Import Cobalt 21.master.0.253153
diff --git a/src/third_party/skia/site/dev/chrome/blink.md b/src/third_party/skia/site/dev/chrome/blink.md
index acfaef9..283e862 100644
--- a/src/third_party/skia/site/dev/chrome/blink.md
+++ b/src/third_party/skia/site/dev/chrome/blink.md
@@ -13,11 +13,12 @@
    detail on running the Blink layout tests\).
 2. Check in your code to the Skia repo.
 3. Ahead of the Skia auto roll including your change, manually push a change to the
-   Blink LayoutTests/TestExpectations [file](https://chromium.googlesource.com/chromium/src/+/master/third_party/WebKit/LayoutTests/TestExpectations),
-   flagging tests expected to fail as a result of your change with \[ NeedsManualRebaseline \].
+   Blink LayoutTests/TestExpectations [file](https://chromium.googlesource.com/chromium/src/+/master/third_party/WebKit/LayoutTests/TestExpectations), flagging tests expected to fail as a result of your change as follows:
+   foo/bar/test-name.html [ Failure Pass ]  # Needs rebaseline
+
 4. Wait for the Skia roll to land successfully.
-5. Check in another change to the Blink TestExpectations file changing the flags to
-   \[ NeedsRebaseline\], which will prompt the automatic rebaseline.
+5. Check in another change to the Blink TestExpectations file removing all the
+  skipped test expectations you add earlier, an run `git cl rebaseline` which will prompt the automatic rebaseline.
 
 
 
diff --git a/src/third_party/skia/site/dev/chrome/commandbuffer.md b/src/third_party/skia/site/dev/chrome/commandbuffer.md
index 2afa5c9..b14a1e9 100644
--- a/src/third_party/skia/site/dev/chrome/commandbuffer.md
+++ b/src/third_party/skia/site/dev/chrome/commandbuffer.md
@@ -10,13 +10,13 @@
 required.
 
 The command buffer standalone shared library is built in a Chromium checkout
-by building the 'command_buffer_gles2' target. The command buffer should be
-built with the is_component_build in GN set to false. This will produce a .so,
+by building the `command_buffer_gles2` target. The command buffer should be
+built with the `is_component_build` in GN set to false. This will produce a .so,
 .dylib, or .dll depending on the target OS. This should be copied alongside
 the dm or nanobench executable built from a Skia repository.
 
-Both tools have a 'commandbuffer' config which can be used with the --config
+Both tools have a `commandbuffer` config which can be used with the `--config`
 option to the tool and will run the tests or benchmarks using the command buffer
 library. Unit tests in dm always run on all appropriate and available backends
-regardless of the --config flag.
+regardless of the `--config` flag.
 
diff --git a/src/third_party/skia/site/dev/chrome/index.md b/src/third_party/skia/site/dev/chrome/index.md
index d715304..abcf0fd 100644
--- a/src/third_party/skia/site/dev/chrome/index.md
+++ b/src/third_party/skia/site/dev/chrome/index.md
@@ -1,17 +1,17 @@
 Skia in Chrome
 ==============
 
-Changes to the Skia repository will be rolled into Chromium (and Blink) by the
-AutoRoll bot several times per day.
+Changes to the Skia repository will be rolled into Chromium by the AutoRoll bot
+several times per day.
 
-If you have a Skia change that needs to be tested in Chrome or Blink, or which
-requires associated changes in those repositories, see the guides in this
-section for tips on execution.
+If you have a Skia change that needs to be tested in Chrome, or which requires
+associated changes in that repository, see the guides in this section for tips
+on execution.
 
 For problems in Chromium related to Skia rolls:
 
-  * Go to https://autoroll.skia.org. Login with google.com account and click
-    the STOP button to pause new rolls.
+  * Go to https://autoroll.skia.org/r/skia-autoroll. Login with google.com
+    account and click the STOP button to pause new rolls.
   * Revert the offending DEPS roll.
   * If an obvious owner cannot be found in the list of CLs, assign to the Skia
     Sheriff, listed at the top of https://status.skia.org and as a reviewer
@@ -19,3 +19,17 @@
   * If the Sheriff cannot be assigned, cc them and assign the issue to hcm@. 
 
 For more tips on bug triage and labeling, see the [Issue Tracker page](../../user/issue-tracker/).
+
+Branching for Chrome
+--------------------
+
+Every 6 weeks, we cut a new branch in Skia to reflect the new release branch in
+Chrome, eg. [refs/heads/chrome/m75](https://skia.googlesource.com/skia/+/chrome/m75).
+This process is simplified by running [tools/chrome_release_branch](https://skia.googlesource.com/skia/+/7a5b6ec0f6c01d3039e3ec30de6f8065ffc8aac4/tools/chrome_release_branch.py').
+This script handles creation of the branch itself, as well as associated
+housekeeping like updating the Chrome milestone number for the next release,
+setting up the [commit queue]('https://skia.googlesource.com/skia/+/infra/config/commit-queue.cfg')
+for the new branch. For example:
+
+    tools/chrome_release_branch <commit hash>
+
diff --git a/src/third_party/skia/site/dev/chrome/multi_repo_trybots.md b/src/third_party/skia/site/dev/chrome/multi_repo_trybots.md
index 4c6f09d..ea1d073 100644
--- a/src/third_party/skia/site/dev/chrome/multi_repo_trybots.md
+++ b/src/third_party/skia/site/dev/chrome/multi_repo_trybots.md
@@ -30,6 +30,7 @@
         'name': 'apply_custom_patch',
         'pattern': '.',
         'action': ['git', '-C', 'src/third_party/skia/',
+                   '-c', 'user.name=Custom Patch', '-c', 'user.email=custompatch@example.com',
                    'cherry-pick', 'FETCH_HEAD',
         ],
       },
@@ -61,13 +62,13 @@
       {
         'name': 'apply_custom_patch',
         'pattern': '.',
-        'action': ['python',
+        'action': ['python2',
                    '-c', 'from distutils.dir_util import copy_tree; copy_tree("src/patch/", "src/");'
         ],
       },
 
 Then, copy all 'out of tree' files into \<chromium>/src/patch/, using the same
-directory structure used by Chromium. When 'gclient runhooks' is run, the files
+directory structure used by Chromium. When `gclient runhooks` is run, the files
 in \<chromium>/src/patch/ will be copied to and overwrite corresponding files in
 \<chromium>/src/. For example, if changing \<skia>/include/core/SkPath.h, place
 a copy of the modified SkPath.h at
@@ -80,5 +81,5 @@
 Try the patch
 -------------
 After committing a \<chromium>/src/DEPS or \<chromium>/src/patch/ change
-locally, 'git cl upload' can be used in the usual way. Be sure to add
-'COMMIT=false' to the issue description to avoid accidentally checking it in.
+locally, `git cl upload` can be used in the usual way. Be sure to add
+`COMMIT=false` to the issue description to avoid accidentally checking it in.
diff --git a/src/third_party/skia/site/dev/chrome/repo.md b/src/third_party/skia/site/dev/chrome/repo.md
index 545f154..f38b8e3 100644
--- a/src/third_party/skia/site/dev/chrome/repo.md
+++ b/src/third_party/skia/site/dev/chrome/repo.md
@@ -4,12 +4,12 @@
 To work on Skia inside a Chromium checkout, run the following:
 
     cd chromium/src/third_party/skia
-    python tools/git-sync-deps
+    python2 tools/git-sync-deps
+    bin/gn gen out/Debug
 
-This command does a minimal "just sync the DEPS" emulation of gclient sync for
-Skia into chromium/src/third_party/skia/third_party.  After that, make dm or
-./gyp_skia && ninja -C out/Debug dm in chromium/src/third_party/skia will get
-you rolling.
+The second command does a minimal "just sync the DEPS" emulation of `gclient
+sync` for Skia into chromium/src/third_party/skia/third_party.  After that,
+`ninja -C out/Debug dm` in chromium/src/third_party/skia will get you rolling.
 
 We no longer recommend the .gclient file manipulation to have Chromium DEPS also
 sync Skia's DEPS.  Most of those DEPS are for building and testing only;
diff --git a/src/third_party/skia/site/dev/contrib/c++11.md b/src/third_party/skia/site/dev/contrib/c++11.md
deleted file mode 100644
index 432ad88..0000000
--- a/src/third_party/skia/site/dev/contrib/c++11.md
+++ /dev/null
@@ -1,57 +0,0 @@
-C++11 in Skia
-=============
-
-Skia uses C++11.  But as a library, we are technically limited by what our
-clients support and what our build bots support.
-
-Skia may also be limited by restrictions we choose put on ourselves.  This
-document is not concerned with C++11 policy in Skia, only its technical
-feasibility.  This is about what we can use, a superset of what we may use.
-
-The gist:
-
--   C++11 the language as supported by GCC 4.7 or later is pretty usable.
--   The C++11 standard library can generally be used, with some teething.
--   If you break a bot, that feature is not usable.
--   Local statics are not thread safe.
-
-
-Clients
--------
-
-The clients we pay most attention to are Chrome, Android, Mozilla, and a few
-internal Google projects.
-
-Chrome builds with a recent Clang on Mac and Linux and with a recent MSVC on
-Windows.  These toolchains are new enough to not be the weak link to use any
-C++11 language feature.  Chromium, however, builds against libstdc++4.6.4
-(STL and runtime) on Linux.  This precludes direct use of a number of type
-traits.
-
-Chrome intentionally disables thread-safe initialization of static variables,
-so we cannot rely on that.  Our bots disable this too, so keep an eye on TSAN.
-
-Android builds with either a somewhat aged GCC or a recent Clang.  They're
-generally not a weak link for C++11 language features.  Android's C++ standard
-library had historically been a pain, but seems to work fine these days.
-
-Mozilla's current weak link is a minimum requirement of GCC 4.7.  Most features
-marked in red on Mozilla's C++11 [feature
-matrix](https://developer.mozilla.org/en-US/docs/Using_CXX_in_Mozilla_code) are
-marked that way because they arrived in GCC 4.8.  Their minimum-supported Clang
-and MSVC toolchains are pretty good, but MSVC 2013 will become the weak link soon.
-
-Internal Google projects tend to support C++11 completely, including the
-full C++11 standard library.
-
-
-Bots
-----
-
-Most of our bots are pretty up-to-date: the Windows bots use MSVC 2013, the Mac
-bots a recent Clang, and the Linux bots GCC 4.8 or a recent Clang.  Our Android
-bots use a recent toolchain from Android (see above), and our Chrome bots use
-Chrome's toolchains (see above).  I'm not exactly sure what our Chrome OS bots
-are using.  They're probably our weak link right now, though problems are rare.
-
-I believe our bots' ability to use C++11 matches Mozilla's list nearly identically.
diff --git a/src/third_party/skia/site/dev/contrib/cqkeywords.md b/src/third_party/skia/site/dev/contrib/cqkeywords.md
index b21b787..8f0385a 100644
--- a/src/third_party/skia/site/dev/contrib/cqkeywords.md
+++ b/src/third_party/skia/site/dev/contrib/cqkeywords.md
@@ -36,7 +36,7 @@
 
     CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:linux_chromium_asan_rel_ng
 
-    CQ_INCLUDE_TRYBOTS=skia.primary:Test-Win-MSVC-ShuttleC-GPU-GTX960-x86_64-Debug-ANGLE
+    CQ_INCLUDE_TRYBOTS=skia.primary:Test-Win10-Clang-ShuttleC-GPU-GTX960-x86_64-Debug-All-ANGLE
 
 
 No-Tree-Checks
diff --git a/src/third_party/skia/site/dev/contrib/directory.md b/src/third_party/skia/site/dev/contrib/directory.md
index 4edab89..0694cd4 100644
--- a/src/third_party/skia/site/dev/contrib/directory.md
+++ b/src/third_party/skia/site/dev/contrib/directory.md
@@ -4,8 +4,7 @@
 *   Docs & Bugs
     -   [Skia.org](https://skia.org/)
     -   [Issue Tracker](https://bug.skia.org/)
-    -   [Autogenerated API
-        Documentation](https://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/index.html)
+    -   [Autogenerated API Documentation](https://api.skia.org)
 
 *   Code Repositories
     -   [Git repository](https://skia.googlesource.com/skia/)
diff --git a/src/third_party/skia/site/dev/contrib/flatten.md b/src/third_party/skia/site/dev/contrib/flatten.md
deleted file mode 100644
index 192571e..0000000
--- a/src/third_party/skia/site/dev/contrib/flatten.md
+++ /dev/null
@@ -1,88 +0,0 @@
-Flattenables
-============
-
-Many objects in Skia, such as SkShaders and other effects on SkPaint, need to be 
-flattened into a data stream for either transport or as part of the key to the 
-font cache. Classes for these objects should derive from SkFlattenable or one of 
-its subclasses. If you create a new flattenable class, you need to make sure you 
-do a few things so that it will work on all platforms:
-
-1: Override the method flatten (the default scope is protected):
-
-<!--?prettify?-->
-~~~~
-virtual void flatten(SkFlattenableWriteBuffer& buffer) const override {
-    this->INHERITED::flatten(buffer);
-    // Write any private data that needs to be stored to recreate this object
-}
-~~~~
-
-2: Override the (protected) constructor that creates an object from an 
-SkFlattenableReadBuffer:
-
-<!--?prettify?-->
-~~~~
-SkNewClass(SkFlattenableReadBuffer& buffer)
-: INHERITED(buffer) {
-    // Read the data from the buffer in the same order as it was written to the
-    // SkFlattenableWriteBuffer and construct the new object
-}
-~~~~
-
-3: Declare a set of deserialization procs for your object in the class declaration:
-We have a macro for this:
-
-<!--?prettify?-->
-~~~~
-public:
-
-SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkNewClass)
-~~~~
-
-4: If your class is declared in a .cpp file or in a private header file, create a 
-function to register its group:
-This occurs in cases where the classes are hidden behind a factory, like many effects 
-and shaders are.  Then in the parent class header file (such as SkGradientShader) you 
-need to add:
-
-<!--?prettify?-->
-~~~~
-public:
-
-SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()
-~~~~
-
-Then in the cpp file you define all the members of the group together:
-
-<!--?prettify?-->
-~~~~
-SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGroupClass)
-
-    SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkMemberClass1)
-
-    SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkMemberClass2)
-
-    // etc
-
-SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
-~~~~
-
-
-5: Register your flattenable with the global registrar:
-You need to add one line to SkFlattenable::InitalizeFlattenables(). To register the 
-flattenable in a Skia build, that function is defined in SkGlobalInitialization_default.cpp. 
-For Chromium, it is in SkGlobalInitialization_chromium.cpp.
-For a single flattenable add
-
-<!--?prettify?-->
-~~~~
-SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkNewClass)
-~~~~
-
-For a group, add
-
-<!--?prettify?-->
-~~~~
-SkGroupClass::InitializeFlattenables();
-~~~~
-
diff --git a/src/third_party/skia/site/dev/contrib/index.md b/src/third_party/skia/site/dev/contrib/index.md
index 9f74a40..23a4aed 100644
--- a/src/third_party/skia/site/dev/contrib/index.md
+++ b/src/third_party/skia/site/dev/contrib/index.md
@@ -7,42 +7,54 @@
 Report Bugs
 -----------
 
-Find bugs to fix or report new bugs in the [Skia issue tracker](http://bug.skia.org/).  
-You can also search the [Chromium issue tracker](http://code.google.com/p/chromium/issues/list) for bugs related to graphics or Skia.
+Find bugs to fix or report new bugs in the [Skia issue
+tracker](http://bug.skia.org/).  You can also search the [Chromium issue
+tracker](http://code.google.com/p/chromium/issues/list) for bugs related to
+graphics or Skia.
 
 Test
 ----
 
-Write an application or tool that will exercise the Skia code differently than our 
-current set of tests and verify that Skia works as expected.  Draw something 
-interesting and profile it to find ways to speed up Skia's implementation.  
-We cannot always fix issues or support every scenario, but we welcome any bugs 
-found so we can assess and prioritize them.  (If you find _and_ fix a bug, even better!)
+Write an application or tool that will exercise the Skia code differently than
+our current set of tests and verify that Skia works as expected.  
+Draw something interesting and profile it to find ways to speed up Skia's
+implementation.  
+We cannot always fix issues or support every scenario, but we welcome any bugs
+found so we can assess and prioritize them. (If you find _and_ fix a bug, even
+better!)
 
 Contribute Code
 ---------------
 
-Whether you develop a new feature or a fix for an existing bug in the Skia code base, 
-you will need a committer to review and approve the change.  There are some steps that 
-can speed up the review process:  
+Whether you develop a new feature or a fix for an existing bug in the Skia code
+base, you will need a committer to review and approve the change.  
+There are some steps that can speed up the review process:  
 Keep your code submissions small and targeted.  
-When possible, have a fellow contributor review your change in advance of submission.  
-Propose new features to the project leads by opening a feature bug or posting to 
-skia-discuss ahead of development.  For more information, see [How to submit a patch](./contrib/submit).
+When possible, have a fellow contributor review your change in advance of
+submission.  
+Propose new features to the project leads by opening a feature bug
+or posting to skia-discuss ahead of development.  
+For more information, see [How to submit a patch](/dev/contrib/submit).
 
-For background on the project and an outline of the types of roles interested parties 
-can take on, see [Project Roles](../../roles).
+For background on the project and an outline of the types of roles interested
+parties can take on, see [Project Roles](/roles).
 
-Anyone contributing code to Skia must sign a Contributor License Agreement and ensure 
-they are listed in the AUTHORS file:
-Individual contributors can complete the [Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual) online.  
-If you are contributing on behalf of a corporation, fill out the [Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate) 
-and send it in as described on that page.
-If it is your first time submitting code or you have not previously done so, add your 
-(or your organization's) name and contact info to the [AUTHORS file](https://skia.googlesource.com/skia/+/master/AUTHORS) as a part 
-of your CL.
-REVIEWERS: Before you LGTM a change, verify that the contributor is listed in the AUTHORS file.  
-If they are not, a Googler must ensure that the individual or their corporation has signed the 
-CLA by searching [go/cla-signers](https://goto.google.com/cla-signers).  
+Anyone contributing code to Skia must sign a Contributor License Agreement and
+ensure they are listed in the AUTHORS file:  
+Individual contributors can complete the [Individual Contributor License
+Agreement](https://developers.google.com/open-source/cla/individual) online.  
+If you are contributing on behalf of a corporation, fill out the [Corporate
+Contributor License
+Agreement](https://developers.google.com/open-source/cla/corporate) and send it
+in as described on that page.  
+If it is your first time submitting code or you have not previously done so,
+add your (or your organization's) name and contact info to the [AUTHORS
+file](https://skia.googlesource.com/skia/+/master/AUTHORS) as a part of your CL.
+
+REVIEWERS: Before you LGTM a change, verify that the contributor is listed in
+the AUTHORS file.  
+If they are not, a Googler must ensure that the individual or
+their corporation has signed the CLA by searching
+[go/cla-signers](https://goto.google.com/cla-signers).  
 Then have an entry added to the AUTHORS file with the CL.
 
diff --git a/src/third_party/skia/site/dev/contrib/jumper.md b/src/third_party/skia/site/dev/contrib/jumper.md
deleted file mode 100644
index 757697f..0000000
--- a/src/third_party/skia/site/dev/contrib/jumper.md
+++ /dev/null
@@ -1,102 +0,0 @@
-Contributing to SkJumper
-========================
-
-SkJumper is the execution engine of SkRasterPipeline, a system we've been using
-to accelerate CPU-bound work inside Skia, most notably color-space conversions
-and color-correct drawing.
-
-(This is where I'd put my link to design document if I had one...)
-
-SkJumper is more annoying to contribute to than most Skia code because of its
-offline compilation step.  You'll need particular tools installed on your
-machine and to tell GN about them.  This document is designed to guide you
-through this process and ease some of that annoyance.
-
-One-time Setup
---------------
-
-To generate stage code you need Clang 4.0, objdump, and ccache.  It's best that
-Clang is exactly the same version we typically use (as of writing 4.0.0) and
-you'll need objdump to be compiled with support for x86-64, ARMv7, and ARMv8.
-
-The easiest way to satisfy these contraints is to get your hands on a Mac and
-install [Homebrew](https://brew.sh).  Once you have `brew` installed, run this
-to get the tools you need:
-
-<!--?prettify lang=sh?-->
-
-    brew install llvm binutils ccache
-
-Setting up GN
--------------------------
-
-With your tools installed, tell GN about them
-
-    skia_jumper_clang = path/to/clang-4.0
-    skia_jumper_objdump = path/to/gobjdump
-    skia_jumper_ccache = path/to/ccache
-
-then regenerate and build as normal.
-
-If you look in your GN out directory, you should now see a bunch of `.o` files,
-and `git status` should show no changes to `src/jumper/SkJumper_generated*.S`.
-That's good.  Those object files are the intermediates we parse to produce
-the assembly files.  We just leave them around in case you want to look at
-them yourself.
-
-Make A Change
--------------
-
-Let's use the `from_srgb` stage as a little playground to make a real change.
-Linearizing sRGB encoded bytes is slow, so let's pretend we've decided to trade
-quality for speed, approximating the existing implementation with a simple square.
-
-Open up `SkJumper_stages.cpp` and find the `from_srgb` stage.  It'll look like
-
-<!--?prettify lang=cc?-->
-
-    STAGE(from_srgb) {
-        r = from_srgb(r);
-        g = from_srgb(g);
-        b = from_srgb(b);
-    }
-
-Let's replace whatever's there with our fast approximation:
-
-<!--?prettify lang=cc?-->
-
-    STAGE(from_srgb) {
-        r *= r;
-        g *= g;
-        b *= b;
-    }
-
-When you save and re-Ninja, you should now see changes to
-`src/jumper/SkJumper_generated.S` and `src/jumper/SkJumper_generated_win.S`.
-If you can't read assembly, no big deal.  If you can, run `git diff`.  You
-should see the various `sk_from_srgb_*` functions get dramatically simpler,
-something like three multiplies and a couple other bookkeeping instructions.
-
-It's not unusual for isolated changes in one stage to cause seemingly unrelated
-changes in another.  When adding or removing any code you'll usually see all
-the comments in branch instructions change a little bit, but the actual
-instruction on the left won't change.  When adding or removing uses of
-constants, you'll often see both the comment and instruction on the left change
-for other loads of constants from memory, especially on x86-64.  You'll also
-see some code that looks like garbage change; those are the constants.  If
-any of this worries you, please do go running to someone who knows more for
-help, but odds are everything is fine.
-
-At this point things should just be business as usual.  Any time you change
-`SkJumper_stages.cpp`, Ninja ought to notice and regenerate the assembly files.
-
-Adding a new Stage
-------------------
-
-Adding a new stage is a lot like changing an existing stage.  Edit
-`SkJumper_stages.cpp`, build Skia, test, repeat until correct.
-
-You'll just need to also edit `SkRasterPipeline.h` to add your new stage to the
-macro listing all the stages.  The stage name is the handle normal Skia code
-uses to refer to the stage abstractly, and the wiring between
-`SkRasterPipeline::foo` and `STAGE(foo) { ... }` should work automatically.
diff --git a/src/third_party/skia/site/dev/contrib/patch.md b/src/third_party/skia/site/dev/contrib/patch.md
index cf8b35b..b7b29f0 100644
--- a/src/third_party/skia/site/dev/contrib/patch.md
+++ b/src/third_party/skia/site/dev/contrib/patch.md
@@ -7,30 +7,31 @@
 locally.)
 
 Notes: 
+
   * For the examples below, we will assume that this is the change you want
     to patch into your local checkout: https://codereview.appspot.com/6201055/ 
   * These instructions should work on Mac or Linux; Windows is trickier, 
     because there is no standard Windows "patch" tool.  
 
-See also:
-http://dev.chromium.org/developers/contributing-code#TOC-Instructions-for-Reviewer:-Checking-in-the-patch-for-a-non-committer
+See also [Contributing Code for The Chromium Projects]
+(http://dev.chromium.org/developers/contributing-code#TOC-Instructions-for-Reviewer:-Checking-in-the-patch-for-a-non-committer).
 
-If you use git cl, then you should be able to use the shortcut:
+If you use `git cl`, then you should be able to use the shortcut:
 
 ~~~~ 
 git cl patch 6201055 
 ~~~~
 
-If you use gcl, or the above doesn't work, the following should always work.
+If you use `gcl`, or the above doesn't work, the following should always work.
 
 1. Prepare your local workspace to accept the patch.
 
-    * cd into the root directory (usually trunk/) of the workspace where you
+    * cd into the root directory (usually `trunk/`) of the workspace where you
       want to apply the patch.  
     * Make sure that the workspace is up-to-date and clean (or "updated and 
       clean enough" for your purposes).  If the codereview patch was against 
       an old revision of the repo, you may need to sync your local workspace 
-      to that same revision...
+      to that same revision.
 
 2. Download the raw patch set.
 
@@ -50,7 +51,7 @@
     ~~~~
 
     * Otherwise, figure out some other way to download this file and save it as
-      'patch.txt'
+      `patch.txt`
 
 3. Apply this patch to your local checkout.
 
@@ -61,12 +62,12 @@
     patch -p1 <patch.txt 
     ~~~~
 
-    * Then you can run diff and visually check the local changes.
+    * Then you can run `diff` and visually check the local changes.
 
 4. Complications: If the patch fails to apply, the following may be happening:
 
-   Wrong revision.  Maybe your local workspace is not up to date?  Or maybe the
-   patch was made against an old revision of the repository, and cannot be applied
-   to the latest revision?  (In that case, revert any changes and sync your
-   workspace to an older revision, then re-apply the patch.)
+    * Wrong revision.  Maybe your local workspace is not up to date?  Or maybe the
+      patch was made against an old revision of the repository, and cannot be applied
+      to the latest revision?  (In that case, revert any changes and sync your
+      workspace to an older revision, then re-apply the patch.)
 
diff --git a/src/third_party/skia/site/dev/contrib/simd.md b/src/third_party/skia/site/dev/contrib/simd.md
deleted file mode 100644
index e2e6310..0000000
--- a/src/third_party/skia/site/dev/contrib/simd.md
+++ /dev/null
@@ -1,141 +0,0 @@
-Skia's New Approach to SIMD
-===========================
-
-Most hot software paths in Skia are implemented with processor-specific SIMD instructions.  For graphics performance, the parallelism from SIMD is essential: there is simply no realistic way to eek the same performance out of portable C++ code as we can from the SSE family of instruction sets on x86 or from NEON on ARM or from MIPS32's DSP instructions.  Depending on the particular code path and math involved, we see 2, 4, 8, or even ~16x performance increases over portable code when really exploiting the processor-specific SIMD instructions.
-
-But the SIMD code we've piled up over the years has some serious problems.  It's often quite low-level, with poor factoring leading to verbose, bug prone, and difficult to read code.  SIMD instrinsic types and functions take a good long while to get used to reading, let alone writing, and assembly is generally just a complete non-starter.  SIMD coverage of Skia methods is not dense: a particular drawing routine might be specialized for NEON but not for SSE, or might have a MIPS DSP implementation but no NEON.  Even when we have full instruction set coverage, the implementations of these specialized routines may not produce identical results, either when compared with each other or with our portable fallback code.  The SIMD implementations are often simply incorrect, but the code is so fragile and difficult to understand, we can't fix it.  There are long lived bugs in our tracker involving crashes and buffer under- and overflows that we simply cannot fix because no one on the team understands the code involved.  And finally, to top it all off, the code isn't always even really that fast.
-
-This all needs to change.  I want Skia developers to be able to write correct, clear, and fast code, and in software rendering, SIMD is the only way to get "fast".  This document outlines a new vision for how Skia will use SIMD instructions with no compromises, writing clear code _once_ that runs quickly on all platforms we support.
-
-The Plan
---------
-
-We're going to wrap low-level platform-specific instrinsics with zero-cost abstractions with interfaces matching Skia's higher-level-but-still-quite-low-level use cases.  Skia code will write to this interface _once_, which then compiles to efficient SSE, NEON, or portable code (MIPS is quite TBD, for now group it conceptually under portable code) via platform-specific backends.  The key here is to find the right sweet spot of abstraction that allows us to express the graphical concepts we want in Skia while allowing each of those platform-specific backends flexibility to implement those concepts as efficiently as possible.
-
-While Skia uses a mix of float, 32-bit, 16-bit, and 8-bit integer SIMD instructions, 32-bit integers fall quite behind the rest in usage.  Since we tend to operate on 8888 ARGB values, 8-bit SIMD tends to be the most natural and fastest approach, but when multiplication gets involved (essentially all the time), 16-bit SIMD inevitably gets tangled in there.  For some operations like division, square roots, or math with high range or precision requirements, we expand our 8-bit pixel components up to floats, and working with a single pixel as a 4-float vector becomes most natural.  This plan focuses on how we'll deal with these majority cases: floats, and 8- and 16-bit integers.
-
-`SkNf` for floats
----------------
-
-Wrapping floats with an API that allows efficient implementation on SSE and NEON is by far the easiest task involved here.  Both SSE and NEON naturally work with 128-bit vectors of 4 floats, and they have a near 1-to-1 correspondence between operations.  Indeed, the correspondence is so close that it's tempting to solve this problem by picking one set of intrinsics, e.g. NEON, and just `#define`ing portable and SSE implementations of NEON:
-
-    #define float32x4_t __m128
-    #define vmulq_f32 _mm_mul_ps
-    #define vaddq_f32 _mm_add_ps
-    #define vld1q_f32 _mm_loadu_ps
-    #define vst1q_f32 _mm_storeu_ps
-    ...
-
-This temptation starts to break down when you notice:
-
--   there are operations that don't quite correspond, e.g. `_mm_movemask_ps`; and
--   math written with either SSE or NEON instrinsics is still very hard to read; and
--   sometimes we want to work with 4 floats, but sometimes 2, maybe even 8, etc.
-
-So we use a wrapper class `SkNf<N>`, parameterized on N, how many floats the vector contains, constrained at compile time to be a power of 2.  `SkNf` provides all the methods you'd expect on vector of N floats: loading and storing from float arrays, all the usual arithmetic operators, min and max, low and high precision reciprocal and sqrt, all the usual comparison operators, and a `.thenElse()` method acting as a non-branching ternary `?:` operator.  To support Skia's main graphic needs, `SkNf` can also load and store from a vector of N _bytes_, converting up to a float when loading and rounding down to [0,255] when storing.
-
-As a convenience, `SkNf<N>` has two default implementations: `SkNf<1>` performs all these operations on a single float, and the generic `SkNf<N>` simply recurses onto two `SkNf<N/2>`.  This allows our different backends to inject specialiations where most natural: the portable backend does nothing, so all `SkNf<N>` recurse down to the default `SkNf<1>`;  the NEON backend specializes `SkNf<2>` with `float32x2_t` and 64-bit SIMD methods, and `SkNf<4>` with `float32x4_t` and 128-bit SIMD methods; the SSE backend specializes both `SkNf<4>` and `SkNf<2>` to use the full or lower half of an `__m128` vector, respectively.  A future AVX backend could simply drop in an `SkNf<8>` specialization.
-
-Our most common float use cases are working with 2D coordinates and with 4-float-component pixels.  Since these are so common, we've made simple typedefs for these two use cases, `Sk2f` and `Sk4f`, and also versions reminding you that it can work with vectors of `SkScalar` (a Skia-specific float typedef) too: `Sk2s`, `Sk4s`.
-
-`SkNf` in practice
-----------------
-
-To date we have implemented several parts of Skia using Sk4f:
-
-  1. `SkColorMatrixFilter`
-  2. `SkRadialGradient`
-  3. `SkColorCubeFilter`
-  4. Three complicated `SkXfermode` subclasses: `ColorBurn`, `ColorDodge`, and `SoftLight`.
-
-In all these cases, we have been able to write a single implementation, producing the same results cross-platform.  The first three of those sites using Sk4f are entirely newly vectorized, and run much faster than the previous portable implementations.  The 3 Sk4f transfermodes replaced portable, SSE, and NEON implementations which all produced different results, and the Sk4f versions are all faster than their predecessors.
-
-`SkColorCubeFilter` stands out as a particularly good example of how and why to use Sk4f over custom platform-specific intrinsics.  Starting from some portable code and a rather slow SSE-only sketch, a Google Chromium dev, an Intel contributor, and I worked together to write an Sk4f version that's more than twice as fast as the original, and runs fast on _both_ x86 and ARM.
-
-`SkPx` for 8- and 16-bit fixed point math
-----------------------------------------
-
-Building an abstraction layer over 8- and 16-bit fixed point math has proven to be quite a challenge.  In fixed point, NEON and SSE again have some overlap, and they could probably be implemented in terms of each other if you were willing to sacrifice performance on SSE in favor of NEON or vice versa.  But unlike with floats, where `SkNf` is really a pretty thin veneer over very similar operations, to really get the best performance out of each fixed point instruction set you need to work in rather different idioms.
-
-`SkPx`, our latest approach (there have been alpha `Sk16b` and beta `Sk4px` predecessors) to 8- and 16-bit SIMD  tries to abstract over those idioms to again allow Skia developers to write one piece of clear graphics code that different backends can translate into their native intrinsics idiomatically.
-
-`SkPx` is really a family of three related types:
-
-  1. `SkPx` itself represents between 1 and `SkPx::N` 8888 ARGB pixels, where `SkPx::N` is a backend-specific compile-time power of 2.
-  2. `SkPx::Wide` represents those same pixels, but with 16-bits of space per component.
-  3.  `SkPx::Alpha` represents the alpha channels of those same pixels.
-
-`SkPx`, `Wide` and `Alpha` create a somewhat complicated algebra of operations entirely motivated by the graphical operations we need to perform.  Here are some examples:
-
-    SkPx::LoadN(const uint32_t*)   -> SkPx  // Load full cruising-speed SkPx.
-    SkPx::Load(n, const uint32_t*) -> SkPx  // For the 0<n<N ragged tail.
-    
-    SkPx.storeN(uint32_t*)   // Store a full SkPx.
-    SkPx.store(n, uint32_t*) // For the ragged 0<n<N tail.
-
-    SkPx + SkPx -> SkPx
-    SkPx - SkPx -> SkPx
-    SkPx.saturatedAdd(SkPx) -> SkPx
-
-    SkPx.alpha() -> Alpha   // Extract alpha channels.
-    Alpha::LoadN(const uint8_t*)   -> Alpha  // Like SkPx loads, in 8-bit steps.
-    Alpha::Load(n, const uint8_t*) -> Alpha
-
-    SkPx.widenLo()   -> Wide  // argb -> 0a0r0g0b
-    SkPx.widenHi()   -> Wide  // argb -> a0r0g0b0
-    SkPx.widenLoHi() -> Wide  // argb -> aarrggbb
-
-    Wide + Wide -> Wide
-    Wide - Wide -> Wide
-    Wide << bits -> Wide
-    Wide >> bits -> Wide
-
-    SkPx * Alpha -> Wide    // 8 x 8 -> 16 bit
-    Wide.div255() -> SkPx   // 16-bit -> 8 bit
-
-    // A faster approximation of (SkPx * Alpha).div255().
-    SkPx.approxMulDiv255(Alpha) -> SkPx
-
-We allow each `SkPx` backend to choose how it physically represents `SkPx`, `SkPx::Wide`, and `SkPx::Alpha` and to choose any power of two as its `SkPx::N` sweet spot.  Code working with SkPx typically runs a loop like this:
-
-    while (n >= SkPx::N) {
-    	// Apply some_function() to SkPx::N pixels.
-    	some_function(SkPx::LoadN(src), SkPx::LoadN(dst)).storeN(dst);
-    	src += SkPx::N; dst += SkPx::N; n -= SkPx::N;
-    }
-    if (n > 0) {
-    	// Finish up the tail of 0<n<N pixels.
-    	some_function(SkPx::Load(n, src), SkPx::Load(n, dst)).store(n, dst);
-    }
-
-The portable code is of course the simplest place to start looking at implementation details: its `SkPx` is just `uint8_t[4]`, its `SkPx::Wide` `uint16_t[4]`, and its `SkPx::Alpha` just `uint8_t`.  Its preferred number of pixels to work with is `SkPx::N = 1`.  (Amusingly, GCC and Clang seem pretty good about autovectorizing this backend using 32-bit math, which typically ends up within ~2x of the best we can do ourselves.)
-
-The most important difference between SSE and NEON when working in fixed point is that SSE works most naturally with 4 interlaced pixels at a time (argbargbargbargb), while NEON works most naturally with 8 planar pixels at a time (aaaaaaaa, rrrrrrrr, gggggggg, bbbbbbbb).  Trying to jam one of these instruction sets into the other's idiom ends up somewhere between not quite optimal (working with interlaced pixels in NEON) and ridiculously inefficient (trying to work with planar pixels in SSE).
-
-So `SkPx`'s SSE backend sets N to 4 pixels, stores them interlaced in an `__m128i`, representing `Wide` as two `__m128i` and `Alpha` as an `__m128i` with each pixel's alpha component replicated four times.  SkPx's NEON backend works with 8 planar pixels, loading them with `vld4_u8` into an `uint8x8x4_t` struct of 4 8-component `uint8x8_t` planes.  `Alpha` is just a single `uint8x8_t` 8-component plane, and `Wide` is NEON's natural choice, `uint16x8x4_t`.
-
-(It's fun to speculate what an AVX2 backend might look like.  Do we make `SkPx` declare it wants to work with 8 pixels at a time, or leave it at 4?  Does `SkPx` become `__m256i`, or maybe only `SkPx::Wide` does?  What's the best way to represent `Alpha`?  And of course, what about AVX-512?)
-
-Keeping `Alpha` as a single dense `uint8x8_t` plane allows the NEON backend to be much more efficient with operations involving `Alpha`.  We'd love to do this in SSE too, where we store `Alpha` somewhat inefficiently with each alpha component replicated 4 times, but SSE simply doesn't expose efficient ways to transpose interlaced pixels into planar pixels and vice versa.  We could write them ourselves, but only as rather complex compound operations that slow things down more than they help.
-
-These details will inevitably change over time.  The important takeaway here is, to really work at peak throughput in SIMD fixed point, you need to work with the idiom of the instruction set, and `SkPx` is a design that can present a consistent interface to abstract away backend details for you.
-
-`SkPx` in practice
-----------------
-
-I am in the process of rolling out `SkPx`.  Some Skia code is already using its precursor, `Sk4px`, which is a bit like `SkPx` that forces `N=4` and restricts the layout to always use interlaced pixels: i.e. fine for SSE, not great for NEON.
-
-  1. All ~20 other `SkXfermode` subclasses that are not implemented with `SkNf`.
-  2. SkBlitRow::Color32
-  3. SkBlitMask::BlitColor
-
-I can certainly say that the `Sk4px` and `SkPx` implementations of these methods are clearer, less buggy, and that all the `SkXfermode` implementations sped up at least 2x when porting from custom per-platform intrinsics.  `Sk4px` has lead to some pretty bad performance regressions that `SkPx` is designed to avoid.  This is an area of active experiementation and iteration.
-
-In Summary
-----------
-
-I am confident that Skia developers soon will be able to write single, clear, maintainable, and of course _fast_,  graphical algorithms using `SkNf` and `SkPx`.  As I have been porting our algorithms, I have perversely enjoyed replacing thousands of lines of unmaintainable code with usually mere dozens of readable code.
-
-I'm also confident that if you're looking to use floats, `SkNf` is ready.  Do not write NEON or SSE SIMD code if you're looking to use floats, and do not accept external contributions that do so.  Use `SkNf` instead.
-
-`SkPx` is less proven, and while its design and early tests look promising, it's still at the stage where we should try it aware that we might need to fall back on hand-written SSE or NEON.
\ No newline at end of file
diff --git a/src/third_party/skia/site/dev/contrib/style.md b/src/third_party/skia/site/dev/contrib/style.md
index 639738c..9edf83d 100644
--- a/src/third_party/skia/site/dev/contrib/style.md
+++ b/src/third_party/skia/site/dev/contrib/style.md
@@ -2,17 +2,17 @@
 =======================
 
 These conventions have evolved over time. Some of the earlier code in both
-projects doesn’t strictly adhere to the guidelines. However, as the code evolves
+projects doesn't strictly adhere to the guidelines. However, as the code evolves
 we hope to make the existing code conform to the guildelines.
 
 Files
 -----
 
-We use .cpp and .h as extensions for c++ source and header files. We use
-foo_impl.h for headers with inline definitions for class foo.
+We use .cpp and .h as extensions for c++ source and header files.
 
-Headers that aren’t meant for public consumption should be placed in src
-directories so that they aren’t in a client’s search path.
+Headers that aren't meant for public consumption should be placed in src
+directories so that they aren't in a client's search path, or in
+include/private if they need to be used by public headers.
 
 We prefer to minimize includes. If forward declaring a name in a header is
 sufficient then that is preferred to an include.
@@ -22,8 +22,9 @@
 
 <span id="no-define-before-sktypes"></span>
 Do not use #if/#ifdef before including "SkTypes.h" (directly or indirectly).
+Most things you'd #if on tend to not yet be decided until SkTypes.h.
 
-We use spaces not tabs (4 of them).
+We use 4 spaces, not tabs.
 
 We use Unix style endlines (LF).
 
@@ -41,7 +42,7 @@
 ------
 
 Both projects use a prefix to designate that they are Skia prefix for classes,
-enums, structs, typedefs etc is Sk. Ganesh’s is Gr. Nested types should not be
+enums, structs, typedefs etc is Sk. Ganesh's is Gr. Nested types should not be
 prefixed.
 
 <!--?prettify?-->
@@ -54,7 +55,7 @@
 };
 ~~~~
 
-Data fields in structs, classes, unions begin with lowercase f and are then 
+Data fields in structs, classes, unions begin with lowercase f and are then
 camel capped.
 
 <!--?prettify?-->
@@ -81,7 +82,8 @@
 Enum values are prefixed with k. Unscoped enum values are post fixed with
 an underscore and singular name of the enum name. The enum itself should be
 singular for exclusive values or plural for a bitfield. If a count is needed it
-is  k&lt;singular enum name&gt;Count and not be a member of the enum (see example):
+is  `k<singular enum name>Count` and not be a member of the enum (see example),
+or a kLast member of the enum is fine too.
 
 <!--?prettify?-->
 ~~~~
@@ -98,7 +100,7 @@
      kBlueberry_PancakeType,
      kPlain_PancakeType,
      kChocolateChip_PancakeType,
-    
+
      kLast_PancakeType = kChocolateChip_PancakeType
 };
 
@@ -167,8 +169,8 @@
 #define GR_GL_TEXTURE0 0xdeadbeef
 ~~~~
 
-Ganesh prefers that macros are always defined and the use of #if MACRO rather than 
-#ifdef MACRO.
+Ganesh prefers that macros are always defined and the use of `#if MACRO` rather than
+`#ifdef MACRO`.
 
 <!--?prettify?-->
 ~~~~
@@ -179,14 +181,14 @@
 #endif
 ~~~~
 
-Skia tends to use #ifdef SK_MACRO for boolean flags.
+Skia tends to use `#ifdef SK_MACRO` for boolean flags.
 
 Braces
 ------
 
-Open braces don’t get a newline. “else” and “else if” appear on same line as
+Open braces don't get a newline. `else` and `else if` appear on same line as
 opening and closing braces unless preprocessor conditional compilation
-interferes. Braces are always used with if, else, while, for, and do.
+interferes. Braces are always used with `if`, `else`, `while`, `for`, and `do`.
 
 <!--?prettify?-->
 ~~~~
@@ -227,7 +229,7 @@
 Flow Control
 ------------
 
-There is a space between flow control words and parentheses and between 
+There is a space between flow control words and parentheses and between
 parentheses and braces:
 
 <!--?prettify?-->
@@ -252,7 +254,7 @@
         ...
         break;
     case kGreen:
-        ... 
+        ...
         break;
     ...
     default:
@@ -284,7 +286,7 @@
 switch (filter) {
     ...
     case kGaussian_Filter: {
-        Bitmap srcCopy = src->makeCopy(); 
+        Bitmap srcCopy = src->makeCopy();
         ...
         break;
     }
@@ -296,9 +298,9 @@
 -------
 
 Unless there is a need for forward declaring something, class declarations
-should be ordered public, protected, private. Each should be preceded by a
-newline. Within each visibility section (public, private), fields should not be
-intermixed with methods.
+should be ordered `public`, `protected`, `private`. Each should be preceded by a
+newline. Within each visibility section (`public`, `private`), fields should not be
+intermixed with methods.  It's nice to keep all data fields together at the end.
 
 <!--?prettify?-->
 ~~~~
@@ -308,14 +310,14 @@
     ...
 
 protected:
-    ...        
-
-private:
-    SkBar fBar;
     ...
 
+private:
     void barHelper(...);
     ...
+
+    SkBar fBar;
+    ...
 };
 ~~~~
 
@@ -330,8 +332,8 @@
 };
 ~~~~
 
-Virtual functions that are overridden in derived classes should use override
-(and not the override keyword). The virtual keyword can be omitted.
+Virtual functions that are overridden in derived classes should use override,
+and the virtual keyword should be omitted.
 
 <!--?prettify?-->
 ~~~~
@@ -339,8 +341,8 @@
 }
 ~~~~
 
-This should be the last element of their private section, and all references to 
-base-class implementations of a virtual function should be explicitly qualified:
+All references to base-class implementations of a virtual function
+should be explicitly qualified:
 
 <!--?prettify?-->
 ~~~~
@@ -351,9 +353,6 @@
 }
 ~~~~
 
-As in the above example, derived classes that redefine virtual functions should
-use override to note that explicitly.
-
 Constructor initializers should be one per line, indented, with punctuation
 placed before the initializer. This is a fairly new rule so much of the existing
 code is non-conforming. Please fix as you go!
@@ -367,7 +366,7 @@
 }
 ~~~~
 
-Constructors that take one argument should almost always be explicit, with 
+Constructors that take one argument should almost always be explicit, with
 exceptions made only for the (rare) automatic compatibility class.
 
 <!--?prettify?-->
@@ -379,7 +378,7 @@
 };
 ~~~~
 
-Method calls within method calls should be prefixed with dereference of the 
+Method calls within method calls should be prefixed with dereference of the
 'this' pointer. For example:
 
 <!--?prettify?-->
@@ -387,47 +386,6 @@
 this->method();
 ~~~~
 
-Comparisons
------------
-
-We prefer that equality operators between lvalues and rvalues place the lvalue 
-on the right:
-
-<!--?prettify?-->
-~~~~
-if (7 == luckyNumber) {
-    ...
-}
-~~~~
-
-However, inequality operators need not follow this rule:
-
-<!--?prettify?-->
-~~~~
-if (count > 0) {
-    ...
-}
-~~~~
-
-Comments
-
-We use doxygen-style comments.
-
-For grouping or separators in an implementation file we use 80 slashes
-
-<!--?prettify?-->
-~~~~
-void SkClassA::foo() {
-    ...
-}
-
-////////////////////////////////////////////////////////////////
-
-void SkClassB::bar() {
-    ...
-}
-~~~~
-
 Integer Types
 -------------
 
@@ -435,16 +393,16 @@
 
 (http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Integer_Types)
 
-Summary: Use int unless you have need a guarantee on the bit count, then use
-stdint.h types (int32_t, etc). Assert that counts, etc are not negative instead
-of using unsigned. Bitfields use uint32_t unless they have to be made shorter
+Summary: Use `int` unless you have need a guarantee on the bit count, then use
+`stdint.h` types (`int32_t`, etc). Assert that counts, etc are not negative instead
+of using unsigned. Bitfields use `uint32_t` unless they have to be made shorter
 for packing or performance reasons.
 
-nullptr, 0
--------
+`nullptr`, 0
+------------
 
-Use nullptr for pointers, 0 for ints. We prefer explicit nullptr comparisons when
-checking for nullptr pointers (as documentation):
+Use `nullptr` for pointers, 0 for ints. We suggest explicit `nullptr` comparisons when
+checking for `nullptr` pointers, as documentation:
 
 <!--?prettify?-->
 ~~~~
@@ -453,8 +411,8 @@
 }
 ~~~~
 
-When checking non-nullptr pointers explicit comparisons are not required because it
-reads like a double negative:
+When checking non-`nullptr` pointers we think implicit comparisons read better than
+an explicit comparison's double negative:
 
 <!--?prettify?-->
 ~~~~
@@ -463,66 +421,27 @@
 }
 ~~~~
 
-Returning structs
------------------
-
-If the desired behavior is for a function to return a struct, we prefer using a
-struct as an output parameter
-
-<!--?prettify?-->
-~~~~
-void modify_foo(SkFoo* foo) {
-    // Modify foo
-}
-~~~~
-
-Then the function can be called as followed:
-
-<!--?prettify?-->
-~~~~
-SkFoo foo;
-modify_foo(&foo);
-~~~~
-
-This way, if return value optimization cannot be used there is no performance
-hit. It also means that modify_foo can actually return a boolean for whether the
-call was successful. In this case, initialization of foo can potentially be
-skipped on failure (assuming the constructor for SkFoo does no initialization).
-
-<!--?prettify?-->
-~~~~
-bool modify_foo(SkFoo* foo) {
-    if (some_condition) {
-        // Modify foo
-        return true;
-    }
-    // Leave foo unmodified
-    return false;
-}
-~~~~
-
 Function Parameters
 -------------------
 
-Mandatory constant object parameters are passed to functions as const references
-if they are not retained by the receiving function. Optional constant object
-parameters are passed to functions as const pointers. Objects that the called
-function will retain, either directly or indirectly, are passed as pointers.
-Variable (i.e. mutable) object parameters are passed to functions as pointers.
+Mandatory constant object parameters are passed to functions as const references.
+Optional constant object parameters are passed to functions as const pointers.
+Mutable object parameters are passed to functions as pointers.
+We very rarely pass anything by non-const reference.
 
 <!--?prettify?-->
 ~~~~
 // src and paint are optional
-void SkCanvas::drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src, 
-                             const SkRect& dst, const SkPaint* paint = nullptr);
+void SkCanvas::drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
+                              const SkRect& dst, const SkPaint* paint = nullptr);
+
 // metrics is mutable (it is changed by the method)
 SkScalar SkPaint::getFontMetrics(FontMetric* metrics, SkScalar scale) const;
-// A reference to foo is retained by SkContainer
-void SkContainer::insert(const SkFoo* foo);
+
 ~~~~
 
-If function arguments or parameters do not all fit on one line, they may be
-lined up with the first parameter on the same line
+If function arguments or parameters do not all fit on one line, the overflowing
+parameters may be lined up with the first parameter on the next line
 
 <!--?prettify?-->
 ~~~~
@@ -533,7 +452,7 @@
 }
 ~~~~
 
-or placed on the next line indented eight spaces
+or all parameters placed on the next line and indented eight spaces
 
 <!--?prettify?-->
 ~~~~
diff --git a/src/third_party/skia/site/dev/contrib/submit.md b/src/third_party/skia/site/dev/contrib/submit.md
index d3ffc9d..59ac5f8 100644
--- a/src/third_party/skia/site/dev/contrib/submit.md
+++ b/src/third_party/skia/site/dev/contrib/submit.md
@@ -32,7 +32,7 @@
 <!--?prettify lang=sh?-->
 
     git pull
-    python tools/git-sync-deps
+    python2 tools/git-sync-deps
 
 Adding a unit test
 ------------------
@@ -45,10 +45,9 @@
 See [Writing Unit and Rendering Tests](../testing/tests) for details.
 
 Unit tests are best, but if your change touches rendering and you can't think of
-an automated way to verify the results, consider writing a GM test or a new page
-of SampleApp. Also, if your change is the GPU code, you may not be able to write
-it as part of the standard unit test suite, but there are GPU-specific testing
-paths you can extend.
+an automated way to verify the results, consider writing a GM test. Also, if your
+change is in the GPU code, you may not be able to write it as part of the standard
+unit test suite, but there are GPU-specific testing paths you can extend.
 
 Submitting a patch
 ------------------
@@ -65,9 +64,12 @@
 Now that you've made a change and written a test for it, it's ready for the code
 review! Submit a patch and getting it reviewed is fairly easy with depot tools.
 
-Use git-cl, which comes with [depot
+Use `git-cl`, which comes with [depot
 tools](http://sites.google.com/a/chromium.org/dev/developers/how-tos/install-depot-tools).
-For help, run git-cl help.
+For help, run `git cl help`.
+Note that in order for `git cl` to work correctly, it needs to run on a clone of
+<https://skia.googlesource.com/skia>. Using clones of mirrors, including Google's mirror
+on GitHub, might lead to issues with `git cl` usage.
 
 ### Find a reviewer
 
@@ -78,7 +80,7 @@
 ### Uploading changes for review
 
 Skia uses the Gerrit code review tool. Skia's instance is [skia-review](http://skia-review.googlesource.com).
-Use git cl to upload your change:
+Use `git cl` to upload your change:
 
 <!--?prettify lang=sh?-->
 
@@ -93,6 +95,27 @@
 (https://skia-review.googlesource.com/c/4559/), indicating where your changelist
 can be reviewed.
 
+### Submit try jobs
+
+Skia's trybots allow testing and verification of changes before they land in the
+repo. You need to have permission to trigger try jobs; if you need permission,
+ask a committer. After uploading your CL to [Gerrit](https://skia-review.googlesource.com/),
+you may trigger a try job for any job listed in tasks.json, either via the
+Gerrit UI, using `git cl try`, eg.
+
+    git cl try -B skia.primary -b Some-Tryjob-Name
+
+or using bin/try, a small wrapper for `git cl try` which helps to choose try jobs.
+From a Skia checkout:
+
+    bin/try --list
+
+You can also search using regular expressions:
+
+    bin/try "Test.*GTX660.*Release"
+
+For more information about testing, see [testing infrastructure](https://skia.org/dev/testing/automated_testing).
+
 ### Request review
 
 Go to the supplied URL or go to the code review page and select the **Your**
@@ -104,7 +127,7 @@
 
 _Note_: If you don't see editing commands on the review page, click **Sign in**
 in the upper right. _Hint_: You can add -r reviewer@example.com --send-mail to
-send the email directly when uploading a change using git-cl.
+send the email directly when uploading a change using `git-cl`.
 
 
 The review process
@@ -134,8 +157,8 @@
     git cl upload
 
 Once you're ready for another review, use **Reply** again to send another
-notification (it is helpful to tell the review what you did with respect to each
-of their comments). When the reviewer is happy with your patch, they will
+notification (it is helpful to tell the reviewer what you did with respect to
+each of their comments). When the reviewer is happy with your patch, they will
 approve your change by setting the Code-Review label to "+1".
 
 _Note_: As you work through the review process, both you and your reviewers
@@ -155,7 +178,7 @@
 
 Skia's principal downstream user is Chromium, and any change to Skia rendering
 output can break Chromium. If your change alters rendering in any way, you are
-expected to test for and alleviate this. (You may be able to find a Skia team
+expected to test for and alleviate this. You may be able to find a Skia team
 member to help you, but the onus remains on each individual contributor to avoid
 breaking Chrome.
 
@@ -171,7 +194,7 @@
 
 [How to land Skia changes that change Blink layout test results](../chrome/layouttest)
 
-If you're changing the Skia API, you may need to make an associated change in Chromium.  
+If you're changing the Skia API, you may need to make an associated change in Chromium.
 If you do, please follow these instructions: [Landing Skia changes which require Chrome changes](../chrome/changes)
 
 
@@ -186,26 +209,26 @@
 If you don't have committer rights in https://skia.googlesource.com/skia.git ...
 first of all, thanks for submitting your patch!  We really appreciate these
 submissions.  After receiving an approval from a committer, you will be able to
-click the "Submit to CQ" button and submit your patch via the commit queue.  
+click the "Submit to CQ" button and submit your patch via the commit queue.
 
 In special instances, a Skia committer may assist you in landing the change
 by uploading a new codereview containing your patch (perhaps with some small
 adjustments at his/her discretion).  If so, you can mark your change as
 "Abandoned", and update it with a link to the new codereview.
 
-### Skia committers 
+### Skia committers
   *  tips on how to apply an externally provided patch are [here](./patch)
   *  when landing externally contributed patches, please note the original
      contributor's identity (and provide a link to the original codereview) in the commit message
 
-    git-cl will squash all your commits into a single one with the description you used when you uploaded your change.
+    `git-cl` will squash all your commits into a single one with the description you used when you uploaded your change.
 
     ~~~~
     git cl land
     ~~~~
-    
+
     or
-    
+
     ~~~~
     git cl land -c 'Contributor Name <email@example.com>'
     ~~~~
diff --git a/src/third_party/skia/site/dev/design/aaa.md b/src/third_party/skia/site/dev/design/aaa.md
new file mode 100644
index 0000000..127c0c5
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/aaa.md
@@ -0,0 +1,5 @@
+Analytic Anti-Alias
+====
+
+* [Analytic Anti-Alias Slides](https://docs.google.com/presentation/d/16r9HMS4_UBrcF3HUHscAqbSgkrtIwqaihZNwGP2TL_s/edit?usp=sharing)
+* [Analytic Anti-Alias Documents](https://docs.google.com/document/d/17Gq-huAf9q7wA4MRfXwpi_bYLrVeteKcSfAep0Am-wA/edit?usp=sharing)
diff --git a/src/third_party/skia/site/dev/design/conical/corollary2.2.1.ggb b/src/third_party/skia/site/dev/design/conical/corollary2.2.1.ggb
new file mode 100644
index 0000000..e8c14a3
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/corollary2.2.1.ggb
Binary files differ
diff --git a/src/third_party/skia/site/dev/design/conical/corollary2.2.1.svg b/src/third_party/skia/site/dev/design/conical/corollary2.2.1.svg
new file mode 100644
index 0000000..6245405
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/corollary2.2.1.svg
@@ -0,0 +1,233 @@
+<?xml version="1.0" standalone="no"?>
+
+<svg 
+     version="1.1"
+     baseProfile="full"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:ev="http://www.w3.org/2001/xml-events"
+     x="0px"
+     y="0px"
+     width="337px"
+     height="327px"
+     viewBox="0 0 337 327"
+     >
+<title></title>
+<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753  Source:  Date: Friday, December 22, 2017 4:11:08 PM EST</desc>
+<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
+  <path d="M 0 0 L 265 0 L 265 257 L 0 257 L 0 0 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 69.171875 149.359375 Q 68.421875 149.359375 68.03125 150.109375 Q 67.65625 150.859375 67.65625 152.359375 Q 67.65625 153.859375 68.03125 154.609375 Q 68.421875 155.359375 69.171875 155.359375 Q 69.953125 155.359375 70.328125 154.609375 Q 70.71875 153.859375 70.71875 152.359375 Q 70.71875 150.859375 70.328125 150.109375 Q 69.953125 149.359375 69.171875 149.359375 z M 69.171875 148.578125 Q 70.40625 148.578125 71.046875 149.546875 Q 71.703125 150.515625 71.703125 152.359375 Q 71.703125 154.203125 71.046875 155.171875 Q 70.40625 156.140625 69.171875 156.140625 Q 67.953125 156.140625 67.296875 155.171875 Q 66.65625 154.203125 66.65625 152.359375 Q 66.65625 150.515625 67.296875 149.546875 Q 67.953125 148.578125 69.171875 148.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 142.82509847769097 L 60.78662485303139 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 148.234375 155.171875 L 149.859375 155.171875 L 149.859375 149.609375 L 148.09375 149.953125 L 148.09375 149.0625 L 149.84375 148.703125 L 150.828125 148.703125 L 150.828125 155.171875 L 152.4375 155.171875 L 152.4375 156 L 148.234375 156 L 148.234375 155.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 149.83505704565925 142.82509847769097 L 149.83505704565925 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 237.921875 155.171875 L 241.359375 155.171875 L 241.359375 156 L 236.734375 156 L 236.734375 155.171875 Q 237.296875 154.59375 238.265625 153.609375 Q 239.234375 152.625 239.484375 152.34375 Q 239.953125 151.8125 240.140625 151.453125 Q 240.328125 151.078125 240.328125 150.71875 Q 240.328125 150.140625 239.921875 149.78125 Q 239.515625 149.40625 238.859375 149.40625 Q 238.390625 149.40625 237.875 149.578125 Q 237.375 149.734375 236.78125 150.0625 L 236.78125 149.0625 Q 237.375 148.828125 237.890625 148.703125 Q 238.40625 148.578125 238.84375 148.578125 Q 239.96875 148.578125 240.640625 149.140625 Q 241.328125 149.703125 241.328125 150.65625 Q 241.328125 151.109375 241.15625 151.515625 Q 240.984375 151.90625 240.546875 152.453125 Q 240.421875 152.59375 239.765625 153.28125 Q 239.109375 153.953125 237.921875 155.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 238.88348923828713 142.82509847769097 L 238.88348923828713 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 0 142.82509847769097 L 263 142.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 264 143.32509847769097 L 261 139.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 264 142.32509847769097 L 261 145.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 44.484375 231.859375 L 47.125 231.859375 L 47.125 232.65625 L 44.484375 232.65625 L 44.484375 231.859375 z M 48.8427734375 234.171875 L 50.4677734375 234.171875 L 50.4677734375 228.609375 L 48.7021484375 228.953125 L 48.7021484375 228.0625 L 50.4521484375 227.703125 L 51.4365234375 227.703125 L 51.4365234375 234.171875 L 53.0458984375 234.171875 L 53.0458984375 235 L 48.8427734375 235 L 48.8427734375 234.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 231.87353067031938 L 60.78662485303139 231.87353067031938"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 51.171875 133.359375 Q 50.421875 133.359375 50.03125 134.109375 Q 49.65625 134.859375 49.65625 136.359375 Q 49.65625 137.859375 50.03125 138.609375 Q 50.421875 139.359375 51.171875 139.359375 Q 51.953125 139.359375 52.328125 138.609375 Q 52.71875 137.859375 52.71875 136.359375 Q 52.71875 134.859375 52.328125 134.109375 Q 51.953125 133.359375 51.171875 133.359375 z M 51.171875 132.578125 Q 52.40625 132.578125 53.046875 133.546875 Q 53.703125 134.515625 53.703125 136.359375 Q 53.703125 138.203125 53.046875 139.171875 Q 52.40625 140.140625 51.171875 140.140625 Q 49.953125 140.140625 49.296875 139.171875 Q 48.65625 138.203125 48.65625 136.359375 Q 48.65625 134.515625 49.296875 133.546875 Q 49.953125 132.578125 51.171875 132.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 142.82509847769097 L 60.78662485303139 142.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 49.234375 56.171875 L 50.859375 56.171875 L 50.859375 50.609375 L 49.09375 50.953125 L 49.09375 50.0625 L 50.84375 49.703125 L 51.828125 49.703125 L 51.828125 56.171875 L 53.4375 56.171875 L 53.4375 57 L 49.234375 57 L 49.234375 56.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 53.776666285062575 L 60.78662485303139 53.776666285062575"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 2 L 60.78662485303139 257"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 61.28662485303139 1 L 57.78662485303139 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.28662485303139 1 L 63.78662485303139 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g id="misc">
+</g><!-- misc -->
+<g id="layer0">
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 238.88348923828713 142.82509847769097 C 238.88348923828713 192.00518957402107 199.0151481419891 231.87353067031938 149.83505704565925 231.87353067031938 C 100.65496594932941 231.87353067031938 60.786624853031384 192.00518957402107 60.786624853031384 142.82509847769097 C 60.786624853031384 93.64500738136084 100.65496594932941 53.776666285062575 149.83505704565925 53.776666285062575 C 199.0151481419891 53.776666285062575 238.88348923828713 93.64500738136084 238.88348923828713 142.82509847769097 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 33 22 L 133 22"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 56 22 C 56 23.65685424949238 54.65685424949238 25 53 25 C 51.34314575050762 25 50 23.65685424949238 50 22 C 50 20.34314575050762 51.34314575050762 19 53 19 C 54.65685424949238 19 56 20.34314575050762 56 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56 22 C 56 23.65685424949238 54.65685424949238 25 53 25 C 51.34314575050762 25 50 23.65685424949238 50 22 C 50 20.34314575050762 51.34314575050762 19 53 19 C 54.65685424949238 19 56 20.34314575050762 56 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 15.9375 33.4375 Q 15.75 33.34375 15.53125 33.296875 Q 15.328125 33.234375 15.0625 33.234375 Q 14.15625 33.234375 13.65625 33.828125 Q 13.171875 34.421875 13.171875 35.546875 L 13.171875 39 L 12.09375 39 L 12.09375 32.4375 L 13.171875 32.4375 L 13.171875 33.453125 Q 13.515625 32.859375 14.0625 32.578125 Q 14.609375 32.28125 15.390625 32.28125 Q 15.5 32.28125 15.625 32.296875 Q 15.765625 32.3125 15.921875 32.34375 L 15.9375 33.4375 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 17.16796875 43.171875 L 18.79296875 43.171875 L 18.79296875 37.609375 L 17.02734375 37.953125 L 17.02734375 37.0625 L 18.77734375 36.703125 L 19.76171875 36.703125 L 19.76171875 43.171875 L 21.37109375 43.171875 L 21.37109375 44 L 17.16796875 44 L 17.16796875 43.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 27.3759765625 33.546875 L 34.8916015625 33.546875 L 34.8916015625 34.53125 L 27.3759765625 34.53125 L 27.3759765625 33.546875 z M 27.3759765625 35.9375 L 34.8916015625 35.9375 L 34.8916015625 36.9375 L 27.3759765625 36.9375 L 27.3759765625 35.9375 z M 41.4638671875 38 L 43.4013671875 38 L 43.4013671875 31.328125 L 41.2919921875 31.75 L 41.2919921875 30.671875 L 43.3857421875 30.25 L 44.5732421875 30.25 L 44.5732421875 38 L 46.5107421875 38 L 46.5107421875 39 L 41.4638671875 39 L 41.4638671875 38 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 142.82509847769097 L 265 4.751810368390778"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 161.734375 128.921875 L 161.734375 130.171875 Q 161.125 129.609375 160.453125 129.34375 Q 159.78125 129.0625 159.015625 129.0625 Q 157.515625 129.0625 156.71875 129.984375 Q 155.921875 130.90625 155.921875 132.640625 Q 155.921875 134.359375 156.71875 135.28125 Q 157.515625 136.203125 159.015625 136.203125 Q 159.78125 136.203125 160.453125 135.921875 Q 161.125 135.640625 161.734375 135.09375 L 161.734375 136.328125 Q 161.109375 136.75 160.40625 136.96875 Q 159.71875 137.171875 158.953125 137.171875 Q 156.953125 137.171875 155.8125 135.953125 Q 154.671875 134.734375 154.671875 132.640625 Q 154.671875 130.53125 155.8125 129.3125 Q 156.953125 128.09375 158.953125 128.09375 Q 159.734375 128.09375 160.421875 128.3125 Q 161.125 128.515625 161.734375 128.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 163.61328125 141.171875 L 165.23828125 141.171875 L 165.23828125 135.609375 L 163.47265625 135.953125 L 163.47265625 135.0625 L 165.22265625 134.703125 L 166.20703125 134.703125 L 166.20703125 141.171875 L 167.81640625 141.171875 L 167.81640625 142 L 163.61328125 142 L 163.61328125 141.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 136 94 C 136 95.65685424949238 134.65685424949237 97 133 97 C 131.34314575050763 97 130 95.65685424949238 130 94 C 130 92.34314575050762 131.34314575050763 91 133 91 C 134.65685424949237 91 136 92.34314575050762 136 94 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 136 94 C 136 95.65685424949238 134.65685424949237 97 133 97 C 131.34314575050763 97 130 95.65685424949238 130 94 C 130 92.34314575050762 131.34314575050763 91 133 91 C 134.65685424949237 91 136 92.34314575050762 136 94 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 139.359375 80.21875 L 139.359375 83.515625 L 140.84375 83.515625 Q 141.671875 83.515625 142.125 83.09375 Q 142.578125 82.65625 142.578125 81.859375 Q 142.578125 81.078125 142.125 80.65625 Q 141.671875 80.21875 140.84375 80.21875 L 139.359375 80.21875 z M 138.171875 79.25 L 140.84375 79.25 Q 142.328125 79.25 143.078125 79.921875 Q 143.828125 80.578125 143.828125 81.859375 Q 143.828125 83.15625 143.078125 83.828125 Q 142.328125 84.484375 140.84375 84.484375 L 139.359375 84.484375 L 139.359375 88 L 138.171875 88 L 138.171875 79.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 72.734375 128.921875 L 72.734375 130.171875 Q 72.125 129.609375 71.453125 129.34375 Q 70.78125 129.0625 70.015625 129.0625 Q 68.515625 129.0625 67.71875 129.984375 Q 66.921875 130.90625 66.921875 132.640625 Q 66.921875 134.359375 67.71875 135.28125 Q 68.515625 136.203125 70.015625 136.203125 Q 70.78125 136.203125 71.453125 135.921875 Q 72.125 135.640625 72.734375 135.09375 L 72.734375 136.328125 Q 72.109375 136.75 71.40625 136.96875 Q 70.71875 137.171875 69.953125 137.171875 Q 67.953125 137.171875 66.8125 135.953125 Q 65.671875 134.734375 65.671875 132.640625 Q 65.671875 130.53125 66.8125 129.3125 Q 67.953125 128.09375 69.953125 128.09375 Q 70.734375 128.09375 71.421875 128.3125 Q 72.125 128.515625 72.734375 128.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 77.09765625 134.40625 L 77.09765625 135.15625 L 76.23828125 135.15625 Q 75.75390625 135.15625 75.56640625 135.359375 Q 75.37890625 135.546875 75.37890625 136.046875 L 75.37890625 136.53125 L 76.84765625 136.53125 L 76.84765625 137.234375 L 75.37890625 137.234375 L 75.37890625 142 L 74.47265625 142 L 74.47265625 137.234375 L 73.61328125 137.234375 L 73.61328125 136.53125 L 74.47265625 136.53125 L 74.47265625 136.15625 Q 74.47265625 135.234375 74.89453125 134.828125 Q 75.31640625 134.40625 76.23828125 134.40625 L 77.09765625 134.40625 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 186 60 C 186 61.65685424949238 184.65685424949237 63 183 63 C 181.34314575050763 63 180 61.65685424949238 180 60 C 180 58.34314575050762 181.34314575050763 57 183 57 C 184.65685424949237 57 186 58.34314575050762 186 60 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 186 60 C 186 61.65685424949238 184.65685424949237 63 183 63 C 181.34314575050763 63 180 61.65685424949238 180 60 C 180 58.34314575050762 181.34314575050763 57 183 57 C 184.65685424949237 57 186 58.34314575050762 186 60 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 189.359375 46.21875 L 189.359375 49.515625 L 190.84375 49.515625 Q 191.671875 49.515625 192.125 49.09375 Q 192.578125 48.65625 192.578125 47.859375 Q 192.578125 47.078125 192.125 46.65625 Q 191.671875 46.21875 190.84375 46.21875 L 189.359375 46.21875 z M 188.171875 45.25 L 190.84375 45.25 Q 192.328125 45.25 193.078125 45.921875 Q 193.828125 46.578125 193.828125 47.859375 Q 193.828125 49.15625 193.078125 49.828125 Q 192.328125 50.484375 190.84375 50.484375 L 189.359375 50.484375 L 189.359375 54 L 188.171875 54 L 188.171875 45.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 195.470703125 58.171875 L 197.095703125 58.171875 L 197.095703125 52.609375 L 195.330078125 52.953125 L 195.330078125 52.0625 L 197.080078125 51.703125 L 198.064453125 51.703125 L 198.064453125 58.171875 L 199.673828125 58.171875 L 199.673828125 59 L 195.470703125 59 L 195.470703125 58.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+</g><!-- layer0 -->
+</g> <!-- default stroke -->
+</svg> <!-- bounding box -->
diff --git a/src/third_party/skia/site/dev/design/conical/corollary2.2.2.ggb b/src/third_party/skia/site/dev/design/conical/corollary2.2.2.ggb
new file mode 100644
index 0000000..738991c
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/corollary2.2.2.ggb
Binary files differ
diff --git a/src/third_party/skia/site/dev/design/conical/corollary2.2.2.svg b/src/third_party/skia/site/dev/design/conical/corollary2.2.2.svg
new file mode 100644
index 0000000..b32cabd
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/corollary2.2.2.svg
@@ -0,0 +1,213 @@
+<?xml version="1.0" standalone="no"?>
+
+<svg 
+     version="1.1"
+     baseProfile="full"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:ev="http://www.w3.org/2001/xml-events"
+     x="0px"
+     y="0px"
+     width="337px"
+     height="327px"
+     viewBox="0 0 337 327"
+     >
+<title></title>
+<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753  Source:  Date: Friday, December 22, 2017 4:12:44 PM EST</desc>
+<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
+  <path d="M 0 0 L 265 0 L 265 257 L 0 257 L 0 0 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 69.171875 149.359375 Q 68.421875 149.359375 68.03125 150.109375 Q 67.65625 150.859375 67.65625 152.359375 Q 67.65625 153.859375 68.03125 154.609375 Q 68.421875 155.359375 69.171875 155.359375 Q 69.953125 155.359375 70.328125 154.609375 Q 70.71875 153.859375 70.71875 152.359375 Q 70.71875 150.859375 70.328125 150.109375 Q 69.953125 149.359375 69.171875 149.359375 z M 69.171875 148.578125 Q 70.40625 148.578125 71.046875 149.546875 Q 71.703125 150.515625 71.703125 152.359375 Q 71.703125 154.203125 71.046875 155.171875 Q 70.40625 156.140625 69.171875 156.140625 Q 67.953125 156.140625 67.296875 155.171875 Q 66.65625 154.203125 66.65625 152.359375 Q 66.65625 150.515625 67.296875 149.546875 Q 67.953125 148.578125 69.171875 148.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 142.82509847769097 L 60.78662485303139 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 148.234375 155.171875 L 149.859375 155.171875 L 149.859375 149.609375 L 148.09375 149.953125 L 148.09375 149.0625 L 149.84375 148.703125 L 150.828125 148.703125 L 150.828125 155.171875 L 152.4375 155.171875 L 152.4375 156 L 148.234375 156 L 148.234375 155.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 149.83505704565925 142.82509847769097 L 149.83505704565925 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 237.921875 155.171875 L 241.359375 155.171875 L 241.359375 156 L 236.734375 156 L 236.734375 155.171875 Q 237.296875 154.59375 238.265625 153.609375 Q 239.234375 152.625 239.484375 152.34375 Q 239.953125 151.8125 240.140625 151.453125 Q 240.328125 151.078125 240.328125 150.71875 Q 240.328125 150.140625 239.921875 149.78125 Q 239.515625 149.40625 238.859375 149.40625 Q 238.390625 149.40625 237.875 149.578125 Q 237.375 149.734375 236.78125 150.0625 L 236.78125 149.0625 Q 237.375 148.828125 237.890625 148.703125 Q 238.40625 148.578125 238.84375 148.578125 Q 239.96875 148.578125 240.640625 149.140625 Q 241.328125 149.703125 241.328125 150.65625 Q 241.328125 151.109375 241.15625 151.515625 Q 240.984375 151.90625 240.546875 152.453125 Q 240.421875 152.59375 239.765625 153.28125 Q 239.109375 153.953125 237.921875 155.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 238.88348923828713 142.82509847769097 L 238.88348923828713 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 0 142.82509847769097 L 263 142.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 264 143.32509847769097 L 261 139.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 264 142.32509847769097 L 261 145.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 44.484375 231.859375 L 47.125 231.859375 L 47.125 232.65625 L 44.484375 232.65625 L 44.484375 231.859375 z M 48.8427734375 234.171875 L 50.4677734375 234.171875 L 50.4677734375 228.609375 L 48.7021484375 228.953125 L 48.7021484375 228.0625 L 50.4521484375 227.703125 L 51.4365234375 227.703125 L 51.4365234375 234.171875 L 53.0458984375 234.171875 L 53.0458984375 235 L 48.8427734375 235 L 48.8427734375 234.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 231.87353067031938 L 60.78662485303139 231.87353067031938"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 51.171875 133.359375 Q 50.421875 133.359375 50.03125 134.109375 Q 49.65625 134.859375 49.65625 136.359375 Q 49.65625 137.859375 50.03125 138.609375 Q 50.421875 139.359375 51.171875 139.359375 Q 51.953125 139.359375 52.328125 138.609375 Q 52.71875 137.859375 52.71875 136.359375 Q 52.71875 134.859375 52.328125 134.109375 Q 51.953125 133.359375 51.171875 133.359375 z M 51.171875 132.578125 Q 52.40625 132.578125 53.046875 133.546875 Q 53.703125 134.515625 53.703125 136.359375 Q 53.703125 138.203125 53.046875 139.171875 Q 52.40625 140.140625 51.171875 140.140625 Q 49.953125 140.140625 49.296875 139.171875 Q 48.65625 138.203125 48.65625 136.359375 Q 48.65625 134.515625 49.296875 133.546875 Q 49.953125 132.578125 51.171875 132.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 142.82509847769097 L 60.78662485303139 142.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 49.234375 56.171875 L 50.859375 56.171875 L 50.859375 50.609375 L 49.09375 50.953125 L 49.09375 50.0625 L 50.84375 49.703125 L 51.828125 49.703125 L 51.828125 56.171875 L 53.4375 56.171875 L 53.4375 57 L 49.234375 57 L 49.234375 56.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 53.776666285062575 L 60.78662485303139 53.776666285062575"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 2 L 60.78662485303139 257"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 61.28662485303139 1 L 57.78662485303139 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.28662485303139 1 L 63.78662485303139 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g id="misc">
+</g><!-- misc -->
+<g id="layer0">
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 238.88348923828713 142.82509847769097 C 238.88348923828713 192.00518957402107 199.0151481419891 231.87353067031938 149.83505704565925 231.87353067031938 C 100.65496594932941 231.87353067031938 60.786624853031384 192.00518957402107 60.786624853031384 142.82509847769097 C 60.786624853031384 93.64500738136084 100.65496594932941 53.776666285062575 149.83505704565925 53.776666285062575 C 199.0151481419891 53.776666285062575 238.88348923828713 93.64500738136084 238.88348923828713 142.82509847769097 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 33 22 L 133 22"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 56 22 C 56 23.65685424949238 54.65685424949238 25 53 25 C 51.34314575050762 25 50 23.65685424949238 50 22 C 50 20.34314575050762 51.34314575050762 19 53 19 C 54.65685424949238 19 56 20.34314575050762 56 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56 22 C 56 23.65685424949238 54.65685424949238 25 53 25 C 51.34314575050762 25 50 23.65685424949238 50 22 C 50 20.34314575050762 51.34314575050762 19 53 19 C 54.65685424949238 19 56 20.34314575050762 56 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 15.9375 33.4375 Q 15.75 33.34375 15.53125 33.296875 Q 15.328125 33.234375 15.0625 33.234375 Q 14.15625 33.234375 13.65625 33.828125 Q 13.171875 34.421875 13.171875 35.546875 L 13.171875 39 L 12.09375 39 L 12.09375 32.4375 L 13.171875 32.4375 L 13.171875 33.453125 Q 13.515625 32.859375 14.0625 32.578125 Q 14.609375 32.28125 15.390625 32.28125 Q 15.5 32.28125 15.625 32.296875 Q 15.765625 32.3125 15.921875 32.34375 L 15.9375 33.4375 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 17.16796875 43.171875 L 18.79296875 43.171875 L 18.79296875 37.609375 L 17.02734375 37.953125 L 17.02734375 37.0625 L 18.77734375 36.703125 L 19.76171875 36.703125 L 19.76171875 43.171875 L 21.37109375 43.171875 L 21.37109375 44 L 17.16796875 44 L 17.16796875 43.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 27.3759765625 33.546875 L 34.8916015625 33.546875 L 34.8916015625 34.53125 L 27.3759765625 34.53125 L 27.3759765625 33.546875 z M 27.3759765625 35.9375 L 34.8916015625 35.9375 L 34.8916015625 36.9375 L 27.3759765625 36.9375 L 27.3759765625 35.9375 z M 41.4638671875 38 L 43.4013671875 38 L 43.4013671875 31.328125 L 41.2919921875 31.75 L 41.2919921875 30.671875 L 43.3857421875 30.25 L 44.5732421875 30.25 L 44.5732421875 38 L 46.5107421875 38 L 46.5107421875 39 L 41.4638671875 39 L 41.4638671875 38 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 142.82509847769097 L -26.259375880414986 0"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 161.734375 128.921875 L 161.734375 130.171875 Q 161.125 129.609375 160.453125 129.34375 Q 159.78125 129.0625 159.015625 129.0625 Q 157.515625 129.0625 156.71875 129.984375 Q 155.921875 130.90625 155.921875 132.640625 Q 155.921875 134.359375 156.71875 135.28125 Q 157.515625 136.203125 159.015625 136.203125 Q 159.78125 136.203125 160.453125 135.921875 Q 161.125 135.640625 161.734375 135.09375 L 161.734375 136.328125 Q 161.109375 136.75 160.40625 136.96875 Q 159.71875 137.171875 158.953125 137.171875 Q 156.953125 137.171875 155.8125 135.953125 Q 154.671875 134.734375 154.671875 132.640625 Q 154.671875 130.53125 155.8125 129.3125 Q 156.953125 128.09375 158.953125 128.09375 Q 159.734375 128.09375 160.421875 128.3125 Q 161.125 128.515625 161.734375 128.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 163.61328125 141.171875 L 165.23828125 141.171875 L 165.23828125 135.609375 L 163.47265625 135.953125 L 163.47265625 135.0625 L 165.22265625 134.703125 L 166.20703125 134.703125 L 166.20703125 141.171875 L 167.81640625 141.171875 L 167.81640625 142 L 163.61328125 142 L 163.61328125 141.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 45 112 C 45 113.65685424949238 43.65685424949238 115 42 115 C 40.34314575050762 115 39 113.65685424949238 39 112 C 39 110.34314575050762 40.34314575050762 109 42 109 C 43.65685424949238 109 45 110.34314575050762 45 112 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 45 112 C 45 113.65685424949238 43.65685424949238 115 42 115 C 40.34314575050762 115 39 113.65685424949238 39 112 C 39 110.34314575050762 40.34314575050762 109 42 109 C 43.65685424949238 109 45 110.34314575050762 45 112 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 48.359375 98.21875 L 48.359375 101.515625 L 49.84375 101.515625 Q 50.671875 101.515625 51.125 101.09375 Q 51.578125 100.65625 51.578125 99.859375 Q 51.578125 99.078125 51.125 98.65625 Q 50.671875 98.21875 49.84375 98.21875 L 48.359375 98.21875 z M 47.171875 97.25 L 49.84375 97.25 Q 51.328125 97.25 52.078125 97.921875 Q 52.828125 98.578125 52.828125 99.859375 Q 52.828125 101.15625 52.078125 101.828125 Q 51.328125 102.484375 49.84375 102.484375 L 48.359375 102.484375 L 48.359375 106 L 47.171875 106 L 47.171875 97.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 72.734375 128.921875 L 72.734375 130.171875 Q 72.125 129.609375 71.453125 129.34375 Q 70.78125 129.0625 70.015625 129.0625 Q 68.515625 129.0625 67.71875 129.984375 Q 66.921875 130.90625 66.921875 132.640625 Q 66.921875 134.359375 67.71875 135.28125 Q 68.515625 136.203125 70.015625 136.203125 Q 70.78125 136.203125 71.453125 135.921875 Q 72.125 135.640625 72.734375 135.09375 L 72.734375 136.328125 Q 72.109375 136.75 71.40625 136.96875 Q 70.71875 137.171875 69.953125 137.171875 Q 67.953125 137.171875 66.8125 135.953125 Q 65.671875 134.734375 65.671875 132.640625 Q 65.671875 130.53125 66.8125 129.3125 Q 67.953125 128.09375 69.953125 128.09375 Q 70.734375 128.09375 71.421875 128.3125 Q 72.125 128.515625 72.734375 128.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 77.09765625 134.40625 L 77.09765625 135.15625 L 76.23828125 135.15625 Q 75.75390625 135.15625 75.56640625 135.359375 Q 75.37890625 135.546875 75.37890625 136.046875 L 75.37890625 136.53125 L 76.84765625 136.53125 L 76.84765625 137.234375 L 75.37890625 137.234375 L 75.37890625 142 L 74.47265625 142 L 74.47265625 137.234375 L 73.61328125 137.234375 L 73.61328125 136.53125 L 74.47265625 136.53125 L 74.47265625 136.15625 Q 74.47265625 135.234375 74.89453125 134.828125 Q 75.31640625 134.40625 76.23828125 134.40625 L 77.09765625 134.40625 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+</g><!-- layer0 -->
+</g> <!-- default stroke -->
+</svg> <!-- bounding box -->
diff --git a/src/third_party/skia/site/dev/design/conical/corollary2.2.ggb b/src/third_party/skia/site/dev/design/conical/corollary2.2.ggb
new file mode 100644
index 0000000..0fdb721
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/corollary2.2.ggb
Binary files differ
diff --git a/src/third_party/skia/site/dev/design/conical/corollary2.3.1.ggb b/src/third_party/skia/site/dev/design/conical/corollary2.3.1.ggb
new file mode 100644
index 0000000..7ff09cf
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/corollary2.3.1.ggb
Binary files differ
diff --git a/src/third_party/skia/site/dev/design/conical/corollary2.3.1.svg b/src/third_party/skia/site/dev/design/conical/corollary2.3.1.svg
new file mode 100644
index 0000000..1a458ed
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/corollary2.3.1.svg
@@ -0,0 +1,213 @@
+<?xml version="1.0" standalone="no"?>
+
+<svg 
+     version="1.1"
+     baseProfile="full"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:ev="http://www.w3.org/2001/xml-events"
+     x="0px"
+     y="0px"
+     width="337px"
+     height="327px"
+     viewBox="0 0 337 327"
+     >
+<title></title>
+<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753  Source:  Date: Friday, December 22, 2017 4:14:25 PM EST</desc>
+<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
+  <path d="M 0 0 L 265 0 L 265 257 L 0 257 L 0 0 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 69.171875 149.359375 Q 68.421875 149.359375 68.03125 150.109375 Q 67.65625 150.859375 67.65625 152.359375 Q 67.65625 153.859375 68.03125 154.609375 Q 68.421875 155.359375 69.171875 155.359375 Q 69.953125 155.359375 70.328125 154.609375 Q 70.71875 153.859375 70.71875 152.359375 Q 70.71875 150.859375 70.328125 150.109375 Q 69.953125 149.359375 69.171875 149.359375 z M 69.171875 148.578125 Q 70.40625 148.578125 71.046875 149.546875 Q 71.703125 150.515625 71.703125 152.359375 Q 71.703125 154.203125 71.046875 155.171875 Q 70.40625 156.140625 69.171875 156.140625 Q 67.953125 156.140625 67.296875 155.171875 Q 66.65625 154.203125 66.65625 152.359375 Q 66.65625 150.515625 67.296875 149.546875 Q 67.953125 148.578125 69.171875 148.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 142.82509847769097 L 60.78662485303139 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 148.234375 155.171875 L 149.859375 155.171875 L 149.859375 149.609375 L 148.09375 149.953125 L 148.09375 149.0625 L 149.84375 148.703125 L 150.828125 148.703125 L 150.828125 155.171875 L 152.4375 155.171875 L 152.4375 156 L 148.234375 156 L 148.234375 155.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 149.83505704565925 142.82509847769097 L 149.83505704565925 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 237.921875 155.171875 L 241.359375 155.171875 L 241.359375 156 L 236.734375 156 L 236.734375 155.171875 Q 237.296875 154.59375 238.265625 153.609375 Q 239.234375 152.625 239.484375 152.34375 Q 239.953125 151.8125 240.140625 151.453125 Q 240.328125 151.078125 240.328125 150.71875 Q 240.328125 150.140625 239.921875 149.78125 Q 239.515625 149.40625 238.859375 149.40625 Q 238.390625 149.40625 237.875 149.578125 Q 237.375 149.734375 236.78125 150.0625 L 236.78125 149.0625 Q 237.375 148.828125 237.890625 148.703125 Q 238.40625 148.578125 238.84375 148.578125 Q 239.96875 148.578125 240.640625 149.140625 Q 241.328125 149.703125 241.328125 150.65625 Q 241.328125 151.109375 241.15625 151.515625 Q 240.984375 151.90625 240.546875 152.453125 Q 240.421875 152.59375 239.765625 153.28125 Q 239.109375 153.953125 237.921875 155.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 238.88348923828713 142.82509847769097 L 238.88348923828713 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 0 142.82509847769097 L 263 142.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 264 143.32509847769097 L 261 139.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 264 142.32509847769097 L 261 145.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 44.484375 231.859375 L 47.125 231.859375 L 47.125 232.65625 L 44.484375 232.65625 L 44.484375 231.859375 z M 48.8427734375 234.171875 L 50.4677734375 234.171875 L 50.4677734375 228.609375 L 48.7021484375 228.953125 L 48.7021484375 228.0625 L 50.4521484375 227.703125 L 51.4365234375 227.703125 L 51.4365234375 234.171875 L 53.0458984375 234.171875 L 53.0458984375 235 L 48.8427734375 235 L 48.8427734375 234.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 231.87353067031938 L 60.78662485303139 231.87353067031938"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 51.171875 133.359375 Q 50.421875 133.359375 50.03125 134.109375 Q 49.65625 134.859375 49.65625 136.359375 Q 49.65625 137.859375 50.03125 138.609375 Q 50.421875 139.359375 51.171875 139.359375 Q 51.953125 139.359375 52.328125 138.609375 Q 52.71875 137.859375 52.71875 136.359375 Q 52.71875 134.859375 52.328125 134.109375 Q 51.953125 133.359375 51.171875 133.359375 z M 51.171875 132.578125 Q 52.40625 132.578125 53.046875 133.546875 Q 53.703125 134.515625 53.703125 136.359375 Q 53.703125 138.203125 53.046875 139.171875 Q 52.40625 140.140625 51.171875 140.140625 Q 49.953125 140.140625 49.296875 139.171875 Q 48.65625 138.203125 48.65625 136.359375 Q 48.65625 134.515625 49.296875 133.546875 Q 49.953125 132.578125 51.171875 132.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 142.82509847769097 L 60.78662485303139 142.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 49.234375 56.171875 L 50.859375 56.171875 L 50.859375 50.609375 L 49.09375 50.953125 L 49.09375 50.0625 L 50.84375 49.703125 L 51.828125 49.703125 L 51.828125 56.171875 L 53.4375 56.171875 L 53.4375 57 L 49.234375 57 L 49.234375 56.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 53.776666285062575 L 60.78662485303139 53.776666285062575"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 2 L 60.78662485303139 257"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 61.28662485303139 1 L 57.78662485303139 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.28662485303139 1 L 63.78662485303139 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g id="misc">
+</g><!-- misc -->
+<g id="layer0">
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 221.07380279976155 142.82509847769097 C 221.07380279976155 182.16917135475506 189.17912992272312 214.0638442317937 149.83505704565925 214.0638442317937 C 110.49098416859538 214.0638442317937 78.59631129155696 182.16917135475506 78.59631129155696 142.82509847769097 C 78.59631129155696 103.48102560062685 110.49098416859538 71.58635272358825 149.83505704565925 71.58635272358825 C 189.17912992272312 71.58635272358825 221.07380279976155 103.48102560062685 221.07380279976155 142.82509847769097 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 33 22 L 133 22"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 52 22 C 52 23.65685424949238 50.65685424949238 25 49 25 C 47.34314575050762 25 46 23.65685424949238 46 22 C 46 20.34314575050762 47.34314575050762 19 49 19 C 50.65685424949238 19 52 20.34314575050762 52 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 52 22 C 52 23.65685424949238 50.65685424949238 25 49 25 C 47.34314575050762 25 46 23.65685424949238 46 22 C 46 20.34314575050762 47.34314575050762 19 49 19 C 50.65685424949238 19 52 20.34314575050762 52 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 11.9375 33.4375 Q 11.75 33.34375 11.53125 33.296875 Q 11.328125 33.234375 11.0625 33.234375 Q 10.15625 33.234375 9.65625 33.828125 Q 9.171875 34.421875 9.171875 35.546875 L 9.171875 39 L 8.09375 39 L 8.09375 32.4375 L 9.171875 32.4375 L 9.171875 33.453125 Q 9.515625 32.859375 10.0625 32.578125 Q 10.609375 32.28125 11.390625 32.28125 Q 11.5 32.28125 11.625 32.296875 Q 11.765625 32.3125 11.921875 32.34375 L 11.9375 33.4375 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 13.16796875 43.171875 L 14.79296875 43.171875 L 14.79296875 37.609375 L 13.02734375 37.953125 L 13.02734375 37.0625 L 14.77734375 36.703125 L 15.76171875 36.703125 L 15.76171875 43.171875 L 17.37109375 43.171875 L 17.37109375 44 L 13.16796875 44 L 13.16796875 43.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 23.3759765625 33.546875 L 30.8916015625 33.546875 L 30.8916015625 34.53125 L 23.3759765625 34.53125 L 23.3759765625 33.546875 z M 23.3759765625 35.9375 L 30.8916015625 35.9375 L 30.8916015625 36.9375 L 23.3759765625 36.9375 L 23.3759765625 35.9375 z M 39.7919921875 31.03125 Q 38.8857421875 31.03125 38.4169921875 31.9375 Q 37.9638671875 32.828125 37.9638671875 34.640625 Q 37.9638671875 36.4375 38.4169921875 37.34375 Q 38.8857421875 38.234375 39.7919921875 38.234375 Q 40.7138671875 38.234375 41.1669921875 37.34375 Q 41.6357421875 36.4375 41.6357421875 34.640625 Q 41.6357421875 32.828125 41.1669921875 31.9375 Q 40.7138671875 31.03125 39.7919921875 31.03125 z M 39.7919921875 30.09375 Q 41.2607421875 30.09375 42.0419921875 31.265625 Q 42.8232421875 32.421875 42.8232421875 34.640625 Q 42.8232421875 36.84375 42.0419921875 38.015625 Q 41.2607421875 39.171875 39.7919921875 39.171875 Q 38.3232421875 39.171875 37.5419921875 38.015625 Q 36.7763671875 36.84375 36.7763671875 34.640625 Q 36.7763671875 32.421875 37.5419921875 31.265625 Q 38.3232421875 30.09375 39.7919921875 30.09375 z M 44.8955078125 37.515625 L 46.1298828125 37.515625 L 46.1298828125 39 L 44.8955078125 39 L 44.8955078125 37.515625 z M 51.2412109375 34.84375 Q 50.3974609375 34.84375 49.9130859375 35.296875 Q 49.4287109375 35.75 49.4287109375 36.53125 Q 49.4287109375 37.328125 49.9130859375 37.78125 Q 50.3974609375 38.234375 51.2412109375 38.234375 Q 52.0849609375 38.234375 52.5693359375 37.78125 Q 53.0537109375 37.328125 53.0537109375 36.53125 Q 53.0537109375 35.75 52.5693359375 35.296875 Q 52.1005859375 34.84375 51.2412109375 34.84375 z M 50.0537109375 34.34375 Q 49.3037109375 34.15625 48.8662109375 33.640625 Q 48.4443359375 33.109375 48.4443359375 32.359375 Q 48.4443359375 31.3125 49.1943359375 30.703125 Q 49.9443359375 30.09375 51.2412109375 30.09375 Q 52.5537109375 30.09375 53.2880859375 30.703125 Q 54.0380859375 31.3125 54.0380859375 32.359375 Q 54.0380859375 33.109375 53.6162109375 33.640625 Q 53.1943359375 34.15625 52.4287109375 34.34375 Q 53.2880859375 34.546875 53.7568359375 35.125 Q 54.2412109375 35.703125 54.2412109375 36.53125 Q 54.2412109375 37.8125 53.4599609375 38.5 Q 52.6943359375 39.171875 51.2412109375 39.171875 Q 49.8037109375 39.171875 49.0224609375 38.5 Q 48.2412109375 37.8125 48.2412109375 36.53125 Q 48.2412109375 35.703125 48.7255859375 35.125 Q 49.2099609375 34.546875 50.0537109375 34.34375 z M 49.6318359375 32.46875 Q 49.6318359375 33.15625 50.0537109375 33.53125 Q 50.4755859375 33.90625 51.2412109375 33.90625 Q 52.0068359375 33.90625 52.4287109375 33.53125 Q 52.8662109375 33.15625 52.8662109375 32.46875 Q 52.8662109375 31.796875 52.4287109375 31.421875 Q 52.0068359375 31.03125 51.2412109375 31.03125 Q 50.4755859375 31.03125 50.0537109375 31.421875 Q 49.6318359375 31.796875 49.6318359375 32.46875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 142.82509847769097 L -26.259375880414986 0"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 161.734375 128.921875 L 161.734375 130.171875 Q 161.125 129.609375 160.453125 129.34375 Q 159.78125 129.0625 159.015625 129.0625 Q 157.515625 129.0625 156.71875 129.984375 Q 155.921875 130.90625 155.921875 132.640625 Q 155.921875 134.359375 156.71875 135.28125 Q 157.515625 136.203125 159.015625 136.203125 Q 159.78125 136.203125 160.453125 135.921875 Q 161.125 135.640625 161.734375 135.09375 L 161.734375 136.328125 Q 161.109375 136.75 160.40625 136.96875 Q 159.71875 137.171875 158.953125 137.171875 Q 156.953125 137.171875 155.8125 135.953125 Q 154.671875 134.734375 154.671875 132.640625 Q 154.671875 130.53125 155.8125 129.3125 Q 156.953125 128.09375 158.953125 128.09375 Q 159.734375 128.09375 160.421875 128.3125 Q 161.125 128.515625 161.734375 128.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 163.61328125 141.171875 L 165.23828125 141.171875 L 165.23828125 135.609375 L 163.47265625 135.953125 L 163.47265625 135.0625 L 165.22265625 134.703125 L 166.20703125 134.703125 L 166.20703125 141.171875 L 167.81640625 141.171875 L 167.81640625 142 L 163.61328125 142 L 163.61328125 141.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 45 112 C 45 113.65685424949238 43.65685424949238 115 42 115 C 40.34314575050762 115 39 113.65685424949238 39 112 C 39 110.34314575050762 40.34314575050762 109 42 109 C 43.65685424949238 109 45 110.34314575050762 45 112 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 45 112 C 45 113.65685424949238 43.65685424949238 115 42 115 C 40.34314575050762 115 39 113.65685424949238 39 112 C 39 110.34314575050762 40.34314575050762 109 42 109 C 43.65685424949238 109 45 110.34314575050762 45 112 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 48.359375 98.21875 L 48.359375 101.515625 L 49.84375 101.515625 Q 50.671875 101.515625 51.125 101.09375 Q 51.578125 100.65625 51.578125 99.859375 Q 51.578125 99.078125 51.125 98.65625 Q 50.671875 98.21875 49.84375 98.21875 L 48.359375 98.21875 z M 47.171875 97.25 L 49.84375 97.25 Q 51.328125 97.25 52.078125 97.921875 Q 52.828125 98.578125 52.828125 99.859375 Q 52.828125 101.15625 52.078125 101.828125 Q 51.328125 102.484375 49.84375 102.484375 L 48.359375 102.484375 L 48.359375 106 L 47.171875 106 L 47.171875 97.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 72.734375 128.921875 L 72.734375 130.171875 Q 72.125 129.609375 71.453125 129.34375 Q 70.78125 129.0625 70.015625 129.0625 Q 68.515625 129.0625 67.71875 129.984375 Q 66.921875 130.90625 66.921875 132.640625 Q 66.921875 134.359375 67.71875 135.28125 Q 68.515625 136.203125 70.015625 136.203125 Q 70.78125 136.203125 71.453125 135.921875 Q 72.125 135.640625 72.734375 135.09375 L 72.734375 136.328125 Q 72.109375 136.75 71.40625 136.96875 Q 70.71875 137.171875 69.953125 137.171875 Q 67.953125 137.171875 66.8125 135.953125 Q 65.671875 134.734375 65.671875 132.640625 Q 65.671875 130.53125 66.8125 129.3125 Q 67.953125 128.09375 69.953125 128.09375 Q 70.734375 128.09375 71.421875 128.3125 Q 72.125 128.515625 72.734375 128.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 77.09765625 134.40625 L 77.09765625 135.15625 L 76.23828125 135.15625 Q 75.75390625 135.15625 75.56640625 135.359375 Q 75.37890625 135.546875 75.37890625 136.046875 L 75.37890625 136.53125 L 76.84765625 136.53125 L 76.84765625 137.234375 L 75.37890625 137.234375 L 75.37890625 142 L 74.47265625 142 L 74.47265625 137.234375 L 73.61328125 137.234375 L 73.61328125 136.53125 L 74.47265625 136.53125 L 74.47265625 136.15625 Q 74.47265625 135.234375 74.89453125 134.828125 Q 75.31640625 134.40625 76.23828125 134.40625 L 77.09765625 134.40625 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+</g><!-- layer0 -->
+</g> <!-- default stroke -->
+</svg> <!-- bounding box -->
diff --git a/src/third_party/skia/site/dev/design/conical/corollary2.3.2.ggb b/src/third_party/skia/site/dev/design/conical/corollary2.3.2.ggb
new file mode 100644
index 0000000..a0d6182
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/corollary2.3.2.ggb
Binary files differ
diff --git a/src/third_party/skia/site/dev/design/conical/corollary2.3.2.svg b/src/third_party/skia/site/dev/design/conical/corollary2.3.2.svg
new file mode 100644
index 0000000..ed5e61b
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/corollary2.3.2.svg
@@ -0,0 +1,233 @@
+<?xml version="1.0" standalone="no"?>
+
+<svg 
+     version="1.1"
+     baseProfile="full"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:ev="http://www.w3.org/2001/xml-events"
+     x="0px"
+     y="0px"
+     width="337px"
+     height="327px"
+     viewBox="0 0 337 327"
+     >
+<title></title>
+<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753  Source:  Date: Friday, December 22, 2017 4:15:24 PM EST</desc>
+<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
+  <path d="M 0 0 L 265 0 L 265 257 L 0 257 L 0 0 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 69.171875 149.359375 Q 68.421875 149.359375 68.03125 150.109375 Q 67.65625 150.859375 67.65625 152.359375 Q 67.65625 153.859375 68.03125 154.609375 Q 68.421875 155.359375 69.171875 155.359375 Q 69.953125 155.359375 70.328125 154.609375 Q 70.71875 153.859375 70.71875 152.359375 Q 70.71875 150.859375 70.328125 150.109375 Q 69.953125 149.359375 69.171875 149.359375 z M 69.171875 148.578125 Q 70.40625 148.578125 71.046875 149.546875 Q 71.703125 150.515625 71.703125 152.359375 Q 71.703125 154.203125 71.046875 155.171875 Q 70.40625 156.140625 69.171875 156.140625 Q 67.953125 156.140625 67.296875 155.171875 Q 66.65625 154.203125 66.65625 152.359375 Q 66.65625 150.515625 67.296875 149.546875 Q 67.953125 148.578125 69.171875 148.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 142.82509847769097 L 60.78662485303139 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 148.234375 155.171875 L 149.859375 155.171875 L 149.859375 149.609375 L 148.09375 149.953125 L 148.09375 149.0625 L 149.84375 148.703125 L 150.828125 148.703125 L 150.828125 155.171875 L 152.4375 155.171875 L 152.4375 156 L 148.234375 156 L 148.234375 155.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 149.83505704565925 142.82509847769097 L 149.83505704565925 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 237.921875 155.171875 L 241.359375 155.171875 L 241.359375 156 L 236.734375 156 L 236.734375 155.171875 Q 237.296875 154.59375 238.265625 153.609375 Q 239.234375 152.625 239.484375 152.34375 Q 239.953125 151.8125 240.140625 151.453125 Q 240.328125 151.078125 240.328125 150.71875 Q 240.328125 150.140625 239.921875 149.78125 Q 239.515625 149.40625 238.859375 149.40625 Q 238.390625 149.40625 237.875 149.578125 Q 237.375 149.734375 236.78125 150.0625 L 236.78125 149.0625 Q 237.375 148.828125 237.890625 148.703125 Q 238.40625 148.578125 238.84375 148.578125 Q 239.96875 148.578125 240.640625 149.140625 Q 241.328125 149.703125 241.328125 150.65625 Q 241.328125 151.109375 241.15625 151.515625 Q 240.984375 151.90625 240.546875 152.453125 Q 240.421875 152.59375 239.765625 153.28125 Q 239.109375 153.953125 237.921875 155.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 238.88348923828713 142.82509847769097 L 238.88348923828713 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 0 142.82509847769097 L 263 142.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 264 143.32509847769097 L 261 139.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 264 142.32509847769097 L 261 145.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 44.484375 231.859375 L 47.125 231.859375 L 47.125 232.65625 L 44.484375 232.65625 L 44.484375 231.859375 z M 48.8427734375 234.171875 L 50.4677734375 234.171875 L 50.4677734375 228.609375 L 48.7021484375 228.953125 L 48.7021484375 228.0625 L 50.4521484375 227.703125 L 51.4365234375 227.703125 L 51.4365234375 234.171875 L 53.0458984375 234.171875 L 53.0458984375 235 L 48.8427734375 235 L 48.8427734375 234.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 231.87353067031938 L 60.78662485303139 231.87353067031938"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 51.171875 133.359375 Q 50.421875 133.359375 50.03125 134.109375 Q 49.65625 134.859375 49.65625 136.359375 Q 49.65625 137.859375 50.03125 138.609375 Q 50.421875 139.359375 51.171875 139.359375 Q 51.953125 139.359375 52.328125 138.609375 Q 52.71875 137.859375 52.71875 136.359375 Q 52.71875 134.859375 52.328125 134.109375 Q 51.953125 133.359375 51.171875 133.359375 z M 51.171875 132.578125 Q 52.40625 132.578125 53.046875 133.546875 Q 53.703125 134.515625 53.703125 136.359375 Q 53.703125 138.203125 53.046875 139.171875 Q 52.40625 140.140625 51.171875 140.140625 Q 49.953125 140.140625 49.296875 139.171875 Q 48.65625 138.203125 48.65625 136.359375 Q 48.65625 134.515625 49.296875 133.546875 Q 49.953125 132.578125 51.171875 132.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 142.82509847769097 L 60.78662485303139 142.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 49.234375 56.171875 L 50.859375 56.171875 L 50.859375 50.609375 L 49.09375 50.953125 L 49.09375 50.0625 L 50.84375 49.703125 L 51.828125 49.703125 L 51.828125 56.171875 L 53.4375 56.171875 L 53.4375 57 L 49.234375 57 L 49.234375 56.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 53.776666285062575 L 60.78662485303139 53.776666285062575"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 2 L 60.78662485303139 257"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 61.28662485303139 1 L 57.78662485303139 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.28662485303139 1 L 63.78662485303139 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g id="misc">
+</g><!-- misc -->
+<g id="layer0">
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 221.07380279976155 142.82509847769097 C 221.07380279976155 182.16917135475506 189.17912992272312 214.0638442317937 149.83505704565925 214.0638442317937 C 110.49098416859538 214.0638442317937 78.59631129155696 182.16917135475506 78.59631129155696 142.82509847769097 C 78.59631129155696 103.48102560062685 110.49098416859538 71.58635272358825 149.83505704565925 71.58635272358825 C 189.17912992272312 71.58635272358825 221.07380279976155 103.48102560062685 221.07380279976155 142.82509847769097 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 33 22 L 133 22"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 52 22 C 52 23.65685424949238 50.65685424949238 25 49 25 C 47.34314575050762 25 46 23.65685424949238 46 22 C 46 20.34314575050762 47.34314575050762 19 49 19 C 50.65685424949238 19 52 20.34314575050762 52 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 52 22 C 52 23.65685424949238 50.65685424949238 25 49 25 C 47.34314575050762 25 46 23.65685424949238 46 22 C 46 20.34314575050762 47.34314575050762 19 49 19 C 50.65685424949238 19 52 20.34314575050762 52 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 11.9375 33.4375 Q 11.75 33.34375 11.53125 33.296875 Q 11.328125 33.234375 11.0625 33.234375 Q 10.15625 33.234375 9.65625 33.828125 Q 9.171875 34.421875 9.171875 35.546875 L 9.171875 39 L 8.09375 39 L 8.09375 32.4375 L 9.171875 32.4375 L 9.171875 33.453125 Q 9.515625 32.859375 10.0625 32.578125 Q 10.609375 32.28125 11.390625 32.28125 Q 11.5 32.28125 11.625 32.296875 Q 11.765625 32.3125 11.921875 32.34375 L 11.9375 33.4375 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 13.16796875 43.171875 L 14.79296875 43.171875 L 14.79296875 37.609375 L 13.02734375 37.953125 L 13.02734375 37.0625 L 14.77734375 36.703125 L 15.76171875 36.703125 L 15.76171875 43.171875 L 17.37109375 43.171875 L 17.37109375 44 L 13.16796875 44 L 13.16796875 43.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 23.3759765625 33.546875 L 30.8916015625 33.546875 L 30.8916015625 34.53125 L 23.3759765625 34.53125 L 23.3759765625 33.546875 z M 23.3759765625 35.9375 L 30.8916015625 35.9375 L 30.8916015625 36.9375 L 23.3759765625 36.9375 L 23.3759765625 35.9375 z M 39.7919921875 31.03125 Q 38.8857421875 31.03125 38.4169921875 31.9375 Q 37.9638671875 32.828125 37.9638671875 34.640625 Q 37.9638671875 36.4375 38.4169921875 37.34375 Q 38.8857421875 38.234375 39.7919921875 38.234375 Q 40.7138671875 38.234375 41.1669921875 37.34375 Q 41.6357421875 36.4375 41.6357421875 34.640625 Q 41.6357421875 32.828125 41.1669921875 31.9375 Q 40.7138671875 31.03125 39.7919921875 31.03125 z M 39.7919921875 30.09375 Q 41.2607421875 30.09375 42.0419921875 31.265625 Q 42.8232421875 32.421875 42.8232421875 34.640625 Q 42.8232421875 36.84375 42.0419921875 38.015625 Q 41.2607421875 39.171875 39.7919921875 39.171875 Q 38.3232421875 39.171875 37.5419921875 38.015625 Q 36.7763671875 36.84375 36.7763671875 34.640625 Q 36.7763671875 32.421875 37.5419921875 31.265625 Q 38.3232421875 30.09375 39.7919921875 30.09375 z M 44.8955078125 37.515625 L 46.1298828125 37.515625 L 46.1298828125 39 L 44.8955078125 39 L 44.8955078125 37.515625 z M 51.2412109375 34.84375 Q 50.3974609375 34.84375 49.9130859375 35.296875 Q 49.4287109375 35.75 49.4287109375 36.53125 Q 49.4287109375 37.328125 49.9130859375 37.78125 Q 50.3974609375 38.234375 51.2412109375 38.234375 Q 52.0849609375 38.234375 52.5693359375 37.78125 Q 53.0537109375 37.328125 53.0537109375 36.53125 Q 53.0537109375 35.75 52.5693359375 35.296875 Q 52.1005859375 34.84375 51.2412109375 34.84375 z M 50.0537109375 34.34375 Q 49.3037109375 34.15625 48.8662109375 33.640625 Q 48.4443359375 33.109375 48.4443359375 32.359375 Q 48.4443359375 31.3125 49.1943359375 30.703125 Q 49.9443359375 30.09375 51.2412109375 30.09375 Q 52.5537109375 30.09375 53.2880859375 30.703125 Q 54.0380859375 31.3125 54.0380859375 32.359375 Q 54.0380859375 33.109375 53.6162109375 33.640625 Q 53.1943359375 34.15625 52.4287109375 34.34375 Q 53.2880859375 34.546875 53.7568359375 35.125 Q 54.2412109375 35.703125 54.2412109375 36.53125 Q 54.2412109375 37.8125 53.4599609375 38.5 Q 52.6943359375 39.171875 51.2412109375 39.171875 Q 49.8037109375 39.171875 49.0224609375 38.5 Q 48.2412109375 37.8125 48.2412109375 36.53125 Q 48.2412109375 35.703125 48.7255859375 35.125 Q 49.2099609375 34.546875 50.0537109375 34.34375 z M 49.6318359375 32.46875 Q 49.6318359375 33.15625 50.0537109375 33.53125 Q 50.4755859375 33.90625 51.2412109375 33.90625 Q 52.0068359375 33.90625 52.4287109375 33.53125 Q 52.8662109375 33.15625 52.8662109375 32.46875 Q 52.8662109375 31.796875 52.4287109375 31.421875 Q 52.0068359375 31.03125 51.2412109375 31.03125 Q 50.4755859375 31.03125 50.0537109375 31.421875 Q 49.6318359375 31.796875 49.6318359375 32.46875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 142.82509847769097 L 168.9065303237307 0"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 161.734375 128.921875 L 161.734375 130.171875 Q 161.125 129.609375 160.453125 129.34375 Q 159.78125 129.0625 159.015625 129.0625 Q 157.515625 129.0625 156.71875 129.984375 Q 155.921875 130.90625 155.921875 132.640625 Q 155.921875 134.359375 156.71875 135.28125 Q 157.515625 136.203125 159.015625 136.203125 Q 159.78125 136.203125 160.453125 135.921875 Q 161.125 135.640625 161.734375 135.09375 L 161.734375 136.328125 Q 161.109375 136.75 160.40625 136.96875 Q 159.71875 137.171875 158.953125 137.171875 Q 156.953125 137.171875 155.8125 135.953125 Q 154.671875 134.734375 154.671875 132.640625 Q 154.671875 130.53125 155.8125 129.3125 Q 156.953125 128.09375 158.953125 128.09375 Q 159.734375 128.09375 160.421875 128.3125 Q 161.125 128.515625 161.734375 128.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 163.61328125 141.171875 L 165.23828125 141.171875 L 165.23828125 135.609375 L 163.47265625 135.953125 L 163.47265625 135.0625 L 165.22265625 134.703125 L 166.20703125 134.703125 L 166.20703125 141.171875 L 167.81640625 141.171875 L 167.81640625 142 L 163.61328125 142 L 163.61328125 141.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 128 58 C 128 59.65685424949238 126.65685424949238 61 125 61 C 123.34314575050762 61 122 59.65685424949238 122 58 C 122 56.34314575050762 123.34314575050762 55 125 55 C 126.65685424949238 55 128 56.34314575050762 128 58 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 128 58 C 128 59.65685424949238 126.65685424949238 61 125 61 C 123.34314575050762 61 122 59.65685424949238 122 58 C 122 56.34314575050762 123.34314575050762 55 125 55 C 126.65685424949238 55 128 56.34314575050762 128 58 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 131.359375 44.21875 L 131.359375 47.515625 L 132.84375 47.515625 Q 133.671875 47.515625 134.125 47.09375 Q 134.578125 46.65625 134.578125 45.859375 Q 134.578125 45.078125 134.125 44.65625 Q 133.671875 44.21875 132.84375 44.21875 L 131.359375 44.21875 z M 130.171875 43.25 L 132.84375 43.25 Q 134.328125 43.25 135.078125 43.921875 Q 135.828125 44.578125 135.828125 45.859375 Q 135.828125 47.15625 135.078125 47.828125 Q 134.328125 48.484375 132.84375 48.484375 L 131.359375 48.484375 L 131.359375 52 L 130.171875 52 L 130.171875 43.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 72.734375 128.921875 L 72.734375 130.171875 Q 72.125 129.609375 71.453125 129.34375 Q 70.78125 129.0625 70.015625 129.0625 Q 68.515625 129.0625 67.71875 129.984375 Q 66.921875 130.90625 66.921875 132.640625 Q 66.921875 134.359375 67.71875 135.28125 Q 68.515625 136.203125 70.015625 136.203125 Q 70.78125 136.203125 71.453125 135.921875 Q 72.125 135.640625 72.734375 135.09375 L 72.734375 136.328125 Q 72.109375 136.75 71.40625 136.96875 Q 70.71875 137.171875 69.953125 137.171875 Q 67.953125 137.171875 66.8125 135.953125 Q 65.671875 134.734375 65.671875 132.640625 Q 65.671875 130.53125 66.8125 129.3125 Q 67.953125 128.09375 69.953125 128.09375 Q 70.734375 128.09375 71.421875 128.3125 Q 72.125 128.515625 72.734375 128.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 77.09765625 134.40625 L 77.09765625 135.15625 L 76.23828125 135.15625 Q 75.75390625 135.15625 75.56640625 135.359375 Q 75.37890625 135.546875 75.37890625 136.046875 L 75.37890625 136.53125 L 76.84765625 136.53125 L 76.84765625 137.234375 L 75.37890625 137.234375 L 75.37890625 142 L 74.47265625 142 L 74.47265625 137.234375 L 73.61328125 137.234375 L 73.61328125 136.53125 L 74.47265625 136.53125 L 74.47265625 136.15625 Q 74.47265625 135.234375 74.89453125 134.828125 Q 75.31640625 134.40625 76.23828125 134.40625 L 77.09765625 134.40625 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 93 105 C 93 106.65685424949238 91.65685424949238 108 90 108 C 88.34314575050762 108 87 106.65685424949238 87 105 C 87 103.34314575050762 88.34314575050762 102 90 102 C 91.65685424949238 102 93 103.34314575050762 93 105 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 93 105 C 93 106.65685424949238 91.65685424949238 108 90 108 C 88.34314575050762 108 87 106.65685424949238 87 105 C 87 103.34314575050762 88.34314575050762 102 90 102 C 91.65685424949238 102 93 103.34314575050762 93 105 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 96.359375 91.21875 L 96.359375 94.515625 L 97.84375 94.515625 Q 98.671875 94.515625 99.125 94.09375 Q 99.578125 93.65625 99.578125 92.859375 Q 99.578125 92.078125 99.125 91.65625 Q 98.671875 91.21875 97.84375 91.21875 L 96.359375 91.21875 z M 95.171875 90.25 L 97.84375 90.25 Q 99.328125 90.25 100.078125 90.921875 Q 100.828125 91.578125 100.828125 92.859375 Q 100.828125 94.15625 100.078125 94.828125 Q 99.328125 95.484375 97.84375 95.484375 L 96.359375 95.484375 L 96.359375 99 L 95.171875 99 L 95.171875 90.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 102.470703125 103.171875 L 104.095703125 103.171875 L 104.095703125 97.609375 L 102.330078125 97.953125 L 102.330078125 97.0625 L 104.080078125 96.703125 L 105.064453125 96.703125 L 105.064453125 103.171875 L 106.673828125 103.171875 L 106.673828125 104 L 102.470703125 104 L 102.470703125 103.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+</g><!-- layer0 -->
+</g> <!-- default stroke -->
+</svg> <!-- bounding box -->
diff --git a/src/third_party/skia/site/dev/design/conical/corollary2.3.3.ggb b/src/third_party/skia/site/dev/design/conical/corollary2.3.3.ggb
new file mode 100644
index 0000000..997ccfa
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/corollary2.3.3.ggb
Binary files differ
diff --git a/src/third_party/skia/site/dev/design/conical/corollary2.3.3.svg b/src/third_party/skia/site/dev/design/conical/corollary2.3.3.svg
new file mode 100644
index 0000000..cfef0b0
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/corollary2.3.3.svg
@@ -0,0 +1,253 @@
+<?xml version="1.0" standalone="no"?>
+
+<svg 
+     version="1.1"
+     baseProfile="full"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:ev="http://www.w3.org/2001/xml-events"
+     x="0px"
+     y="0px"
+     width="337px"
+     height="327px"
+     viewBox="0 0 337 327"
+     >
+<title></title>
+<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753  Source:  Date: Friday, December 22, 2017 4:23:26 PM EST</desc>
+<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
+  <path d="M 0 0 L 265 0 L 265 257 L 0 257 L 0 0 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 69.171875 149.359375 Q 68.421875 149.359375 68.03125 150.109375 Q 67.65625 150.859375 67.65625 152.359375 Q 67.65625 153.859375 68.03125 154.609375 Q 68.421875 155.359375 69.171875 155.359375 Q 69.953125 155.359375 70.328125 154.609375 Q 70.71875 153.859375 70.71875 152.359375 Q 70.71875 150.859375 70.328125 150.109375 Q 69.953125 149.359375 69.171875 149.359375 z M 69.171875 148.578125 Q 70.40625 148.578125 71.046875 149.546875 Q 71.703125 150.515625 71.703125 152.359375 Q 71.703125 154.203125 71.046875 155.171875 Q 70.40625 156.140625 69.171875 156.140625 Q 67.953125 156.140625 67.296875 155.171875 Q 66.65625 154.203125 66.65625 152.359375 Q 66.65625 150.515625 67.296875 149.546875 Q 67.953125 148.578125 69.171875 148.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 142.82509847769097 L 60.78662485303139 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 148.234375 155.171875 L 149.859375 155.171875 L 149.859375 149.609375 L 148.09375 149.953125 L 148.09375 149.0625 L 149.84375 148.703125 L 150.828125 148.703125 L 150.828125 155.171875 L 152.4375 155.171875 L 152.4375 156 L 148.234375 156 L 148.234375 155.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 149.83505704565925 142.82509847769097 L 149.83505704565925 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 237.921875 155.171875 L 241.359375 155.171875 L 241.359375 156 L 236.734375 156 L 236.734375 155.171875 Q 237.296875 154.59375 238.265625 153.609375 Q 239.234375 152.625 239.484375 152.34375 Q 239.953125 151.8125 240.140625 151.453125 Q 240.328125 151.078125 240.328125 150.71875 Q 240.328125 150.140625 239.921875 149.78125 Q 239.515625 149.40625 238.859375 149.40625 Q 238.390625 149.40625 237.875 149.578125 Q 237.375 149.734375 236.78125 150.0625 L 236.78125 149.0625 Q 237.375 148.828125 237.890625 148.703125 Q 238.40625 148.578125 238.84375 148.578125 Q 239.96875 148.578125 240.640625 149.140625 Q 241.328125 149.703125 241.328125 150.65625 Q 241.328125 151.109375 241.15625 151.515625 Q 240.984375 151.90625 240.546875 152.453125 Q 240.421875 152.59375 239.765625 153.28125 Q 239.109375 153.953125 237.921875 155.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 238.88348923828713 142.82509847769097 L 238.88348923828713 146.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 0 142.82509847769097 L 263 142.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 264 143.32509847769097 L 261 139.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 264 142.32509847769097 L 261 145.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 44.484375 231.859375 L 47.125 231.859375 L 47.125 232.65625 L 44.484375 232.65625 L 44.484375 231.859375 z M 48.8427734375 234.171875 L 50.4677734375 234.171875 L 50.4677734375 228.609375 L 48.7021484375 228.953125 L 48.7021484375 228.0625 L 50.4521484375 227.703125 L 51.4365234375 227.703125 L 51.4365234375 234.171875 L 53.0458984375 234.171875 L 53.0458984375 235 L 48.8427734375 235 L 48.8427734375 234.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 231.87353067031938 L 60.78662485303139 231.87353067031938"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 51.171875 133.359375 Q 50.421875 133.359375 50.03125 134.109375 Q 49.65625 134.859375 49.65625 136.359375 Q 49.65625 137.859375 50.03125 138.609375 Q 50.421875 139.359375 51.171875 139.359375 Q 51.953125 139.359375 52.328125 138.609375 Q 52.71875 137.859375 52.71875 136.359375 Q 52.71875 134.859375 52.328125 134.109375 Q 51.953125 133.359375 51.171875 133.359375 z M 51.171875 132.578125 Q 52.40625 132.578125 53.046875 133.546875 Q 53.703125 134.515625 53.703125 136.359375 Q 53.703125 138.203125 53.046875 139.171875 Q 52.40625 140.140625 51.171875 140.140625 Q 49.953125 140.140625 49.296875 139.171875 Q 48.65625 138.203125 48.65625 136.359375 Q 48.65625 134.515625 49.296875 133.546875 Q 49.953125 132.578125 51.171875 132.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 142.82509847769097 L 60.78662485303139 142.82509847769097"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 49.234375 56.171875 L 50.859375 56.171875 L 50.859375 50.609375 L 49.09375 50.953125 L 49.09375 50.0625 L 50.84375 49.703125 L 51.828125 49.703125 L 51.828125 56.171875 L 53.4375 56.171875 L 53.4375 57 L 49.234375 57 L 49.234375 56.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.78662485303139 53.776666285062575 L 60.78662485303139 53.776666285062575"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 2 L 60.78662485303139 257"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 61.28662485303139 1 L 57.78662485303139 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.28662485303139 1 L 63.78662485303139 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g id="misc">
+</g><!-- misc -->
+<g id="layer0">
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 221.07380279976155 142.82509847769097 C 221.07380279976155 182.16917135475506 189.17912992272312 214.0638442317937 149.83505704565925 214.0638442317937 C 110.49098416859538 214.0638442317937 78.59631129155696 182.16917135475506 78.59631129155696 142.82509847769097 C 78.59631129155696 103.48102560062685 110.49098416859538 71.58635272358825 149.83505704565925 71.58635272358825 C 189.17912992272312 71.58635272358825 221.07380279976155 103.48102560062685 221.07380279976155 142.82509847769097 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 33 22 L 133 22"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 52 22 C 52 23.65685424949238 50.65685424949238 25 49 25 C 47.34314575050762 25 46 23.65685424949238 46 22 C 46 20.34314575050762 47.34314575050762 19 49 19 C 50.65685424949238 19 52 20.34314575050762 52 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 52 22 C 52 23.65685424949238 50.65685424949238 25 49 25 C 47.34314575050762 25 46 23.65685424949238 46 22 C 46 20.34314575050762 47.34314575050762 19 49 19 C 50.65685424949238 19 52 20.34314575050762 52 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 11.9375 33.4375 Q 11.75 33.34375 11.53125 33.296875 Q 11.328125 33.234375 11.0625 33.234375 Q 10.15625 33.234375 9.65625 33.828125 Q 9.171875 34.421875 9.171875 35.546875 L 9.171875 39 L 8.09375 39 L 8.09375 32.4375 L 9.171875 32.4375 L 9.171875 33.453125 Q 9.515625 32.859375 10.0625 32.578125 Q 10.609375 32.28125 11.390625 32.28125 Q 11.5 32.28125 11.625 32.296875 Q 11.765625 32.3125 11.921875 32.34375 L 11.9375 33.4375 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 13.16796875 43.171875 L 14.79296875 43.171875 L 14.79296875 37.609375 L 13.02734375 37.953125 L 13.02734375 37.0625 L 14.77734375 36.703125 L 15.76171875 36.703125 L 15.76171875 43.171875 L 17.37109375 43.171875 L 17.37109375 44 L 13.16796875 44 L 13.16796875 43.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 23.3759765625 33.546875 L 30.8916015625 33.546875 L 30.8916015625 34.53125 L 23.3759765625 34.53125 L 23.3759765625 33.546875 z M 23.3759765625 35.9375 L 30.8916015625 35.9375 L 30.8916015625 36.9375 L 23.3759765625 36.9375 L 23.3759765625 35.9375 z M 39.7919921875 31.03125 Q 38.8857421875 31.03125 38.4169921875 31.9375 Q 37.9638671875 32.828125 37.9638671875 34.640625 Q 37.9638671875 36.4375 38.4169921875 37.34375 Q 38.8857421875 38.234375 39.7919921875 38.234375 Q 40.7138671875 38.234375 41.1669921875 37.34375 Q 41.6357421875 36.4375 41.6357421875 34.640625 Q 41.6357421875 32.828125 41.1669921875 31.9375 Q 40.7138671875 31.03125 39.7919921875 31.03125 z M 39.7919921875 30.09375 Q 41.2607421875 30.09375 42.0419921875 31.265625 Q 42.8232421875 32.421875 42.8232421875 34.640625 Q 42.8232421875 36.84375 42.0419921875 38.015625 Q 41.2607421875 39.171875 39.7919921875 39.171875 Q 38.3232421875 39.171875 37.5419921875 38.015625 Q 36.7763671875 36.84375 36.7763671875 34.640625 Q 36.7763671875 32.421875 37.5419921875 31.265625 Q 38.3232421875 30.09375 39.7919921875 30.09375 z M 44.8955078125 37.515625 L 46.1298828125 37.515625 L 46.1298828125 39 L 44.8955078125 39 L 44.8955078125 37.515625 z M 51.2412109375 34.84375 Q 50.3974609375 34.84375 49.9130859375 35.296875 Q 49.4287109375 35.75 49.4287109375 36.53125 Q 49.4287109375 37.328125 49.9130859375 37.78125 Q 50.3974609375 38.234375 51.2412109375 38.234375 Q 52.0849609375 38.234375 52.5693359375 37.78125 Q 53.0537109375 37.328125 53.0537109375 36.53125 Q 53.0537109375 35.75 52.5693359375 35.296875 Q 52.1005859375 34.84375 51.2412109375 34.84375 z M 50.0537109375 34.34375 Q 49.3037109375 34.15625 48.8662109375 33.640625 Q 48.4443359375 33.109375 48.4443359375 32.359375 Q 48.4443359375 31.3125 49.1943359375 30.703125 Q 49.9443359375 30.09375 51.2412109375 30.09375 Q 52.5537109375 30.09375 53.2880859375 30.703125 Q 54.0380859375 31.3125 54.0380859375 32.359375 Q 54.0380859375 33.109375 53.6162109375 33.640625 Q 53.1943359375 34.15625 52.4287109375 34.34375 Q 53.2880859375 34.546875 53.7568359375 35.125 Q 54.2412109375 35.703125 54.2412109375 36.53125 Q 54.2412109375 37.8125 53.4599609375 38.5 Q 52.6943359375 39.171875 51.2412109375 39.171875 Q 49.8037109375 39.171875 49.0224609375 38.5 Q 48.2412109375 37.8125 48.2412109375 36.53125 Q 48.2412109375 35.703125 48.7255859375 35.125 Q 49.2099609375 34.546875 50.0537109375 34.34375 z M 49.6318359375 32.46875 Q 49.6318359375 33.15625 50.0537109375 33.53125 Q 50.4755859375 33.90625 51.2412109375 33.90625 Q 52.0068359375 33.90625 52.4287109375 33.53125 Q 52.8662109375 33.15625 52.8662109375 32.46875 Q 52.8662109375 31.796875 52.4287109375 31.421875 Q 52.0068359375 31.03125 51.2412109375 31.03125 Q 50.4755859375 31.03125 50.0537109375 31.421875 Q 49.6318359375 31.796875 49.6318359375 32.46875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60.78662485303139 142.82509847769097 L 265 -42.99129391401277"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 153 143 C 153 144.65685424949237 151.65685424949237 146 150 146 C 148.34314575050763 146 147 144.65685424949237 147 143 C 147 141.34314575050763 148.34314575050763 140 150 140 C 151.65685424949237 140 153 141.34314575050763 153 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 161.734375 128.921875 L 161.734375 130.171875 Q 161.125 129.609375 160.453125 129.34375 Q 159.78125 129.0625 159.015625 129.0625 Q 157.515625 129.0625 156.71875 129.984375 Q 155.921875 130.90625 155.921875 132.640625 Q 155.921875 134.359375 156.71875 135.28125 Q 157.515625 136.203125 159.015625 136.203125 Q 159.78125 136.203125 160.453125 135.921875 Q 161.125 135.640625 161.734375 135.09375 L 161.734375 136.328125 Q 161.109375 136.75 160.40625 136.96875 Q 159.71875 137.171875 158.953125 137.171875 Q 156.953125 137.171875 155.8125 135.953125 Q 154.671875 134.734375 154.671875 132.640625 Q 154.671875 130.53125 155.8125 129.3125 Q 156.953125 128.09375 158.953125 128.09375 Q 159.734375 128.09375 160.421875 128.3125 Q 161.125 128.515625 161.734375 128.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 163.61328125 141.171875 L 165.23828125 141.171875 L 165.23828125 135.609375 L 163.47265625 135.953125 L 163.47265625 135.0625 L 165.22265625 134.703125 L 166.20703125 134.703125 L 166.20703125 141.171875 L 167.81640625 141.171875 L 167.81640625 142 L 163.61328125 142 L 163.61328125 141.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 168 48 C 168 49.65685424949238 166.65685424949237 51 165 51 C 163.34314575050763 51 162 49.65685424949238 162 48 C 162 46.34314575050762 163.34314575050763 45 165 45 C 166.65685424949237 45 168 46.34314575050762 168 48 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 168 48 C 168 49.65685424949238 166.65685424949237 51 165 51 C 163.34314575050763 51 162 49.65685424949238 162 48 C 162 46.34314575050762 163.34314575050763 45 165 45 C 166.65685424949237 45 168 46.34314575050762 168 48 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 171.359375 34.21875 L 171.359375 37.515625 L 172.84375 37.515625 Q 173.671875 37.515625 174.125 37.09375 Q 174.578125 36.65625 174.578125 35.859375 Q 174.578125 35.078125 174.125 34.65625 Q 173.671875 34.21875 172.84375 34.21875 L 171.359375 34.21875 z M 170.171875 33.25 L 172.84375 33.25 Q 174.328125 33.25 175.078125 33.921875 Q 175.828125 34.578125 175.828125 35.859375 Q 175.828125 37.15625 175.078125 37.828125 Q 174.328125 38.484375 172.84375 38.484375 L 171.359375 38.484375 L 171.359375 42 L 170.171875 42 L 170.171875 33.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 64 143 C 64 144.65685424949237 62.65685424949238 146 61 146 C 59.34314575050762 146 58 144.65685424949237 58 143 C 58 141.34314575050763 59.34314575050762 140 61 140 C 62.65685424949238 140 64 141.34314575050763 64 143 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 72.734375 128.921875 L 72.734375 130.171875 Q 72.125 129.609375 71.453125 129.34375 Q 70.78125 129.0625 70.015625 129.0625 Q 68.515625 129.0625 67.71875 129.984375 Q 66.921875 130.90625 66.921875 132.640625 Q 66.921875 134.359375 67.71875 135.28125 Q 68.515625 136.203125 70.015625 136.203125 Q 70.78125 136.203125 71.453125 135.921875 Q 72.125 135.640625 72.734375 135.09375 L 72.734375 136.328125 Q 72.109375 136.75 71.40625 136.96875 Q 70.71875 137.171875 69.953125 137.171875 Q 67.953125 137.171875 66.8125 135.953125 Q 65.671875 134.734375 65.671875 132.640625 Q 65.671875 130.53125 66.8125 129.3125 Q 67.953125 128.09375 69.953125 128.09375 Q 70.734375 128.09375 71.421875 128.3125 Q 72.125 128.515625 72.734375 128.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 77.09765625 134.40625 L 77.09765625 135.15625 L 76.23828125 135.15625 Q 75.75390625 135.15625 75.56640625 135.359375 Q 75.37890625 135.546875 75.37890625 136.046875 L 75.37890625 136.53125 L 76.84765625 136.53125 L 76.84765625 137.234375 L 75.37890625 137.234375 L 75.37890625 142 L 74.47265625 142 L 74.47265625 137.234375 L 73.61328125 137.234375 L 73.61328125 136.53125 L 74.47265625 136.53125 L 74.47265625 136.15625 Q 74.47265625 135.234375 74.89453125 134.828125 Q 75.31640625 134.40625 76.23828125 134.40625 L 77.09765625 134.40625 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 141 73 C 141 74.65685424949238 139.65685424949237 76 138 76 C 136.34314575050763 76 135 74.65685424949238 135 73 C 135 71.34314575050762 136.34314575050763 70 138 70 C 139.65685424949237 70 141 71.34314575050762 141 73 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 141 73 C 141 74.65685424949238 139.65685424949237 76 138 76 C 136.34314575050763 76 135 74.65685424949238 135 73 C 135 71.34314575050762 136.34314575050763 70 138 70 C 139.65685424949237 70 141 71.34314575050762 141 73 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 144.359375 59.21875 L 144.359375 62.515625 L 145.84375 62.515625 Q 146.671875 62.515625 147.125 62.09375 Q 147.578125 61.65625 147.578125 60.859375 Q 147.578125 60.078125 147.125 59.65625 Q 146.671875 59.21875 145.84375 59.21875 L 144.359375 59.21875 z M 143.171875 58.25 L 145.84375 58.25 Q 147.328125 58.25 148.078125 58.921875 Q 148.828125 59.578125 148.828125 60.859375 Q 148.828125 62.15625 148.078125 62.828125 Q 147.328125 63.484375 145.84375 63.484375 L 144.359375 63.484375 L 144.359375 67 L 143.171875 67 L 143.171875 58.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 150.470703125 71.171875 L 152.095703125 71.171875 L 152.095703125 65.609375 L 150.330078125 65.953125 L 150.330078125 65.0625 L 152.080078125 64.703125 L 153.064453125 64.703125 L 153.064453125 71.171875 L 154.673828125 71.171875 L 154.673828125 72 L 150.470703125 72 L 150.470703125 71.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 84 124 C 84 125.65685424949238 82.65685424949238 127 81 127 C 79.34314575050762 127 78 125.65685424949238 78 124 C 78 122.34314575050762 79.34314575050762 121 81 121 C 82.65685424949238 121 84 122.34314575050762 84 124 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 84 124 C 84 125.65685424949238 82.65685424949238 127 81 127 C 79.34314575050762 127 78 125.65685424949238 78 124 C 78 122.34314575050762 79.34314575050762 121 81 121 C 82.65685424949238 121 84 122.34314575050762 84 124 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 87.359375 110.21875 L 87.359375 113.515625 L 88.84375 113.515625 Q 89.671875 113.515625 90.125 113.09375 Q 90.578125 112.65625 90.578125 111.859375 Q 90.578125 111.078125 90.125 110.65625 Q 89.671875 110.21875 88.84375 110.21875 L 87.359375 110.21875 z M 86.171875 109.25 L 88.84375 109.25 Q 90.328125 109.25 91.078125 109.921875 Q 91.828125 110.578125 91.828125 111.859375 Q 91.828125 113.15625 91.078125 113.828125 Q 90.328125 114.484375 88.84375 114.484375 L 87.359375 114.484375 L 87.359375 118 L 86.171875 118 L 86.171875 109.25 z M 94.595703125 110.21875 L 94.595703125 113.515625 L 96.080078125 113.515625 Q 96.908203125 113.515625 97.361328125 113.09375 Q 97.814453125 112.65625 97.814453125 111.859375 Q 97.814453125 111.078125 97.361328125 110.65625 Q 96.908203125 110.21875 96.080078125 110.21875 L 94.595703125 110.21875 z M 93.408203125 109.25 L 96.080078125 109.25 Q 97.564453125 109.25 98.314453125 109.921875 Q 99.064453125 110.578125 99.064453125 111.859375 Q 99.064453125 113.15625 98.314453125 113.828125 Q 97.564453125 114.484375 96.080078125 114.484375 L 94.595703125 114.484375 L 94.595703125 118 L 93.408203125 118 L 93.408203125 109.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.2733051439510972, 0, 0, 1.2733051439510972, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 100.70703125 122.171875 L 102.33203125 122.171875 L 102.33203125 116.609375 L 100.56640625 116.953125 L 100.56640625 116.0625 L 102.31640625 115.703125 L 103.30078125 115.703125 L 103.30078125 122.171875 L 104.91015625 122.171875 L 104.91015625 123 L 100.70703125 123 L 100.70703125 122.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+</g><!-- layer0 -->
+</g> <!-- default stroke -->
+</svg> <!-- bounding box -->
diff --git a/src/third_party/skia/site/dev/design/conical/index.md b/src/third_party/skia/site/dev/design/conical/index.md
new file mode 100644
index 0000000..2efb90c
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/index.md
@@ -0,0 +1,324 @@
+Two-point Conical Gradient
+====
+
+<script type="text/x-mathjax-config">
+MathJax.Hub.Config({
+    tex2jax: {
+        inlineMath: [['$','$'], ['\\(','\\)']]
+    }
+});
+</script>
+
+<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML'></script>
+
+(Please refresh the page if you see a lot of dollars instead of math symbols.)
+
+We present a fast shading algorithm (compared to bruteforcely solving the quadratic equation of
+gradient $t$) for computing the two-point conical gradient (i.e., `createRadialGradient` in
+[spec](https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-createradialgradient)).
+It reduced the number of multiplications per pixel from ~10 down to 3, and brought a speedup of up to
+26% in our nanobenches.
+
+This document has 3 parts:
+
+1. [Problem Statement and Setup](#problem-statement)
+2. [Algorithm](#algorithm)
+3. [Appendix](#appendix)
+
+Part 1 and 2 are self-explanatory. Part 3 shows how to geometrically proves our Theorem 1 in part
+2; it's more complicated but it gives us a nice picture about what's going on.
+
+## <span id="problem-statement">Problem Statement and Setup</span>
+
+Let two circles be $C_0, r_0$ and $C_1, r_1$ where $C$ is the center and $r$ is the radius. For any
+point $P = (x, y)$ we want the shader to quickly compute a gradient $t \in \mathbb R$ such that $p$
+is on the linearly interpolated circle with center $C_t = (1-t) \cdot C_0 + t \cdot C_1$ and radius
+$r_t = (1-t) \cdot r_0 + t \cdot r_1 > 0$ (note that radius $r_t$ has to be *positive*). If
+there are multiple (at most 2) solutions of $t$, choose the bigger one.
+
+There are two degenerated cases:
+
+1. $C_0 = C_1$ so the gradient is essentially a simple radial gradient.
+2. $r_0 = r_1$ so the gradient is a single strip with bandwidth $2 r_0 = 2 r_1$.
+
+<!-- TODO maybe add some fiddle or images here to illustrate the two degenerated cases -->
+
+They are easy to handle so we won't cover them here. From now on, we assume $C_0 \neq C_1$ and $r_0
+\neq r_1$.
+
+As $r_0 \neq r_1$, we can find a focal point $C_f = (1-f) \cdot C_0 + f \cdot C_1$ where its
+corresponding linearly interpolated radius $r_f = (1-f) \cdot r_0 + f \cdot r_1 = 0$.
+Solving the latter equation gets us $f = r_0 / (r_0 - r_1)$.
+
+As $C_0 \neq C_1$, focal point $C_f$ is different from $C_1$ unless $r_1 = 0$. If $r_1 = 0$, we can
+swap $C_0, r_0$ with $C_1, r_1$, compute swapped gradient $t_s$ as if $r_1 \neq 0$, and finally set
+$t = 1 - t_s$. The only catch here is that with multiple solutions of $t_s$, we shall choose the
+smaller one (so $t$ could be the bigger one).
+
+Assuming that we've done swapping if necessary so $C_1 \neq C_f$, we can then do a linear
+transformation to map $C_f, C_1$ to $(0, 0), (1, 0)$. After the transformation:
+
+1. All centers $C_t = (x_t, 0)$ must be on the $x$ axis
+2. The radius $r_t$ is $x_t r_1$.
+3. Given $x_t$ , we can derive $t = f + (1 - f) x_t$
+
+From now on, we'll focus on how to quickly computes $x_t$. Note that $r_t > 0$ so we're only
+interested positive solution $x_t$. Again, if there are multiple $x_t$ solutions, we may want to
+find the bigger one if $1 - f > 0$, and smaller one if $1 - f < 0$, so the corresponding $t$ is
+always the bigger one (note that $f \neq 1$, otherwise we'll swap $C_0, r_0$ with $C_1, r_1$).
+
+## <span id="algorithm">Algorithm</span>
+
+**Theorem 1.** The solution to $x_t$ is
+
+1. $\frac{x^2 + y^2}{(1 + r_1) x} = \frac{x^2 + y^2}{2 x}$ if $r_1 = 1$
+2. $\left(\sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2}  - x\right) / (r_1^2 - 1)$ if $r_1 > 1$
+3. $\left(\pm \sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2}  - x\right) / (r_1^2 - 1)$ if $r_1 < 1$.
+
+Case 2 always produces a valid $x_t$. Case 1 and 3 requires $x > 0$ to produce valid $x_t > 0$. Case
+3 may have no solution at all if $(r_1^2 - 1) y^2 + r_1^2 x^2 < 0$.
+
+*Proof.* Algebriacally, solving the quadratic equation $(x_t - x)^2 + y^2 = (x_t r_1)^2$ and
+eliminate negative $x_t$ solutions get us the theorem.
+
+Alternatively, we can also combine Corollary 2., 3., and Lemma 4. in the Appendix to geometrically
+prove the theorem. $\square$
+
+Theorem 1 by itself is not sufficient for our shader algorithm because:
+
+1. we still need to compute $t$ from $x_t$ (remember that $t = f + (1-f) x_t$);
+2. we still need to handle cases of choosing the bigger/smaller $x_t$;
+3. we still need to handle the swapped case (we swap $C_0, r_0$ with $C_1, r_1$ if $r_1 = 0$);
+4. there are way too many multiplications and divisions in Theorem 1 that would slow our shader.
+
+Issue 2 and 3 are solved by generating different shader code based on different situations. So they
+are mainly correctness issues rather than performance issues. Issue 1 and 4 are performance
+critical, and they will affect how we handle issue 2 and 3.
+
+The key to handle 1 and 4 efficiently is to fold as many multiplications and divisions into the
+linear transformation matrix, which the shader has to do anyway (remember our linear transformation
+to map $C_f, C_1$ to $(0, 0), (1, 0)$).
+
+For example, let $\hat x, \hat y = |1-f|x, |1-f|y$. Computing $\hat x_t$ with respect to $\hat x,
+\hat y$ allow us to have $t = f + (1 - f)x_t = f + \text{sign}(1-f) \cdot \hat x_t$. That saves us
+one multiplication. Applying similar techniques to Theorem 1 gets us:
+
+1. If $r_1 = 1$, let $x' = x/2,~ y' = y/2$, then $x_t = (x'^2 + y'^2) / x'$.
+2. If $r_1 > 1$, let $x' = r_1 / (r_1^2 - 1) x,~ y' = \frac{\sqrt{r_1^2 - 1}}{r_1^2 - 1} y$, then
+    $x_t = \sqrt{x'^2 + y'^2} - x' / r_1$
+3. If $r_1 < 1$, let $x' = r_1 / (r_1^2 - 1) x,~ y' = \frac{\sqrt{1 - r_1^2}}{r_1^2 - 1} y$, then
+    $x_t = \pm\sqrt{x'^2 - y'^2} - x' / r_1$
+
+Combining it with the swapping, the equation $t = f + (1-f) x_t$, and the fact that we only want
+positive $x_t > 0$ and bigger $t$, we have our final algorithm:
+
+**Algorithm 1.**
+
+1. Let $C'_0, r'_0, C'_1, r'_1 = C_0, r_0, C_1, r_1$ if there is no swapping and $C'_0,
+    r'_0, C'_1, r'_1 = C_1, r_1, C_0, r_0$ if there is swapping.
+2. Let $f = r'_0 / (r'_0 - r'_1)$ and $1 - f = r'_1 / (r'_1 - r'_0)$
+3. Let $x' = x/2,~ y' = y/2$ if $r_1 = 1$, and
+    $x' = r_1 / (r_1^2 - 1) x,~ y' = \sqrt{|r_1^2 - 1|} / (r_1^2 - 1) y$ if $r_1 \neq 1$
+4. Let $\hat x = |1 - f|x', \hat y = |1 - f|y'$
+5. If $r_1 = 1$, let $\hat x_t = (\hat x^2 + \hat y^2) / \hat x$
+6. If $r_1 > 1$,
+    let $\hat x_t = \sqrt{\hat x^2 + \hat y^2} - \hat x / r_1$
+7. If $r_1 < 1$
+  1. return invalid if $\hat x^2 - \hat y^2 < 0$
+  2. let $\hat x_t =  -\sqrt{\hat x^2 - \hat y^2} - \hat x / r_1$ if we've swapped $r_0, r_1$,
+    or if $1 - f < 0$
+
+  3. let $\hat x_t =  \sqrt{\hat x^2 - \hat y^2} - \hat x / r_1$ otherwise
+
+8. $t$ is invalid if $\hat x_t < 0$ (this check is unnecessary if $r_1 > 1$)
+9. Let $t = f + \text{sign}(1 - f) \hat x_t$
+10. If swapped, let $t = 1 - t$
+
+In step 7, we try to select either the smaller or bigger $\hat x_t$ based on whether the final $t$
+has a negative or positive relationship with $\hat x_t$. It's negative if we've swapped, or if
+$\text{sign}(1 - f)$ is negative (these two cannot both happen).
+
+Note that all the computations and if decisions not involving $\hat x, \hat y$  can be precomputed
+before the shading stage. The two if decisions  $\hat x^2 - \hat y^2 < 0$ and $\hat x^t < 0$  can
+also be omitted by precomputing the shading area that never violates those conditions.
+
+The number of operations per shading is thus:
+
+* 1 addition, 2 multiplications, and 1 division if $r_1 = 1$
+* 2 additions, 3 multiplications, and 1 sqrt for $r_1 \neq 1$ (count substraction as addition;
+    dividing $r_1$ is multiplying $1/r_1$)
+* 1 more addition operation if $f \neq 0$
+* 1 more addition operation if swapped.
+
+In comparison, for $r_1 \neq 1$ case, our current raster pipeline shading algorithm (which shall
+hopefully soon be upgraded to the algorithm described here) mainly uses formula $$t = 0.5 \cdot
+(1/a) \cdot \left(-b \pm \sqrt{b^2 - 4ac}\right)$$ It precomputes $a = 1 - (r_1 - r_0)^2, 1/a, r1 -
+r0$. Number $b = -2 \cdot (x + (r1 - r0) \cdot r0)$ costs 2 multiplications and 1 addition. Number
+$c = x^2 + y^2 - r_0^2$ costs 3 multiplications and 2 additions. And the final $t$ costs 5 more
+multiplications, 1 more sqrt, and 2 more additions. That's a total of 5 additions, 10
+multiplications, and 1 sqrt. (Our algorithm has 2-4 additions, 3 multiplications, and 1 sqrt.) Even
+if it saves the $0.5 \cdot (1/a), 4a, r_0^2$ and $(r_1 - r_0) r_0$ multiplications, there are still
+6 multiplications. Moreover, it sends in 4 unitofmrs to the shader while our algorithm only needs 2
+uniforms ($1/r_1$ and $f$).
+
+## <span id="appendix">Appendix</span>
+
+**Lemma 1.** Draw a ray from $C_f = (0, 0)$ to $P = (x, y)$. For every
+intersection points $P_1$ between that ray and circle $C_1 = (1, 0), r_1$, there exists an $x_t$
+that equals to the length of segment $C_f P$ over length of segment $C_f P_1$. That is,
+$x_t = || C_f P || / ||C_f P_1||$
+
+*Proof.* Draw a line from $P$ that's parallel to $C_1 P_1$. Let it intersect with $x$-axis on point
+$C = (x', y')$.
+
+<img src="conical/lemma1.svg"/>
+
+Triangle $\triangle C_f C P$ is similar to triangle $\triangle C_f C_1 P_1$.
+Therefore $||P C|| = ||P_1 C_1|| \cdot (||C_f C|| / ||C_f C_1||) = r_1 x'$. Thus $x'$ is a solution
+to $x_t$. Because triangle $\triangle C_f C P$ and triangle $\triangle C_f C_1 P_1$ are similar, $x'
+= ||C_f C_1|| \cdot (||C_f P|| / ||C_f P_1||) = ||C_f P|| / ||C_f P_1||$. $\square$
+
+**Lemma 2.** For every solution $x_t$, if we extend/shrink segment $C_f P$ to $C_f P_1$ with ratio
+$1 / x_t$ (i.e., find $P_1$ on ray $C_f P$ such that $||C_f P_1|| / ||C_f P|| = 1 / x_t$), then
+$P_1$ must be on circle $C_1, r_1$.
+
+*Proof.* Let $C_t = (x_t, 0)$. Triangle $\triangle C_f C_t P$ is similar to $C_f C_1 P_1$. Therefore
+$||C_1 P_1|| = r_1$ and $P_1$ is on circle $C_1, r_1$. $\square$
+
+**Corollary 1.** By lemma 1. and 2., we conclude that the number of solutions $x_t$ is equal to the
+number of intersections between ray $C_f P$ and circle $C_1, r_1$. Therefore
+
+* when $r_1 > 1$, there's always one unique intersection/solution; we call this "well-behaved"; this
+  was previously known as the "inside" case;
+* when $r_1 = 1$, there's either one or zero intersection/solution (excluding $C_f$ which is always
+  on the circle); we call this "focal-on-circle"; this was previously known as the "edge" case;
+
+<img src="conical/corollary2.2.1.svg"/>
+<img src="conical/corollary2.2.2.svg"/>
+
+* when $r_1 < 1$, there may be $0, 1$, or $2$ solutions; this was also previously as the "outside"
+  case.
+
+<img src="conical/corollary2.3.1.svg" width="30%"/>
+<img src="conical/corollary2.3.2.svg" width="30%"/>
+<img src="conical/corollary2.3.3.svg" width="30%"/>
+
+**Lemma 3.** When solution exists, one such solution is
+$$
+    x_t = {|| C_f P || \over ||C_f P_1||} = \frac{x^2 + y^2}{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}
+$$
+
+*Proof.* As $C_f = (0, 0), P = (x, y)$, we have $||C_f P|| = \sqrt(x^2 + y^2)$. So we'll mainly
+focus on how to compute $||C_f P_1||$.
+
+**When $x \geq 0$:**
+
+<img src="conical/lemma3.1.svg"/>
+
+Let $X_P = (x, 0)$ and $H$ be a point on $C_f P_1$ such that $C_1 H$ is perpendicular to $C_1
+P_1$. Triangle $\triangle C_1 H C_f$ is similar to triangle $\triangle P X_P C_f$. Thus
+$$||C_f H|| = ||C_f C_1|| \cdot (||C_f X_P|| / ||C_f P||) = x / \sqrt{x^2 + y^2}$$
+$$||C_1 H|| = ||C_f C_1|| \cdot (||P X_P|| / ||C_f P||) = y / \sqrt{x^2 + y^2}$$
+
+Triangle $\triangle C_1 H P_1$ is a right triangle with hypotenuse $r_1$. Hence
+$$ ||H P_1|| = \sqrt{r_1^2 - ||C_1 H||^2} = \sqrt{r_1^2 - y^2 / (x^2 + y^2)} $$
+
+We have
+\begin{align}
+    ||C_f P_1|| &= ||C_f H|| + ||H P_1|| \\\\\\
+        &= x / \sqrt{x^2 + y^2} + \sqrt{r_1^2 - y^2 / (x^2 + y^2)} \\\\\\
+        &= \frac{x + \sqrt{r_1^2 (x^2 + y^2) - y^2}}{\sqrt{x^2 + y^2}} \\\\\\
+        &= \frac{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}{\sqrt{x^2 + y^2}}
+\end{align}
+
+**When $x < 0$:**
+
+Define $X_P$ and $H$ similarly as before except that now $H$ is on ray $P_1 C_f$ instead of
+$C_f P_1$.
+
+<img src="conical/lemma3.2.svg"/>
+
+As before, triangle $\triangle C_1 H C_f$ is similar to triangle $\triangle P X_P C_f$, and triangle
+$\triangle C_1 H P_1$ is a right triangle, so we have
+$$||C_f H|| = ||C_f C_1|| \cdot (||C_f X_P|| / ||C_f P||) = -x / \sqrt{x^2 + y^2}$$
+$$||C_1 H|| = ||C_f C_1|| \cdot (||P X_P|| / ||C_f P||) = y / \sqrt{x^2 + y^2}$$
+$$ ||H P_1|| = \sqrt{r_1^2 - ||C_1 H||^2} = \sqrt{r_1^2 - y^2 / (x^2 + y^2)} $$
+
+Note that the only difference is changing $x$ to $-x$ because $x$ is negative.
+
+Also note that now $||C_f P_1|| = -||C_f H|| + ||H P_1||$ and we have $-||C_f H||$ instead of
+$||C_f H||$. That negation cancels out the negation of $-x$ so we get the same equation
+of $||C_f P_1||$ for both $x \geq 0$ and $x < 0$ cases:
+
+$$
+    ||C_f P_1|| = \frac{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}{\sqrt{x^2 + y^2}}
+$$
+
+Finally
+$$
+    x_t = \frac{||C_f P||}{||C_f P_1||} = \frac{\sqrt{x^2 + y^2}}{||C_f P_1||}
+        = \frac{x^2 + y^2}{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}
+$$ $\square$
+
+**Corollary 2.** If $r_1 = 1$, then the solution $x_t = \frac{x^2 + y^2}{(1 + r_1) x}$, and
+it's valide (i.e., $x_t > 0$) iff $x > 0$.
+
+*Proof.* Simply plug $r_1 = 1$ into the formula of Lemma 3. $\square$
+
+**Corollary 3.** If $r_1 > 1$, then the unique solution is
+$x_t = \left(\sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2}  - x\right) / (r_1^2 - 1)$.
+
+*Proof.* From Lemma 3., we have
+
+\begin{align}
+    x_t &= \frac{x^2 + y^2}{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}} \\\\\\
+        &=  {
+                (x^2 + y^2) \left ( -x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2} \right )
+            \over
+                \left (x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2} \right )
+                \left (-x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2} \right )
+            } \\\\\\
+        &=  {
+                (x^2 + y^2) \left ( -x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2} \right )
+            \over
+                -x^2 + (r_1^2 - 1) y^2 + r_1^2 x^2
+            } \\\\\\
+        &=  {
+                (x^2 + y^2) \left ( -x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2} \right )
+            \over
+                (r_1^2 - 1) (x^2 + y^2)
+            } \\\\\\
+        &=  \left(\sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2}  - x\right) / (r_1^2 - 1)
+\end{align}
+
+The transformation above (multiplying $-x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}$ to enumerator and
+denomenator) is always valid because $r_1 > 1$ and it's the unique solution due to Corollary 1.
+$\square$
+
+**Lemma 4.** If $r_1 < 1$, then
+
+1. there's no solution to $x_t$ if $(r_1^2 - 1) y^2 + r_1^2 x^2 < 0$
+2. otherwise, the solutions are
+    $x_t = \left(\sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2}  - x\right) / (r_1^2 - 1)$,
+    or
+    $x_t = \left(-\sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2}  - x\right) / (r_1^2 - 1)$.
+
+(Note that solution $x_t$ still has to be nonnegative to be valid; also note that
+$x_t > 0 \Leftrightarrow x > 0$ if the solution exists.)
+
+*Proof.* Case 1 follows naturally from Lemma 3. and Corollary 1.
+
+<img src="conical/lemma4.svg"/>
+
+For case 2, we notice that $||C_f P_1||$ could be
+
+1. either $||C_f H|| + ||H P_1||$ or $||C_f H|| - ||H P_1||$ if $x \geq 0$,
+2. either $-||C_f H|| + ||H P_1||$ or $-||C_f H|| - ||H P_1||$ if $x < 0$.
+
+By analysis similar to Lemma 3., the solution to $x_t$ does not depend on the sign of $x$ and
+they are either $\frac{x^2 + y^2}{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}$
+or $\frac{x^2 + y^2}{x - \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}$.
+
+As $r_1 \neq 1$, we can apply the similar transformation in Corollary 3. to get the two
+formula in the lemma.
+$\square$
diff --git a/src/third_party/skia/site/dev/design/conical/lemma1.ggb b/src/third_party/skia/site/dev/design/conical/lemma1.ggb
new file mode 100644
index 0000000..1e80fe0
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/lemma1.ggb
Binary files differ
diff --git a/src/third_party/skia/site/dev/design/conical/lemma1.svg b/src/third_party/skia/site/dev/design/conical/lemma1.svg
new file mode 100644
index 0000000..8aa566b
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/lemma1.svg
@@ -0,0 +1,298 @@
+<?xml version="1.0" standalone="no"?>
+
+<svg 
+     version="1.1"
+     baseProfile="full"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:ev="http://www.w3.org/2001/xml-events"
+     x="0px"
+     y="0px"
+     width="562px"
+     height="514px"
+     viewBox="0 0 562 514"
+     >
+<title></title>
+<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753  Source:  Date: Friday, December 22, 2017 3:02:35 PM EST</desc>
+<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
+  <path d="M 0 0 L 442 0 L 442 404 L 0 404 L 0 0 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 49.484375 212.859375 L 52.125 212.859375 L 52.125 213.65625 L 49.484375 213.65625 L 49.484375 212.859375 z M 53.8427734375 215.171875 L 55.4677734375 215.171875 L 55.4677734375 209.609375 L 53.7021484375 209.953125 L 53.7021484375 209.0625 L 55.4521484375 208.703125 L 56.4365234375 208.703125 L 56.4365234375 215.171875 L 58.0458984375 215.171875 L 58.0458984375 216 L 53.8427734375 216 L 53.8427734375 215.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 53.73819266040353 202.82509847769083 L 53.73819266040353 206.82509847769083"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 151.171875 209.359375 Q 150.421875 209.359375 150.03125 210.109375 Q 149.65625 210.859375 149.65625 212.359375 Q 149.65625 213.859375 150.03125 214.609375 Q 150.421875 215.359375 151.171875 215.359375 Q 151.953125 215.359375 152.328125 214.609375 Q 152.71875 213.859375 152.71875 212.359375 Q 152.71875 210.859375 152.328125 210.109375 Q 151.953125 209.359375 151.171875 209.359375 z M 151.171875 208.578125 Q 152.40625 208.578125 153.046875 209.546875 Q 153.703125 210.515625 153.703125 212.359375 Q 153.703125 214.203125 153.046875 215.171875 Q 152.40625 216.140625 151.171875 216.140625 Q 149.953125 216.140625 149.296875 215.171875 Q 148.65625 214.203125 148.65625 212.359375 Q 148.65625 210.515625 149.296875 209.546875 Q 149.953125 208.578125 151.171875 208.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 142.7866248530314 202.82509847769083 L 142.7866248530314 206.82509847769083"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 230.234375 215.171875 L 231.859375 215.171875 L 231.859375 209.609375 L 230.09375 209.953125 L 230.09375 209.0625 L 231.84375 208.703125 L 232.828125 208.703125 L 232.828125 215.171875 L 234.4375 215.171875 L 234.4375 216 L 230.234375 216 L 230.234375 215.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 231.8350570456593 202.82509847769083 L 231.8350570456593 206.82509847769083"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 319.921875 215.171875 L 323.359375 215.171875 L 323.359375 216 L 318.734375 216 L 318.734375 215.171875 Q 319.296875 214.59375 320.265625 213.609375 Q 321.234375 212.625 321.484375 212.34375 Q 321.953125 211.8125 322.140625 211.453125 Q 322.328125 211.078125 322.328125 210.71875 Q 322.328125 210.140625 321.921875 209.78125 Q 321.515625 209.40625 320.859375 209.40625 Q 320.390625 209.40625 319.875 209.578125 Q 319.375 209.734375 318.78125 210.0625 L 318.78125 209.0625 Q 319.375 208.828125 319.890625 208.703125 Q 320.40625 208.578125 320.84375 208.578125 Q 321.96875 208.578125 322.640625 209.140625 Q 323.328125 209.703125 323.328125 210.65625 Q 323.328125 211.109375 323.15625 211.515625 Q 322.984375 211.90625 322.546875 212.453125 Q 322.421875 212.59375 321.765625 213.28125 Q 321.109375 213.953125 319.921875 215.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 320.8834892382872 202.82509847769083 L 320.8834892382872 206.82509847769083"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 411.0625 212.0625 Q 411.765625 212.21875 412.15625 212.703125 Q 412.5625 213.171875 412.5625 213.875 Q 412.5625 214.953125 411.8125 215.546875 Q 411.078125 216.140625 409.703125 216.140625 Q 409.25 216.140625 408.765625 216.046875 Q 408.28125 215.953125 407.765625 215.78125 L 407.765625 214.828125 Q 408.171875 215.0625 408.65625 215.1875 Q 409.15625 215.3125 409.6875 215.3125 Q 410.609375 215.3125 411.09375 214.953125 Q 411.578125 214.578125 411.578125 213.875 Q 411.578125 213.234375 411.125 212.875 Q 410.671875 212.515625 409.875 212.515625 L 409.015625 212.515625 L 409.015625 211.703125 L 409.90625 211.703125 Q 410.640625 211.703125 411.015625 211.40625 Q 411.40625 211.109375 411.40625 210.5625 Q 411.40625 210.015625 411 209.71875 Q 410.609375 209.40625 409.875 209.40625 Q 409.46875 209.40625 409 209.5 Q 408.53125 209.578125 407.984375 209.765625 L 407.984375 208.890625 Q 408.546875 208.734375 409.03125 208.65625 Q 409.53125 208.578125 409.953125 208.578125 Q 411.078125 208.578125 411.734375 209.09375 Q 412.390625 209.59375 412.390625 210.46875 Q 412.390625 211.078125 412.046875 211.5 Q 411.703125 211.90625 411.0625 212.0625 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 409.9319214309151 202.82509847769083 L 409.9319214309151 206.82509847769083"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 0 202.82509847769083 L 440 202.82509847769083"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 441 203.32509847769083 L 438 199.82509847769083"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 441 202.32509847769083 L 438 205.82509847769083"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 126.484375 380.859375 L 129.125 380.859375 L 129.125 381.65625 L 126.484375 381.65625 L 126.484375 380.859375 z M 131.5302734375 383.171875 L 134.9677734375 383.171875 L 134.9677734375 384 L 130.3427734375 384 L 130.3427734375 383.171875 Q 130.9052734375 382.59375 131.8740234375 381.609375 Q 132.8427734375 380.625 133.0927734375 380.34375 Q 133.5615234375 379.8125 133.7490234375 379.453125 Q 133.9365234375 379.078125 133.9365234375 378.71875 Q 133.9365234375 378.140625 133.5302734375 377.78125 Q 133.1240234375 377.40625 132.4677734375 377.40625 Q 131.9990234375 377.40625 131.4833984375 377.578125 Q 130.9833984375 377.734375 130.3896484375 378.0625 L 130.3896484375 377.0625 Q 130.9833984375 376.828125 131.4990234375 376.703125 Q 132.0146484375 376.578125 132.4521484375 376.578125 Q 133.5771484375 376.578125 134.2490234375 377.140625 Q 134.9365234375 377.703125 134.9365234375 378.65625 Q 134.9365234375 379.109375 134.7646484375 379.515625 Q 134.5927734375 379.90625 134.1552734375 380.453125 Q 134.0302734375 380.59375 133.3740234375 381.28125 Q 132.7177734375 381.953125 131.5302734375 383.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 138.7866248530314 380.9219628629475 L 142.7866248530314 380.9219628629475"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 126.484375 291.859375 L 129.125 291.859375 L 129.125 292.65625 L 126.484375 292.65625 L 126.484375 291.859375 z M 130.8427734375 294.171875 L 132.4677734375 294.171875 L 132.4677734375 288.609375 L 130.7021484375 288.953125 L 130.7021484375 288.0625 L 132.4521484375 287.703125 L 133.4365234375 287.703125 L 133.4365234375 294.171875 L 135.0458984375 294.171875 L 135.0458984375 295 L 130.8427734375 295 L 130.8427734375 294.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 138.7866248530314 291.87353067031916 L 142.7866248530314 291.87353067031916"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 133.171875 193.359375 Q 132.421875 193.359375 132.03125 194.109375 Q 131.65625 194.859375 131.65625 196.359375 Q 131.65625 197.859375 132.03125 198.609375 Q 132.421875 199.359375 133.171875 199.359375 Q 133.953125 199.359375 134.328125 198.609375 Q 134.71875 197.859375 134.71875 196.359375 Q 134.71875 194.859375 134.328125 194.109375 Q 133.953125 193.359375 133.171875 193.359375 z M 133.171875 192.578125 Q 134.40625 192.578125 135.046875 193.546875 Q 135.703125 194.515625 135.703125 196.359375 Q 135.703125 198.203125 135.046875 199.171875 Q 134.40625 200.140625 133.171875 200.140625 Q 131.953125 200.140625 131.296875 199.171875 Q 130.65625 198.203125 130.65625 196.359375 Q 130.65625 194.515625 131.296875 193.546875 Q 131.953125 192.578125 133.171875 192.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 138.7866248530314 202.8250984776908 L 142.7866248530314 202.8250984776908"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 131.234375 116.171875 L 132.859375 116.171875 L 132.859375 110.609375 L 131.09375 110.953125 L 131.09375 110.0625 L 132.84375 109.703125 L 133.828125 109.703125 L 133.828125 116.171875 L 135.4375 116.171875 L 135.4375 117 L 131.234375 117 L 131.234375 116.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 138.7866248530314 113.77666628506246 L 142.7866248530314 113.77666628506246"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 131.921875 27.171875 L 135.359375 27.171875 L 135.359375 28 L 130.734375 28 L 130.734375 27.171875 Q 131.296875 26.59375 132.265625 25.609375 Q 133.234375 24.625 133.484375 24.34375 Q 133.953125 23.8125 134.140625 23.453125 Q 134.328125 23.078125 134.328125 22.71875 Q 134.328125 22.140625 133.921875 21.78125 Q 133.515625 21.40625 132.859375 21.40625 Q 132.390625 21.40625 131.875 21.578125 Q 131.375 21.734375 130.78125 22.0625 L 130.78125 21.0625 Q 131.375 20.828125 131.890625 20.703125 Q 132.40625 20.578125 132.84375 20.578125 Q 133.96875 20.578125 134.640625 21.140625 Q 135.328125 21.703125 135.328125 22.65625 Q 135.328125 23.109375 135.15625 23.515625 Q 134.984375 23.90625 134.546875 24.453125 Q 134.421875 24.59375 133.765625 25.28125 Q 133.109375 25.953125 131.921875 27.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 138.7866248530314 24.72823409243412 L 142.7866248530314 24.72823409243412"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 142.7866248530314 2 L 142.7866248530314 404"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 143.2866248530314 1 L 139.7866248530314 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 142.2866248530314 1 L 145.7866248530314 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g id="misc">
+</g><!-- misc -->
+<g id="layer0">
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 418.8367646501779 202.82509847769083 C 418.8367646501779 306.10328977998404 335.113248347952 389.82680608221034 231.8350570456593 389.82680608221034 C 128.5568657433666 389.82680608221034 44.83334944114074 306.10328977998404 44.83334944114074 202.82509847769083 C 44.83334944114074 99.5469071753976 128.5568657433666 15.82339087317132 231.8350570456593 15.82339087317132 C 335.113248347952 15.82339087317132 418.8367646501779 99.5469071753976 418.8367646501779 202.82509847769083 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 33 22 L 133 22"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 78 22 C 78 23.65685424949238 76.65685424949238 25 75 25 C 73.34314575050762 25 72 23.65685424949238 72 22 C 72 20.34314575050762 73.34314575050762 19 75 19 C 76.65685424949238 19 78 20.34314575050762 78 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 78 22 C 78 23.65685424949238 76.65685424949238 25 75 25 C 73.34314575050762 25 72 23.65685424949238 72 22 C 72 20.34314575050762 73.34314575050762 19 75 19 C 76.65685424949238 19 78 20.34314575050762 78 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 68.9375 6.4375 Q 68.75 6.34375 68.53125 6.296875 Q 68.328125 6.234375 68.0625 6.234375 Q 67.15625 6.234375 66.65625 6.828125 Q 66.171875 7.421875 66.171875 8.546875 L 66.171875 12 L 65.09375 12 L 65.09375 5.4375 L 66.171875 5.4375 L 66.171875 6.453125 Q 66.515625 5.859375 67.0625 5.578125 Q 67.609375 5.28125 68.390625 5.28125 Q 68.5 5.28125 68.625 5.296875 Q 68.765625 5.3125 68.921875 5.34375 L 68.9375 6.4375 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 70.16796875 16.171875 L 71.79296875 16.171875 L 71.79296875 10.609375 L 70.02734375 10.953125 L 70.02734375 10.0625 L 71.77734375 9.703125 L 72.76171875 9.703125 L 72.76171875 16.171875 L 74.37109375 16.171875 L 74.37109375 17 L 70.16796875 17 L 70.16796875 16.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 80.3759765625 6.546875 L 87.8916015625 6.546875 L 87.8916015625 7.53125 L 80.3759765625 7.53125 L 80.3759765625 6.546875 z M 80.3759765625 8.9375 L 87.8916015625 8.9375 L 87.8916015625 9.9375 L 80.3759765625 9.9375 L 80.3759765625 8.9375 z M 95.2763671875 11 L 99.4169921875 11 L 99.4169921875 12 L 93.8544921875 12 L 93.8544921875 11 Q 94.5263671875 10.3125 95.6826171875 9.140625 Q 96.8544921875 7.953125 97.1513671875 7.609375 Q 97.7294921875 6.984375 97.9482421875 6.546875 Q 98.1826171875 6.09375 98.1826171875 5.671875 Q 98.1826171875 4.96875 97.6826171875 4.53125 Q 97.1982421875 4.09375 96.4169921875 4.09375 Q 95.8544921875 4.09375 95.2294921875 4.28125 Q 94.6201171875 4.46875 93.9169921875 4.875 L 93.9169921875 3.671875 Q 94.6357421875 3.390625 95.2451171875 3.25 Q 95.8701171875 3.09375 96.3857421875 3.09375 Q 97.7451171875 3.09375 98.5576171875 3.78125 Q 99.3701171875 4.453125 99.3701171875 5.59375 Q 99.3701171875 6.125 99.1669921875 6.609375 Q 98.9638671875 7.09375 98.4326171875 7.75 Q 98.2763671875 7.921875 97.4951171875 8.734375 Q 96.7138671875 9.546875 95.2763671875 11 z M 101.8955078125 10.515625 L 103.1298828125 10.515625 L 103.1298828125 12 L 101.8955078125 12 L 101.8955078125 10.515625 z M 105.9130859375 11 L 107.8505859375 11 L 107.8505859375 4.328125 L 105.7412109375 4.75 L 105.7412109375 3.671875 L 107.8349609375 3.25 L 109.0224609375 3.25 L 109.0224609375 11 L 110.9599609375 11 L 110.9599609375 12 L 105.9130859375 12 L 105.9130859375 11 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linejoin="round" stroke-dasharray="5,4" stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 3.451104209809671 409 L 389.1354963935821 -5"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 142.7866248530314 202.82509847769083 L 442 13.738868350091622"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 359.30328095086816 65.9986005269738 L 231.8350570456593 202.82509847769083"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 235 203 C 235 204.65685424949237 233.65685424949237 206 232 206 C 230.34314575050763 206 229 204.65685424949237 229 203 C 229 201.34314575050763 230.34314575050763 200 232 200 C 233.65685424949237 200 235 201.34314575050763 235 203 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 235 203 C 235 204.65685424949237 233.65685424949237 206 232 206 C 230.34314575050763 206 229 204.65685424949237 229 203 C 229 201.34314575050763 230.34314575050763 200 232 200 C 233.65685424949237 200 235 201.34314575050763 235 203 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 243.734375 188.921875 L 243.734375 190.171875 Q 243.125 189.609375 242.453125 189.34375 Q 241.78125 189.0625 241.015625 189.0625 Q 239.515625 189.0625 238.71875 189.984375 Q 237.921875 190.90625 237.921875 192.640625 Q 237.921875 194.359375 238.71875 195.28125 Q 239.515625 196.203125 241.015625 196.203125 Q 241.78125 196.203125 242.453125 195.921875 Q 243.125 195.640625 243.734375 195.09375 L 243.734375 196.328125 Q 243.109375 196.75 242.40625 196.96875 Q 241.71875 197.171875 240.953125 197.171875 Q 238.953125 197.171875 237.8125 195.953125 Q 236.671875 194.734375 236.671875 192.640625 Q 236.671875 190.53125 237.8125 189.3125 Q 238.953125 188.09375 240.953125 188.09375 Q 241.734375 188.09375 242.421875 188.3125 Q 243.125 188.515625 243.734375 188.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 245.61328125 201.171875 L 247.23828125 201.171875 L 247.23828125 195.609375 L 245.47265625 195.953125 L 245.47265625 195.0625 L 247.22265625 194.703125 L 248.20703125 194.703125 L 248.20703125 201.171875 L 249.81640625 201.171875 L 249.81640625 202 L 245.61328125 202 L 245.61328125 201.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 274 122 C 274 123.65685424949238 272.65685424949237 125 271 125 C 269.34314575050763 125 268 123.65685424949238 268 122 C 268 120.34314575050762 269.34314575050763 119 271 119 C 272.65685424949237 119 274 120.34314575050762 274 122 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 274 122 C 274 123.65685424949238 272.65685424949237 125 271 125 C 269.34314575050763 125 268 123.65685424949238 268 122 C 268 120.34314575050762 269.34314575050763 119 271 119 C 272.65685424949237 119 274 120.34314575050762 274 122 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 277.359375 108.21875 L 277.359375 111.515625 L 278.84375 111.515625 Q 279.671875 111.515625 280.125 111.09375 Q 280.578125 110.65625 280.578125 109.859375 Q 280.578125 109.078125 280.125 108.65625 Q 279.671875 108.21875 278.84375 108.21875 L 277.359375 108.21875 z M 276.171875 107.25 L 278.84375 107.25 Q 280.328125 107.25 281.078125 107.921875 Q 281.828125 108.578125 281.828125 109.859375 Q 281.828125 111.15625 281.078125 111.828125 Q 280.328125 112.484375 278.84375 112.484375 L 277.359375 112.484375 L 277.359375 116 L 276.171875 116 L 276.171875 107.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 146 203 C 146 204.65685424949237 144.65685424949237 206 143 206 C 141.34314575050763 206 140 204.65685424949237 140 203 C 140 201.34314575050763 141.34314575050763 200 143 200 C 144.65685424949237 200 146 201.34314575050763 146 203 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 146 203 C 146 204.65685424949237 144.65685424949237 206 143 206 C 141.34314575050763 206 140 204.65685424949237 140 203 C 140 201.34314575050763 141.34314575050763 200 143 200 C 144.65685424949237 200 146 201.34314575050763 146 203 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 154.734375 188.921875 L 154.734375 190.171875 Q 154.125 189.609375 153.453125 189.34375 Q 152.78125 189.0625 152.015625 189.0625 Q 150.515625 189.0625 149.71875 189.984375 Q 148.921875 190.90625 148.921875 192.640625 Q 148.921875 194.359375 149.71875 195.28125 Q 150.515625 196.203125 152.015625 196.203125 Q 152.78125 196.203125 153.453125 195.921875 Q 154.125 195.640625 154.734375 195.09375 L 154.734375 196.328125 Q 154.109375 196.75 153.40625 196.96875 Q 152.71875 197.171875 151.953125 197.171875 Q 149.953125 197.171875 148.8125 195.953125 Q 147.671875 194.734375 147.671875 192.640625 Q 147.671875 190.53125 148.8125 189.3125 Q 149.953125 188.09375 151.953125 188.09375 Q 152.734375 188.09375 153.421875 188.3125 Q 154.125 188.515625 154.734375 188.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 159.09765625 194.40625 L 159.09765625 195.15625 L 158.23828125 195.15625 Q 157.75390625 195.15625 157.56640625 195.359375 Q 157.37890625 195.546875 157.37890625 196.046875 L 157.37890625 196.53125 L 158.84765625 196.53125 L 158.84765625 197.234375 L 157.37890625 197.234375 L 157.37890625 202 L 156.47265625 202 L 156.47265625 197.234375 L 155.61328125 197.234375 L 155.61328125 196.53125 L 156.47265625 196.53125 L 156.47265625 196.15625 Q 156.47265625 195.234375 156.89453125 194.828125 Q 157.31640625 194.40625 158.23828125 194.40625 L 159.09765625 194.40625 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 362 66 C 362 67.65685424949238 360.65685424949237 69 359 69 C 357.34314575050763 69 356 67.65685424949238 356 66 C 356 64.34314575050762 357.34314575050763 63 359 63 C 360.65685424949237 63 362 64.34314575050762 362 66 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 362 66 C 362 67.65685424949238 360.65685424949237 69 359 69 C 357.34314575050763 69 356 67.65685424949238 356 66 C 356 64.34314575050762 357.34314575050763 63 359 63 C 360.65685424949237 63 362 64.34314575050762 362 66 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 365.359375 52.21875 L 365.359375 55.515625 L 366.84375 55.515625 Q 367.671875 55.515625 368.125 55.09375 Q 368.578125 54.65625 368.578125 53.859375 Q 368.578125 53.078125 368.125 52.65625 Q 367.671875 52.21875 366.84375 52.21875 L 365.359375 52.21875 z M 364.171875 51.25 L 366.84375 51.25 Q 368.328125 51.25 369.078125 51.921875 Q 369.828125 52.578125 369.828125 53.859375 Q 369.828125 55.15625 369.078125 55.828125 Q 368.328125 56.484375 366.84375 56.484375 L 365.359375 56.484375 L 365.359375 60 L 364.171875 60 L 364.171875 51.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 371.470703125 64.171875 L 373.095703125 64.171875 L 373.095703125 58.609375 L 371.330078125 58.953125 L 371.330078125 58.0625 L 373.080078125 57.703125 L 374.064453125 57.703125 L 374.064453125 64.171875 L 375.673828125 64.171875 L 375.673828125 65 L 371.470703125 65 L 371.470703125 64.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 199 203 C 199 204.65685424949237 197.65685424949237 206 196 206 C 194.34314575050763 206 193 204.65685424949237 193 203 C 193 201.34314575050763 194.34314575050763 200 196 200 C 197.65685424949237 200 199 201.34314575050763 199 203 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 199 203 C 199 204.65685424949237 197.65685424949237 206 196 206 C 194.34314575050763 206 193 204.65685424949237 193 203 C 193 201.34314575050763 194.34314575050763 200 196 200 C 197.65685424949237 200 199 201.34314575050763 199 203 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(1.273305143951097, 0, 0, 1.273305143951097, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 207.734375 188.921875 L 207.734375 190.171875 Q 207.125 189.609375 206.453125 189.34375 Q 205.78125 189.0625 205.015625 189.0625 Q 203.515625 189.0625 202.71875 189.984375 Q 201.921875 190.90625 201.921875 192.640625 Q 201.921875 194.359375 202.71875 195.28125 Q 203.515625 196.203125 205.015625 196.203125 Q 205.78125 196.203125 206.453125 195.921875 Q 207.125 195.640625 207.734375 195.09375 L 207.734375 196.328125 Q 207.109375 196.75 206.40625 196.96875 Q 205.71875 197.171875 204.953125 197.171875 Q 202.953125 197.171875 201.8125 195.953125 Q 200.671875 194.734375 200.671875 192.640625 Q 200.671875 190.53125 201.8125 189.3125 Q 202.953125 188.09375 204.953125 188.09375 Q 205.734375 188.09375 206.421875 188.3125 Q 207.125 188.515625 207.734375 188.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+</g><!-- layer0 -->
+</g> <!-- default stroke -->
+</svg> <!-- bounding box -->
diff --git a/src/third_party/skia/site/dev/design/conical/lemma3.1.ggb b/src/third_party/skia/site/dev/design/conical/lemma3.1.ggb
new file mode 100644
index 0000000..6684365
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/lemma3.1.ggb
Binary files differ
diff --git a/src/third_party/skia/site/dev/design/conical/lemma3.1.svg b/src/third_party/skia/site/dev/design/conical/lemma3.1.svg
new file mode 100644
index 0000000..2d4d280
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/lemma3.1.svg
@@ -0,0 +1,328 @@
+<?xml version="1.0" standalone="no"?>
+
+<svg 
+     version="1.1"
+     baseProfile="full"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:ev="http://www.w3.org/2001/xml-events"
+     x="0px"
+     y="0px"
+     width="357px"
+     height="247px"
+     viewBox="0 0 357 247"
+     >
+<title></title>
+<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753  Source:  Date: Friday, December 22, 2017 4:53:23 PM EST</desc>
+<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
+  <path d="M 0 0 L 405 0 L 405 280 L 0 280 L 0 0 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 45.484375 235.859375 L 48.125 235.859375 L 48.125 236.65625 L 45.484375 236.65625 L 45.484375 235.859375 z M 51.7802734375 232.359375 Q 51.0302734375 232.359375 50.6396484375 233.109375 Q 50.2646484375 233.859375 50.2646484375 235.359375 Q 50.2646484375 236.859375 50.6396484375 237.609375 Q 51.0302734375 238.359375 51.7802734375 238.359375 Q 52.5615234375 238.359375 52.9365234375 237.609375 Q 53.3271484375 236.859375 53.3271484375 235.359375 Q 53.3271484375 233.859375 52.9365234375 233.109375 Q 52.5615234375 232.359375 51.7802734375 232.359375 z M 51.7802734375 231.578125 Q 53.0146484375 231.578125 53.6552734375 232.546875 Q 54.3115234375 233.515625 54.3115234375 235.359375 Q 54.3115234375 237.203125 53.6552734375 238.171875 Q 53.0146484375 239.140625 51.7802734375 239.140625 Q 50.5615234375 239.140625 49.9052734375 238.171875 Q 49.2646484375 237.203125 49.2646484375 235.359375 Q 49.2646484375 233.515625 49.9052734375 232.546875 Q 50.5615234375 231.578125 51.7802734375 231.578125 z M 56.033203125 237.765625 L 57.064453125 237.765625 L 57.064453125 239 L 56.033203125 239 L 56.033203125 237.765625 z M 59.2275390625 231.703125 L 63.1025390625 231.703125 L 63.1025390625 232.546875 L 60.1337890625 232.546875 L 60.1337890625 234.328125 Q 60.3525390625 234.25 60.5556640625 234.21875 Q 60.7744140625 234.1875 60.9931640625 234.1875 Q 62.2119140625 234.1875 62.9150390625 234.859375 Q 63.6337890625 235.515625 63.6337890625 236.65625 Q 63.6337890625 237.84375 62.8994140625 238.5 Q 62.1806640625 239.140625 60.8369140625 239.140625 Q 60.3837890625 239.140625 59.8994140625 239.0625 Q 59.4306640625 238.984375 58.9150390625 238.828125 L 58.9150390625 237.84375 Q 59.3681640625 238.078125 59.8369140625 238.203125 Q 60.3056640625 238.3125 60.8212890625 238.3125 Q 61.6650390625 238.3125 62.1494140625 237.875 Q 62.6494140625 237.421875 62.6494140625 236.65625 Q 62.6494140625 235.90625 62.1494140625 235.46875 Q 61.6650390625 235.015625 60.8212890625 235.015625 Q 60.4306640625 235.015625 60.0244140625 235.109375 Q 59.6337890625 235.1875 59.2275390625 235.375 L 59.2275390625 231.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 54.41565157552739 225.13443114482905 L 54.41565157552739 229.13443114482905"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 127.171875 232.359375 Q 126.421875 232.359375 126.03125 233.109375 Q 125.65625 233.859375 125.65625 235.359375 Q 125.65625 236.859375 126.03125 237.609375 Q 126.421875 238.359375 127.171875 238.359375 Q 127.953125 238.359375 128.328125 237.609375 Q 128.71875 236.859375 128.71875 235.359375 Q 128.71875 233.859375 128.328125 233.109375 Q 127.953125 232.359375 127.171875 232.359375 z M 127.171875 231.578125 Q 128.40625 231.578125 129.046875 232.546875 Q 129.703125 233.515625 129.703125 235.359375 Q 129.703125 237.203125 129.046875 238.171875 Q 128.40625 239.140625 127.171875 239.140625 Q 125.953125 239.140625 125.296875 238.171875 Q 124.65625 237.203125 124.65625 235.359375 Q 124.65625 233.515625 125.296875 232.546875 Q 125.953125 231.578125 127.171875 231.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 118.66669502231808 225.13443114482905 L 118.66669502231808 229.13443114482905"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 178.171875 232.359375 Q 177.421875 232.359375 177.03125 233.109375 Q 176.65625 233.859375 176.65625 235.359375 Q 176.65625 236.859375 177.03125 237.609375 Q 177.421875 238.359375 178.171875 238.359375 Q 178.953125 238.359375 179.328125 237.609375 Q 179.71875 236.859375 179.71875 235.359375 Q 179.71875 233.859375 179.328125 233.109375 Q 178.953125 232.359375 178.171875 232.359375 z M 178.171875 231.578125 Q 179.40625 231.578125 180.046875 232.546875 Q 180.703125 233.515625 180.703125 235.359375 Q 180.703125 237.203125 180.046875 238.171875 Q 179.40625 239.140625 178.171875 239.140625 Q 176.953125 239.140625 176.296875 238.171875 Q 175.65625 237.203125 175.65625 235.359375 Q 175.65625 233.515625 176.296875 232.546875 Q 176.953125 231.578125 178.171875 231.578125 z M 182.4248046875 237.765625 L 183.4560546875 237.765625 L 183.4560546875 239 L 182.4248046875 239 L 182.4248046875 237.765625 z M 185.619140625 231.703125 L 189.494140625 231.703125 L 189.494140625 232.546875 L 186.525390625 232.546875 L 186.525390625 234.328125 Q 186.744140625 234.25 186.947265625 234.21875 Q 187.166015625 234.1875 187.384765625 234.1875 Q 188.603515625 234.1875 189.306640625 234.859375 Q 190.025390625 235.515625 190.025390625 236.65625 Q 190.025390625 237.84375 189.291015625 238.5 Q 188.572265625 239.140625 187.228515625 239.140625 Q 186.775390625 239.140625 186.291015625 239.0625 Q 185.822265625 238.984375 185.306640625 238.828125 L 185.306640625 237.84375 Q 185.759765625 238.078125 186.228515625 238.203125 Q 186.697265625 238.3125 187.212890625 238.3125 Q 188.056640625 238.3125 188.541015625 237.875 Q 189.041015625 237.421875 189.041015625 236.65625 Q 189.041015625 235.90625 188.541015625 235.46875 Q 188.056640625 235.015625 187.212890625 235.015625 Q 186.822265625 235.015625 186.416015625 235.109375 Q 186.025390625 235.1875 185.619140625 235.375 L 185.619140625 231.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 182.91773846910877 225.13443114482905 L 182.91773846910877 229.13443114482905"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 245.234375 238.171875 L 246.859375 238.171875 L 246.859375 232.609375 L 245.09375 232.953125 L 245.09375 232.0625 L 246.84375 231.703125 L 247.828125 231.703125 L 247.828125 238.171875 L 249.4375 238.171875 L 249.4375 239 L 245.234375 239 L 245.234375 238.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 247.16878191589944 225.13443114482905 L 247.16878191589944 229.13443114482905"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 305.234375 238.171875 L 306.859375 238.171875 L 306.859375 232.609375 L 305.09375 232.953125 L 305.09375 232.0625 L 306.84375 231.703125 L 307.828125 231.703125 L 307.828125 238.171875 L 309.4375 238.171875 L 309.4375 239 L 305.234375 239 L 305.234375 238.171875 z M 311.4248046875 237.765625 L 312.4560546875 237.765625 L 312.4560546875 239 L 311.4248046875 239 L 311.4248046875 237.765625 z M 314.619140625 231.703125 L 318.494140625 231.703125 L 318.494140625 232.546875 L 315.525390625 232.546875 L 315.525390625 234.328125 Q 315.744140625 234.25 315.947265625 234.21875 Q 316.166015625 234.1875 316.384765625 234.1875 Q 317.603515625 234.1875 318.306640625 234.859375 Q 319.025390625 235.515625 319.025390625 236.65625 Q 319.025390625 237.84375 318.291015625 238.5 Q 317.572265625 239.140625 316.228515625 239.140625 Q 315.775390625 239.140625 315.291015625 239.0625 Q 314.822265625 238.984375 314.306640625 238.828125 L 314.306640625 237.84375 Q 314.759765625 238.078125 315.228515625 238.203125 Q 315.697265625 238.3125 316.212890625 238.3125 Q 317.056640625 238.3125 317.541015625 237.875 Q 318.041015625 237.421875 318.041015625 236.65625 Q 318.041015625 235.90625 317.541015625 235.46875 Q 317.056640625 235.015625 316.212890625 235.015625 Q 315.822265625 235.015625 315.416015625 235.109375 Q 315.025390625 235.1875 314.619140625 235.375 L 314.619140625 231.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 311.4198253626901 225.13443114482905 L 311.4198253626901 229.13443114482905"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 374.921875 238.171875 L 378.359375 238.171875 L 378.359375 239 L 373.734375 239 L 373.734375 238.171875 Q 374.296875 237.59375 375.265625 236.609375 Q 376.234375 235.625 376.484375 235.34375 Q 376.953125 234.8125 377.140625 234.453125 Q 377.328125 234.078125 377.328125 233.71875 Q 377.328125 233.140625 376.921875 232.78125 Q 376.515625 232.40625 375.859375 232.40625 Q 375.390625 232.40625 374.875 232.578125 Q 374.375 232.734375 373.78125 233.0625 L 373.78125 232.0625 Q 374.375 231.828125 374.890625 231.703125 Q 375.40625 231.578125 375.84375 231.578125 Q 376.96875 231.578125 377.640625 232.140625 Q 378.328125 232.703125 378.328125 233.65625 Q 378.328125 234.109375 378.15625 234.515625 Q 377.984375 234.90625 377.546875 235.453125 Q 377.421875 235.59375 376.765625 236.28125 Q 376.109375 236.953125 374.921875 238.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 375.6708688094808 225.13443114482905 L 375.6708688094808 229.13443114482905"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 0 225.13443114482905 L 403 225.13443114482905"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 404 225.63443114482905 L 401 222.13443114482905"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 404 224.63443114482905 L 401 228.13443114482905"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 109.171875 216.359375 Q 108.421875 216.359375 108.03125 217.109375 Q 107.65625 217.859375 107.65625 219.359375 Q 107.65625 220.859375 108.03125 221.609375 Q 108.421875 222.359375 109.171875 222.359375 Q 109.953125 222.359375 110.328125 221.609375 Q 110.71875 220.859375 110.71875 219.359375 Q 110.71875 217.859375 110.328125 217.109375 Q 109.953125 216.359375 109.171875 216.359375 z M 109.171875 215.578125 Q 110.40625 215.578125 111.046875 216.546875 Q 111.703125 217.515625 111.703125 219.359375 Q 111.703125 221.203125 111.046875 222.171875 Q 110.40625 223.140625 109.171875 223.140625 Q 107.953125 223.140625 107.296875 222.171875 Q 106.65625 221.203125 106.65625 219.359375 Q 106.65625 217.515625 107.296875 216.546875 Q 107.953125 215.578125 109.171875 215.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 114.66669502231808 225.13443114482905 L 118.66669502231808 225.13443114482905"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 99.171875 157.359375 Q 98.421875 157.359375 98.03125 158.109375 Q 97.65625 158.859375 97.65625 160.359375 Q 97.65625 161.859375 98.03125 162.609375 Q 98.421875 163.359375 99.171875 163.359375 Q 99.953125 163.359375 100.328125 162.609375 Q 100.71875 161.859375 100.71875 160.359375 Q 100.71875 158.859375 100.328125 158.109375 Q 99.953125 157.359375 99.171875 157.359375 z M 99.171875 156.578125 Q 100.40625 156.578125 101.046875 157.546875 Q 101.703125 158.515625 101.703125 160.359375 Q 101.703125 162.203125 101.046875 163.171875 Q 100.40625 164.140625 99.171875 164.140625 Q 97.953125 164.140625 97.296875 163.171875 Q 96.65625 162.203125 96.65625 160.359375 Q 96.65625 158.515625 97.296875 157.546875 Q 97.953125 156.578125 99.171875 156.578125 z M 103.4248046875 162.765625 L 104.4560546875 162.765625 L 104.4560546875 164 L 103.4248046875 164 L 103.4248046875 162.765625 z M 106.619140625 156.703125 L 110.494140625 156.703125 L 110.494140625 157.546875 L 107.525390625 157.546875 L 107.525390625 159.328125 Q 107.744140625 159.25 107.947265625 159.21875 Q 108.166015625 159.1875 108.384765625 159.1875 Q 109.603515625 159.1875 110.306640625 159.859375 Q 111.025390625 160.515625 111.025390625 161.65625 Q 111.025390625 162.84375 110.291015625 163.5 Q 109.572265625 164.140625 108.228515625 164.140625 Q 107.775390625 164.140625 107.291015625 164.0625 Q 106.822265625 163.984375 106.306640625 163.828125 L 106.306640625 162.84375 Q 106.759765625 163.078125 107.228515625 163.203125 Q 107.697265625 163.3125 108.212890625 163.3125 Q 109.056640625 163.3125 109.541015625 162.875 Q 110.041015625 162.421875 110.041015625 161.65625 Q 110.041015625 160.90625 109.541015625 160.46875 Q 109.056640625 160.015625 108.212890625 160.015625 Q 107.822265625 160.015625 107.416015625 160.109375 Q 107.025390625 160.1875 106.619140625 160.375 L 106.619140625 156.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 114.66669502231808 160.88338769803818 L 118.66669502231808 160.88338769803818"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 107.234375 99.171875 L 108.859375 99.171875 L 108.859375 93.609375 L 107.09375 93.953125 L 107.09375 93.0625 L 108.84375 92.703125 L 109.828125 92.703125 L 109.828125 99.171875 L 111.4375 99.171875 L 111.4375 100 L 107.234375 100 L 107.234375 99.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 114.66669502231808 96.63234425124729 L 118.66669502231808 96.63234425124729"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 97.234375 35.171875 L 98.859375 35.171875 L 98.859375 29.609375 L 97.09375 29.953125 L 97.09375 29.0625 L 98.84375 28.703125 L 99.828125 28.703125 L 99.828125 35.171875 L 101.4375 35.171875 L 101.4375 36 L 97.234375 36 L 97.234375 35.171875 z M 103.4248046875 34.765625 L 104.4560546875 34.765625 L 104.4560546875 36 L 103.4248046875 36 L 103.4248046875 34.765625 z M 106.619140625 28.703125 L 110.494140625 28.703125 L 110.494140625 29.546875 L 107.525390625 29.546875 L 107.525390625 31.328125 Q 107.744140625 31.25 107.947265625 31.21875 Q 108.166015625 31.1875 108.384765625 31.1875 Q 109.603515625 31.1875 110.306640625 31.859375 Q 111.025390625 32.515625 111.025390625 33.65625 Q 111.025390625 34.84375 110.291015625 35.5 Q 109.572265625 36.140625 108.228515625 36.140625 Q 107.775390625 36.140625 107.291015625 36.0625 Q 106.822265625 35.984375 106.306640625 35.828125 L 106.306640625 34.84375 Q 106.759765625 35.078125 107.228515625 35.203125 Q 107.697265625 35.3125 108.212890625 35.3125 Q 109.056640625 35.3125 109.541015625 34.875 Q 110.041015625 34.421875 110.041015625 33.65625 Q 110.041015625 32.90625 109.541015625 32.46875 Q 109.056640625 32.015625 108.212890625 32.015625 Q 107.822265625 32.015625 107.416015625 32.109375 Q 107.025390625 32.1875 106.619140625 32.375 L 106.619140625 28.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 114.66669502231808 32.3813008044564 L 118.66669502231808 32.3813008044564"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 118.66669502231808 2 L 118.66669502231808 280"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 119.16669502231808 1 L 115.66669502231808 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 118.16669502231808 1 L 121.66669502231808 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g id="misc">
+</g><!-- misc -->
+<g id="layer0">
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 452.7721209456297 225.13443114482905 C 452.7721209456297 338.6860198052397 360.72037057630973 430.7377701745599 247.16878191589944 430.7377701745599 C 133.6171932554891 430.7377701745599 41.56544288616922 338.6860198052397 41.56544288616922 225.13443114482905 C 41.56544288616922 111.58284248441836 133.6171932554891 19.531092115098204 247.16878191589944 19.531092115098204 C 360.72037057630973 19.531092115098204 452.7721209456297 111.58284248441836 452.7721209456297 225.13443114482905 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 33 22 L 133 22"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 68 22 C 68 23.65685424949238 66.65685424949238 25 65 25 C 63.34314575050762 25 62 23.65685424949238 62 22 C 62 20.34314575050762 63.34314575050762 19 65 19 C 66.65685424949238 19 68 20.34314575050762 68 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 68 22 C 68 23.65685424949238 66.65685424949238 25 65 25 C 63.34314575050762 25 62 23.65685424949238 62 22 C 62 20.34314575050762 63.34314575050762 19 65 19 C 66.65685424949238 19 68 20.34314575050762 68 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 27.9375 33.4375 Q 27.75 33.34375 27.53125 33.296875 Q 27.328125 33.234375 27.0625 33.234375 Q 26.15625 33.234375 25.65625 33.828125 Q 25.171875 34.421875 25.171875 35.546875 L 25.171875 39 L 24.09375 39 L 24.09375 32.4375 L 25.171875 32.4375 L 25.171875 33.453125 Q 25.515625 32.859375 26.0625 32.578125 Q 26.609375 32.28125 27.390625 32.28125 Q 27.5 32.28125 27.625 32.296875 Q 27.765625 32.3125 27.921875 32.34375 L 27.9375 33.4375 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 29.16796875 43.171875 L 30.79296875 43.171875 L 30.79296875 37.609375 L 29.02734375 37.953125 L 29.02734375 37.0625 L 30.77734375 36.703125 L 31.76171875 36.703125 L 31.76171875 43.171875 L 33.37109375 43.171875 L 33.37109375 44 L 29.16796875 44 L 29.16796875 43.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 39.3759765625 33.546875 L 46.8916015625 33.546875 L 46.8916015625 34.53125 L 39.3759765625 34.53125 L 39.3759765625 33.546875 z M 39.3759765625 35.9375 L 46.8916015625 35.9375 L 46.8916015625 36.9375 L 39.3759765625 36.9375 L 39.3759765625 35.9375 z M 53.4638671875 38 L 55.4013671875 38 L 55.4013671875 31.328125 L 53.2919921875 31.75 L 53.2919921875 30.671875 L 55.3857421875 30.25 L 56.5732421875 30.25 L 56.5732421875 38 L 58.5107421875 38 L 58.5107421875 39 L 53.4638671875 39 L 53.4638671875 38 z M 60.8955078125 37.515625 L 62.1298828125 37.515625 L 62.1298828125 39 L 60.8955078125 39 L 60.8955078125 37.515625 z M 67.3974609375 34.15625 Q 66.6005859375 34.15625 66.1318359375 34.703125 Q 65.6630859375 35.25 65.6630859375 36.1875 Q 65.6630859375 37.140625 66.1318359375 37.6875 Q 66.6005859375 38.234375 67.3974609375 38.234375 Q 68.1943359375 38.234375 68.6474609375 37.6875 Q 69.1162109375 37.140625 69.1162109375 36.1875 Q 69.1162109375 35.25 68.6474609375 34.703125 Q 68.1943359375 34.15625 67.3974609375 34.15625 z M 69.7412109375 30.4375 L 69.7412109375 31.515625 Q 69.2880859375 31.3125 68.8349609375 31.203125 Q 68.3818359375 31.09375 67.9443359375 31.09375 Q 66.7724609375 31.09375 66.1474609375 31.890625 Q 65.5380859375 32.671875 65.4443359375 34.265625 Q 65.7880859375 33.765625 66.3037109375 33.5 Q 66.8349609375 33.21875 67.4599609375 33.21875 Q 68.7724609375 33.21875 69.5380859375 34.015625 Q 70.3037109375 34.8125 70.3037109375 36.1875 Q 70.3037109375 37.546875 69.5068359375 38.359375 Q 68.7099609375 39.171875 67.3974609375 39.171875 Q 65.8662109375 39.171875 65.0693359375 38.015625 Q 64.2724609375 36.84375 64.2724609375 34.640625 Q 64.2724609375 32.5625 65.2568359375 31.328125 Q 66.2412109375 30.09375 67.8974609375 30.09375 Q 68.3349609375 30.09375 68.7880859375 30.1875 Q 69.2412109375 30.265625 69.7412109375 30.4375 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="0.10196078568696976" fill-rule="nonzero" stroke="none" fill="#006400">
+  <path d="M 211.6416473388672 167.66152954101562 L 193.5975799560547 178.8155517578125 L 204.75160217285156 196.85960388183594 L 222.795654296875 185.70558166503906 L 211.6416473388672 167.66152954101562"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#006400">
+  <path d="M 211.6416473388672 167.66152954101562 L 193.5975799560547 178.8155517578125 L 204.75160217285156 196.85960388183594 L 222.795654296875 185.70558166503906 L 211.6416473388672 167.66152954101562"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 118.66669502231808 225.13443114482905 L 405 48.136155148760366"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 211.64164002930823 167.6615326346497 L 247.16878191589944 225.13443114482905"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 290.818181818182 118.7181818181819 L 290.818181818182 225.13443114482905"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 250 225 C 250 226.65685424949237 248.65685424949237 228 247 228 C 245.34314575050763 228 244 226.65685424949237 244 225 C 244 223.34314575050763 245.34314575050763 222 247 222 C 248.65685424949237 222 250 223.34314575050763 250 225 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 250 225 C 250 226.65685424949237 248.65685424949237 228 247 228 C 245.34314575050763 228 244 226.65685424949237 244 225 C 244 223.34314575050763 245.34314575050763 222 247 222 C 248.65685424949237 222 250 223.34314575050763 250 225 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 258.734375 210.921875 L 258.734375 212.171875 Q 258.125 211.609375 257.453125 211.34375 Q 256.78125 211.0625 256.015625 211.0625 Q 254.515625 211.0625 253.71875 211.984375 Q 252.921875 212.90625 252.921875 214.640625 Q 252.921875 216.359375 253.71875 217.28125 Q 254.515625 218.203125 256.015625 218.203125 Q 256.78125 218.203125 257.453125 217.921875 Q 258.125 217.640625 258.734375 217.09375 L 258.734375 218.328125 Q 258.109375 218.75 257.40625 218.96875 Q 256.71875 219.171875 255.953125 219.171875 Q 253.953125 219.171875 252.8125 217.953125 Q 251.671875 216.734375 251.671875 214.640625 Q 251.671875 212.53125 252.8125 211.3125 Q 253.953125 210.09375 255.953125 210.09375 Q 256.734375 210.09375 257.421875 210.3125 Q 258.125 210.515625 258.734375 210.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 260.61328125 223.171875 L 262.23828125 223.171875 L 262.23828125 217.609375 L 260.47265625 217.953125 L 260.47265625 217.0625 L 262.22265625 216.703125 L 263.20703125 216.703125 L 263.20703125 223.171875 L 264.81640625 223.171875 L 264.81640625 224 L 260.61328125 224 L 260.61328125 223.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 294 119 C 294 120.65685424949238 292.65685424949237 122 291 122 C 289.34314575050763 122 288 120.65685424949238 288 119 C 288 117.34314575050762 289.34314575050763 116 291 116 C 292.65685424949237 116 294 117.34314575050762 294 119 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 294 119 C 294 120.65685424949238 292.65685424949237 122 291 122 C 289.34314575050763 122 288 120.65685424949238 288 119 C 288 117.34314575050762 289.34314575050763 116 291 116 C 292.65685424949237 116 294 117.34314575050762 294 119 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 297.359375 105.21875 L 297.359375 108.515625 L 298.84375 108.515625 Q 299.671875 108.515625 300.125 108.09375 Q 300.578125 107.65625 300.578125 106.859375 Q 300.578125 106.078125 300.125 105.65625 Q 299.671875 105.21875 298.84375 105.21875 L 297.359375 105.21875 z M 296.171875 104.25 L 298.84375 104.25 Q 300.328125 104.25 301.078125 104.921875 Q 301.828125 105.578125 301.828125 106.859375 Q 301.828125 108.15625 301.078125 108.828125 Q 300.328125 109.484375 298.84375 109.484375 L 297.359375 109.484375 L 297.359375 113 L 296.171875 113 L 296.171875 104.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 122 225 C 122 226.65685424949237 120.65685424949238 228 119 228 C 117.34314575050762 228 116 226.65685424949237 116 225 C 116 223.34314575050763 117.34314575050762 222 119 222 C 120.65685424949238 222 122 223.34314575050763 122 225 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 122 225 C 122 226.65685424949237 120.65685424949238 228 119 228 C 117.34314575050762 228 116 226.65685424949237 116 225 C 116 223.34314575050763 117.34314575050762 222 119 222 C 120.65685424949238 222 122 223.34314575050763 122 225 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 130.734375 210.921875 L 130.734375 212.171875 Q 130.125 211.609375 129.453125 211.34375 Q 128.78125 211.0625 128.015625 211.0625 Q 126.515625 211.0625 125.71875 211.984375 Q 124.921875 212.90625 124.921875 214.640625 Q 124.921875 216.359375 125.71875 217.28125 Q 126.515625 218.203125 128.015625 218.203125 Q 128.78125 218.203125 129.453125 217.921875 Q 130.125 217.640625 130.734375 217.09375 L 130.734375 218.328125 Q 130.109375 218.75 129.40625 218.96875 Q 128.71875 219.171875 127.953125 219.171875 Q 125.953125 219.171875 124.8125 217.953125 Q 123.671875 216.734375 123.671875 214.640625 Q 123.671875 212.53125 124.8125 211.3125 Q 125.953125 210.09375 127.953125 210.09375 Q 128.734375 210.09375 129.421875 210.3125 Q 130.125 210.515625 130.734375 210.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 135.09765625 216.40625 L 135.09765625 217.15625 L 134.23828125 217.15625 Q 133.75390625 217.15625 133.56640625 217.359375 Q 133.37890625 217.546875 133.37890625 218.046875 L 133.37890625 218.53125 L 134.84765625 218.53125 L 134.84765625 219.234375 L 133.37890625 219.234375 L 133.37890625 224 L 132.47265625 224 L 132.47265625 219.234375 L 131.61328125 219.234375 L 131.61328125 218.53125 L 132.47265625 218.53125 L 132.47265625 218.15625 Q 132.47265625 217.234375 132.89453125 216.828125 Q 133.31640625 216.40625 134.23828125 216.40625 L 135.09765625 216.40625 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 380 66 C 380 67.65685424949238 378.65685424949237 69 377 69 C 375.34314575050763 69 374 67.65685424949238 374 66 C 374 64.34314575050762 375.34314575050763 63 377 63 C 378.65685424949237 63 380 64.34314575050762 380 66 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 380 66 C 380 67.65685424949238 378.65685424949237 69 377 69 C 375.34314575050763 69 374 67.65685424949238 374 66 C 374 64.34314575050762 375.34314575050763 63 377 63 C 378.65685424949237 63 380 64.34314575050762 380 66 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 383.359375 52.21875 L 383.359375 55.515625 L 384.84375 55.515625 Q 385.671875 55.515625 386.125 55.09375 Q 386.578125 54.65625 386.578125 53.859375 Q 386.578125 53.078125 386.125 52.65625 Q 385.671875 52.21875 384.84375 52.21875 L 383.359375 52.21875 z M 382.171875 51.25 L 384.84375 51.25 Q 386.328125 51.25 387.078125 51.921875 Q 387.828125 52.578125 387.828125 53.859375 Q 387.828125 55.15625 387.078125 55.828125 Q 386.328125 56.484375 384.84375 56.484375 L 383.359375 56.484375 L 383.359375 60 L 382.171875 60 L 382.171875 51.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 389.470703125 64.171875 L 391.095703125 64.171875 L 391.095703125 58.609375 L 389.330078125 58.953125 L 389.330078125 58.0625 L 391.080078125 57.703125 L 392.064453125 57.703125 L 392.064453125 64.171875 L 393.673828125 64.171875 L 393.673828125 65 L 389.470703125 65 L 389.470703125 64.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 215 168 C 215 169.65685424949237 213.65685424949237 171 212 171 C 210.34314575050763 171 209 169.65685424949237 209 168 C 209 166.34314575050763 210.34314575050763 165 212 165 C 213.65685424949237 165 215 166.34314575050763 215 168 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 215 168 C 215 169.65685424949237 213.65685424949237 171 212 171 C 210.34314575050763 171 209 169.65685424949237 209 168 C 209 166.34314575050763 210.34314575050763 165 212 165 C 213.65685424949237 165 215 166.34314575050763 215 168 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 217.171875 153.25 L 218.359375 153.25 L 218.359375 156.84375 L 222.65625 156.84375 L 222.65625 153.25 L 223.84375 153.25 L 223.84375 162 L 222.65625 162 L 222.65625 157.828125 L 218.359375 157.828125 L 218.359375 162 L 217.171875 162 L 217.171875 153.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 294 225 C 294 226.65685424949237 292.65685424949237 228 291 228 C 289.34314575050763 228 288 226.65685424949237 288 225 C 288 223.34314575050763 289.34314575050763 222 291 222 C 292.65685424949237 222 294 223.34314575050763 294 225 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 294 225 C 294 226.65685424949237 292.65685424949237 228 291 228 C 289.34314575050763 228 288 226.65685424949237 288 225 C 288 223.34314575050763 289.34314575050763 222 291 222 C 292.65685424949237 222 294 223.34314575050763 294 225 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 295.75 210.25 L 297.03125 210.25 L 299.203125 213.5 L 301.390625 210.25 L 302.65625 210.25 L 299.84375 214.453125 L 302.84375 219 L 301.578125 219 L 299.109375 215.28125 L 296.640625 219 L 295.359375 219 L 298.484375 214.328125 L 295.75 210.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906831, 0, 0, 0.8823656448906831, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 305.189453125 217.515625 L 305.189453125 220.265625 L 306.423828125 220.265625 Q 307.111328125 220.265625 307.486328125 219.90625 Q 307.876953125 219.546875 307.876953125 218.890625 Q 307.876953125 218.234375 307.486328125 217.875 Q 307.111328125 217.515625 306.423828125 217.515625 L 305.189453125 217.515625 z M 304.205078125 216.703125 L 306.423828125 216.703125 Q 307.658203125 216.703125 308.283203125 217.265625 Q 308.908203125 217.8125 308.908203125 218.890625 Q 308.908203125 219.96875 308.283203125 220.515625 Q 307.658203125 221.0625 306.423828125 221.0625 L 305.189453125 221.0625 L 305.189453125 224 L 304.205078125 224 L 304.205078125 216.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+</g><!-- layer0 -->
+</g> <!-- default stroke -->
+</svg> <!-- bounding box -->
diff --git a/src/third_party/skia/site/dev/design/conical/lemma3.2.ggb b/src/third_party/skia/site/dev/design/conical/lemma3.2.ggb
new file mode 100644
index 0000000..182f0ec
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/lemma3.2.ggb
Binary files differ
diff --git a/src/third_party/skia/site/dev/design/conical/lemma3.2.svg b/src/third_party/skia/site/dev/design/conical/lemma3.2.svg
new file mode 100644
index 0000000..a38bee0
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/lemma3.2.svg
@@ -0,0 +1,328 @@
+<?xml version="1.0" standalone="no"?>
+
+<svg 
+     version="1.1"
+     baseProfile="full"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:ev="http://www.w3.org/2001/xml-events"
+     x="0px"
+     y="0px"
+     width="312px"
+     height="279px"
+     viewBox="0 0 312 279"
+     >
+<title></title>
+<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753  Source:  Date: Wednesday, December 27, 2017 9:52:32 AM EST</desc>
+<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
+  <path d="M 0 0 L 354 0 L 354 317 L 0 317 L 0 0 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 45.484375 235.859375 L 48.125 235.859375 L 48.125 236.65625 L 45.484375 236.65625 L 45.484375 235.859375 z M 51.7802734375 232.359375 Q 51.0302734375 232.359375 50.6396484375 233.109375 Q 50.2646484375 233.859375 50.2646484375 235.359375 Q 50.2646484375 236.859375 50.6396484375 237.609375 Q 51.0302734375 238.359375 51.7802734375 238.359375 Q 52.5615234375 238.359375 52.9365234375 237.609375 Q 53.3271484375 236.859375 53.3271484375 235.359375 Q 53.3271484375 233.859375 52.9365234375 233.109375 Q 52.5615234375 232.359375 51.7802734375 232.359375 z M 51.7802734375 231.578125 Q 53.0146484375 231.578125 53.6552734375 232.546875 Q 54.3115234375 233.515625 54.3115234375 235.359375 Q 54.3115234375 237.203125 53.6552734375 238.171875 Q 53.0146484375 239.140625 51.7802734375 239.140625 Q 50.5615234375 239.140625 49.9052734375 238.171875 Q 49.2646484375 237.203125 49.2646484375 235.359375 Q 49.2646484375 233.515625 49.9052734375 232.546875 Q 50.5615234375 231.578125 51.7802734375 231.578125 z M 56.033203125 237.765625 L 57.064453125 237.765625 L 57.064453125 239 L 56.033203125 239 L 56.033203125 237.765625 z M 59.2275390625 231.703125 L 63.1025390625 231.703125 L 63.1025390625 232.546875 L 60.1337890625 232.546875 L 60.1337890625 234.328125 Q 60.3525390625 234.25 60.5556640625 234.21875 Q 60.7744140625 234.1875 60.9931640625 234.1875 Q 62.2119140625 234.1875 62.9150390625 234.859375 Q 63.6337890625 235.515625 63.6337890625 236.65625 Q 63.6337890625 237.84375 62.8994140625 238.5 Q 62.1806640625 239.140625 60.8369140625 239.140625 Q 60.3837890625 239.140625 59.8994140625 239.0625 Q 59.4306640625 238.984375 58.9150390625 238.828125 L 58.9150390625 237.84375 Q 59.3681640625 238.078125 59.8369140625 238.203125 Q 60.3056640625 238.3125 60.8212890625 238.3125 Q 61.6650390625 238.3125 62.1494140625 237.875 Q 62.6494140625 237.421875 62.6494140625 236.65625 Q 62.6494140625 235.90625 62.1494140625 235.46875 Q 61.6650390625 235.015625 60.8212890625 235.015625 Q 60.4306640625 235.015625 60.0244140625 235.109375 Q 59.6337890625 235.1875 59.2275390625 235.375 L 59.2275390625 231.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 54.41565157552735 225.13443114482908 L 54.41565157552735 229.13443114482908"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 127.171875 232.359375 Q 126.421875 232.359375 126.03125 233.109375 Q 125.65625 233.859375 125.65625 235.359375 Q 125.65625 236.859375 126.03125 237.609375 Q 126.421875 238.359375 127.171875 238.359375 Q 127.953125 238.359375 128.328125 237.609375 Q 128.71875 236.859375 128.71875 235.359375 Q 128.71875 233.859375 128.328125 233.109375 Q 127.953125 232.359375 127.171875 232.359375 z M 127.171875 231.578125 Q 128.40625 231.578125 129.046875 232.546875 Q 129.703125 233.515625 129.703125 235.359375 Q 129.703125 237.203125 129.046875 238.171875 Q 128.40625 239.140625 127.171875 239.140625 Q 125.953125 239.140625 125.296875 238.171875 Q 124.65625 237.203125 124.65625 235.359375 Q 124.65625 233.515625 125.296875 232.546875 Q 125.953125 231.578125 127.171875 231.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 118.66669502231811 225.13443114482908 L 118.66669502231811 229.13443114482908"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 178.171875 232.359375 Q 177.421875 232.359375 177.03125 233.109375 Q 176.65625 233.859375 176.65625 235.359375 Q 176.65625 236.859375 177.03125 237.609375 Q 177.421875 238.359375 178.171875 238.359375 Q 178.953125 238.359375 179.328125 237.609375 Q 179.71875 236.859375 179.71875 235.359375 Q 179.71875 233.859375 179.328125 233.109375 Q 178.953125 232.359375 178.171875 232.359375 z M 178.171875 231.578125 Q 179.40625 231.578125 180.046875 232.546875 Q 180.703125 233.515625 180.703125 235.359375 Q 180.703125 237.203125 180.046875 238.171875 Q 179.40625 239.140625 178.171875 239.140625 Q 176.953125 239.140625 176.296875 238.171875 Q 175.65625 237.203125 175.65625 235.359375 Q 175.65625 233.515625 176.296875 232.546875 Q 176.953125 231.578125 178.171875 231.578125 z M 182.4248046875 237.765625 L 183.4560546875 237.765625 L 183.4560546875 239 L 182.4248046875 239 L 182.4248046875 237.765625 z M 185.619140625 231.703125 L 189.494140625 231.703125 L 189.494140625 232.546875 L 186.525390625 232.546875 L 186.525390625 234.328125 Q 186.744140625 234.25 186.947265625 234.21875 Q 187.166015625 234.1875 187.384765625 234.1875 Q 188.603515625 234.1875 189.306640625 234.859375 Q 190.025390625 235.515625 190.025390625 236.65625 Q 190.025390625 237.84375 189.291015625 238.5 Q 188.572265625 239.140625 187.228515625 239.140625 Q 186.775390625 239.140625 186.291015625 239.0625 Q 185.822265625 238.984375 185.306640625 238.828125 L 185.306640625 237.84375 Q 185.759765625 238.078125 186.228515625 238.203125 Q 186.697265625 238.3125 187.212890625 238.3125 Q 188.056640625 238.3125 188.541015625 237.875 Q 189.041015625 237.421875 189.041015625 236.65625 Q 189.041015625 235.90625 188.541015625 235.46875 Q 188.056640625 235.015625 187.212890625 235.015625 Q 186.822265625 235.015625 186.416015625 235.109375 Q 186.025390625 235.1875 185.619140625 235.375 L 185.619140625 231.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 182.91773846910888 225.13443114482908 L 182.91773846910888 229.13443114482908"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 245.234375 238.171875 L 246.859375 238.171875 L 246.859375 232.609375 L 245.09375 232.953125 L 245.09375 232.0625 L 246.84375 231.703125 L 247.828125 231.703125 L 247.828125 238.171875 L 249.4375 238.171875 L 249.4375 239 L 245.234375 239 L 245.234375 238.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 247.16878191589964 225.13443114482908 L 247.16878191589964 229.13443114482908"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 305.234375 238.171875 L 306.859375 238.171875 L 306.859375 232.609375 L 305.09375 232.953125 L 305.09375 232.0625 L 306.84375 231.703125 L 307.828125 231.703125 L 307.828125 238.171875 L 309.4375 238.171875 L 309.4375 239 L 305.234375 239 L 305.234375 238.171875 z M 311.4248046875 237.765625 L 312.4560546875 237.765625 L 312.4560546875 239 L 311.4248046875 239 L 311.4248046875 237.765625 z M 314.619140625 231.703125 L 318.494140625 231.703125 L 318.494140625 232.546875 L 315.525390625 232.546875 L 315.525390625 234.328125 Q 315.744140625 234.25 315.947265625 234.21875 Q 316.166015625 234.1875 316.384765625 234.1875 Q 317.603515625 234.1875 318.306640625 234.859375 Q 319.025390625 235.515625 319.025390625 236.65625 Q 319.025390625 237.84375 318.291015625 238.5 Q 317.572265625 239.140625 316.228515625 239.140625 Q 315.775390625 239.140625 315.291015625 239.0625 Q 314.822265625 238.984375 314.306640625 238.828125 L 314.306640625 237.84375 Q 314.759765625 238.078125 315.228515625 238.203125 Q 315.697265625 238.3125 316.212890625 238.3125 Q 317.056640625 238.3125 317.541015625 237.875 Q 318.041015625 237.421875 318.041015625 236.65625 Q 318.041015625 235.90625 317.541015625 235.46875 Q 317.056640625 235.015625 316.212890625 235.015625 Q 315.822265625 235.015625 315.416015625 235.109375 Q 315.025390625 235.1875 314.619140625 235.375 L 314.619140625 231.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 311.4198253626904 225.13443114482908 L 311.4198253626904 229.13443114482908"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 0 225.13443114482908 L 352 225.13443114482908"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 353 225.63443114482908 L 350 222.13443114482908"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 353 224.63443114482908 L 350 228.13443114482908"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 93.484375 289.859375 L 96.125 289.859375 L 96.125 290.65625 L 93.484375 290.65625 L 93.484375 289.859375 z M 99.7802734375 286.359375 Q 99.0302734375 286.359375 98.6396484375 287.109375 Q 98.2646484375 287.859375 98.2646484375 289.359375 Q 98.2646484375 290.859375 98.6396484375 291.609375 Q 99.0302734375 292.359375 99.7802734375 292.359375 Q 100.5615234375 292.359375 100.9365234375 291.609375 Q 101.3271484375 290.859375 101.3271484375 289.359375 Q 101.3271484375 287.859375 100.9365234375 287.109375 Q 100.5615234375 286.359375 99.7802734375 286.359375 z M 99.7802734375 285.578125 Q 101.0146484375 285.578125 101.6552734375 286.546875 Q 102.3115234375 287.515625 102.3115234375 289.359375 Q 102.3115234375 291.203125 101.6552734375 292.171875 Q 101.0146484375 293.140625 99.7802734375 293.140625 Q 98.5615234375 293.140625 97.9052734375 292.171875 Q 97.2646484375 291.203125 97.2646484375 289.359375 Q 97.2646484375 287.515625 97.9052734375 286.546875 Q 98.5615234375 285.578125 99.7802734375 285.578125 z M 104.033203125 291.765625 L 105.064453125 291.765625 L 105.064453125 293 L 104.033203125 293 L 104.033203125 291.765625 z M 107.2275390625 285.703125 L 111.1025390625 285.703125 L 111.1025390625 286.546875 L 108.1337890625 286.546875 L 108.1337890625 288.328125 Q 108.3525390625 288.25 108.5556640625 288.21875 Q 108.7744140625 288.1875 108.9931640625 288.1875 Q 110.2119140625 288.1875 110.9150390625 288.859375 Q 111.6337890625 289.515625 111.6337890625 290.65625 Q 111.6337890625 291.84375 110.8994140625 292.5 Q 110.1806640625 293.140625 108.8369140625 293.140625 Q 108.3837890625 293.140625 107.8994140625 293.0625 Q 107.4306640625 292.984375 106.9150390625 292.828125 L 106.9150390625 291.84375 Q 107.3681640625 292.078125 107.8369140625 292.203125 Q 108.3056640625 292.3125 108.8212890625 292.3125 Q 109.6650390625 292.3125 110.1494140625 291.875 Q 110.6494140625 291.421875 110.6494140625 290.65625 Q 110.6494140625 289.90625 110.1494140625 289.46875 Q 109.6650390625 289.015625 108.8212890625 289.015625 Q 108.4306640625 289.015625 108.0244140625 289.109375 Q 107.6337890625 289.1875 107.2275390625 289.375 L 107.2275390625 285.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 114.66669502231811 289.3854745916199 L 118.66669502231811 289.3854745916199"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 109.171875 216.359375 Q 108.421875 216.359375 108.03125 217.109375 Q 107.65625 217.859375 107.65625 219.359375 Q 107.65625 220.859375 108.03125 221.609375 Q 108.421875 222.359375 109.171875 222.359375 Q 109.953125 222.359375 110.328125 221.609375 Q 110.71875 220.859375 110.71875 219.359375 Q 110.71875 217.859375 110.328125 217.109375 Q 109.953125 216.359375 109.171875 216.359375 z M 109.171875 215.578125 Q 110.40625 215.578125 111.046875 216.546875 Q 111.703125 217.515625 111.703125 219.359375 Q 111.703125 221.203125 111.046875 222.171875 Q 110.40625 223.140625 109.171875 223.140625 Q 107.953125 223.140625 107.296875 222.171875 Q 106.65625 221.203125 106.65625 219.359375 Q 106.65625 217.515625 107.296875 216.546875 Q 107.953125 215.578125 109.171875 215.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 114.66669502231811 225.13443114482908 L 118.66669502231811 225.13443114482908"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 99.171875 157.359375 Q 98.421875 157.359375 98.03125 158.109375 Q 97.65625 158.859375 97.65625 160.359375 Q 97.65625 161.859375 98.03125 162.609375 Q 98.421875 163.359375 99.171875 163.359375 Q 99.953125 163.359375 100.328125 162.609375 Q 100.71875 161.859375 100.71875 160.359375 Q 100.71875 158.859375 100.328125 158.109375 Q 99.953125 157.359375 99.171875 157.359375 z M 99.171875 156.578125 Q 100.40625 156.578125 101.046875 157.546875 Q 101.703125 158.515625 101.703125 160.359375 Q 101.703125 162.203125 101.046875 163.171875 Q 100.40625 164.140625 99.171875 164.140625 Q 97.953125 164.140625 97.296875 163.171875 Q 96.65625 162.203125 96.65625 160.359375 Q 96.65625 158.515625 97.296875 157.546875 Q 97.953125 156.578125 99.171875 156.578125 z M 103.4248046875 162.765625 L 104.4560546875 162.765625 L 104.4560546875 164 L 103.4248046875 164 L 103.4248046875 162.765625 z M 106.619140625 156.703125 L 110.494140625 156.703125 L 110.494140625 157.546875 L 107.525390625 157.546875 L 107.525390625 159.328125 Q 107.744140625 159.25 107.947265625 159.21875 Q 108.166015625 159.1875 108.384765625 159.1875 Q 109.603515625 159.1875 110.306640625 159.859375 Q 111.025390625 160.515625 111.025390625 161.65625 Q 111.025390625 162.84375 110.291015625 163.5 Q 109.572265625 164.140625 108.228515625 164.140625 Q 107.775390625 164.140625 107.291015625 164.0625 Q 106.822265625 163.984375 106.306640625 163.828125 L 106.306640625 162.84375 Q 106.759765625 163.078125 107.228515625 163.203125 Q 107.697265625 163.3125 108.212890625 163.3125 Q 109.056640625 163.3125 109.541015625 162.875 Q 110.041015625 162.421875 110.041015625 161.65625 Q 110.041015625 160.90625 109.541015625 160.46875 Q 109.056640625 160.015625 108.212890625 160.015625 Q 107.822265625 160.015625 107.416015625 160.109375 Q 107.025390625 160.1875 106.619140625 160.375 L 106.619140625 156.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 114.66669502231811 160.88338769803823 L 118.66669502231811 160.88338769803823"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 107.234375 99.171875 L 108.859375 99.171875 L 108.859375 93.609375 L 107.09375 93.953125 L 107.09375 93.0625 L 108.84375 92.703125 L 109.828125 92.703125 L 109.828125 99.171875 L 111.4375 99.171875 L 111.4375 100 L 107.234375 100 L 107.234375 99.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 114.66669502231811 96.63234425124739 L 118.66669502231811 96.63234425124739"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 97.234375 35.171875 L 98.859375 35.171875 L 98.859375 29.609375 L 97.09375 29.953125 L 97.09375 29.0625 L 98.84375 28.703125 L 99.828125 28.703125 L 99.828125 35.171875 L 101.4375 35.171875 L 101.4375 36 L 97.234375 36 L 97.234375 35.171875 z M 103.4248046875 34.765625 L 104.4560546875 34.765625 L 104.4560546875 36 L 103.4248046875 36 L 103.4248046875 34.765625 z M 106.619140625 28.703125 L 110.494140625 28.703125 L 110.494140625 29.546875 L 107.525390625 29.546875 L 107.525390625 31.328125 Q 107.744140625 31.25 107.947265625 31.21875 Q 108.166015625 31.1875 108.384765625 31.1875 Q 109.603515625 31.1875 110.306640625 31.859375 Q 111.025390625 32.515625 111.025390625 33.65625 Q 111.025390625 34.84375 110.291015625 35.5 Q 109.572265625 36.140625 108.228515625 36.140625 Q 107.775390625 36.140625 107.291015625 36.0625 Q 106.822265625 35.984375 106.306640625 35.828125 L 106.306640625 34.84375 Q 106.759765625 35.078125 107.228515625 35.203125 Q 107.697265625 35.3125 108.212890625 35.3125 Q 109.056640625 35.3125 109.541015625 34.875 Q 110.041015625 34.421875 110.041015625 33.65625 Q 110.041015625 32.90625 109.541015625 32.46875 Q 109.056640625 32.015625 108.212890625 32.015625 Q 107.822265625 32.015625 107.416015625 32.109375 Q 107.025390625 32.1875 106.619140625 32.375 L 106.619140625 28.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 114.66669502231811 32.381300804456544 L 118.66669502231811 32.381300804456544"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 118.66669502231811 2 L 118.66669502231811 317"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 119.16669502231811 1 L 115.66669502231811 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 118.16669502231811 1 L 121.66669502231811 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g id="misc">
+</g><!-- misc -->
+<g id="layer0">
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 452.77212094563004 225.13443114482908 C 452.77212094563004 338.68601980523965 360.7203705763101 430.7377701745598 247.16878191589961 430.7377701745598 C 133.61719325548916 430.7377701745598 41.565442886169166 338.68601980523965 41.565442886169166 225.13443114482908 C 41.565442886169166 111.58284248441846 133.61719325548916 19.531092115098375 247.16878191589961 19.531092115098375 C 360.7203705763101 19.531092115098375 452.77212094563004 111.58284248441846 452.77212094563004 225.13443114482908 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 33 22 L 133 22"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 68 22 C 68 23.65685424949238 66.65685424949238 25 65 25 C 63.34314575050762 25 62 23.65685424949238 62 22 C 62 20.34314575050762 63.34314575050762 19 65 19 C 66.65685424949238 19 68 20.34314575050762 68 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 68 22 C 68 23.65685424949238 66.65685424949238 25 65 25 C 63.34314575050762 25 62 23.65685424949238 62 22 C 62 20.34314575050762 63.34314575050762 19 65 19 C 66.65685424949238 19 68 20.34314575050762 68 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 27.9375 33.4375 Q 27.75 33.34375 27.53125 33.296875 Q 27.328125 33.234375 27.0625 33.234375 Q 26.15625 33.234375 25.65625 33.828125 Q 25.171875 34.421875 25.171875 35.546875 L 25.171875 39 L 24.09375 39 L 24.09375 32.4375 L 25.171875 32.4375 L 25.171875 33.453125 Q 25.515625 32.859375 26.0625 32.578125 Q 26.609375 32.28125 27.390625 32.28125 Q 27.5 32.28125 27.625 32.296875 Q 27.765625 32.3125 27.921875 32.34375 L 27.9375 33.4375 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 29.16796875 43.171875 L 30.79296875 43.171875 L 30.79296875 37.609375 L 29.02734375 37.953125 L 29.02734375 37.0625 L 30.77734375 36.703125 L 31.76171875 36.703125 L 31.76171875 43.171875 L 33.37109375 43.171875 L 33.37109375 44 L 29.16796875 44 L 29.16796875 43.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 39.3759765625 33.546875 L 46.8916015625 33.546875 L 46.8916015625 34.53125 L 39.3759765625 34.53125 L 39.3759765625 33.546875 z M 39.3759765625 35.9375 L 46.8916015625 35.9375 L 46.8916015625 36.9375 L 39.3759765625 36.9375 L 39.3759765625 35.9375 z M 53.4638671875 38 L 55.4013671875 38 L 55.4013671875 31.328125 L 53.2919921875 31.75 L 53.2919921875 30.671875 L 55.3857421875 30.25 L 56.5732421875 30.25 L 56.5732421875 38 L 58.5107421875 38 L 58.5107421875 39 L 53.4638671875 39 L 53.4638671875 38 z M 60.8955078125 37.515625 L 62.1298828125 37.515625 L 62.1298828125 39 L 60.8955078125 39 L 60.8955078125 37.515625 z M 67.3974609375 34.15625 Q 66.6005859375 34.15625 66.1318359375 34.703125 Q 65.6630859375 35.25 65.6630859375 36.1875 Q 65.6630859375 37.140625 66.1318359375 37.6875 Q 66.6005859375 38.234375 67.3974609375 38.234375 Q 68.1943359375 38.234375 68.6474609375 37.6875 Q 69.1162109375 37.140625 69.1162109375 36.1875 Q 69.1162109375 35.25 68.6474609375 34.703125 Q 68.1943359375 34.15625 67.3974609375 34.15625 z M 69.7412109375 30.4375 L 69.7412109375 31.515625 Q 69.2880859375 31.3125 68.8349609375 31.203125 Q 68.3818359375 31.09375 67.9443359375 31.09375 Q 66.7724609375 31.09375 66.1474609375 31.890625 Q 65.5380859375 32.671875 65.4443359375 34.265625 Q 65.7880859375 33.765625 66.3037109375 33.5 Q 66.8349609375 33.21875 67.4599609375 33.21875 Q 68.7724609375 33.21875 69.5380859375 34.015625 Q 70.3037109375 34.8125 70.3037109375 36.1875 Q 70.3037109375 37.546875 69.5068359375 38.359375 Q 68.7099609375 39.171875 67.3974609375 39.171875 Q 65.8662109375 39.171875 65.0693359375 38.015625 Q 64.2724609375 36.84375 64.2724609375 34.640625 Q 64.2724609375 32.5625 65.2568359375 31.328125 Q 66.2412109375 30.09375 67.8974609375 30.09375 Q 68.3349609375 30.09375 68.7880859375 30.1875 Q 69.2412109375 30.265625 69.7412109375 30.4375 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="0.10196078568696976" fill-rule="nonzero" stroke="none" fill="#006400">
+  <path d="M 154.53904724121094 282.778564453125 L 172.54957580566406 271.57049560546875 L 161.34149169921875 253.55996704101562 L 143.3309783935547 264.7680358886719 L 154.53904724121094 282.778564453125"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#006400">
+  <path d="M 154.53904724121094 282.778564453125 L 172.54957580566406 271.57049560546875 L 161.34149169921875 253.55996704101562 L 143.3309783935547 264.7680358886719 L 154.53904724121094 282.778564453125"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 178.9468221607791 322 L -5 26.4114799761894"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 154.53904829384888 282.7785681228254 L 247.16878191589961 225.13443114482908"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 80 163 L 80 225.13443114482908"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 250 225 C 250 226.65685424949237 248.65685424949237 228 247 228 C 245.34314575050763 228 244 226.65685424949237 244 225 C 244 223.34314575050763 245.34314575050763 222 247 222 C 248.65685424949237 222 250 223.34314575050763 250 225 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 250 225 C 250 226.65685424949237 248.65685424949237 228 247 228 C 245.34314575050763 228 244 226.65685424949237 244 225 C 244 223.34314575050763 245.34314575050763 222 247 222 C 248.65685424949237 222 250 223.34314575050763 250 225 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 258.734375 210.921875 L 258.734375 212.171875 Q 258.125 211.609375 257.453125 211.34375 Q 256.78125 211.0625 256.015625 211.0625 Q 254.515625 211.0625 253.71875 211.984375 Q 252.921875 212.90625 252.921875 214.640625 Q 252.921875 216.359375 253.71875 217.28125 Q 254.515625 218.203125 256.015625 218.203125 Q 256.78125 218.203125 257.453125 217.921875 Q 258.125 217.640625 258.734375 217.09375 L 258.734375 218.328125 Q 258.109375 218.75 257.40625 218.96875 Q 256.71875 219.171875 255.953125 219.171875 Q 253.953125 219.171875 252.8125 217.953125 Q 251.671875 216.734375 251.671875 214.640625 Q 251.671875 212.53125 252.8125 211.3125 Q 253.953125 210.09375 255.953125 210.09375 Q 256.734375 210.09375 257.421875 210.3125 Q 258.125 210.515625 258.734375 210.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 260.61328125 223.171875 L 262.23828125 223.171875 L 262.23828125 217.609375 L 260.47265625 217.953125 L 260.47265625 217.0625 L 262.22265625 216.703125 L 263.20703125 216.703125 L 263.20703125 223.171875 L 264.81640625 223.171875 L 264.81640625 224 L 260.61328125 224 L 260.61328125 223.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 83 163 C 83 164.65685424949237 81.65685424949238 166 80 166 C 78.34314575050762 166 77 164.65685424949237 77 163 C 77 161.34314575050763 78.34314575050762 160 80 160 C 81.65685424949238 160 83 161.34314575050763 83 163 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 83 163 C 83 164.65685424949237 81.65685424949238 166 80 166 C 78.34314575050762 166 77 164.65685424949237 77 163 C 77 161.34314575050763 78.34314575050762 160 80 160 C 81.65685424949238 160 83 161.34314575050763 83 163 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 86.359375 149.21875 L 86.359375 152.515625 L 87.84375 152.515625 Q 88.671875 152.515625 89.125 152.09375 Q 89.578125 151.65625 89.578125 150.859375 Q 89.578125 150.078125 89.125 149.65625 Q 88.671875 149.21875 87.84375 149.21875 L 86.359375 149.21875 z M 85.171875 148.25 L 87.84375 148.25 Q 89.328125 148.25 90.078125 148.921875 Q 90.828125 149.578125 90.828125 150.859375 Q 90.828125 152.15625 90.078125 152.828125 Q 89.328125 153.484375 87.84375 153.484375 L 86.359375 153.484375 L 86.359375 157 L 85.171875 157 L 85.171875 148.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 122 225 C 122 226.65685424949237 120.65685424949238 228 119 228 C 117.34314575050762 228 116 226.65685424949237 116 225 C 116 223.34314575050763 117.34314575050762 222 119 222 C 120.65685424949238 222 122 223.34314575050763 122 225 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 122 225 C 122 226.65685424949237 120.65685424949238 228 119 228 C 117.34314575050762 228 116 226.65685424949237 116 225 C 116 223.34314575050763 117.34314575050762 222 119 222 C 120.65685424949238 222 122 223.34314575050763 122 225 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 130.734375 210.921875 L 130.734375 212.171875 Q 130.125 211.609375 129.453125 211.34375 Q 128.78125 211.0625 128.015625 211.0625 Q 126.515625 211.0625 125.71875 211.984375 Q 124.921875 212.90625 124.921875 214.640625 Q 124.921875 216.359375 125.71875 217.28125 Q 126.515625 218.203125 128.015625 218.203125 Q 128.78125 218.203125 129.453125 217.921875 Q 130.125 217.640625 130.734375 217.09375 L 130.734375 218.328125 Q 130.109375 218.75 129.40625 218.96875 Q 128.71875 219.171875 127.953125 219.171875 Q 125.953125 219.171875 124.8125 217.953125 Q 123.671875 216.734375 123.671875 214.640625 Q 123.671875 212.53125 124.8125 211.3125 Q 125.953125 210.09375 127.953125 210.09375 Q 128.734375 210.09375 129.421875 210.3125 Q 130.125 210.515625 130.734375 210.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 135.09765625 216.40625 L 135.09765625 217.15625 L 134.23828125 217.15625 Q 133.75390625 217.15625 133.56640625 217.359375 Q 133.37890625 217.546875 133.37890625 218.046875 L 133.37890625 218.53125 L 134.84765625 218.53125 L 134.84765625 219.234375 L 133.37890625 219.234375 L 133.37890625 224 L 132.47265625 224 L 132.47265625 219.234375 L 131.61328125 219.234375 L 131.61328125 218.53125 L 132.47265625 218.53125 L 132.47265625 218.15625 Q 132.47265625 217.234375 132.89453125 216.828125 Q 133.31640625 216.40625 134.23828125 216.40625 L 135.09765625 216.40625 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 65 135 C 65 136.65685424949237 63.65685424949238 138 62 138 C 60.34314575050762 138 59 136.65685424949237 59 135 C 59 133.34314575050763 60.34314575050762 132 62 132 C 63.65685424949238 132 65 133.34314575050763 65 135 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 65 135 C 65 136.65685424949237 63.65685424949238 138 62 138 C 60.34314575050762 138 59 136.65685424949237 59 135 C 59 133.34314575050763 60.34314575050762 132 62 132 C 63.65685424949238 132 65 133.34314575050763 65 135 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 68.359375 121.21875 L 68.359375 124.515625 L 69.84375 124.515625 Q 70.671875 124.515625 71.125 124.09375 Q 71.578125 123.65625 71.578125 122.859375 Q 71.578125 122.078125 71.125 121.65625 Q 70.671875 121.21875 69.84375 121.21875 L 68.359375 121.21875 z M 67.171875 120.25 L 69.84375 120.25 Q 71.328125 120.25 72.078125 120.921875 Q 72.828125 121.578125 72.828125 122.859375 Q 72.828125 124.15625 72.078125 124.828125 Q 71.328125 125.484375 69.84375 125.484375 L 68.359375 125.484375 L 68.359375 129 L 67.171875 129 L 67.171875 120.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 74.470703125 133.171875 L 76.095703125 133.171875 L 76.095703125 127.609375 L 74.330078125 127.953125 L 74.330078125 127.0625 L 76.080078125 126.703125 L 77.064453125 126.703125 L 77.064453125 133.171875 L 78.673828125 133.171875 L 78.673828125 134 L 74.470703125 134 L 74.470703125 133.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 158 283 C 158 284.65685424949237 156.65685424949237 286 155 286 C 153.34314575050763 286 152 284.65685424949237 152 283 C 152 281.34314575050763 153.34314575050763 280 155 280 C 156.65685424949237 280 158 281.34314575050763 158 283 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 158 283 C 158 284.65685424949237 156.65685424949237 286 155 286 C 153.34314575050763 286 152 284.65685424949237 152 283 C 152 281.34314575050763 153.34314575050763 280 155 280 C 156.65685424949237 280 158 281.34314575050763 158 283 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 160.171875 268.25 L 161.359375 268.25 L 161.359375 271.84375 L 165.65625 271.84375 L 165.65625 268.25 L 166.84375 268.25 L 166.84375 277 L 165.65625 277 L 165.65625 272.828125 L 161.359375 272.828125 L 161.359375 277 L 160.171875 277 L 160.171875 268.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 83 225 C 83 226.65685424949237 81.65685424949238 228 80 228 C 78.34314575050762 228 77 226.65685424949237 77 225 C 77 223.34314575050763 78.34314575050762 222 80 222 C 81.65685424949238 222 83 223.34314575050763 83 225 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 83 225 C 83 226.65685424949237 81.65685424949238 228 80 228 C 78.34314575050762 228 77 226.65685424949237 77 225 C 77 223.34314575050763 78.34314575050762 222 80 222 C 81.65685424949238 222 83 223.34314575050763 83 225 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 84.75 210.25 L 86.03125 210.25 L 88.203125 213.5 L 90.390625 210.25 L 91.65625 210.25 L 88.84375 214.453125 L 91.84375 219 L 90.578125 219 L 88.109375 215.28125 L 85.640625 219 L 84.359375 219 L 87.484375 214.328125 L 84.75 210.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8823656448906823, 0, 0, 0.8823656448906823, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 94.189453125 217.515625 L 94.189453125 220.265625 L 95.423828125 220.265625 Q 96.111328125 220.265625 96.486328125 219.90625 Q 96.876953125 219.546875 96.876953125 218.890625 Q 96.876953125 218.234375 96.486328125 217.875 Q 96.111328125 217.515625 95.423828125 217.515625 L 94.189453125 217.515625 z M 93.205078125 216.703125 L 95.423828125 216.703125 Q 96.658203125 216.703125 97.283203125 217.265625 Q 97.908203125 217.8125 97.908203125 218.890625 Q 97.908203125 219.96875 97.283203125 220.515625 Q 96.658203125 221.0625 95.423828125 221.0625 L 94.189453125 221.0625 L 94.189453125 224 L 93.205078125 224 L 93.205078125 216.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+</g><!-- layer0 -->
+</g> <!-- default stroke -->
+</svg> <!-- bounding box -->
diff --git a/src/third_party/skia/site/dev/design/conical/lemma3.ggb b/src/third_party/skia/site/dev/design/conical/lemma3.ggb
new file mode 100644
index 0000000..30c53ab
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/lemma3.ggb
Binary files differ
diff --git a/src/third_party/skia/site/dev/design/conical/lemma4.ggb b/src/third_party/skia/site/dev/design/conical/lemma4.ggb
new file mode 100644
index 0000000..a2f710f
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/lemma4.ggb
Binary files differ
diff --git a/src/third_party/skia/site/dev/design/conical/lemma4.svg b/src/third_party/skia/site/dev/design/conical/lemma4.svg
new file mode 100644
index 0000000..1930a8a
--- /dev/null
+++ b/src/third_party/skia/site/dev/design/conical/lemma4.svg
@@ -0,0 +1,338 @@
+<?xml version="1.0" standalone="no"?>
+
+<svg 
+     version="1.1"
+     baseProfile="full"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:ev="http://www.w3.org/2001/xml-events"
+     x="0px"
+     y="0px"
+     width="308px"
+     height="243px"
+     viewBox="0 0 308 243"
+     >
+<title></title>
+<desc>Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753  Source:  Date: Wednesday, December 27, 2017 4:17:43 PM EST</desc>
+<g stroke-linejoin="miter" stroke-dashoffset="0" stroke-dasharray="none" stroke-width="1" stroke-miterlimit="10" stroke-linecap="square">
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#ffffff">
+  <path d="M 0 0 L 385 0 L 385 303 L 0 303 L 0 0 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 65.171875 205.359375 Q 64.421875 205.359375 64.03125 206.109375 Q 63.65625 206.859375 63.65625 208.359375 Q 63.65625 209.859375 64.03125 210.609375 Q 64.421875 211.359375 65.171875 211.359375 Q 65.953125 211.359375 66.328125 210.609375 Q 66.71875 209.859375 66.71875 208.359375 Q 66.71875 206.859375 66.328125 206.109375 Q 65.953125 205.359375 65.171875 205.359375 z M 65.171875 204.578125 Q 66.40625 204.578125 67.046875 205.546875 Q 67.703125 206.515625 67.703125 208.359375 Q 67.703125 210.203125 67.046875 211.171875 Q 66.40625 212.140625 65.171875 212.140625 Q 63.953125 212.140625 63.296875 211.171875 Q 62.65625 210.203125 62.65625 208.359375 Q 62.65625 206.515625 63.296875 205.546875 Q 63.953125 204.578125 65.171875 204.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.63336452454984 198.05787425931192 L 56.63336452454984 202.05787425931192"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 123.171875 205.359375 Q 122.421875 205.359375 122.03125 206.109375 Q 121.65625 206.859375 121.65625 208.359375 Q 121.65625 209.859375 122.03125 210.609375 Q 122.421875 211.359375 123.171875 211.359375 Q 123.953125 211.359375 124.328125 210.609375 Q 124.71875 209.859375 124.71875 208.359375 Q 124.71875 206.859375 124.328125 206.109375 Q 123.953125 205.359375 123.171875 205.359375 z M 123.171875 204.578125 Q 124.40625 204.578125 125.046875 205.546875 Q 125.703125 206.515625 125.703125 208.359375 Q 125.703125 210.203125 125.046875 211.171875 Q 124.40625 212.140625 123.171875 212.140625 Q 121.953125 212.140625 121.296875 211.171875 Q 120.65625 210.203125 120.65625 208.359375 Q 120.65625 206.515625 121.296875 205.546875 Q 121.953125 204.578125 123.171875 204.578125 z M 127.4248046875 210.765625 L 128.4560546875 210.765625 L 128.4560546875 212 L 127.4248046875 212 L 127.4248046875 210.765625 z M 130.619140625 204.703125 L 134.494140625 204.703125 L 134.494140625 205.546875 L 131.525390625 205.546875 L 131.525390625 207.328125 Q 131.744140625 207.25 131.947265625 207.21875 Q 132.166015625 207.1875 132.384765625 207.1875 Q 133.603515625 207.1875 134.306640625 207.859375 Q 135.025390625 208.515625 135.025390625 209.65625 Q 135.025390625 210.84375 134.291015625 211.5 Q 133.572265625 212.140625 132.228515625 212.140625 Q 131.775390625 212.140625 131.291015625 212.0625 Q 130.822265625 211.984375 130.306640625 211.828125 L 130.306640625 210.84375 Q 130.759765625 211.078125 131.228515625 211.203125 Q 131.697265625 211.3125 132.212890625 211.3125 Q 133.056640625 211.3125 133.541015625 210.875 Q 134.041015625 210.421875 134.041015625 209.65625 Q 134.041015625 208.90625 133.541015625 208.46875 Q 133.056640625 208.015625 132.212890625 208.015625 Q 131.822265625 208.015625 131.416015625 208.109375 Q 131.025390625 208.1875 130.619140625 208.375 L 130.619140625 204.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 127.30951231601955 198.05787425931192 L 127.30951231601955 202.05787425931192"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 196.234375 211.171875 L 197.859375 211.171875 L 197.859375 205.609375 L 196.09375 205.953125 L 196.09375 205.0625 L 197.84375 204.703125 L 198.828125 204.703125 L 198.828125 211.171875 L 200.4375 211.171875 L 200.4375 212 L 196.234375 212 L 196.234375 211.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 197.98566010748925 198.05787425931192 L 197.98566010748925 202.05787425931192"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 262.234375 211.171875 L 263.859375 211.171875 L 263.859375 205.609375 L 262.09375 205.953125 L 262.09375 205.0625 L 263.84375 204.703125 L 264.828125 204.703125 L 264.828125 211.171875 L 266.4375 211.171875 L 266.4375 212 L 262.234375 212 L 262.234375 211.171875 z M 268.4248046875 210.765625 L 269.4560546875 210.765625 L 269.4560546875 212 L 268.4248046875 212 L 268.4248046875 210.765625 z M 271.619140625 204.703125 L 275.494140625 204.703125 L 275.494140625 205.546875 L 272.525390625 205.546875 L 272.525390625 207.328125 Q 272.744140625 207.25 272.947265625 207.21875 Q 273.166015625 207.1875 273.384765625 207.1875 Q 274.603515625 207.1875 275.306640625 207.859375 Q 276.025390625 208.515625 276.025390625 209.65625 Q 276.025390625 210.84375 275.291015625 211.5 Q 274.572265625 212.140625 273.228515625 212.140625 Q 272.775390625 212.140625 272.291015625 212.0625 Q 271.822265625 211.984375 271.306640625 211.828125 L 271.306640625 210.84375 Q 271.759765625 211.078125 272.228515625 211.203125 Q 272.697265625 211.3125 273.212890625 211.3125 Q 274.056640625 211.3125 274.541015625 210.875 Q 275.041015625 210.421875 275.041015625 209.65625 Q 275.041015625 208.90625 274.541015625 208.46875 Q 274.056640625 208.015625 273.212890625 208.015625 Q 272.822265625 208.015625 272.416015625 208.109375 Q 272.025390625 208.1875 271.619140625 208.375 L 271.619140625 204.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 268.66180789895895 198.05787425931192 L 268.66180789895895 202.05787425931192"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 338.921875 211.171875 L 342.359375 211.171875 L 342.359375 212 L 337.734375 212 L 337.734375 211.171875 Q 338.296875 210.59375 339.265625 209.609375 Q 340.234375 208.625 340.484375 208.34375 Q 340.953125 207.8125 341.140625 207.453125 Q 341.328125 207.078125 341.328125 206.71875 Q 341.328125 206.140625 340.921875 205.78125 Q 340.515625 205.40625 339.859375 205.40625 Q 339.390625 205.40625 338.875 205.578125 Q 338.375 205.734375 337.78125 206.0625 L 337.78125 205.0625 Q 338.375 204.828125 338.890625 204.703125 Q 339.40625 204.578125 339.84375 204.578125 Q 340.96875 204.578125 341.640625 205.140625 Q 342.328125 205.703125 342.328125 206.65625 Q 342.328125 207.109375 342.15625 207.515625 Q 341.984375 207.90625 341.546875 208.453125 Q 341.421875 208.59375 340.765625 209.28125 Q 340.109375 209.953125 338.921875 211.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 339.33795569042866 198.05787425931192 L 339.33795569042866 202.05787425931192"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 0 198.05787425931192 L 383 198.05787425931192"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 384 198.55787425931192 L 381 195.05787425931192"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 384 197.55787425931192 L 381 201.05787425931192"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 31.484375 268.859375 L 34.125 268.859375 L 34.125 269.65625 L 31.484375 269.65625 L 31.484375 268.859375 z M 37.7802734375 265.359375 Q 37.0302734375 265.359375 36.6396484375 266.109375 Q 36.2646484375 266.859375 36.2646484375 268.359375 Q 36.2646484375 269.859375 36.6396484375 270.609375 Q 37.0302734375 271.359375 37.7802734375 271.359375 Q 38.5615234375 271.359375 38.9365234375 270.609375 Q 39.3271484375 269.859375 39.3271484375 268.359375 Q 39.3271484375 266.859375 38.9365234375 266.109375 Q 38.5615234375 265.359375 37.7802734375 265.359375 z M 37.7802734375 264.578125 Q 39.0146484375 264.578125 39.6552734375 265.546875 Q 40.3115234375 266.515625 40.3115234375 268.359375 Q 40.3115234375 270.203125 39.6552734375 271.171875 Q 39.0146484375 272.140625 37.7802734375 272.140625 Q 36.5615234375 272.140625 35.9052734375 271.171875 Q 35.2646484375 270.203125 35.2646484375 268.359375 Q 35.2646484375 266.515625 35.9052734375 265.546875 Q 36.5615234375 264.578125 37.7802734375 264.578125 z M 42.033203125 270.765625 L 43.064453125 270.765625 L 43.064453125 272 L 42.033203125 272 L 42.033203125 270.765625 z M 45.2275390625 264.703125 L 49.1025390625 264.703125 L 49.1025390625 265.546875 L 46.1337890625 265.546875 L 46.1337890625 267.328125 Q 46.3525390625 267.25 46.5556640625 267.21875 Q 46.7744140625 267.1875 46.9931640625 267.1875 Q 48.2119140625 267.1875 48.9150390625 267.859375 Q 49.6337890625 268.515625 49.6337890625 269.65625 Q 49.6337890625 270.84375 48.8994140625 271.5 Q 48.1806640625 272.140625 46.8369140625 272.140625 Q 46.3837890625 272.140625 45.8994140625 272.0625 Q 45.4306640625 271.984375 44.9150390625 271.828125 L 44.9150390625 270.84375 Q 45.3681640625 271.078125 45.8369140625 271.203125 Q 46.3056640625 271.3125 46.8212890625 271.3125 Q 47.6650390625 271.3125 48.1494140625 270.875 Q 48.6494140625 270.421875 48.6494140625 269.65625 Q 48.6494140625 268.90625 48.1494140625 268.46875 Q 47.6650390625 268.015625 46.8212890625 268.015625 Q 46.4306640625 268.015625 46.0244140625 268.109375 Q 45.6337890625 268.1875 45.2275390625 268.375 L 45.2275390625 264.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 52.63336452454984 268.73402205078196 L 56.63336452454984 268.73402205078196"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 47.171875 189.359375 Q 46.421875 189.359375 46.03125 190.109375 Q 45.65625 190.859375 45.65625 192.359375 Q 45.65625 193.859375 46.03125 194.609375 Q 46.421875 195.359375 47.171875 195.359375 Q 47.953125 195.359375 48.328125 194.609375 Q 48.71875 193.859375 48.71875 192.359375 Q 48.71875 190.859375 48.328125 190.109375 Q 47.953125 189.359375 47.171875 189.359375 z M 47.171875 188.578125 Q 48.40625 188.578125 49.046875 189.546875 Q 49.703125 190.515625 49.703125 192.359375 Q 49.703125 194.203125 49.046875 195.171875 Q 48.40625 196.140625 47.171875 196.140625 Q 45.953125 196.140625 45.296875 195.171875 Q 44.65625 194.203125 44.65625 192.359375 Q 44.65625 190.515625 45.296875 189.546875 Q 45.953125 188.578125 47.171875 188.578125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 52.63336452454984 198.05787425931194 L 56.63336452454984 198.05787425931194"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 37.171875 124.359375 Q 36.421875 124.359375 36.03125 125.109375 Q 35.65625 125.859375 35.65625 127.359375 Q 35.65625 128.859375 36.03125 129.609375 Q 36.421875 130.359375 37.171875 130.359375 Q 37.953125 130.359375 38.328125 129.609375 Q 38.71875 128.859375 38.71875 127.359375 Q 38.71875 125.859375 38.328125 125.109375 Q 37.953125 124.359375 37.171875 124.359375 z M 37.171875 123.578125 Q 38.40625 123.578125 39.046875 124.546875 Q 39.703125 125.515625 39.703125 127.359375 Q 39.703125 129.203125 39.046875 130.171875 Q 38.40625 131.140625 37.171875 131.140625 Q 35.953125 131.140625 35.296875 130.171875 Q 34.65625 129.203125 34.65625 127.359375 Q 34.65625 125.515625 35.296875 124.546875 Q 35.953125 123.578125 37.171875 123.578125 z M 41.4248046875 129.765625 L 42.4560546875 129.765625 L 42.4560546875 131 L 41.4248046875 131 L 41.4248046875 129.765625 z M 44.619140625 123.703125 L 48.494140625 123.703125 L 48.494140625 124.546875 L 45.525390625 124.546875 L 45.525390625 126.328125 Q 45.744140625 126.25 45.947265625 126.21875 Q 46.166015625 126.1875 46.384765625 126.1875 Q 47.603515625 126.1875 48.306640625 126.859375 Q 49.025390625 127.515625 49.025390625 128.65625 Q 49.025390625 129.84375 48.291015625 130.5 Q 47.572265625 131.140625 46.228515625 131.140625 Q 45.775390625 131.140625 45.291015625 131.0625 Q 44.822265625 130.984375 44.306640625 130.828125 L 44.306640625 129.84375 Q 44.759765625 130.078125 45.228515625 130.203125 Q 45.697265625 130.3125 46.212890625 130.3125 Q 47.056640625 130.3125 47.541015625 129.875 Q 48.041015625 129.421875 48.041015625 128.65625 Q 48.041015625 127.90625 47.541015625 127.46875 Q 47.056640625 127.015625 46.212890625 127.015625 Q 45.822265625 127.015625 45.416015625 127.109375 Q 45.025390625 127.1875 44.619140625 127.375 L 44.619140625 123.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 52.63336452454984 127.38172646784193 L 56.63336452454984 127.38172646784193"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 45.234375 59.171875 L 46.859375 59.171875 L 46.859375 53.609375 L 45.09375 53.953125 L 45.09375 53.0625 L 46.84375 52.703125 L 47.828125 52.703125 L 47.828125 59.171875 L 49.4375 59.171875 L 49.4375 60 L 45.234375 60 L 45.234375 59.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 52.63336452454984 56.705578676371914 L 56.63336452454984 56.705578676371914"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.63336452454984 2 L 56.63336452454984 303"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 57.13336452454984 1 L 53.63336452454984 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linecap="butt" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.13336452454984 1 L 59.63336452454984 4"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g id="misc">
+</g><!-- misc -->
+<g id="layer0">
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 296.9322670155468 198.05787425931192 C 296.9322670155468 252.70457630213457 252.63236215031168 297.00448116736993 197.98566010748925 297.00448116736993 C 143.33895806466683 297.00448116736993 99.03905319943168 252.70457630213457 99.03905319943168 198.05787425931192 C 99.03905319943168 143.41117221648926 143.33895806466683 99.1112673512539 197.98566010748925 99.1112673512539 C 252.63236215031168 99.1112673512539 296.9322670155468 143.41117221648926 296.9322670155468 198.05787425931192 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 33 22 L 133 22"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 50 22 C 50 23.65685424949238 48.65685424949238 25 47 25 C 45.34314575050762 25 44 23.65685424949238 44 22 C 44 20.34314575050762 45.34314575050762 19 47 19 C 48.65685424949238 19 50 20.34314575050762 50 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 50 22 C 50 23.65685424949238 48.65685424949238 25 47 25 C 45.34314575050762 25 44 23.65685424949238 44 22 C 44 20.34314575050762 45.34314575050762 19 47 19 C 48.65685424949238 19 50 20.34314575050762 50 22 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 9.9375 33.4375 Q 9.75 33.34375 9.53125 33.296875 Q 9.328125 33.234375 9.0625 33.234375 Q 8.15625 33.234375 7.65625 33.828125 Q 7.171875 34.421875 7.171875 35.546875 L 7.171875 39 L 6.09375 39 L 6.09375 32.4375 L 7.171875 32.4375 L 7.171875 33.453125 Q 7.515625 32.859375 8.0625 32.578125 Q 8.609375 32.28125 9.390625 32.28125 Q 9.5 32.28125 9.625 32.296875 Q 9.765625 32.3125 9.921875 32.34375 L 9.9375 33.4375 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 11.16796875 43.171875 L 12.79296875 43.171875 L 12.79296875 37.609375 L 11.02734375 37.953125 L 11.02734375 37.0625 L 12.77734375 36.703125 L 13.76171875 36.703125 L 13.76171875 43.171875 L 15.37109375 43.171875 L 15.37109375 44 L 11.16796875 44 L 11.16796875 43.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#000000">
+  <path d="M 21.3759765625 33.546875 L 28.8916015625 33.546875 L 28.8916015625 34.53125 L 21.3759765625 34.53125 L 21.3759765625 33.546875 z M 21.3759765625 35.9375 L 28.8916015625 35.9375 L 28.8916015625 36.9375 L 21.3759765625 36.9375 L 21.3759765625 35.9375 z M 37.7919921875 31.03125 Q 36.8857421875 31.03125 36.4169921875 31.9375 Q 35.9638671875 32.828125 35.9638671875 34.640625 Q 35.9638671875 36.4375 36.4169921875 37.34375 Q 36.8857421875 38.234375 37.7919921875 38.234375 Q 38.7138671875 38.234375 39.1669921875 37.34375 Q 39.6357421875 36.4375 39.6357421875 34.640625 Q 39.6357421875 32.828125 39.1669921875 31.9375 Q 38.7138671875 31.03125 37.7919921875 31.03125 z M 37.7919921875 30.09375 Q 39.2607421875 30.09375 40.0419921875 31.265625 Q 40.8232421875 32.421875 40.8232421875 34.640625 Q 40.8232421875 36.84375 40.0419921875 38.015625 Q 39.2607421875 39.171875 37.7919921875 39.171875 Q 36.3232421875 39.171875 35.5419921875 38.015625 Q 34.7763671875 36.84375 34.7763671875 34.640625 Q 34.7763671875 32.421875 35.5419921875 31.265625 Q 36.3232421875 30.09375 37.7919921875 30.09375 z M 42.8955078125 37.515625 L 44.1298828125 37.515625 L 44.1298828125 39 L 42.8955078125 39 L 42.8955078125 37.515625 z M 46.4130859375 30.25 L 52.0380859375 30.25 L 52.0380859375 30.75 L 48.8662109375 39 L 47.6318359375 39 L 50.6162109375 31.25 L 46.4130859375 31.25 L 46.4130859375 30.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="0.10196078568696976" fill-rule="nonzero" stroke="none" fill="#006400">
+  <path d="M 148.8255615234375 130.73641967773438 L 131.6938018798828 143.2465362548828 L 144.20391845703125 160.3782958984375 L 161.33566284179688 147.86817932128906 L 148.8255615234375 130.73641967773438"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#006400">
+  <path d="M 148.8255615234375 130.73641967773438 L 131.6938018798828 143.2465362548828 L 144.20391845703125 160.3782958984375 L 161.33566284179688 147.86817932128906 L 148.8255615234375 130.73641967773438"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 56.63336452454984 198.05787425931192 L 385 -41.72509929585516"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 148.82555735449304 130.73642394409598 L 197.98566010748925 198.05787425931192"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 232.00000000000009 70 L 232.00000000000009 198.05787425931192"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 201 198 C 201 199.65685424949237 199.65685424949237 201 198 201 C 196.34314575050763 201 195 199.65685424949237 195 198 C 195 196.34314575050763 196.34314575050763 195 198 195 C 199.65685424949237 195 201 196.34314575050763 201 198 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 201 198 C 201 199.65685424949237 199.65685424949237 201 198 201 C 196.34314575050763 201 195 199.65685424949237 195 198 C 195 196.34314575050763 196.34314575050763 195 198 195 C 199.65685424949237 195 201 196.34314575050763 201 198 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 209.734375 183.921875 L 209.734375 185.171875 Q 209.125 184.609375 208.453125 184.34375 Q 207.78125 184.0625 207.015625 184.0625 Q 205.515625 184.0625 204.71875 184.984375 Q 203.921875 185.90625 203.921875 187.640625 Q 203.921875 189.359375 204.71875 190.28125 Q 205.515625 191.203125 207.015625 191.203125 Q 207.78125 191.203125 208.453125 190.921875 Q 209.125 190.640625 209.734375 190.09375 L 209.734375 191.328125 Q 209.109375 191.75 208.40625 191.96875 Q 207.71875 192.171875 206.953125 192.171875 Q 204.953125 192.171875 203.8125 190.953125 Q 202.671875 189.734375 202.671875 187.640625 Q 202.671875 185.53125 203.8125 184.3125 Q 204.953125 183.09375 206.953125 183.09375 Q 207.734375 183.09375 208.421875 183.3125 Q 209.125 183.515625 209.734375 183.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 211.61328125 196.171875 L 213.23828125 196.171875 L 213.23828125 190.609375 L 211.47265625 190.953125 L 211.47265625 190.0625 L 213.22265625 189.703125 L 214.20703125 189.703125 L 214.20703125 196.171875 L 215.81640625 196.171875 L 215.81640625 197 L 211.61328125 197 L 211.61328125 196.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 235 70 C 235 71.65685424949238 233.65685424949237 73 232 73 C 230.34314575050763 73 229 71.65685424949238 229 70 C 229 68.34314575050762 230.34314575050763 67 232 67 C 233.65685424949237 67 235 68.34314575050762 235 70 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 235 70 C 235 71.65685424949238 233.65685424949237 73 232 73 C 230.34314575050763 73 229 71.65685424949238 229 70 C 229 68.34314575050762 230.34314575050763 67 232 67 C 233.65685424949237 67 235 68.34314575050762 235 70 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#0000ff">
+  <path d="M 238.359375 56.21875 L 238.359375 59.515625 L 239.84375 59.515625 Q 240.671875 59.515625 241.125 59.09375 Q 241.578125 58.65625 241.578125 57.859375 Q 241.578125 57.078125 241.125 56.65625 Q 240.671875 56.21875 239.84375 56.21875 L 238.359375 56.21875 z M 237.171875 55.25 L 239.84375 55.25 Q 241.328125 55.25 242.078125 55.921875 Q 242.828125 56.578125 242.828125 57.859375 Q 242.828125 59.15625 242.078125 59.828125 Q 241.328125 60.484375 239.84375 60.484375 L 238.359375 60.484375 L 238.359375 64 L 237.171875 64 L 237.171875 55.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 60 198 C 60 199.65685424949237 58.65685424949238 201 57 201 C 55.34314575050762 201 54 199.65685424949237 54 198 C 54 196.34314575050763 55.34314575050762 195 57 195 C 58.65685424949238 195 60 196.34314575050763 60 198 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 60 198 C 60 199.65685424949237 58.65685424949238 201 57 201 C 55.34314575050762 201 54 199.65685424949237 54 198 C 54 196.34314575050763 55.34314575050762 195 57 195 C 58.65685424949238 195 60 196.34314575050763 60 198 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 68.734375 183.921875 L 68.734375 185.171875 Q 68.125 184.609375 67.453125 184.34375 Q 66.78125 184.0625 66.015625 184.0625 Q 64.515625 184.0625 63.71875 184.984375 Q 62.921875 185.90625 62.921875 187.640625 Q 62.921875 189.359375 63.71875 190.28125 Q 64.515625 191.203125 66.015625 191.203125 Q 66.78125 191.203125 67.453125 190.921875 Q 68.125 190.640625 68.734375 190.09375 L 68.734375 191.328125 Q 68.109375 191.75 67.40625 191.96875 Q 66.71875 192.171875 65.953125 192.171875 Q 63.953125 192.171875 62.8125 190.953125 Q 61.671875 189.734375 61.671875 187.640625 Q 61.671875 185.53125 62.8125 184.3125 Q 63.953125 183.09375 65.953125 183.09375 Q 66.734375 183.09375 67.421875 183.3125 Q 68.125 183.515625 68.734375 183.921875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 73.09765625 189.40625 L 73.09765625 190.15625 L 72.23828125 190.15625 Q 71.75390625 190.15625 71.56640625 190.359375 Q 71.37890625 190.546875 71.37890625 191.046875 L 71.37890625 191.53125 L 72.84765625 191.53125 L 72.84765625 192.234375 L 71.37890625 192.234375 L 71.37890625 197 L 70.47265625 197 L 70.47265625 192.234375 L 69.61328125 192.234375 L 69.61328125 191.53125 L 70.47265625 191.53125 L 70.47265625 191.15625 Q 70.47265625 190.234375 70.89453125 189.828125 Q 71.31640625 189.40625 72.23828125 189.40625 L 73.09765625 189.40625 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 195 99 C 195 100.65685424949238 193.65685424949237 102 192 102 C 190.34314575050763 102 189 100.65685424949238 189 99 C 189 97.34314575050762 190.34314575050763 96 192 96 C 193.65685424949237 96 195 97.34314575050762 195 99 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 195 99 C 195 100.65685424949238 193.65685424949237 102 192 102 C 190.34314575050763 102 189 100.65685424949238 189 99 C 189 97.34314575050762 190.34314575050763 96 192 96 C 193.65685424949237 96 195 97.34314575050762 195 99 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 198.359375 85.21875 L 198.359375 88.515625 L 199.84375 88.515625 Q 200.671875 88.515625 201.125 88.09375 Q 201.578125 87.65625 201.578125 86.859375 Q 201.578125 86.078125 201.125 85.65625 Q 200.671875 85.21875 199.84375 85.21875 L 198.359375 85.21875 z M 197.171875 84.25 L 199.84375 84.25 Q 201.328125 84.25 202.078125 84.921875 Q 202.828125 85.578125 202.828125 86.859375 Q 202.828125 88.15625 202.078125 88.828125 Q 201.328125 89.484375 199.84375 89.484375 L 198.359375 89.484375 L 198.359375 93 L 197.171875 93 L 197.171875 84.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 204.470703125 97.171875 L 206.095703125 97.171875 L 206.095703125 91.609375 L 204.330078125 91.953125 L 204.330078125 91.0625 L 206.080078125 90.703125 L 207.064453125 90.703125 L 207.064453125 97.171875 L 208.673828125 97.171875 L 208.673828125 98 L 204.470703125 98 L 204.470703125 97.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 109 162 C 109 163.65685424949237 107.65685424949238 165 106 165 C 104.34314575050762 165 103 163.65685424949237 103 162 C 103 160.34314575050763 104.34314575050762 159 106 159 C 107.65685424949238 159 109 160.34314575050763 109 162 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 109 162 C 109 163.65685424949237 107.65685424949238 165 106 165 C 104.34314575050762 165 103 163.65685424949237 103 162 C 103 160.34314575050763 104.34314575050762 159 106 159 C 107.65685424949238 159 109 160.34314575050763 109 162 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 112.359375 148.21875 L 112.359375 151.515625 L 113.84375 151.515625 Q 114.671875 151.515625 115.125 151.09375 Q 115.578125 150.65625 115.578125 149.859375 Q 115.578125 149.078125 115.125 148.65625 Q 114.671875 148.21875 113.84375 148.21875 L 112.359375 148.21875 z M 111.171875 147.25 L 113.84375 147.25 Q 115.328125 147.25 116.078125 147.921875 Q 116.828125 148.578125 116.828125 149.859375 Q 116.828125 151.15625 116.078125 151.828125 Q 115.328125 152.484375 113.84375 152.484375 L 112.359375 152.484375 L 112.359375 156 L 111.171875 156 L 111.171875 147.25 z M 119.595703125 148.21875 L 119.595703125 151.515625 L 121.080078125 151.515625 Q 121.908203125 151.515625 122.361328125 151.09375 Q 122.814453125 150.65625 122.814453125 149.859375 Q 122.814453125 149.078125 122.361328125 148.65625 Q 121.908203125 148.21875 121.080078125 148.21875 L 119.595703125 148.21875 z M 118.408203125 147.25 L 121.080078125 147.25 Q 122.564453125 147.25 123.314453125 147.921875 Q 124.064453125 148.578125 124.064453125 149.859375 Q 124.064453125 151.15625 123.314453125 151.828125 Q 122.564453125 152.484375 121.080078125 152.484375 L 119.595703125 152.484375 L 119.595703125 156 L 118.408203125 156 L 118.408203125 147.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 125.70703125 160.171875 L 127.33203125 160.171875 L 127.33203125 154.609375 L 125.56640625 154.953125 L 125.56640625 154.0625 L 127.31640625 153.703125 L 128.30078125 153.703125 L 128.30078125 160.171875 L 129.91015625 160.171875 L 129.91015625 161 L 125.70703125 161 L 125.70703125 160.171875 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 152 131 C 152 132.65685424949237 150.65685424949237 134 149 134 C 147.34314575050763 134 146 132.65685424949237 146 131 C 146 129.34314575050763 147.34314575050763 128 149 128 C 150.65685424949237 128 152 129.34314575050763 152 131 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 152 131 C 152 132.65685424949237 150.65685424949237 134 149 134 C 147.34314575050763 134 146 132.65685424949237 146 131 C 146 129.34314575050763 147.34314575050763 128 149 128 C 150.65685424949237 128 152 129.34314575050763 152 131 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 154.171875 116.25 L 155.359375 116.25 L 155.359375 119.84375 L 159.65625 119.84375 L 159.65625 116.25 L 160.84375 116.25 L 160.84375 125 L 159.65625 125 L 159.65625 120.828125 L 155.359375 120.828125 L 155.359375 125 L 154.171875 125 L 154.171875 116.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 235 198 C 235 199.65685424949237 233.65685424949237 201 232 201 C 230.34314575050763 201 229 199.65685424949237 229 198 C 229 196.34314575050763 230.34314575050763 195 232 195 C 233.65685424949237 195 235 196.34314575050763 235 198 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g stroke-linejoin="round" stroke-linecap="round" fill="none" stroke-opacity="1" stroke="#000000">
+  <path d="M 235 198 C 235 199.65685424949237 233.65685424949237 201 232 201 C 230.34314575050763 201 229 199.65685424949237 229 198 C 229 196.34314575050763 230.34314575050763 195 232 195 C 233.65685424949237 195 235 196.34314575050763 235 198 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 236.75 183.25 L 238.03125 183.25 L 240.203125 186.5 L 242.390625 183.25 L 243.65625 183.25 L 240.84375 187.453125 L 243.84375 192 L 242.578125 192 L 240.109375 188.28125 L 237.640625 192 L 236.359375 192 L 239.484375 187.328125 L 236.75 183.25 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+<g transform="matrix(0.8021505862642581, 0, 0, 0.8021505862642581, 0, 0)">
+<g fill-opacity="1" fill-rule="nonzero" stroke="none" fill="#404040">
+  <path d="M 246.189453125 190.515625 L 246.189453125 193.265625 L 247.423828125 193.265625 Q 248.111328125 193.265625 248.486328125 192.90625 Q 248.876953125 192.546875 248.876953125 191.890625 Q 248.876953125 191.234375 248.486328125 190.875 Q 248.111328125 190.515625 247.423828125 190.515625 L 246.189453125 190.515625 z M 245.205078125 189.703125 L 247.423828125 189.703125 Q 248.658203125 189.703125 249.283203125 190.265625 Q 249.908203125 190.8125 249.908203125 191.890625 Q 249.908203125 192.96875 249.283203125 193.515625 Q 248.658203125 194.0625 247.423828125 194.0625 L 246.189453125 194.0625 L 246.189453125 197 L 245.205078125 197 L 245.205078125 189.703125 z"/>
+</g> <!-- drawing style -->
+</g> <!-- transform -->
+</g><!-- layer0 -->
+</g> <!-- default stroke -->
+</svg> <!-- bounding box -->
diff --git a/src/third_party/skia/site/dev/design/pdftheory.md b/src/third_party/skia/site/dev/design/pdftheory.md
index a5521ba..2927d08 100644
--- a/src/third_party/skia/site/dev/design/pdftheory.md
+++ b/src/third_party/skia/site/dev/design/pdftheory.md
@@ -62,7 +62,7 @@
 lists the specific byte position for each object. The objects may have
 references to other objects and the ASCII size of those references is
 dependent on the object number assigned to the referenced object;
-therefore we can’t calculate the table of contents until the size of
+therefore we can't calculate the table of contents until the size of
 objects is known, which requires assignment of object numbers.  The
 document uses SkWStream::bytesWritten() to query the offsets of each
 object and build the cross-reference table.
@@ -91,7 +91,7 @@
     210399  % Byte offset to the start of the table of contents.
     %%EOF
 
-The class SkPDFObjNumMap and the virtual class SkPDFObject are used to
+The the virtual class SkPDFObject are used to
 manage the needs of the file format. Any object that will represent a
 PDF object must inherit from SkPDFObject and implement the methods to
 generate the binary representation and report any other SkPDFObjects
@@ -100,6 +100,10 @@
 (A stream is a dictionary containing at least a Length entry followed
 by the data of the stream.)
 
+Streams are now handled in a slightly different way.  The SkPDFStreamOut()
+function compresses and serializes the binary data immediately instead of
+creating a new object.
+
 All of these PDF object types except the stream type can be used in
 both a direct and an indirect fashion, i.e. an array can have an int
 or a dictionary as an inline entry, which does not require an object
@@ -128,23 +132,15 @@
     ...stream contents can be arbitrary, including binary...  
     endstream`
 
-The PDF backend requires all indirect objects used in a PDF to be
-added to the SkPDFObjNumMap of the SkPDFDocument. The catalog is
-responsible for assigning object numbers and generating the table of
-contents required at the end of PDF files. In some sense, generating a
-PDF is a three step process. In the first step all the objects and
-references among them are created (mostly done by SkPDFDevice). In the
-second step, SkPDFObjNumMap assigns and remembers object numbers.
-Finally, in the third
-step, the header is printed, each object is printed, and then the
-table of contents and trailer are printed. SkPDFDocument takes care of
-collecting all the objects from the various SkPDFDevice instances,
-adding them to an SkPDFObjNumMap, iterating through the objects once to
-set their file positions, and iterating again to generate the final
-PDF.
+Indirect objects are either:
 
-As an optimization, many leaf nodes in the direct graph of indirect
-objects can be assigned object numbers and serialized early.
+  - Serialized as soon as they are needed, and a new SkPDFIndirectReference is
+    returned, or
+
+  - Serialized later, but reserve a document-unique SkPDFIndirectReference to
+    allow other objects to refer to it.
+
+Example document:
 
     %PDF-1.4
     2 0 obj <<
@@ -232,17 +228,9 @@
 
 There are a number of high level PDF objects (like fonts, graphic
 states, etc) that are likely to be referenced multiple times in a
-single PDF. To ensure that there is only one copy of each object
-instance these objects an implemented with an
-[interning pattern](http://en.wikipedia.org/wiki/String_interning).
-As such, the classes representing these objects (like
-SkPDFGraphicState) have private constructors and static methods to
-retrieve an instance of the class.
-
-The SkPDFCanon object owns the interned objects.  For obvious reasons,
-the returned instance should not be modified. A mechanism to ensure
-that interned classes are immutable is needed.  See [issue
-2683](https://bug.skia.org/2683).
+single PDF. To ensure that there is only one copy of each object,
+the SkPDFDocument holds on to a mapping from type-specific keys onto the
+SkPDFIndirectReference for these objects.
 
 <span id="Graphic_States">Graphic States</span>
 -----------------------------------------------
@@ -336,9 +324,9 @@
 Certain objects have specific properties that need to be dealt
 with. Images, layers (see below), and fonts assume the standard PDF
 coordinate system, so we have to undo any flip to the Skia coordinate
-system before drawing these entities. We don’t currently support
+system before drawing these entities. We don't currently support
 inverted paths, so filling an inverted path will give the wrong result
-([issue 241](https://bug.skia.org/241)). PDF doesn’t draw zero length
+([issue 241](https://bug.skia.org/241)). PDF doesn't draw zero length
 lines that have butt of square caps, so that is emulated.
 
 ### <span id="Layers">Layers</span> ###
@@ -367,7 +355,7 @@
 only talk about some of the more important ones. A couple short
 details:
 
-*   We can’t assume that an arbitrary font will be available at PDF view
+*   We can't assume that an arbitrary font will be available at PDF view
     time, so we embed all fonts in accordance with modern PDF
     guidelines.
 *   Most fonts these days are TrueType fonts, so this is where most of
@@ -408,7 +396,7 @@
 Skia has two types of predefined shaders, image shaders and gradient
 shaders. In both cases, shaders are effectively positioned absolutely,
 so the initial position and bounds of where they are visible is part
-of the immutable state of the shader object. Each of the Skia’s tile
+of the immutable state of the shader object. Each of the Skia's tile
 modes needs to be considered and handled explicitly. The image shader
 we generate will be tiled, so tiling is handled by default. To support
 mirroring, we draw the image, reversed, on the appropriate axis, or on
@@ -452,8 +440,8 @@
 I will describe the system with this change applied.
 
 First, a bit of terminology and definition. When drawing something
-with an emulated xfer mode, what’s already drawn to the device is
-called the destination or Dst, and what’s about to be drawn is the
+with an emulated xfer mode, what's already drawn to the device is
+called the destination or Dst, and what's about to be drawn is the
 source or Src. Src (and Dst) can have regions where it is transparent
 (alpha equals zero), but it also has an inherent shape. For most kinds
 of drawn objects, the shape is the same as where alpha is not
@@ -464,11 +452,11 @@
 interaction between shape and alpha in combination with the port-duff
 xfer modes.
 
-The clear xfer mode removes any part of Dst that is within Src’s
+The clear xfer mode removes any part of Dst that is within Src's
 shape. This is accomplished by bundling the current content of the
 device (Dst) into a single entity and then drawing that with the
-inverse of Src’s shape used as a mask (we want Dst where Src
-isn’t). The implementation of that takes a couple more steps. You may
+inverse of Src's shape used as a mask (we want Dst where Src
+isn't). The implementation of that takes a couple more steps. You may
 have to refer back to [the content stream section](#Generating_a_content_stream). For any draw call, a
 ContentEntry is created through a method called
 SkPDFDevice::setUpContentEntry(). This method examines the xfer modes
@@ -486,17 +474,17 @@
 with the inverse shape of Src as a mask. This works well when the
 shape of Src is the same as the opaque part of the drawing, since PDF
 uses the alpha channel of the mask form x-object to do masking. When
-shape doesn’t match the alpha channel, additional action is
-required. The drawing routines where shape and alpha don’t match, set
+shape doesn't match the alpha channel, additional action is
+required. The drawing routines where shape and alpha don't match, set
 state to indicate the shape (always rectangular), which
 finishContentEntry uses. The clear xfer mode is a special case; if
-shape is needed, then Src isn’t used, so there is code to not bother
+shape is needed, then Src isn't used, so there is code to not bother
 drawing Src if shape is required and the xfer mode is clear.
 
 SrcMode is clear plus Src being drawn afterward. DstMode simply omits
 drawing Src. DstOver is the same as SrcOver with Src and Dst swapped -
 this is accomplished by inserting the new ContentEntry at the
-beginning of the list of ContentEntry’s in setUpContentEntry instead
+beginning of the list of ContentEntry's in setUpContentEntry instead
 of at the end. SrcIn, SrcOut, DstIn, DstOut are similar to each, the
 difference being an inverted or non-inverted mask and swapping Src and
 Dst (or not). SrcIn is SrcMode with Src drawn with Dst as a
@@ -508,10 +496,6 @@
 <span id="Known_issues">Known issues</span>
 -------------------------------------------
 
-*   [issue 237](https://bug.skia.org/237)
-    SkMaskFilter is not supported.
-*   [issue 238](https://bug.skia.org/238)
-    SkColorFilter is not supported.
 *   [issue 249](https://bug.skia.org/249)
     SrcAtop Xor, and Plus xfer modes are not supported.
 *   [issue 240](https://bug.skia.org/240)
diff --git a/src/third_party/skia/site/dev/design/sync.md b/src/third_party/skia/site/dev/design/sync.md
deleted file mode 100644
index 1172058..0000000
--- a/src/third_party/skia/site/dev/design/sync.md
+++ /dev/null
@@ -1,13 +0,0 @@
-sync
-====
-
-[`sync`](https://skia.googlesource.com/skia.git/+/master/bin/sync)
-is a Python program that wraps `tools/git-sync-deps`.  Motivations for using it:
-
--  Written in Python, so it will work on all platforms.
-
--  Checks to see if the `DEPS` file has changed since it last ran
-   `gclient sync`.  If not, it skips that step.
-
--  Since running `sync` is fast when it can do nothing, it is
-   easy to do before every recompile of Skia.  This is a good habit.
diff --git a/src/third_party/skia/site/dev/sheriffing/android.md b/src/third_party/skia/site/dev/sheriffing/android.md
index 73c1f6e..c9ef21e 100644
--- a/src/third_party/skia/site/dev/sheriffing/android.md
+++ b/src/third_party/skia/site/dev/sheriffing/android.md
@@ -17,7 +17,7 @@
 
 1) Monitor and approve the semi-autonomous [git merges](https://googleplex-android-review.git.corp.google.com/#/q/owner:31977622648%2540project.gserviceaccount.com+status:open) from Skia's repository into the Android source tree. See autoroller documentation <a href="#autoroller_doc">here</a> for details on how to interact with it.
 
-2) Stay on top of incoming Android-related bugs in both the [Skia](https://bugs.chromium.org/p/skia/issues/list?can=2&q=OpSys%3DAndroid&sort=-id&colspec=ID+Type+Status+Priority+Owner+Summary&cells=tiles) and [Android](https://buganizer.corp.google.com/issues?q=componentid:1346%20status:open) bug trackers.  For Skia bugs, this means triaging and assigning all Android bugs that are currently unassigned.  For Android, this means following the [Android guidelines](go/android-buganizer) to verifying that all Skia bugs are TL-triaged (if not reach out to djsollen@).
+2) Stay on top of incoming Android-related bugs in both the [Skia](https://bugs.chromium.org/p/skia/issues/list?can=2&q=OpSys%3DAndroid&sort=-id&colspec=ID+Type+Status+Priority+Owner+Summary&cells=tiles) and [Android](https://buganizer.corp.google.com/issues?q=assignee:skia-android-triage%20status:open) bug trackers.  For Skia bugs, this means triaging and assigning all Android bugs that are currently unassigned.  For Android, this means following the [Android guidelines](go/android-buganizer) to verifying that all Skia bugs are TL-triaged (if not reach out to djsollen@).
 
 The RoboCop's job is NOT to address issues in Perf and Gold. You'll get your chance when you are the general Skia sheriff.
 
@@ -33,11 +33,13 @@
 
 You can also stop the autoroller via the UI. This is useful in cases where a failure needs to be investigated and you do not want to waste TH resources by running unnecessary tests.
 
+If the autoroller displays an error in the UI then look for more detail in it's [cloud logs](https://pantheon.corp.google.com/logs/viewer?project=google.com:skia-buildbots&resource=logging_log%2Fname%2Fandroid-master-autoroll&logName=projects%2Fgoogle.com:skia-buildbots%2Flogs%2Fautoroll).
+
 If you need any more information about the autoroller please look at [skia:5538](https://bugs.chromium.org/p/skia/issues/detail?id=5538) or ask rmistry@ / skiabot@.
 
 We also have autorollers into release branches (also restricted only to Googlers):
 
-* [https://android-o-roll.skia.org](https://android-o-roll.skia.org).
+* [https://android-o-roll.skia.org](https://android-o-roll.skia.org) ([cloud logs](https://pantheon.corp.google.com/logs/viewer?project=google.com:skia-buildbots&resource=logging_log%2Fname%2Fandroid-o-autoroll&logName=projects%2Fgoogle.com:skia-buildbots%2Flogs%2Fautoroll)).
 
 Changes created by these rollers need to be manually approved.<br/>
 The changes created by the release rollers:
diff --git a/src/third_party/skia/site/dev/sheriffing/index.md b/src/third_party/skia/site/dev/sheriffing/index.md
index 45be620..3b5ad96 100644
--- a/src/third_party/skia/site/dev/sheriffing/index.md
+++ b/src/third_party/skia/site/dev/sheriffing/index.md
@@ -5,7 +5,7 @@
 
 *   [What does a sheriff do?](#what_is_a_sheriff)
     +   [Skia tree](#skia_tree)
-    +   [DEPS rolls](#deps_rolls)
+    +   [AutoRollers](#autorollers)
     +   [Gold and Perf](#gold_and_perf)
     +   [Documentation](#sheriff_doc)
 *   [View current and upcoming sheriffs](#view_current_upcoming_sheriffs)
@@ -13,7 +13,6 @@
 *   [Tips for sheriffs](#tips)
     +   [When to file bugs](#when_to_file_bugs)
     +   [How to close or re-open the tree](#how_close_tree)
-    +   [Compile bot failures automatically close the tree](#tree_closers)
     +   [How to revert a CL](#how_to_revert)
     +   [What to do if DEPS roll fails to land](#deps_roll_failures)
     +   [How to rebaseline](#how_to_rebaseline)
@@ -35,6 +34,9 @@
 * Close and open the [tree](http://skia-tree-status.appspot.com).
 * Keep the builder comments on the [status page](https://status.skia.org) up to date.
 * File or follow up with [BreakingTheBuildbots bugs](https://bug.skia.org/?q=label:BreakingTheBuildbots). See the tip on [when to file bugs](#when_to_file_bugs).
+* Read and update the [Ongoing Issues section](https://docs.google.com/document/d/1y2jUf4vXI0fwhu2TiCLVIfWC1JOxFcHXGw39y7i-y_I/edit#heading=h.tpualuc3p7z0) in the handoff doc.
+* (Optional) Document significant events that occurred during your sheriff shift in the [Weekly
+  Handoff Notes section](https://docs.google.com/document/d/1y2jUf4vXI0fwhu2TiCLVIfWC1JOxFcHXGw39y7i-y_I/edit#heading=h.y49irwbutzr) in the handoff doc.
 
 <a name="blamer"></a>
 ### Blamer
@@ -58,9 +60,9 @@
 
         Review-Url: https://codereview.chromium.org/2167723002
 
-<a name="deps_rolls"></a>
-### DEPS rolls
-* Ensure that [AutoRoll Bot](https://autoroll.skia.org)'s DEPS rolls land successfully.
+<a name="autorollers"></a>
+### Autorollers
+* Ensure that all AutoRollers listed on the [status page](https://status.skia.org) are successfully landing.
 
 <a name="gold_and_perf"></a>
 ### Gold and Perf
@@ -117,14 +119,6 @@
 * Add "No-Tree-Checks: true" to your CL description and use the CQ as usual.
 
 
-<a name="tree_closers"></a>
-### Compile bot failures automatically close the tree
-
-A failure of the build steps in all compile bots automatically closes the tree. Sheriffs will have to manually reopen the tree when they deem the problem fixed.
-
-Note: The tree is not closed automatically if the last run of the failed compile builder had the same failing step. The tree is also not closed if the tree was automatically closed less than 10 mins ago. If the tree is already closed then no action is taken.
-
-
 <a name="how_to_revert"></a>
 ### How to revert a CL
 
@@ -143,7 +137,7 @@
 
 * First create a Chromium bug:
   * goto [crbug.com](https://crbug.com)
-  * Make sure you’re logged in with your Chromium credentials
+  * Make sure you're logged in with your Chromium credentials
   * Click “New Issue”
   * Summary: “Skia image rebaseline”
   * Description:
@@ -166,14 +160,14 @@
 * (Preferred but slower) Make a separate Blink patch by editing LayoutTests/TestExpectations
   * Add # comment about what has changed (I usually paraphrase the crbug text)
   * Add line(s) like the following after the comment:
-      * crbug.com/<bug#youjustcreated> foo/bar/test-name.html [ NeedsManualRebaseline ]
+      * crbug.com/<bug#youjustcreated> foo/bar/test-name.html [ Skip ]  # needs rebaseline
   * Commit the patch you created and wait until it lands and rolls into Chrome
 
 * Retry the DEPS roll (for the 1st/dispreferred option this usually means just retrying the layout bots)
 * Make a Blink patch by editing LayoutTests/TestExpectations
   * Add # comment about what has changed
   * Add line(s) like the following after the comment:
-      * crbug.com/<bug#youjustcreated> foo/bar/test-name.html [ NeedsRebaseline ]
+      * crbug.com/<bug#youjustcreated> foo/bar/test-name.html [ Skip ]  # needs rebaseline
         * (if you took the second option above you can just edit the existing line(s))
 
 * If you took the first/dispreferred option above:
diff --git a/src/third_party/skia/site/dev/sheriffing/trooper.md b/src/third_party/skia/site/dev/sheriffing/trooper.md
index f497381..ea6c2c5 100644
--- a/src/third_party/skia/site/dev/sheriffing/trooper.md
+++ b/src/third_party/skia/site/dev/sheriffing/trooper.md
@@ -1,119 +1,5 @@
 Infra Trooper Documentation
 ===========================
 
-### Contents ###
-
-*   [What does an Infra trooper do?](#what_is_a_trooper)
-*   [View current and upcoming troopers](#view_current_upcoming_troopers)
-*   [How to swap trooper shifts](#how_to_swap)
-*   [Tips for troopers](#tips)
-
-
-<a name="what_is_a_trooper"></a>
-What does an Infra trooper do?
-------------------------------
-
-The trooper has two main jobs:
-
-1) Keep an eye on Infra alerts emails (sent to infra-alerts@skia.org). The alerts are also available [here](https://alerts.skia.org/infra).
-
-2) Resolve the above alerts as they come in.
-
-<a name="view_current_upcoming_troopers"></a>
-View current and upcoming troopers
-----------------------------------
-
-The list of troopers is specified in the [skia-tree-status web app](http://skia-tree-status.appspot.com/trooper). The current trooper is highlighted in green.
-The banner on the top of the [status page](https://status.skia.org) also displays the current trooper.
-
-
-<a name="how_to_swap"></a>
-How to swap trooper shifts
---------------------------
-
-If you need to swap shifts with someone (because you are out sick or on vacation), please get approval from the person you want to swap with. Then send an email to skiabot@google.com and cc rmistry@.
-
-
-<a name="tips"></a>
-Tips for troopers
------------------
-
-- Make sure you are a member of
-  [MDB group chrome-skia-ninja](https://ganpati.corp.google.com/#Group_Info?name=chrome-skia-ninja@prod.google.com).
-  Valentine passwords and Chrome Golo access are based on membership in this
-  group.
-
-- These alerts generally auto-dismiss once the criteria for the alert is no
-  longer met:
-  - Monitoring alerts, including prober, collectd, and others
-  - Disconnected build slaves
-
-- These alerts generally do not auto-dismiss ([issue here](https://bug.skia.org/4292)):
-  - Build slaves that failed a step
-  - Disconnected devices (these are detected as the "wait for device" step failing)
-
-- "Failed to execute query" may show a different query than the failing one;
-  dismiss the alert to get a new alert showing the query that is actually
-  failing. (All "failed to execute query" alerts are lumped into a single alert,
-  which is why the failed query which initially triggered the alert may not be
-  failing any more but the alert is still active because another query is
-  failing.)
-
-- Where machines are located:
-  - Machine name like "skia-vm-NNN", "ct-vm-NNN" -> GCE
-  - Machine name ends with "a3", "a4", "m3" -> Chrome Golo
-  - Machine name ends with "m5" -> CT bare-metal bots in Chrome Golo
-  - Machine name starts with "skiabot-" -> Chapel Hill lab
-  - Machine name starts with "win8" -> Chapel Hill lab (Windows machine
-    names can't be very long, so the "skiabot-shuttle-" prefix is dropped.)
-  - slave11-c3 is a Chrome infra GCE machine (not to be confused with the Skia
-    Buildbots GCE, which we refer to as simply "GCE")
-
-- The [chrome-infra hangout](https://goto.google.com/cit-hangout) is useful for
-  questions regarding bots managed by the Chrome Infra team and to get
-  visibility into upstream failures that cause problems for us.
-
-- To log in to a Linux buildbot in GCE, use `gcloud compute ssh default@<machine
-  name>`. Choose the zone listed for the
-  [GCE VM](https://pantheon.corp.google.com/project/31977622648/compute/instances)
-  (or specify it using the `--zone` command-line flag).
-
-- To log in to a Windows buildbot in GCE, use
-  [Chrome RDP Extension](https://chrome.google.com/webstore/detail/chrome-rdp/cbkkbcmdlboombapidmoeolnmdacpkch?hl=en-US)
-  with the
-  [IP address of the GCE VM](https://pantheon.corp.google.com/project/31977622648/compute/instances)
-  shown on the [host info page](https://status.skia.org/hosts) for that bot. The
-  username is chrome-bot and the password can be found on
-  [Valentine](https://valentine.corp.google.com/) as "chrome-bot (Win GCE)".
-
-- If there is a problem with a bot in the Chrome Golo or Chrome infra GCE, the
-  best course of action is to
-  [file a bug](https://code.google.com/p/chromium/issues/entry?template=Build%20Infrastructure)
-  with the Chrome infra team. But if you know what you're doing:
-  - To access bots in the Chrome Golo,
-    [follow these instructions](https://chrome-internal.googlesource.com/infra/infra_internal/+/master/doc/ssh.md).
-    - Machine name ends with "a3" or "a4" -> ssh command looks like `ssh
-      build3-a3.chrome`
-    - Machine name ends with "m3" -> ssh command looks like `ssh build5-m3.golo`
-    - Machine name ends with "m5" -> ssh command looks like `ssh build1-m5.golo`.
-      [Example bug](https://bugs.chromium.org/p/chromium/issues/detail?id=638193) to file to Infra Labs.
-    - For MacOS and Windows bots, you will be prompted for a password, which is
-      stored on [Valentine](https://valentine.corp.google.com/) as "Chrome Golo,
-      Perf, GPU bots - chrome-bot".
-  - To access bots in the Chrome infra GCE -> command looks like `gcutil
-    --project=google.com:chromecompute ssh --ssh_user=default slave11-c3` (or
-    use the ccompute ssh script from the infra_internal repo).
-
-- Read over the [SkiaLab documentation](../testing/skialab) for more detail on
-  dealing with device alerts.
-
-- To stop a buildslave for a device, log in to the host for that device, `cd
-  ~/buildbot/<slave name>/build/slave; make stop`. To start it again,
-  `TESTING_SLAVENAME=<slave name> make start`.
-
-- Buildslaves can be slow to come up after reboot, but if the buildslave remains
-  disconnected, you may need to start it manually. On Mac and Linux, check using
-  `ps aux | grep python` that neither buildbot nor gclient are running, then run
-  `~/skiabot-slave-start-on-boot.sh`.
-
-- Sometimes iOS builds fail with 'The service is invalid'. Try rebooting the iOS host to fix this.
+The trooper handles problems with Skia's build and test infrastructure.
+Documentation for troopering is found at [go/skia-infra-trooper](http://go/skia-infra-trooper) (Googler's only).
diff --git a/src/third_party/skia/site/dev/testing/automated_testing.md b/src/third_party/skia/site/dev/testing/automated_testing.md
index d7a817a..16ff488 100644
--- a/src/third_party/skia/site/dev/testing/automated_testing.md
+++ b/src/third_party/skia/site/dev/testing/automated_testing.md
@@ -20,18 +20,18 @@
 Multiple jobs may share the same task, for example, tests on two different
 Android devices which use the same compiled code.
 
-Each Skia repository has an infra/bots/tasks.json file which defines the jobs
+Each Skia repository has an `infra/bots/tasks.json` file which defines the jobs
 and tasks for the repo. Most jobs will run at every commit, but it is possible
 to specify nightly and weekly jobs as well. For convenience, most repos also
-have a gen_tasks.go which will generate tasks.json. You will need to
+have a `gen_tasks.go` which will generate `tasks.json`. You will need to
 [install Go](https://golang.org/doc/install). From the repository root:
 
 	$ go get -u go.skia.org/infra/...
 	$ go run infra/bots/gen_tasks.go
 
-It is necessary to run gen_tasks.go every time it is changed or every time an
+It is necessary to run `gen_tasks.go` every time it is changed or every time an
 [asset](https://skia.googlesource.com/skia/+/master/infra/bots/assets/README.md)
-has changed. There is also a test mode which simply verifies that the tasks.json
+has changed. There is also a test mode which simply verifies that the `tasks.json`
 file is up to date:
 
 	$ go run infra/bots/gen_tasks.go --test
@@ -41,16 +41,22 @@
 Try Jobs
 --------
 
-It is useful to know how your change will perform before it is submitted. After
-uploading your CL to [Gerrit](https://skia-review.googlesource.com/), you may
-trigger a try job for any job listed in tasks.json:
+Skia's trybots allow testing and verification of changes before they land in the
+repo. You need to have permission to trigger try jobs; if you need permission,
+ask a committer. After uploading your CL to [Gerrit](https://skia-review.googlesource.com/),
+you may trigger a try job for any job listed in `tasks.json`, either via the
+Gerrit UI, using `git cl try`, eg.
 
-	$ git cl try -B <bucket name> -b <job name>
+    git cl try -B skia.primary -b Some-Tryjob-Name
 
-The bucket name refers to the [Buildbucket](https://chromium.googlesource.com/infra/infra/+/master/appengine/cr-buildbucket/README.md)
-bucket to which the request will be submitted. Most public Skia repos use the
-"skia.primary" bucket, and most private Skia repos use the "skia.internal"
-bucket.
+or using `bin/try`, a small wrapper for `git cl try` which helps to choose try jobs.
+From a Skia checkout:
+
+    bin/try --list
+
+You can also search using regular expressions:
+
+    bin/try "Test.*GTX660.*Release"
 
 
 Status View
@@ -62,7 +68,7 @@
 
 * green: success
 * orange: failure
-* purple: exception (infrastructure issue)
+* purple: mishap (infrastructure issue)
 * black border, no fill: task in progress
 * blank: no task has started yet for a given revision
 
@@ -87,4 +93,96 @@
   used, per the Javascript String Match() rules:
   http://www.w3schools.com/jsref/jsref_match.asp
 
+<a name="adding-new-jobs"></a>
+Adding new jobs
+---------------
 
+If you would like to add jobs to build or test new configurations, please file a
+[New Bot Request][new bot request].
+
+If you know that the new jobs will need new hardware or you aren't sure which
+existing bots should run the new jobs, assign to jcgregorio. Once the Infra team
+has allocated the hardware, we will assign back to you to complete the process.
+
+Generally it's possible to copy an existing job and make changes to accomplish
+what you want. You will need to add the new job to
+[infra/bots/jobs.json][jobs json]. In some cases, you will need to make changes
+to recipes:
+
+* If there are new GN flags or compiler options:
+  [infra/bots/recipe_modules/build][build recipe module], probably default.py.
+* If there are modifications to dm flags: [infra/bots/recipes/test.py][test py]
+* If there are modifications to nanobench flags:
+  [infra/bots/recipes/perf.py][perf py]
+
+After modifying any of the above files, run `make train` in the infra/bots
+directory to update generated files. Upload the CL, then run `git cl try -B
+skia.primary -b <job name>` to run the new job. (After commit, the new job will
+appear in the PolyGerrit UI after the next successful run of the
+Housekeeper-Nightly-UpdateMetaConfig task.)
+
+[new bot request]:
+    https://bugs.chromium.org/p/skia/issues/entry?template=New+Bot+Request
+[jobs json]: https://skia.googlesource.com/skia/+/master/infra/bots/jobs.json
+[build recipe module]:
+    https://skia.googlesource.com/skia/+/refs/heads/master/infra/bots/recipe_modules/build/
+[test py]:
+    https://skia.googlesource.com/skia/+/master/infra/bots/recipes/test.py
+[perf py]:
+    https://skia.googlesource.com/skia/+/master/infra/bots/recipes/perf.py
+
+
+Detail on Skia Tasks
+--------------------
+
+[infra/bots/gen_tasks.go][gen_tasks] reads config files:
+
+* [infra/bots/jobs.json][jobs json]
+* [infra/bots/cfg.json][cfg json]
+* [infra/bots/recipe_modules/builder_name_schema/builder_name_schema.json][builder_name_schema]
+
+Based on each job name in jobs.json, gen_tasks decides which tasks to generate (process
+function). Various helper functions return task name of the direct dependencies of the job.
+
+In gen_tasks, tasks are specified with a TaskSpec. A TaskSpec specifies how to generate and trigger
+a Swarming task.
+
+Most Skia tasks run a recipe with Kitchen. The arguments to the kitchenTask function specify the
+most common parameters for a TaskSpec that will run a recipe. More info on recipes at
+[infra/bots/recipes/README.md][recipes README] and
+[infra/bots/recipe_modules/README.md][recipe_modules README].
+
+The Swarming task is generated based on several parameters of the TaskSpec:
+
+* Isolate: specifies the isolate file. The isolate file specifies the files from the repo to place
+  on the bot before running the task. (For non-Kitchen tasks, the isolate also specifies the command
+  to run.) [More info][isolate user guide].
+* Command: the command to run, if not specified in the Isolate. (Generally this is a boilerplate
+  Kitchen command that runs a recipe; see below.)
+* CipdPackages: specifies the IDs of CIPD packages that will be placed on the bot before running the
+  task. See infra/bots/assets/README.md for more info.
+* Dependencies: specifies the names of other tasks that this task depends upon. The outputs of those
+  tasks will be placed on the bot before running this task.
+* Dimensions: specifies what kind of bot should run this task. Ask Infra team for how to set this.
+* ExecutionTimeout: total time the task is allowed to run before it is killed.
+* IoTimeout: amount of time the task can run without printing something to stdout/stderr before it
+  is killed.
+* Expiration: Mostly ignored. If the task happens to be scheduled when there are no bots that can
+  run it, it will remain pending for this long before being canceled.
+
+If you need to do something more complicated, or if you are not sure how to add
+and configure the new jobs, please ask for help from borenet, benjaminwagner, or
+mtklein.
+
+[gen_tasks]:
+	https://skia.googlesource.com/skia/+/master/infra/bots/gen_tasks.go
+[cfg json]:
+	https://skia.googlesource.com/skia/+/master/infra/bots/cfg.json
+[builder_name_schema]:
+	https://skia.googlesource.com/skia/+/master/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.json
+[recipes README]:
+    https://skia.googlesource.com/skia/+/master/infra/bots/recipes/README.md
+[recipe_modules README]:
+    https://skia.googlesource.com/skia/+/master/infra/bots/recipe_modules/README.md
+[isolate user guide]:
+    https://chromium.googlesource.com/infra/luci/luci-py/+/master/appengine/isolate/doc/client/Isolate-User-Guide.md
diff --git a/src/third_party/skia/site/dev/testing/ct-system-diagram.svg b/src/third_party/skia/site/dev/testing/ct-system-diagram.svg
deleted file mode 100644
index 3251cf2..0000000
--- a/src/third_party/skia/site/dev/testing/ct-system-diagram.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" standalone="yes"?>
-
-<svg version="1.1" viewBox="0.0 0.0 913.2414698162729 647.4120734908137" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="p.0"><path d="m0 0l913.24146 0l0 647.41205l-913.24146 0l0 -647.41205z" clip-rule="nonzero"></path></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l913.24146 0l0 647.41205l-913.24146 0z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m372.84747 34.722347l0 0c0 -15.513569 12.576233 -28.089802 28.089813 -28.089802l262.68655 0c7.44989 0 14.5946045 2.9594522 19.862488 8.227312c5.2678223 5.2678595 8.227295 12.41261 8.227295 19.862488l0 112.35582c0 15.51358 -12.576233 28.089813 -28.089783 28.089813l-262.68655 0c-15.51358 0 -28.089813 -12.576233 -28.089813 -28.089813z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m372.84747 34.722347l0 0c0 -15.513569 12.576233 -28.089802 28.089813 -28.089802l262.68655 0c7.44989 0 14.5946045 2.9594522 19.862488 8.227312c5.2678223 5.2678595 8.227295 12.41261 8.227295 19.862488l0 112.35582c0 15.51358 -12.576233 28.089813 -28.089783 28.089813l-262.68655 0c-15.51358 0 -28.089813 -12.576233 -28.089813 -28.089813z" fill-rule="nonzero"></path><path fill="#000000" d="m395.43408 33.003517l0 -1.078125l3.9375 -0.015625l0 3.453125q-0.90625 0.71875 -1.875 1.09375q-0.953125 0.359375 -1.96875 0.359375q-1.375 0 -2.5 -0.578125q-1.125 -0.59375 -1.703125 -1.703125q-0.5625 -1.109375 -0.5625 -2.484375q0 -1.359375 0.5625 -2.53125q0.578125 -1.1875 1.640625 -1.75q1.078125 -0.578125 2.453125 -0.578125q1.015625 0 1.828125 0.328125q0.8125 0.328125 1.28125 0.921875q0.46875 0.578125 0.703125 1.515625l-1.109375 0.296875q-0.203125 -0.703125 -0.515625 -1.109375q-0.3125 -0.40625 -0.890625 -0.640625q-0.578125 -0.25 -1.28125 -0.25q-0.84375 0 -1.46875 0.265625q-0.609375 0.25 -0.984375 0.671875q-0.375 0.40625 -0.59375 0.90625q-0.34375 0.875 -0.34375 1.875q0 1.25 0.421875 2.09375q0.421875 0.828125 1.234375 1.234375q0.828125 0.40625 1.75 0.40625q0.796875 0 1.5625 -0.296875q0.765625 -0.3125 1.15625 -0.671875l0 -1.734375l-2.734375 0zm12.648315 0.390625l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm3.0157776 3.265625l0 -9.3125l6.71875 0l0 1.109375l-5.484375 0l0 2.84375l5.140625 0l0 1.09375l-5.140625 0l0 3.171875l5.703125 0l0 1.09375l-6.9375 0z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m179.7454 90.90026l0 0c0 -19.256035 15.97673 -34.86614 35.685043 -34.86614c19.708298 0 35.685028 15.610104 35.685028 34.86614c0 19.256042 -15.97673 34.866142 -35.685028 34.866142c-19.708313 0 -35.685043 -15.6101 -35.685043 -34.866142z" fill-rule="nonzero"></path><path fill="#a5b4c2" d="m200.28082 80.4727c0 -2.0058365 1.6642456 -3.6318893 3.7171936 -3.6318893c2.052948 0 3.7171936 1.6260529 3.7171936 3.6318893c0 2.0058365 -1.6642456 3.6318893 -3.7171936 3.6318893c-2.052948 0 -3.7171936 -1.6260529 -3.7171936 -3.6318893m22.864868 0c0 -2.0058365 1.6642303 -3.6318893 3.7171783 -3.6318893c2.052948 0 3.7171936 1.6260529 3.7171936 3.6318893c0 2.0058365 -1.6642456 3.6318893 -3.7171936 3.6318893c-2.052948 0 -3.7171783 -1.6260529 -3.7171783 -3.6318893" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m196.08893 106.10562q19.341522 12.978569 38.63788 0" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m179.7454 90.90026l0 0c0 -19.256035 15.97673 -34.86614 35.685043 -34.86614c19.708298 0 35.685028 15.610104 35.685028 34.86614c0 19.256042 -15.97673 34.866142 -35.685028 34.866142c-19.708313 0 -35.685043 -15.6101 -35.685043 -34.866142z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m200.28082 80.4727c0 -2.0058365 1.6642456 -3.6318893 3.7171936 -3.6318893c2.052948 0 3.7171936 1.6260529 3.7171936 3.6318893c0 2.0058365 -1.6642456 3.6318893 -3.7171936 3.6318893c-2.052948 0 -3.7171936 -1.6260529 -3.7171936 -3.6318893m22.864868 0c0 -2.0058365 1.6642303 -3.6318893 3.7171783 -3.6318893c2.052948 0 3.7171936 1.6260529 3.7171936 3.6318893c0 2.0058365 -1.6642456 3.6318893 -3.7171936 3.6318893c-2.052948 0 -3.7171783 -1.6260529 -3.7171783 -3.6318893" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.08893 106.10562q19.341522 12.978569 38.63788 0" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m179.7454 90.90026l0 0c0 -19.256035 15.97673 -34.86614 35.685043 -34.86614c19.708298 0 35.685028 15.610104 35.685028 34.86614c0 19.256042 -15.97673 34.866142 -35.685028 34.866142c-19.708313 0 -35.685043 -15.6101 -35.685043 -34.866142z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m251.11548 90.90026l133.32285 -0.03149414" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m251.11548 90.90026l121.322845 -0.028656006" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m372.4391 94.175064l9.075439 -3.3056107l-9.076996 -3.3013153z" fill-rule="evenodd"></path><path fill="#d9d9d9" d="m616.34906 44.325897l0 0c0 -7.975754 14.276978 -14.441383 31.888489 -14.441383c17.611511 0 31.888428 6.4656296 31.888428 14.441383l0 57.765526c0 7.9757614 -14.2769165 14.441383 -31.888428 14.441383c-17.611511 0 -31.888489 -6.465622 -31.888489 -14.441383z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m680.126 44.325897l0 0c0 7.975754 -14.2769165 14.441383 -31.888428 14.441383c-17.611511 0 -31.888489 -6.4656296 -31.888489 -14.441383" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m616.34906 44.325897l0 0c0 -7.975754 14.276978 -14.441383 31.888489 -14.441383c17.611511 0 31.888428 6.4656296 31.888428 14.441383l0 57.765526c0 7.9757614 -14.2769165 14.441383 -31.888428 14.441383c-17.611511 0 -31.888489 -6.465622 -31.888489 -14.441383z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m680.126 44.325897l0 0c0 7.975754 -14.2769165 14.441383 -31.888428 14.441383c-17.611511 0 -31.888489 -6.4656296 -31.888489 -14.441383" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m616.34906 44.325897l0 0c0 -7.975754 14.276978 -14.441383 31.888489 -14.441383c17.611511 0 31.888428 6.4656296 31.888428 14.441383l0 57.765526c0 7.9757614 -14.2769165 14.441383 -31.888428 14.441383c-17.611511 0 -31.888489 -6.465622 -31.888489 -14.441383z" fill-rule="nonzero"></path><path fill="#000000" d="m632.1079 65.573105l0 -1.078125l3.9375 -0.015625l0 3.453125q-0.90625 0.71875 -1.875 1.09375q-0.953125 0.359375 -1.96875 0.359375q-1.375 0 -2.5 -0.578125q-1.125 -0.59375 -1.703125 -1.703125q-0.5625 -1.109375 -0.5625 -2.484375q0 -1.3593788 0.5625 -2.5312538q0.578125 -1.1875 1.640625 -1.75q1.078125 -0.578125 2.453125 -0.578125q1.015625 0 1.828125 0.328125q0.8125 0.328125 1.28125 0.921875q0.46875 0.578125 0.703125 1.515625l-1.109375 0.296875q-0.203125 -0.703125 -0.515625 -1.109375q-0.3125 -0.40625 -0.890625 -0.640625q-0.578125 -0.25 -1.28125 -0.25q-0.84375 0 -1.46875 0.265625q-0.609375 0.25 -0.984375 0.671875q-0.375 0.40625 -0.59375 0.90625q-0.34375 0.875 -0.34375 1.8750038q0 1.25 0.421875 2.09375q0.421875 0.828125 1.234375 1.234375q0.828125 0.40625 1.75 0.40625q0.796875 0 1.5625 -0.296875q0.765625 -0.3125 1.15625 -0.671875l0 -1.734375l-2.734375 0zm5.4451294 0.28125q0 -1.8750038 1.03125 -2.7656288q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.9062538 0.890625 2.5156288q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.8906288q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.6406288 -0.5625 1.9375038zm6.2406006 0q0 -1.8750038 1.03125 -2.7656288q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.9062538 0.890625 2.5156288q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.8906288q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.6406288 -0.5625 1.9375038zm6.4437256 3.9375l1.125 0.15625q0.0625 0.515625 0.375 0.75q0.4375 0.328125 1.171875 0.328125q0.78125 0 1.21875 -0.328125q0.4375 -0.3125 0.578125 -0.890625q0.09375 -0.34375 0.09375 -1.453125q-0.75 0.875 -1.875 0.875q-1.390625 0 -2.15625 -1.0q-0.75 -1.0 -0.75 -2.40625q0 -0.96875 0.34375 -1.78125q0.359375 -0.8125038 1.015625 -1.2500038q0.65625 -0.453125 1.5625 -0.453125q1.1875 0 1.96875 0.96875l0 -0.8125l1.046875 0l0 5.812504q0 1.578125 -0.328125 2.234375q-0.3125 0.65625 -1.015625 1.03125q-0.6875 0.390625 -1.703125 0.390625q-1.203125 0 -1.953125 -0.546875q-0.734375 -0.53125 -0.71875 -1.625zm0.953125 -4.046875q0 1.3125 0.515625 1.921875q0.53125 0.609375 1.328125 0.609375q0.796875 0 1.328125 -0.59375q0.53125 -0.609375 0.53125 -1.90625q0 -1.234375 -0.546875 -1.8593788q-0.546875 -0.640625 -1.328125 -0.640625q-0.765625 0 -1.296875 0.625q-0.53125 0.6250038 -0.53125 1.8437538zm6.6468506 3.484375l0 -9.312504l1.140625 0l0 9.312504l-1.140625 0zm7.6017456 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.6406288q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.9218788 0.859375 2.5781288q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.2812538q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.5156288 -0.59375 1.4062538z" fill-rule="nonzero"></path><path fill="#000000" d="m638.4663 81.96373l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm2.812683 3.265625l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm2.5704346 -3.375q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm11.084351 3.375l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.171875l1.140625 0l0 3.734375q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.609375l1.140625 0l0 6.734375l-1.015625 0zm7.3656006 0l0 -0.84375q-0.640625 1.0 -1.890625 1.0q-0.796875 0 -1.484375 -0.4375q-0.671875 -0.453125 -1.046875 -1.25q-0.375 -0.796875 -0.375 -1.828125q0 -1.015625 0.34375 -1.828125q0.34375 -0.828125 1.015625 -1.265625q0.671875 -0.4375 1.5 -0.4375q0.609375 0 1.078125 0.265625q0.484375 0.25 0.78125 0.65625l0 -3.34375l1.140625 0l0 9.3125l-1.0625 0zm-3.609375 -3.359375q0 1.296875 0.53125 1.9375q0.546875 0.640625 1.296875 0.640625q0.75 0 1.265625 -0.609375q0.53125 -0.625 0.53125 -1.875q0 -1.390625 -0.53125 -2.03125q-0.53125 -0.65625 -1.3125 -0.65625q-0.765625 0 -1.28125 0.625q-0.5 0.625 -0.5 1.96875z" fill-rule="nonzero"></path><path fill="#000000" d="m635.481 98.24498l1.171875 -0.109375q0.078125 0.703125 0.375 1.15625q0.3125 0.4375 0.9375 0.71875q0.640625 0.265625 1.4375 0.265625q0.703125 0 1.234375 -0.203125q0.546875 -0.203125 0.8125 -0.5625q0.265625 -0.375 0.265625 -0.8125q0 -0.4375 -0.265625 -0.765625q-0.25 -0.328125 -0.828125 -0.546875q-0.375 -0.140625 -1.65625 -0.453125q-1.28125 -0.3125 -1.796875 -0.578125q-0.671875 -0.34375 -1.0 -0.859375q-0.328125 -0.53125 -0.328125 -1.171875q0 -0.703125 0.390625 -1.3125q0.40625 -0.609375 1.171875 -0.921875q0.78125 -0.328125 1.71875 -0.328125q1.03125 0 1.8125 0.34375q0.796875 0.328125 1.21875 0.984375q0.4375 0.640625 0.46875 1.453125l-1.1875 0.09375q-0.09375 -0.890625 -0.640625 -1.328125q-0.546875 -0.453125 -1.625 -0.453125q-1.109375 0 -1.625 0.40625q-0.515625 0.40625 -0.515625 0.984375q0 0.5 0.359375 0.828125q0.359375 0.328125 1.859375 0.671875q1.5 0.328125 2.0625 0.578125q0.8125 0.375 1.1875 0.953125q0.390625 0.578125 0.390625 1.328125q0 0.734375 -0.421875 1.390625q-0.421875 0.65625 -1.21875 1.03125q-0.796875 0.359375 -1.796875 0.359375q-1.265625 0 -2.125 -0.359375q-0.84375 -0.375 -1.328125 -1.109375q-0.484375 -0.75 -0.515625 -1.671875zm16.374146 1.984375q0.84375 0.59375 1.578125 0.859375l-0.359375 0.859375q-1.015625 -0.359375 -2.0 -1.140625q-1.046875 0.578125 -2.296875 0.578125q-1.265625 0 -2.296875 -0.609375q-1.015625 -0.609375 -1.578125 -1.703125q-0.546875 -1.109375 -0.546875 -2.5q0 -1.375 0.546875 -2.5q0.5625 -1.140625 1.59375 -1.71875q1.03125 -0.59375 2.3125 -0.59375q1.28125 0 2.3125 0.609375q1.046875 0.609375 1.578125 1.71875q0.546875 1.09375 0.546875 2.484375q0 1.140625 -0.34375 2.0625q-0.34375 0.921875 -1.046875 1.59375zm-2.71875 -1.578125q1.0625 0.3125 1.765625 0.890625q1.078125 -0.984375 1.078125 -2.96875q0 -1.140625 -0.390625 -1.984375q-0.375 -0.84375 -1.125 -1.296875q-0.734375 -0.46875 -1.65625 -0.46875q-1.375 0 -2.28125 0.9375q-0.90625 0.9375 -0.90625 2.8125q0 1.8125 0.890625 2.796875q0.90625 0.96875 2.296875 0.96875q0.671875 0 1.25 -0.25q-0.578125 -0.375 -1.21875 -0.53125l0.296875 -0.90625zm5.9763794 2.578125l0 -9.3125l1.234375 0l0 8.21875l4.578125 0l0 1.09375l-5.8125 0z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m384.4396 41.88684l150.73807 0l0 98.195724c-75.36905 0 -75.36905 37.414368 -150.73807 16.156204z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m384.4396 41.88684l150.73807 0l0 98.195724c-75.36905 0 -75.36905 37.414368 -150.73807 16.156204z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m384.4396 41.88684l150.7377 0l0 97.958405l-150.7377 0z" fill-rule="nonzero"></path><g transform="matrix(0.11648972106493051 0.0 0.0 0.1285543307086614 384.43960603674543 41.88683937007874)"><clipPath id="p.1"><path d="m0 0l1294.0 0l0 762.0l-1294.0 0z" clip-rule="nonzero"></path></clipPath><image clip-path="url(#p.1)" fill="#000" width="1294.0" height="762.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQ4AAAL6CAYAAAB3g8u1AACAAElEQVR42uzdCVBU174/eu5QN/9Xr949Ve//r3/qX6/q5N577smcmDgnapxi1Gg0JAajREWNGA0Gh6BGTQiJSpyOcUSjKIqoKISIIBgUBVQGkXmSQZkRaGaZxOT79lrdDd3QNN3QqMj3V/U5S3Zv9t69u+n0/p619rKy0qlZs2aBiIiIiIiIiIiI+ier9vXdt+tAREREREREREREJLQGhzafWIOIiIiIiIiIiIhIkKHhjI+n45MZH4ItW7Zs2bJly5YtW7Zs2bJly5YtW7bG2xFvD8PWLa74atlSLHNY8kS1byvHtmb1KoPHPe2DyZgwYSzemzDO5NbqI+sPQERERERERERERF17a/gQbPlp0xN7bF+vWm7wsXfHj8HChfOwYcM3JrP6cPoUWH84FWzZsmXLli1btmzZsmXLli1btmzZsjXeDh82BK6uG5/I4xs2bDBWrXI0+Pj4caOxft0a2C+ab/L2rEQ3RSIiIiIiIiIiIura0CGDsHnTD0bXmTBhAsaOHYt3330X48aNk+TP48coRvfqsa1YvszgY2PGjMQ336w2a3tWU6dMxAdTJ4EtW7Zs2bJly5YtW7Zs2bJly5YtW7bG2yFDBmLjRhej64ng8O7du9BWY2MjkpKSsGjRIowfN6bXjm/I4Dex3NHB4ONjRo/A2jVfm7U9qynvv4f3J08AW7Zs2bJly5YtW7Zs2bJly5YtW7ZsjbeDBr2BjT9+b3Q9bXD4008/yV6H06dPh7+/P7Kzs+XPY8eMxJgxYzB+/HhJ9EjUXS56J2p7LWp7LIrgr6vjG6wcm5gkxdDjo0a+JSdOMef5Wk2aOB6TJ70LtmzZsmXLli1btmzZsmXLli1btmzZGm8HDRyAH1y+M7rehAnjZXC4efNmTSg4HkuXLkVLS4sMCN8ZNQIzZszA1atXUVVVhXv37mH//v0yKBTBYWVlJX755RdkZGSgsLAQFy9elAHjO6PeMrrfgW++LmdYNvT4yBHD4fT1CrOer9XE98bhvQljwZYtW7Zs2bJly5YtW7Zs2bJly5YtW+PtG2+8BpfvvzO63oQJ42Rw6Oq6GePHj8XUqe/D19cXiYmJMhgUUlNTceaMNyZOfA+zZs1CQUEB1q37BqNHj5bBYXh4uOx1+N577yI9PR0bN25UtmX8+N5843V8uXSxwcfffmuonHHZnOdrNeHdMSAiIiIiIiIiIqKuvTHgVXzvvKGL9cbq3eNQVG1tDZYtW4Z33nkHCxcuxP379zFhwrt4992x0p49uxEcHIzx49U9DlesWK4ZzjwGXl4nZMj4rgnHtnSJvcHH3ho+BKtWOpr1XK3Gj3sH48aOAlu2bNmyZcuWLVu2bNmyZcuWLVu2bI23r7/2Mr77bn0X641tG6o8dqzsNejs7CzDQptPPsH69evx4MED5OfntyouLkZERLiyvrrH4YL58+X2xowZhSNHjsh7JHZ1fK+//goWL15o8PGhQwfKGZfbLxf3Phw6ZCDefPM1OdRZt7USN10kIiIiIiIiIiKirr326kv4dsM64+uNbQsOdZdVVFTghx9csOjzz2U4KJaNHfOOYrTm36MwZow6OJw/fz6GDR2k/DyyNTg05dgW2y80+NjQIeoZl9svHzL4DWXbvyErK7MDq8mTJ2PunNkY/c5bird71IobNL4zajhbtk99a4m/F7Zs2bJly5YtW7Zs2bJly7avtK++8gI2rF9rdD1tWObq6ion8pg4cSJcXFzwxx9/yKG5Y0aPlPf1O336NEQeJdaxs7OTQdfod0a0hmVDBg+S29OGZeIxY/t99ZUXsehzO4OPDx40QM4y3H75oIGv49y535CVeVuR2Wl77pyfnAyl/e9/tWyJnMG4q/0MeP1luZ3p095X/v2K/Ll9O33aFLk/8XN39yPaYUMHtu5Puz31sldan494XCzraj+iFZO4yODws88+xaiRw3tk5IhhRP1KT/9miIiIiIiIiPqKl196AevWrTG6jpjUQ/e+fmIobm5uLn766Sfl8bcxYsRwTJs2DSEhITIkrKurQ1paGlauXNk6IcjcuXM12xsBd3d3GRyKobRdHdvChfMMPiaG3Do4LOmw/K3hg/HmG6/htddeNkqsI9Zt//tim2LbXe1H/P7OnTuQmXnbKLGOWLe7+xHE8Wr3Jf49ZPCbcrloxc/a/Yh/d7UfoS04tJ3Z7fBkxNtDOxBdHwcMeEUmvq+8/AJRnyXewyKZH6K8p99+a4jB9ztDVCIiIiIiInravaxcI69evUqOwjO67kj1kFwxAcioUaOUZSMUwzFo0CAMfPM1uY4ICcXjYj3x77bff1vxllxPvW7XHdXEtforL7+I+XZzDD4u7tPn8OUXFj8fYptvap6Psf0MHzYIb7zxqhxCbIxYR6zb3f1o96Xdnug9qPuY+Fn7mCn7EXocHLYPUMSLJWZvmTvHFpE3rqGmugrNTU1EfZZ4D9+4fg1z534mA0QxA5GhAJH/ESEiIiIiIqKnmegg9sHUyZg0cfwTdVxiGPFbbw3FrE9nPJHBYV/dT4+DQ0OhoXixVq1agfr793G/rha1NdVEfZ54L4v3tONXDq1dlBkeEhERERERUX8iroVFr7UPp099Im5ZJ67Lxf3+RA+6T2fOwMT3xhkNDj/+aLrF9i221Vmg97Tsp0fBoaHhmuINNHz4EFSoVKirZWhITxfxnlapyjF06CB5E1EOWyYiIiIiIqL+GB6OHj0S48aNxsA3B8ghwi+99PxjIW4tJnoaitBw+vQpnR6zCMOsP/xABmOWJLbZPtCbM2fWI9nPo3g+Fg0OtSnvT5s3oaGhnkETPZXEe3vTjz/IXofD2euQiIiIiIiI+ikxXFkMDRb3FVy4YN5jIfYtjqGznoZaovOPCMR6g9j207qfbgeHhkJDkTiLrqFpaakmD1EuvXcPt7PuIuV2HlIy8pGReRfFRUUMqOiJHrIs3uMvv/S88sc0qMOQ5eHDBssAvbeICVrEPvkfKSIiIiIiIiLqbWYHh4ZCQ2HokIGw+eQjNDU2dhm+qMrLsOXno5i3+ghGzd2Pt233Y/js/Rg5xw3v2+/H6h8PIDk5hUEVPZHEe/yjj6bLIE/MQqT9GxB/D+Ien4d+OYDgoAsW5+//G/bs2okPp0+Rs5bzA4yIiIiIiIiInpjg0ND93LS9DcVMyr/6npUTSBgLXSJjbmLNDz/j8w2nMGz2ATw/ZQfesj2AUXMP4nXrXfjv97dj4KxDGDv/IAKCQrof8JTHYpOtHfYmlT2egEnZ/1ZbW+yMLetzwZgq3RfOdtaYOtUaX57OYljYjniPnz3rLXvYtu91KILD48ePwfO4h8Wd9PJU/sZ8EBDgj1mzbOS++SFGRERERERERI89OOwsNBRErytxQ8yKigqjgUtScgr+cbEMR86EYNmGIxj86X4sXX8E9it+wufLXbHS2R2frjqB59/fipc/3I23Zu1FXFyckW2WISN4D9YtssHUqVNl0GW7dCNOhOc+/uCwJhdR5/0Rlfco9pWIvXZTNedAfR7snA4golv7LkPURlvY7oyFiiFhp8R7/Y0Br8mef7q9DsXPTl+vwAnPYzh+7GivOHXSC6dPeWHY0Dd5T0UiIiIiIiIierzBoaHQULe34cCBr+P7778zOilKTXUV1h4Mw3cXgf3B+Thw2AfLvtmLdxesx5h1/hi58lcMme+KZc4H8dGyI/iviT/hpQ/3wX7tflSoyg1uM+O0I6ynLsJW31jkFJdBVZyFW8F74OwchPzHHhw+SurgcHlwrvy5JPsSdio/W6+7hBKzt1WE0OXW+PJ87tMf/invK5+zZ5V/1+gsr0Ho5UvtlhmeJGXDhvWyp61ur0PRjh0zUgZ7xzyO9Bpfn7OYP3+ODC35QUZERERERERET1RwqNvb8NVXX0JiQrzRSVHCIiIx52glpu9Xwem3Rnj8egMff7EGg35OgcO5Rnx/uRHjj9TgTSdPfG6/ElNmOOCNsYswftYPCAwI7LjN4ktYZ20Np84CLk1wuOn0HjjZWsueeHbrTiOpXPdxWzjv3YLli+xga7cRUcpjqiRfbNL2YLRZhE2+ieqed5r1N3mK7al79X258xJysoOwdal6fZvlexBVbGCocnEYnKwXwTu7rVffrS22sNvbzW13Ghy2TSyT47kIU+0OIEP8nH0Je53sYC2ek7UdnA5GqgPFDufge7ivtW3ttWhj44gT6U9vcOjj44NpH3yAn3fu1ASFNfLfU6ZM0YSHxidJiY+/Jad/F/f31O11KIYrb9+2BR5H3XuNGLq8d88ueZ9FfpARERERERER0WMJDo2FhqJ3lZjldfq0qV1OinLAOxSfHq3D1L1lWHamHgfORmLYLEe8vqcAa8/X4EB0HayP1eC1db447H4EiSm34XniNFYsX4lNm1w73ocvdiNspjoiuNjIPQ5tpsJ6+QH1cOHiMOy0tcZybdCofdzJFxnlumGfNb7UBGslsQfwpbUttkaW6WzPE7eUfaqy/eFkPRW2i5zxa7p4PBEnllrDzjOte8GhOdvuKjhU1vdeKp7bJZSUi8essWhvGPJFMJodhE22NnAKzjV8DmqKENxPehyK8O/ECU/YfPIJdu/aJYl/e3oeN2lmcPGenzplsuxxq9vrUAxXtp39KbxOHMfRI4d7jd+vPnh3/Bhlv0P4YUZEREREREREjzY4NDZEWfY2HD4YA15/BadOnexyUpQtntdhc6gK7+8pw6fuNdh3LhXjps7Cs9/8jiEHVJh0pAbP77yDF6fZ47jHMWTkqxCdcheXr9+C2y+HOwaH4U6wtnaWvQQ7Dw5tsCmyrDWsS9ppB9uNsTphnQ2cI8v0w0gb3W2K+/3ZwGZjJFQdtqcO2Gy14Z/o5Xd6Eaydwlp785kXHJqxbSP3OLS21rSLNuJ8tnhOW2CrPKcInfOU77sUNjJU7HgO+lNwqJ7opA6nTp6ErfJaCeLfYpmpk6R4nfDEq6+8qO51qDNceeCbr+PIkcM44n6o15z0OoG1a77GkMGcYZmIiIiIiIiInqDgUIQjw4YOlMFheXkZamuN3xPO9VgYZh2uwJQ9ZZi0uxzfB9RhvcsOvDbeBs/O/xn/c7E7/s/4uZjx4XQkp+fI0DAsJgW/h0Xh8JHj3etx2O4ehxkH7WDjHKkzPFj/8ZLLTrDWDu/V/o6nHayXa0I2vfWLEOpkjUU6sw6LQE6u262hymZsu5Pg8EvfNOTn5SrHWq33nORQZ00wJtlYw2a5fyf3gexfwaEYnuxx9CjsFy2SxL+7ur9hK+U9L977YnblIYPfkMOVtb0OBw96A05fr5Lhobv7oV4htu3l5Sl7PHKSFCIiIiIiIiJ6ZMGh8dBQ26vqNXyzdg0ajUyKorX72Hks8CjDlN0lcrjytP0V2B5SC5ftRzBj8nv4cPIkrFnhiNj4ZCRlFeNaXAYuX49DYEg4Dhw81O17HJoTHHbZ47C7wWF5GNbZLMIJneAwYp1NW49CCwWHuvc4bHtOW2BruwW3yk07R/0rOKyRw5NFmHr2zBlJ/FssMzU8FO/9NU5fywBdBOni70L8fYh/jxs3WgZ7vRUcCmfOeGP27JlyqDQ/0IiIiIiIiIjoCQgOB8veVa+88iJuxsSYdD+4kMtXscAtDdP3FOKDvffw/v5qfPCPO3D+6Rf4nDmLrLwS3C2pQkJmEa7HZ8rehoGXr8M/6JIMdDqdVdl6Ebae151V+QCcNxqeVbmr4LC2PFJzj8NYw/c47G5wWJOGE4ussdxXs262r/oeho8gOKzV3OPwy71hyClXh5b56WEIjS3q98Ghl9cJeU9D7fBk7bBlsczf/5zJ90mMjorESy/+Xd7vU7fX4ZtvvIbt27b2anB4/LgHduzYhkEDX+cHGhERERERERE9vuBQ996Ggwe/gUkT30VjY4NJAUtVZQVWbj2BeYcLMWVXIaZvvgmnb35E4IWLSM+vRNztIkQl30VkYjYibqXjYlgMLl65jsNHjqEgP6+T7ZYhI3gP1mlnQZ5qA7vlW+AdmdutHoeyh167WZWdfbsZ7ukFh+oQ0snWBrZ2i/Cl0z+w18nG4kOVDQaHQp7OrMpituRFTtgbntvvg8Oy0nsIDgrSu6eh+Pe1iAiztiP+Bia8O07e11D0NNTe61AMX547ZzaOHTvaq+Ghr+9ZvDPqLU6SQkRERERERESPNzjU9jYUQzNFIFJff9/kgCU6Kgpf7QnFjH15+PBzZ0TeuIH0gircTM1DdPIddWgYm46QiFhcCo/GuYBgBAcH9ZN77dHjmlnZlGVGJ0lR/gbE/QbVk6S09ToU3nzzNTmRSW8Gh6dOecHR0UGG+fxQIyIiIiIiIqJHHhxqextqJ0V59dWXUFZairraGrNCluCLv2O12yUs3BkO1z3HEZeag1vpebiRkIWI2FRE3ExGVFwqfH87Dx9fH4Zb9MQTfwOl9+7h5Zeel5OiiPsNaocrDxo4ADaffIxjxzx6dZIUD48jeGPAq/xQIyIiIiIiIqLHExxqexuKSVFWrvgKjQ0N3QpaEhPisc3NC8t+Oo3vdnohICwe0YmZuBaTAL+Aizh46LC8bxxDKeorxN+Co+My2RN36JCBevc6FEOYJ0+aABcXZxw+/IsM+SztH//YweCQiIiIiIiIiB59cKjf21A9KcqNG9dxv66uR2FLbOxNHDl2Elt37oPnCS/4nzuHhPg4BlHUB4c81yEiIrx1khTdXoeCGMIsQkUxnFl69SWLEtsW++OHGhERERERERE9suBQNzQUvagGDxqA8ePGoKG+noERkQ7xNzFm9Cg5m3L7XodyUqFh6r8h3XsgWg4nRiEiIiIiIiKiRxgctoWGbfc2FL0Nj3kcQYMZk6IQ9Y/g8L685+CLotfh4LZeh+LvR/u3pA3k+eFDRERERERERH0uONQGhkOHDpTDK8XkDtqehmKI5fz58+SwTHMnRSHqD5Ok1NXVYu7cz+REKQMHvt7a81C3l6FugEhERERERERE9DiJ/E9mFzqZhcHgUDwggg0xM+xrr70sg8KXXnpeLl/0+XycPeuN+3W1EoMiIkP3OlT/fZzxPgVb20/5AURERERERERETzSR/YkMUGSBIhMU2aA2PNQLDkWqKFYYM2YU9uz+GcmJCci6nSEDkabGRnkPN/Y0JOq656H4WxF/MzwfRERERERERPSkd4KqUKlQkJ+Hr79eKbNBkRF2CA5Fl0SRLorQsK62tjUE4UkkIiIiIiIiIiJ6ut24fk1mgyIj7BAciskcxOQnoqchTxYREREREREREVH/kZV5W2aDIiPsEByKiRxefvkF3sOQiIiIiIiIiIioHwaHIhsUGaGB4PBNeUNEBoePV52cYKOOiIiIiIiI6KlWx/yB6IkLDkU2KDJCBodPpBrcuH4dZ7xPw/P4cSIiIiIiIqKnkrjuFde/4jqYWQARg0MyoafhrdibuBTyO/Lz81FSUkJERERERET0VBLXvTdu3EBCfBx7HhIxOKSu3L9fh6tXQlFcXIwHDx6AxWKxWCwWi8VisVisp7XEda+4/hXXweJ6mLkAEYNDMqJe+aAMDwtDRUUF/wvCYrFYLBaLxWKxWKynvsT1r7gOrmdwSNT/gsOqsiKo7qQ+kidWoSpHdVVlnw8OI8LDUVlZyf96sFgsFovFYrFYLBbrqS9x/Suugy0RHFZXV0oMf/qRkmzUhGxF9eHpqHZ9EdU//FXdKj+L5bVFt3t35GhdLZoaG/GwpQV//vknlP+R7R9//IEHD5rR0FCPutoaBoeGlEQHIfX7iUh3nYr0vV+htrqq155U9u0MZKalIC05EfdKih5NUKl8uCVkl+ByfD4uJ+QjLrNYLpOPVVTi9/g8ZOSVmh0cXouIYHDIYrFYLBaLxWKxWKw+VSIs8fX1xY8//ggPj2NoaWkxOTgU18HdDQ5zSjLhFrUdSwNmYYb3GMw4MwZL/G2wP3IrskrSGaz1ssLiahzwrsdMpzKMmJeCoXNTMHJxAWzXl+DgqXIUFlb0yn5rqlSoCfgW1Zv+rg4LO6M8Ltarqbhn8cBQDLWXYWEXJULEpqZG1PaRAPGRBIflt+OR5PI+qsK3oTpiC7K2WaM0JbpXnlB56T1kZaSipChfSktJhKq8tNdOYElpBdwv3cbiw3FY552CbedvY7vC+UwqvlCWHfw9A66/JeNb5ecFbjeRVVBmVnB4/VoEqqqqunzjZWVl4fjx49i2bRtcXFxkK37OzMzkf7FYLBaLxWKxWCwWi/VIKzc3F+vXr0d5eTn27t2LpKRkk35PXP+K6+DuBIf+yd6Y5fMePvYebdDMs+/CN+nEIw1dkDAN8LNSO6PwVBxW7FVcmtzj7e/duwf79u3tEbENSzzXI78WYMzCQkyaW47xM2/jY8fbWLQxH598V4AR9rcxbF4BRs/NhXeAZTt41RRnofqXqcYDw/aU9cXvWWL/jQ0Neu/hhj+B8hagqAkorAdSqv9AaOEDROY3oLK2QS9AvJ2RYZnJdWtrzPbEBIdVJYVIcp6GisubUOr7BapCf0Dy2jFQ5aT12hDltKQEFBfmIf9uNooKcpWfE3tl2PLN20VYcjgO+y7mwCeqEMfC8nDg0l3l5zv45XIuTl0vwO6gbCw8dAsnIvLh6JGAi3F5ZgSH93Hj+rUug8P09HTs2rULycnJKCsrQ3V1tWzFz2K5eLzrakTUpWfxzKF5iOri/wgqyXPD1ht+yDVx+SOp2hT4uHsitLjF+DIjpYryhptnOIotdEiW3l6n/0F2m4GR49YiqulJ+YrQhJRNkzBykjNSmvrScVvgPddptaA0zBPunqEw8e34GKsFqkhvuHsEo6AF/biU85ASAh9Pd7i7u3c8H2Z+vrBYLBaLxWL1t7p06RJ++eUX+e/Q0FCcPn3a5OBQXAeL62Fzrs9/Szklexh2Fhrq8kk8/uiCQxEYPvyfQLOm1f33Zqseb/+zzz7DggULekRso6fHse2oCoPtMjFiTjTcPGoQn9yE8tpGVDY2oLC6AZFZTdh8ugljlhZiysoWbPMosUxoWHGv09CwZusr6sd2DOw8PKxS9fAWc/db37uJJfVYmAVENAP1fwAP/gT+UKiUf58s+hO2vzfjjb2F+O5EJKprauTvFBUV4U5Odo9Dw3179+KDDz7A1KlTuzR92jScPnXK5PCwd4PD6kqk7FiE0oD1UJ1bjrJzK3Fn32xkHv2hV/8w72ZnIvt2GgpycyQRIN5OS7HoPsRQ5KVH4nDyRiHcQu5gR0AWdgflYHdwDnYp7c7ALGz+7TZ+vpAN99C78Liah2VHExB8K9esN2DkjesyCDRWhw4dkiHh3bt3ZW9DLfFzUlKSfNxywWEjEq4+h2cOzERYiynLH1GGk+6nXNiH6IUyhpYZC7syd02TQVacRYIsS2+v8yr2W4kZdtuMhnRPYnD45B13z99zT0dwqHxZSwmEt881lPbnTKw2ET7u7vAOy0RBaSlKVbVo6fbrz2KxWCwWi9X/ys3NDREREfLfpcr3KTFk2ZThyuL6V1wHmxMcZpdk4FOfCSaFhuqeh+Nxuyj50QWHze16Gu7QLHPueXC4cOFCnDlzRvbQ7A7xu2IbPTmGY7738PqsTExdnYRrac2orWvEfeX1q2kXTFXV1OB6eiMmry6Xzl4p7nlwGPhtx0DQ8zPUZEXpr5dzEzWn7TuGi8rv92T/2vd0eEQ0/l+XMPxzNLCttN31lQjSy5SXPR4YcfIBrBaGY/gXu3CvXD0RbtjVqz0ODj/88EMZAM+dO7dLs2bNwqJFi56M4DDL40cUHLVHRYATSrwWoOj4F0jevEAGir39xymCwrvZt5GbkymDw5zMdBkoWmLbZaoKLDkcC8+IfPwjMAs7g7KxwTsFC3+JxRqvBKw7lYBFB28py1Lh+tttfKe0e5R1HI7Emx0cRkXeQI0mie6sNm3aJIcqi7BQd13xs1guHn+6g8N6pPu5wyO4AE1Glz2dweGTV6YFh0/Q4VroPdeLwSHDqUdXmnPdUhwKT/eTuGYwPTX39WexWCwWi8XqXyXCvw0bvoVKpWpdtmPHP5CWltbl74prWnEdbE5wuD9qmwwEN1x2gHfKUckr6VBrUHgq+XDr8nWXvpTLdt/Y9GiCQzE8ueWvMjRsXbZZs+wbywSHXie6P/xa/G5PgsP8wkqMmluOd+zvIiytGYWVDcpy44FU6M1yzPy+GP63HqCyByNcawozOtzTsObKLuO/c/kfHe952M0hyyIr097T8P3538DKNQP/dhkYeA2o+0P9fhaPZikXDb53gC3RLXj/VA3+5dtsWL39DVwPest1bt261ePg8OTJk1i+fDkcHR1NcuHChccfHOYHe+H25mlQBa5BoZs1ik8uRcKq91BZXPBI/jirKiuQkhAvw8PsjFQZHqYnJ6KoIL/H2z4VkY0t/pnYE5yD7eez5BDkPRfSUVymvsnn5l+TscZLfV/DLf4Z2HA6Fc5n0rDU3czgsP4+oqMiUVtba/SDVQSEYjiyaHVvxKm73Jzg8GLhUXx++ln8+z4rPHPgBUy9cQVV2nUuKuuI5boOLYR7sKHlixHVot3uTHinr8HU439RP3ZgAD67pd2u5ggq/bDK7wX8b+3vH3gWr/msQVhXV+b1mfB390BwbpPRZbWZgdjmMBuTRo7ESMW4aXZY6RaHWm3QpVneatImo8FXU3EIdjnMaN3eyHGTMNthF+JqjW+vKVc5jpV2mDFJ+3vTYOfsrfxex0QrN2Qb7Kdpj9cB20Li4G2n/GwfAu3q+kN+20K78HBPrJ2tOY5xMzTP1fztm/fcOwsOlX35rZTr22mOo/1QZdPPi+FSRbm1Pd+R4zDDYRsCdd8TOscVEu6GlZp1JzmnaMIfM86HgfdXkyodYYHe8HRXD231OOmD4MgC1OsFhyHILU5HqJ+nZvirNwJjtOvor5eTE4NgH/V6nqHFrdlhbW7bcnflGLz9w5CpajEQUop9pSBEu66nH0Izq5RHm1CqMwTX0ycUmVX6v68/VLkFBYHKut4x0L9pQi1SfJTlfjma89fT/ZoavoYgMzMSgd4emnOonOfE4g4Bnnw9/L3h4a7dXzASC+oNbk//XBcgN1gzPFmH7mtg8DOHxWKxWCwWq59WcHAwtm7dhs2bXbFx48ZWXl5eeutFR8dgy5at2L59h+Tq+pNc79ix4/Jeb63fMpXrX3EdLK6HTb12XnL+UxkGimBQt7TBoW6JdcSyz899bLkehb9q7l94WnFK07vwuOKIpnfhtwoXxW51UIiAD2RoCP8pfT44/NmzGKM/r8TO0w+hqm/s0MuwM6UVtSisb0B+afdnz5azJ+uGhqft9SdqKSpBQlq2bPVm2/b8TP/3xGzL3QzstO/dz9b8DKvvsvCvPoDVceV9prlnWelD4Oo94FDSH1gfWodBhyrxTytvwmrQF9jhcV6uc/PmzR6/DxqUvxcx4YpJGhvNCuZ7JTgsz4hHstM4qPydULBnKgoPzkTs4mEoTYp+pDchFROlJN66KYctiwlT8u5kIyk+Fqqynk2W4ugRD8+IPLj4pMtAcMd5/fs1fn7wFvYG52Cbfya2nsvEt6dTZXgo7ocYmpBvVnAYEx1lUnCYkZHRISDsbLnR4HDfX/D8kWH4/NYpXMzxw+4LLyjLnsHUzBLN1fhdXBTh4YGJ8C6/i9waoarz5a3btcK/H5mJ4yUlaGypQkLyPDyvLBtyI11ZQ1zDx2O98qH6zPGZ2J15BVGFV3Ax0w3rLzniovZavyoR3soF/MmwUr0OWPU5/nD3CIRebthuWVOKG2aLQGm2MzxDohAXF44Qv11w3hSovgdhbTGiNokegisRkluM4mKFysh5b8rErhnK9mY4wzskDikpcYgK8YPbpl0IVxnfXm2Ust9t3giUxxGH8EA3rBRhlZ233v0hVeFrZdA2ba0nQpT14kI8sXbGJHVY11VwKIIv5bn6pRRDpRxLivdKjBs5DitDVGZv3+zn3iE4rEWKm72y/0lY6ZfbGvC0Dw5NPS+GqjbKGdNECOiwC4FR4njEcxEBoD38itsFhzIUXAvvqFzlNSlGbm6t2eej/furpTRSDmt19wlBYmYuCgpykZkSidDQdM3vaUIqdw+cPOmH0MRMZb85SAzxlssCc+r1wywZPIqgSyX//lVVmmgzN1QGk57+kUjPLUBBTiJCTopgyx8pVe0CMWW7nsq+wlJylH1lItJfBG0nERLmh5N+YUjJyUVuZiT8PdqHgj0MDru9XxODQ3GeT4YgvbQeLS31UKWH4KSyzCdG1fq50FIaI18PD59QZX8FKC7IREzwSeV3vXV6EHZ+rlvqlTYnGB7iHoa5VXJ5bVOL0c8cFovFYrFYrP5Yokehs/P3cjbZ7tb336tvs6UbHIrrYHOCw0/OjDU7OBT3Q6zq4f3tZAgoQsOWmcqXRKs24mcxFLlah/h5p5XFc4/HHRzafpeH0QtTcPN2E6rNCKMKi8rx3cF0fL45DDXd3Hf14en6AWBOWwB341Yq9ntdxL4TwbKNvNWW24hhzHq9DpXtdPf5a9/7Gcr1xN+2JuFffq6A1c9/YELgn7jbDMRWAKcz/sDOqAYsOl+F/7U5D1bjXDBorkvrRCmXLoX0v8lR0nauQJH7AhTumYbCn6cg8cvhyAs+9XimAs/PRXJcLLLSU2R4KGSmp3Z7e6JX4dLDcTgQchcbfTPw+cFY5BSU663jHZGDBQdudrDhdBLKVZVmJcbiA7Ours7gB+wffz7ExgsrYXdscpfEemL9roPDZ/F5ns6lfEs8VolAz8evtdeheUOVdbfb2HG5sv5FcfFdfwqj9llhVLqRGKFKfc+xk9d0g8Mm5AR6wN0/R6fXVvtlxfATvcambTLSe83MocWqENiPHAn7kFqLbK8pcxdmjJyGXZmtsRo8Z4ug01M/NMt1U9YzJTjU3ZbO9hzCNb9n+va789xbg8NaFcI3Kcc3cgY2hehPE2PK5Cgdz4uh0jyXabugt1qxnzzOSc5xrT0K1edmEjZ1eFHMOR/t31+1SPFzl8OQC5q6Cr08EaK7UosK10Tw598+fDM06UYVEkVQd7LdvQdrU+Anwq8QbY84nW0U6PfC9XNXH2ex7mJxrz53byRWWSo47O5+TQ0O221fWV4slovj1QTVYhix+8kwvf2hpQox3uJcZ+r3Au1kgpOW4hB4iKHKqpYO7++OnzksFovFYrFY/bPERCbOzs6Ij0/o1u9nZmbi22+/Q2FhYesycf0rroMbzAgOxT0LRRgohicbCg5b/mjpGByeGYNqC9xGTfY03GmibZYPDsWsyGfPnHlsweGouZHYeCANqrpG5XzWwNM7Cx5nM1BZWWW4l2B1FfwuFOGjxbkYNPcu3nOMRG1DffeCQ9cX28K/HQPbcpuS0tbQUEv8rNvzUE6cojOJSnefv5jYpLlJfeFxPqMO/+J4Bf+28ir+988qrIl4gM2RD/BVUA2sT5bib65psBq3Hv/r7XlIvqu+EWJ+Xh6Sk5P63+Qoqdsdkb/nExRuew+FOyYjcdGbyAt6fMGh6HWYmZaM26lJimTl390PDjPySvG1ZyJ2nM/Ej74ZWHTgZq8du/igvBkTLW8qajDqa6nHvKOTkdZyGfEP/DslHhfrifW7DA4PTG8X/FXhnI8VnvFy0wQq3Q0OJ6oDQt1H8qbj3/c9h1UljW09Dg+Nxpe3TiGsvASNpvyXpikXwR7u8M+s73xZbQgcRE+yXZlG7kfWWdDXhCbR26iVtgujptfdJAds8w5BXKaq3baNBIdNxQh3Wwu7GR2HMzuE17Yeswi9Znjmdgi43GaYEBx22G8twh1EMOat6WFp+vYNpHldPnf1MdjD2UE8RzvsMpDYdggOTTkvhkrzXDq+vioE2ouekdpAURscrkRUreFtmHQ+2r+/mnLgLwNtlZFbEWpCqg4zFTchx1/0VExp1zMxsGMIWa/ZT2T7/dQjUwZlkVC1GNlXSylCPdX35dNbLO/l54kwnZ54PQoOu71fU4PDjj39WgqC1SGf2Fbr61Ha7jyJ53VSZ0ITI+faWHBo6DOHxWKxWCwWqx+XuD2Wq6srTp/2RkNDg0m/I4Z3hoRckr0No6Oj9R4T17/iOtic4HB50Dy9yU9cI9ZBVV/WYVKUnMrb2B+zVf77i/M2lhmqfFrTy1Clo17Ty7BAh/jZ1bLB4bnffkN2VqZZvccsHRx6BxaguKYBBeX1+NolE2NtizHcPh9TnEoQfE1/3ZikIny87i4GTkvB+M+KMM7hPj5ck4maxobuBYftZkhuzaRu39ELDbXSlOWtweGBSXq/35PXISI8rPX9u9o7FVbDluHflgbhf/xUhf9nWyX+rx8KYLVGWf7JIfzTazNx6kqS+pqjpQXBQUEoLirsf5OjlKfFIe7zoSjeZ4MCl1Eo+mkibtoOwL2EqEcaGpbdK0H8zWgZGGakJCIzLQVxMVFyCHN3t5lVUIavjsZjy2+Z+M47DXZuN+X/y2J03H0PgsPYmzGorzd8gXq/uQZz3CfiaoM7Ltzf3inxuFhPrN9lcNhhcpRGXBTB4fGdPQsODUya0liyGH/d9xd8VqiOCBtrgrD1wjA5hPkZzf0VZ9y4ghJjuaEMDPyQXm9kWbGfHKY826/Y2JYMBn1NKZva7uMnOUCbYTUVh8NtrR2mjdPek2821npGQWU0OKxFlPMk2QPP2TMEUSliyGoucuPUPdtae/EVe8tjtgtUtTtOTe9JE+5xmNJ+v7rBoRnbN3i2unjuuvd4HOfgZ3BIp/5xm3heDJXm9bXr8Po2IWrlOJ1zYWTSFjPOR4f3V22K7Anrk1LbdejVYXKUJuSK4NA7URPKGZlEpdP9tKAg2F3ndzrZRkspwjzb3atPLg6TAV5br7ue3uOwu/s1MTg0MJOxelseCBEPaM6Te6f8Ne9H4xPWdBYcGvrMYbFYLBaLxervJcK+kydPYfv27fJ7vLESk58cPnwYe/bswb17pR0eF9e/4jrYnODQI3Zfazi4N+YnVDdW4kTSL63L5vl9gPiSaFQ2qJR/T5XLfr7+o2WCw1Nm9DjcbNng0NraWgZGDg4OuBYR/liCQ+FqbD0+cEjF+MVlsPlOhe987+NtpziMWVqI5dtrEZlYju/dS/CiXQ7eXl6KOd8XITiuGdPXNGLR5mJUNTR2Lzj86UWDvQZFz0JDPQ5FT8TW3936eltwqGynp69FdHSUfP82/wG8s+Y0rIZ/hX9eHol/Wp+Jf3ZKwL/YB8BqkD2c9v3W+l4Xwe/dOzmy12G/nBylMPQcEhYMxL3tU1C0bhiKXSch2nYoKu5mPpLQsLJChfjYGNnDMD0pXvY4jL8ZhZKink3OIrrbLjh4U967cLVnMpYcisO1lM63WVJagfS793BPM3GKecFhPW7F3uw0OKxrrobtLxMQUnMAv1Vt6pR4XKwn1n9sweG+0TjXLqypypnY1uOw3bFUVV7B8UvD5AQtE9JLOg0SCkI84O6XrhNyGVjWkx6HTcXITImT99yTUnINBGpNqM2NQ+A2OxmU2cvwqbPtRWHluI7HIobkTtMNyHra47Cr4LAnPQ5NeO5tE7TskoHcpJUdw0O94zb1vBgqc3scGgoOTT4fBt5f5vQ47Elw2GRmj0NLBofBhoLDKiR6P4bg0N0fOe1ePzGxjnuHHoe5UFVVyf9jR1+t/pBus4JDQ585LBaLxWKxWCxtidlhN23ajIcPO79N1u7de3Du3LlO74tYr7kOFtfDJucPZbmY++v76kAw6kfsjtqk19NQhIV+6V6yl6F2Wcyda5YJDj3N6HH4g2WDw/S0NJw/fx5ff/01ZsyYoZzbXY88ODzmX4Nh88oxeHYGVu+rQE5No5z05EbmfSzenIZJXxVgzNfAAPtqvL04GYd/V75TNzQiOrsJ7zuW4ps9RahuaLDMPQ6z2jqriXsa6t7j8Hps28hTcS9ES93jsPU9WFDQGprfLq7Bs1PWwWrKFvyrYzj+dWkIrN79EeO/2oMHD9UT2l6+fAmpKclyqHNZDzq39dnJUbRuH/4JaUuGosTlHRR/Mwx5a0fi5uIPUKMq79XQUIyZT46/hfTkBBkait6GYrjynSzLhJYuZ5Kw2TcDX7knYKNPOhyOxKGgpONNVUvLK/B7XB5CE4oQd7sEqooqs4PDuFuxnXb3FkHgLLfxuKDagzOlzp0Sj4v1LBMcAhkRL6iHHre72Da8XBscPoOpegFgCc75PdN2j0ODOcEVzNhnhb9eijc8bLmlWA6B1OuBZWiZttfYpE1GZ+iVQZYYxtrdCQ+04dc2dYBlcHu14TLEnO1ZrB9aynV1A7Ie3uOwq+CwJ/c47PK56x9DbZzh8FDvuE0+L4aqGN7m3OPQUHBo6vkw+P4y4x6HPQkOzb3HoQWDQ9U19RBfvSHIcmbhxxEcth8mXK++56DOPQ7l6+EdA1WLCdszJzg0+PqzWCwWi8VisbRVWlqKjRs36c2SrFtiuRjWLO5t2FmJ6195HVxv3n3vQm9faJ0kpStOF+0tlj/I2ZNN7XHoYtng0MnJCf7nzqGiQiW/J8+ZMwd79+55pMHhvpPVGDqnGN8crIWqsREVdfdRU60J9mpqEBhdj4/WxmHVPzKRnNWEyvpGlNXUweWXIoy1T4fXhRrc7+Y9Dmsu6c+qLGZL1n3c87erMjj0OqffG1PMvqwXOF7aapHXIz4urjUQPx2aiH8atgT/MuswrD7aj+c+2Yy7xRXyMTG8P/LGDRkalhQXyY5v/W5ylFbVlYhbNQs5Xw1FyarBuOc0DLcXvIG0Hd/0anCYlZGO5PhYpCclIC0pXv47JTHeYtu/kVYI+19uYZ1XCpyOJ8vZk+fuu4mtfqm4rjwmhjNfTSyA28XbOBSSheNXcxCaWIiM/NLWPyCTgkPljyc+7hYaGxs7DQ5n7huL34p3wDN/bafE42I9SwWH6p6Cf8HUW0GIKolHguZ+hIaXt83W/NdDA/B5gh/C8vzwy8UBsjdh66zKlW6Yeno6Vt06inN5V1rXEb/3mXaylnaTo6iDBx+9yRUMLZPxjO6syoHhiIpqN6uyzK5WYqSYedg7CikpKcp/zIo776FY7IeV9muxyzsQ4VFxiFO2571ptpx4w1lzAz3D2yuGn+gFN80ZIXI231pkBjpjhmbIr25App3ld8ZaT4THpZg3q3KXwaHp22+KW4txesOou3ruHY/BUHiof9ymn5cOx4N2syqHRxmfVdlgcGja+ejs/dU6q7J3CGJ0ZlUOaT+rco+CQzFMVj2rsof/NTmrcm5mDII7m1XZYsGhWOeaeubiyFxUNTWhvioXkf6e8HgswaEHPD19EJqSI89zSqiP/JLU2azK6tdDnKt0JIYFwz+0uNs9Djt7/VksFovFYrFY6goOvih7ExqrS5cu49ixY51fmSrXv+I6uKEbYZIID+doeh52RoSL8fkxlgsOj5gxq/K3lg0OxdDUTz/9FMuWLUNRUSEOHz6E2bNn4/q1iEcWHBYWV8LaqQqTV2TgWprh7KisqhbljQ2oE69pbQ3Co4swcGYiJi+JRGF1I2pq67oXHBZnoXrz39uFgP+Qj4kZv3WHKoufDYaNyu/XFGZY7DUJu3q19b3suP0krEaswP+Y7IKgqDR1rFFZieCgCzI0LMjPQ4WqXHZ+63eTo+gN7S0qQMysESh0HIySL15C6fKBiJ70HMrSk3slNFSVleJW1A3Z0zAl/hZSE+IQHxON6soKi+7nJ78UrPBIwoqjSTI83B2YjR/OpmHVsUQsP5aATb4ZcPs9Cy5nU7Ev6DbOx+Qj5U6JeT0ORXAYH4empqZOg8NPdo/G2dyf4J61slPicbGepYJDtNzF8YvD8FftvQgPLVb/jsHlbds9l7cTn3n9RXP/wgHy/oWt199NV7D1wmi8dkjzuOhpeHwiVqWnt/U2rEqEtwgOw0RwqFz0i15QesMnDS3Tic4yA7HNYYYMneT996bZYa1bnN6kF4HOdjKAko9P2mQwYNIkYfB0tsfsaeNa7+U3abYDtoXktoWNnW1PFYVdrccxDjPstyEwyht2HXrWNSE3cBvsp2nuFTjNHtsCo9Q941ZGte6nu8GhqdvvENR1+dwNH4MID8VzHKcJDztMjmLieTEUHKp/3Q1rZ2vvraj8voPy+3pdEI0Hh12fD+Pvr6bSdIT5e6vDNDmLsA+CYwqMh2pmBofyPObGINjHU3O/Pg94+4chvd1wWksHh3JZeih8PDXP7aQfwtJz1T0gH3Vw6BmC3IJE5Rx4qI/Fw1s5z8UdZjhuUWXiWrCPDFrV652ET2AoYnJrjZ+nToND468/i8VisVgsVn8v0Ztwy5atyMvLkz//+eefCAsLw+bNm+Hp6dl6Cy4xa/IPP/yIsrIyg9sR17/iOrihm73Q8svu4OjNvVgeZIdPfSZ0CA6P3txj0WwAv1gBboq9it1tsyeLiVDEPQ3F8GTR01CEhlhvZeFbtFXIoGrx4sUyRFSVl2P16tVY7eQkH3c/fEjOumzMunXrenyPw9NBxRjlkI/pm1NxJbG0k5GhmolElO/u79ln4R27JPx24wEqGxvM6mDVYbuB3+oHgT+9KAPFtHYTpIifZdCoc19EGTRe+N6io19Fm5ionmU85EY8rF6fi5dmfofm5ma57NdffWVomJebi/KyUlRXVVqkt2Gfmxylw5DdxJuInPgCipe8hrLFryBu8l9REnOtV4LD0pJixEVHIi0xDqkJtxATea1Hk6F0Rtyz0OlEPByPJuLrY0n44kCcbL87nYbvvdNlmPjVkQR8fyYVuy7cxrnou11OotKd4PDjnaMQXOAOnzvbOiUeF+sZDw57qzoLJHtYLSpcO+kOb937vRla9rSVKlA9pNe7uG9uvy+f7/7w/nqiq+tQtXd3z9efxWKxWCwWy1jdvn0bP/+8SwaG9fUNOH78ODZt2oTQ0FC5fOfOnSguVl9niF6J4t58vREctqcbGn5/eSWqqyseybwLj4KYHCXyxnVcuRIKOzs7BAYE4Dc/PxkOibBnx44dWLBggVH29vbyd3t6LJs9cjB8ZRzedEzE2l8KEZuiag3SRBudWIVvduVj6GdJmPxlBrZ45KGysRE1PcybaqpUckbl1jDwmrtcfiUqSS84DItRd16ruXZIbybmmgrL50XaiVJ8AkJg9X+/judGz0F9g7pLVMjvF1FYkI/SeyUWCQ379OQo7RVc9EPku39DzNj/D/ErPkNtD7tiGpOamICbN64hRlGkvCC9tZ9yVSWcTiRg/v6bWOWRKCdLWXUsSRL/XnEsEQ5HbuF0eDYqKsx/QzQqH5QJCfGtyXT7ErMkr/ScC+sdI7q0wnNOF7Mq97HgsD9UbRzctnnKobdxKXFy+K2z6P02biVCVH1g+zzfrKcpOGSxWCwWi8ViGa3Ll0Ph6+uLwsJCGVi5ux+RnWdEifu+BQYG4scff0RsbKy8ldO+ffsNbkdc/4rr4EYLB4drLi5GWUXJUxMaCiIgnDdvHipUKtnT8McffkB6Wqpc9vvvF1FXW4v6+3UmscTxnL1ajfHL72D014UY/lUuRn91B9NXl2L04ga8veA+Rs3PxwcOiTgXXY9yERqaMUFHl0OWRXioc49Dn6AbesGh+Ll1UhVlPRkaKr/XG6/LtWsR8r18524ubOYtg8uOg7JHrnhvi6BX9DS0xH0Nn4rJUdqrKimCKjvjkfwBVajKLJbednkfhYQCrDgWj9m7ozBrTxRm74mGo0cc9gdlIDmn++m1+KBMTEjodLapxpZ6FNfmIkuVjNvliZ0Sj4v1xPoMDvtSkJUCt5WzMU1znz9xD8HZDtsQktvUN7bP881icMhisVgsFovVb6qiogI7d/6MrVu3Ijw8XPY8bF85OTnYu3cvtm3bJmdgNlTi+ldcB1syOPzukiNKK4qfqtBQ0A39RG6jzW7EMnMmv7Ck/Ht1OPx7FVb8chuffH8LH69PwewNBXDYVACv4BbkqhpRVt/Q456GHcLDinuouXe3tYfjwdMhesGh+Lm1B6SyXm/0NNRKTko0mOPcuHFD9ja01BDlR+WRBodkbnDYYDQ4/OPPhzIMFD0JxTDkzojHxXpifRaLxXriIkFVjLx/qXunvBGjYlrIYrFYLBaL1R+qLThssMh19f7ILaisUjFjeIRqRK+++3WoaqhHVWMDqkXvQuX1lLMnK8trenn/d/OL9EJDLbH8UZ0DMTP4LUV2djbS0lIREhKCtNQU3CsplhOi9KXXk8HhEx4cJiUmoqWFF8wsFutpribUVlXJoSyG1YL9PlksFovFYrH6R4nrX3EdbKngkIgYHD7FwWE9UlNT5M1hDXXzZrFYLBaLxWKxWCwW62kpcd0rrn/FdbClhioTEYPDp1Z9/X0U5OehpKRE3kTz4cOHRERERERERE8lcd0rQgpxHzhxPcxcgIjBIRlTWyOnoBfhoRgTn5KcRERERERERPRUEte94vpXXAfXPqbJPYiIwWGfImZCaqivl9Nlmzy1NhEREREREVFfo1z3iuvfOoaGRAwOiYiIiIiIiIiIiMEhERERERERERERPW3BIU8UERERERERERFR/8PgkIiIiIiIiIiIiLoXHJ45c5aIiIiIiIiIiIj6CZODw9HWgURERERERERERNRPMDgkIiIiIiIiIiIiBodERERERERERETE4JCIiIiIiIiIiIgYHBIRERERERERERGDQyIiIiIiIiIiImJwSERERERERERERAwOiYiIiIiIiIiIiMEhERERERERERERMTgkIiIiIiIiIiIiBodERERERERERETE4JCIiIiIiIiIiIgYHBIRERERERERERGDQyIiIiIiIiIiImJwyOCQiIiIiIiIiIiIwSGDQyIiIiIiIiIiIgaHDA6JiIiIiIiIiIiIwSERERERERERERExOCQiIiIiIiIiIiIGh0RERERERERERMTgkIiIiIiIiIiIiBgcEhEREREREREREYNDIiIiIiIiIiIiYnBIREREREREREREDA6JiIiIiIiIiIiIwSERERERERERERExOCQiIiIiIiIiIiIGh6ayDYerfwmyKh9CXQ9RklGEPRtCWteZsl2lLK/BjvmW2eeUFXE4uDscEyz2HKJx+T6MVnNcLKZ0tR2bcJwtBeouR1ru2MwWhDmuqdizJsiC27yIJe5Fba9xcxOyIpKx0Nb4udgRUYM67XsiORcu9kH8IyUiIiIiIiKiJ1QAhn0ZgOfWBuC/lgbgnV7e3zufBuBvyr6ecwrA8I+exuBwfiyCSkWQVIcI32S4uMZi/e50XL4jAqZ6BLmGWD44tLmKgyKci4jsOsgzIxhb6BILl+1xkmtwvXK8TQhyi9MsU57XmhATju0JCA7nJyBLOfr47Rcttk3r7WVoxkOk+sdhiUM4lmy/g9Rm5XlGxcK6k/PpdLlJeV+o4OV6XTm3ybgs3icF2Vhoww8iIiIiIiIiImJwOHpmAJ5fHYD/XBGAt56+4PAi1kc9AJorsWdFu55kNtdlgIbSXCyxsXxw6GXx4LBdUOZWoxxvHfbYm3tsT2NwGALXDGWDd5IxU2f5nOOiL6EKLraGjyFVeTTL/WrrsgkrslGCB4hwucgPIiIiIiIiIiJicPhUD1XWhEOdhWRT1sTB1TVchnt6waGhcE2zrEKzbIJ9HM4l12uGuSrrFpTBy0X0+LuKPQU644fvF8FRBFc2oVjvW4Y87XDjyhpcdr+uCRaD4Hj5AVBwB+cymuTDJcHGgz1jweGUFckIUrbT3DoE907bENwOzy0Ic7bnIr60bYhv6uWE1l53U1zL0NxcibP+ZShp1jzXOwVwXRMLr7h6zT6aEO+rE5Iae662cfI1aa3kWNi4qpR9qHD2snrYcPPdAlypUtoo/aHXc9yV59xchvXzOw59tl4TDad2PS7nuIutVRoMDqe4lCj7qsdZ3UDZJlIOBy/xv/4Yh3ETEREREREREfU0OAzAiDkBeHlFAP5jrXr9v38VgCGfBOivMy8AL3yt2d7yAAxSfv4vsb7y71EGhiq3/qxsd9CiAPz3avXv/s1RbLuPBYcTNhSgwsSebeYFhyFwTX4IFOTCZc1VzFkRjYNxD4D7JVgvQirbcE2Pw2hY2wTJno+OYmhxcw3OuUVj4YpwOLmXKMf2EPFuV5XtaYJDERhGpMJlewJcVgR1r8ehfTLim5XjjEvH+jXhWLghAecylGOtLNAEmPrPzdpVBGgPEO8fB0fluJa4ZiP+vhjiGyeH+MrgUIR5d7LhZB+ECQ7q7UP5nejjkcrzu4glxyuVderhtcKU5ypC12RNj8NQTBC9PUVwKPeRC1dXEeaGYbFvvX5IKIZ/F4jjijatF6dtNIIqlY1m6PdCbD1/u2vk6+06X783pnjdmk3dBxERERERERHRExgcjpwXgP/UBIb/tSIAf9eEg8+tDsAgTcA3ylYTEir+2zEALy3XrGNKcCisCsDriwLw8ir1z/+hbGNkXwoORa+yZhOHnpoVHGpCrOaMVCzR9mabfx3rXa9jpo2Bocrz42TYluUWqjeM2kkMoy69g4U2muCwWQUXE4dKGw4Og7DEvx64rwkJtcsdUpEngrvtIe2e21XsuSMmVYnTuw+g9W4R5Cnnwl4bHD7A5Q1BbcOC74gh3jr3ArRXbz/a9aIJz7XjUGV1cCj20fY6TXBIbzvm1mHETQjaYMLkJbbXcVCEpYaGqGvMlOevfW9EzeuaHMvgkIiIiIiIiIj6ZnD4UQBedVKv84Kddp0ADF6mXvafX4plys+Omt6CX7StM2SZ6cHhQE0A+c5sTUjpZJn7ID66Hodrcnupx2EgZm4vQYlmKHBFgQqX/ZNljzxt7zjd4FB7HIanQi7DeltNcFipvt9i94PDELhkdD7rcolvOCboPjfbaEQ0d7b2AxnSqYPDOhx0aAsB5T7uJLSFjfNFD8KHiHe9aMJz7Sw4VJ6Lg+5zCcUOEWpmiP1oAlFTzs/8aJwVE98018BrQ+evu/X2ys57HMYxOCQiIiIiIiKiPhoczgzAf2vCvSEfty1/x1YzbPnrALz9cQBe0/RCfGV22/DlUXNNDA51Zlm29MzLj+4eh7axiG7u/B6H1ttLkHenCK72QYaDwwjd4PA6zlW2BYcymJwfjvVu2QiKq0GFDOBqcFD0cDMYHD5A9O7rmONwtZ3QtqHK2h55PQgOZW/Agmw4rrjaYV8zbYP0Q1HN+am4HIuFDh3Xt7YJbA0O2/ZjSnBo7Ll2HhzusG8/nFgsr8QOh0h57mXwaSwodkhAhMgD75d12tOwNSjeUCTvcejFexwSERERERER0dMUHH4SgL8bCw5X6QeHL/cwOBz9qSao7HPBoRgiG2FkVmUxiYm4959Nxx6HHXqeaYbgqocqh2NHcIF+jzbNffvy3EPV9+PT3ONwiiYoExOC6AdSF+Hor0L85QTMsbFUcBiEJcFNHYY8i/sSRmSUqY9XNzjUDLnGnVTM0d22awHik3Pl/QXNDQ67fq6mB4finEc3P0RWcBEqZK9HI2GgfZw6NCwtwHp7E4YzGxhSPWHFHc6qTERERERERER9fqjyK8aGKi/VH6ostjNK83uDHE0PDt/q+8GhOiC6LAKl5jpE+CfDxTUWLm7ZiCgQswjXI8g1pONQZe09+ZSfz+2OxJINCTibrJ7tWHuPQ3FvQFSWYMeGq5hpH471viL80t6DL1Q9s3JBLlxdrsNaBphNcvbhiOOxWOIQDqfjZXJIb57sRWep4FCEhKkyuJMTjWwIx5w1CTgnjvV+iTpMbDcMe+Zu9eQneZeT4bTiqpwcJbVZDBFOliGf2cFhl881UM6sHC/OZUQy1m8IwYedBYetr4PYn+FJTlqHaMepX8/L7nFw2a4rsvW+ky7+uTjrpu21qGz7cpN6EhfxGrskI6gUcmZrU4eLExERERERERE9ruBQ3p9wVQD+W9dydXg3YkHbbMqmTI7yn8o6z39txuQoT01wKIOtSByMqETJfe3N9h6iJKMIezaEtA1d1QsOxe/E4mxyvQzV0NyE1OAE7LnzsHWo8gT7OJzTPi5WqaxEkFu4podiEOa4qcMy2fvPVhNcBatQov2F+3WI9o3VhG+WCw7Vw3BTcflOk+bYlGO+U4AdKzS96Drcv/EiFroVILX0Yeu9DfOi0lsnVzE/OOzquWqCvog69fHdScX8ToND9czYdcpqqbtDjIbDqZ3e2VGzXdtoOQxZrxep6DkaUSO3L0PhjFy4mNJbkYiIiIiIiIjoCQgOO1itPP6Rer235wbgpRVtAeLflwVgyCcBett6e14Antf0TvzbVwEYvECzHcf+FBxSn2W9XYXm5jKTZ5smIiIiIiIiIqKuA8gRcwPwxsIADLZtG/I8YqHuzMuP59gYHFKXpqyIhatbNqI1E9JwlmMiIiIiIiIi6u/+ttxIb8MnwF9Xn2dwSI+gp6GcURmoy7gDJ/Y2JCIiIiIiIiKyrI8CMMQ+AH93agv+/uPrALxip5kshT0OiYiIiIiIiIiI6EnB4JCIiIiIiIiIiIgYHBIRERERERERERGDQyIiIiIiIiIiImJwSERERERERERERAwOiYiIiIiIiIiIiMEhERERERERERERMTgkIiIiIiIiIiIiBodERERERERERETE4JCIiIiIiIiIiIgYHBIRERERERERERGDQyIiIiIiIiIiImJwSERERERERERERAwOiYiIiIiIiIiIiMEhg0MiIiIiIiIiIiIGhwwOiYiIiIiIiIiIGBwyOCQiIiIiIiIiIiIGh0RERERERERERMTgkIiIiIiIiIiIiBgcEhEREREREREREYNDIiIiIiIiIiIiYnBIREREREREREREDA6JiIiIiIiIiIjoiQ4OAwICEBgYiAsXLiAoKIiIyGLE54rW+fPn8euvv8LLy4vnhoioC9988w3PAxEREVE/+M4lrpHFtbK4Zta9hjbld319fc3i4+ODs2fP4syZM6YHh2FhYYiIiMC1a9dw/fp1IiKLEZ8rgviMEZ81ly5dgr+/P88NEVEXfvzxR54HIiIion7wnUtcI4trZd18ztSM7vfffzfLxYsXERwcLINJk4PD+Ph4JCUlITk5GSkpKUREFiM+VwTxGZOQkICYmBhcuXKF54aIqAs7duzgeSAiIiLqB9+5xDWyuFYW18zafM7UjC4qKsoskZGRuHHjhgwmTQ4Os7OzkZubi7y8POTn5xMRWYz4XBHEZ8ydO3eQnp6O2NhYnhsioi7s37+f54GIiIioH3znEtfI4lpZXDNr8zlTM7q0tDSzpKamysBRhJQmB4clJSUoLy9HRUUFKisriYgsRnyuCCqVCqWlpSgoKJAfiDw3RETGHTlyhOeBiIiIqB985xLXyOJaWVwzi2tn7XW0Kb+rDRlNpe3Uk5mZaXpwKHZUV1eH+vp6NDQ0EBFZjPhcEe7fv4+amhqUlZXJDymeGyIi4zw9PXkeiIiIiPrBdy5xjSyulcU1s7h21l5Hm/K79+7dM1txcbEMEU0ODlksFqu36s8//5T++OMPPHjwQP6fFOJDisVisVjGy9vbmyeBxWKxWCwWqx985xLXyOJaWVwzi2tn7XW0KSXCxs58+OGHRh9ncMhisR57MThksVisvvsllsVisVgsFovfuXq/eiM4FKGhFoNDFov1xBaDQxaLxeq7X2JZLBaLxWKx+J2r98vSwaFuaGgsPGRwyGKxHnsxOGSxWKy++yWWxWKxWCwWi9+5er8sGRwaCg07Cw8ZHLJYrMdeDA5ZLBar736JZbFYLBaLxeJ3rt6v3rrHYVcYHLJYrMdeDA5ZLBar736JZbFYLBaLxeJ3rt4vBocsFqvfFoNDFovF6rtfYlksFovFYrH4nav3i8Ehi8Xqt8XgkMVisfrul1gWi8VisVgsfufq/WJwyGKx+m0xOGSxWKy++yWWxWKxWCwWi9+5er8YHLJYrH5bDA5ZLBar736JZbFYLBaLxeJ3rt4vBocsFqvfFoNDFovF6rtfYlksFovFYrH4nav3i8Ehi8Xqt8XgkMVisfrul1gWi8VisVgsfufq/WJwyGKx+m0xOGSxWKy++yWWxWKxWCwWi9+5er8YHLJYrH5bDA5ZLBar736JZbFYLBaLxeJ3rt4vBocsFqvfFoNDFovF6rtfYlksFovFYrH4nav3i8Ehi8Xqt8XgkMVisfrul1gWi8VisVgsfufq/WJwyGKx+m0xOGSxWKy++yWWxWKxWCwWi9+5er8YHLJYrH5bDA5ZLBar736JZbFYLBaLxeJ3rt4vBocsFqvfFoNDFovF6rtfYlksFovFYrH4nav3i8Ehi8Xqt8XgkMVisfrul1gWi8VisVgsfufq/WJwyGKx+m09scFhYyTm/cUKVlb6nnluNBafSkejdr2SUxhm9QymXxFLSuA2wArPzotse9zoPoIwWtnmxKBG846tKh5HHadj2HN/0RzXM3h2wEQsdruiHEHrgXU4lpIrR3EqvbFXT5vp+7hr3rnSO2/xWDNgANbEW+q5VCHy6FFoN9cYOQ9/sRqGoyWP6L2m9x5SjsZvJl6YeFQ5QyzWk/8llsVisVgsFovfuXq/GByyWKx+W096cPiX6W4IunIFV64EIcjvKFxnvgArq2cx70qVej290KcK8W5rsDPIxMSpO8Ghsr+Zz1rB6i/DMM/1qPrYgk5h5+LReNZKBHFBUB9Zu2Op8lP21RZO9UqZtY/uBoeNiF8zAM/N1D5PC7zUV/5/9u4vtLn9vve8rkZXM7oZjmAuRjwX03Vzal2cGF1EIIgLor5RzEBlBqa62vZNjRhqUKkzkJgM2oYpSjnUogOuoJiIVlAxaieKCB2JTKcrpY1VeuKKEueoPW4Q2xOiOqWR2AQ+s/5JXpK1bD/PY+0tPXq/yqKPpaX1+60lb/fXD7/f75t1gsLq5Gvr11UsPASJSzcXHDrPJhFVujrgDwRWfhALAADAmGv5CA4BbKxVDw5j+e5ssDXqqRALKZxpu68/Cn3epo23DQ4HqqTCCkWzqi/IlAbVtMIhQ8Xego9+KMGh9bzTkYB7fNevej44/Kwt+B0aNrOKxg5ljvgbgdUexAIAADDmWj6CQwAba+2CQ/VVigcFh7PLg51AKpJWqZhVPOoudY4YGZVMb67cXHA46pWVttqMZquLl6n2SjKs81OBa2iH6vUGXn99fbHaSfuXW0/6PvPRulLhqLKFQ6ViEavf9vLnjIptX1tDU+VcSsZkCXc4ptSh1deRey+L2hh1KzpMxRR2Xo8qkS2rO3Sfo92/SKakYjauyOR6+fqTS3R7pbjCRlH+3HDYLSuXeGgjninqodt2O2EZhwXrnKhzX5FoQrmy6cxYtJclR339TlSHj5cqD9sqWX2MTpaFJ3IqT75DewZk3mo7UVT5MKVY2D3HSBfUnk6JHKlfLygTj3p9tO7bebaLZq1OPtJWNhJRpj7kjwRWehALAADAmGv5CA4BbKzVDw5NDUcjjexj2JdZySoaiulwEvI8FxzaIVrKDrJGzmzFcjqiUCzvLoP1B4f9ijLRJ0JDy7CaUigUV2n+hEn/vMPr2OyMPquf9mzAdDMgiHJmC9pLoNMqO3sUjtQrpxUJW+05Kd1Q9Yzd95wqZl+DQc96FjnF/EHmfBuDitJhqw+Zktq9vnrtsnOPkUzdupobHNohWypfldntql3OWM/W+nw1KCxzQ9vooS/M7ZeVstqIWW00uz2rjYoO7esaeW+23qSdmHLVvvO5oVlUIhyZLgW2Z/c5QWHfC3D9waG9n6JhX8+677Z1/W5b5WzMul7Cey5ucGiHgXE79LS/5r67nDyS9cLTXkGGfZ/Fpnr9gfrdporOzFFvRuHCWavW807ZAezrLckGg1gAAACs55iL4BDAxlq34ij2Ec14s+xszwaHMeW7/iWo9nLihJxszAsOU+WKEzQ9FRra+qW41X5KM5PQBhWr/dn+Gc463rng8LllxF5wmCj7e9BT0ZjMuhyoXS6qYg4D3n/cRr9kKBTJ+mbe2ZP3isoX69bVvEAvUfEVdHGvNxMMznwnTSeITFR9s/0Oo04QO7Okt192vpO086DcdsLpui+AG8m0PxcvOc97fqmyPzgcNTPO8u+Sf4qjHSbGQoo4z9YLDu37HPmun7Oub3jX71VVKs3OpBw5vwfed7kwOPSuGyuox3JlrPAgFgAAgDHX8hEcbor7jvbfvNGb+WNrR/snl7q6f612rnV5tKtt7/q7F7c8e6ysVQ8Oo9mK2qYp03QLpFTLh0qE7SDKq3r7bHA4W5135jUvOJwGfvmn9/sbVBMLZhwO1XP6Zx3tshOsvXNwGI7q0JwNr9qZsEKJ6rTgSq9ZUTF/qGwmpXgs7PR7cXA4+aw/GPTzlirP7HE4WPCa/wFU5gK2gaoJ+7tozu1D2VU+ZvWrYFe/9pYqz22K6DzLcMYJ+54KDntFQ6Fobm6vQeveshGF4mUNJgGfUfAtn5689rCkejQwVS0VdJjLKp0wvGXPKTdADtgns1+OzwWSwOoNYgEAABhzLR/B4Sup1WqPQznrWBlBweHkSJ7IfO/wcKyr4y3fdQ3tnt/wXzpW1vrtcWjnPPaSYa9AxysEh044WU45M9sKT5Xy7RWf3uPQ6/PrBYdDNdMhhVJVZ2lxxV5mHTaUOSyoWK6qaTadZbxPB4fVJ4PD6JKDQwUFh5W3CQ4PXxAcFgODw2E773xv0VRW+WJJlXpbZtWdcUhwiHUfxAIAADDmWj6Cw1e0KDxcGb7gcK8xSQjHum0cT2cH7rz37MBbXe6419o66uie/8ax4ggOJ8VR+iolQk7YFJwd9t2qypGMqv0FXe6Vnes9GRw2n16qHPdPZ7SewWHUDuCsZ+CElhFlZ9cdK2vPypwPDr02JrP1/MGXvZ9gLJZVc/gOwaH1vDLOUuXJA32Lpcopf4A5VDPjBn99vWSp8twsz8lSZWcPw+eCQzt8DU+XRU+76Cw7TzwRHPqWKvNnAis8iAUAAGDMtXwEh6/IvrFkMrlGwaHtTrVdr797jWnYd9s508HuZPbgtnaPLqbLme8ae94sxWOdHe3IsJck/2FNe49mMm7r9HrsNn9d08l+UlveTMTtvWNdXj/0Y+E1a7fq5Azn9e3jmi6Odr3Pb2vvtKPb25Z1zW33c0ZSBxfXGvvuq3N+oN1tY/r+/klDt94J4+tTLzDd12XtVPvbbp+N5IEurse+x9PR2cGO1+4bbe0e6Ny8m3m0Tz0rrLZVDw4jmbLqzaaazlFXteQuVbaDICfQebXgUE44F7fDu2IveMnyoK5sLOQEl+nDospVq0+VsgrZhLv8NZJS0dmHcC449EK32GFV7e6CchuT4ijhhPL1rvo9rwhIOKVKX14YZy+nbqo/HGlovV/KRN09H4Pa8IqjxHIVmXZRELPi9D2SfSiO8lbB4eQzh+ZMcRT7+4hly24BFrOqw3hYodiht7fipDhKRGmnOElP7VLaelYRZb3NIkfmofVzVNlyU91BQHGU+KEqZu/huYTiKroVbp4JDr39Du2iM9bFR8OButW84k71Za+NgOIo1ZT9+9cWEw6xyoNYAAAAxlzLR3D40tzN6vQ3vvGNJ9/f3d11wiN/eLg6NxAUHN6rsTcbHN61jqZB2cyxe66bsS/k8x273/y/dbK/M529aO+duLt3oMtbaXxzod2FS6R3deaFdAuv6QsOFx3Go9eS3vXuZR5vT5dLbye3p+dsH5vOPT4Eh4uWbVv36TwaU8fbi87Z0fmN1+9nnhUIDt8nOHxUHCUSUyJbUnsSBr5icOgETgXD3cfwqYoYo57qxZxSRlRhr18RI6Vssa7ecDaEewjmhmrn416V5wX7Dk5mHObzSnt7F0YTOZW7D4VIepWc4lG3vXA0oWypqbodinkz9xa1MeqWlUvEvH5GlchVvBmV7xIcejP1jNlZeEPTbsN7FmGrjWxRzekNensppvPOOU7fYykdVn3hrPVdF1Pue05o6w8OnW61VczGvX0Jw4qlrOdi+gq0PLNU2Z6ZWUhPnkFEhtWXartk/d5ElbN/bxYFh8OmMpGIMk1qKmO1B7EAAACMuZaP4PCFNzoJBY+Pj598374H++fJsuWVEbRUuXOqHe/15Jkdl13rLOmFbCcd2XPrxrc15Qz7tS0dmWNfyLel3HlLV9c3unUueasLb6ly8nQy++9erUn4t3PqzsS7v9L5ZJbjfsNpY/E1xw/BYfLU3YPRuo+jrTfT15zr3TW8/r3Rrp1UWudMft5vOHegmzMvzN060tXYHxxu6aB26/T1trY/DTRr1sduL3e9zxzIvcy1Lrx+bx1fWZ95/llhta1scLhpvOAw3Vzx+W2DutKRZ/aCnLEooFyHryOjSCyvLtMNseKDWAAAAMZcy0dw+IKbnISCk8MfHi4KDSfs8HBlPFccZetILTv5ur14CBL3D3R0dKSjg5x2jYd9EKch3/aJE8I9WBAcjq+mQd9u7WGJ733LC+mMA5n+WYwz13wIDo1cxwsi71Tb84d3thud7/jDT7+x9Z3c6bYxCQVz6swEh7u6nHTr5kzJ6YzCe7X2vZmNB+Z0CfT9dUOXl5eqdW5f9Kyw2ggOV8S6BIfOrMy4YtmmXjYXbx2DQ3u/y6jS1QG/l1j5QSwAAABjruUjOHzmBv2hoGma2tramoaHT4WGKycoONxKau/oQpNt+55cwusFc28XHHaU85YM5zoPJ4/NyRLfPdkTIF8eHD4srX4IDn3tesHh/fWljna3FtzDU8HhuS84fNj7cfvEv3fig5c8K6w2gsMVsTbBodx9BxOJF846XL/gcFjPykhXRGyIdRjEAgAAMOZaPoLDJ25uUSh4fX09DQ8n/3vlQ0PnhoL2OJwznUW3peOrxUtt33bG4bE343DvVWYcviA4tO71wJv1lzw4V63VUuNs9y2Dw8UzDnV/q5ubG93YVVZe8Kyw2ggOAWB9B7EAAACMuZaP4DDgxp6aSegPD9ciNHRu6oXB4fhaJ5OCILtnXnXgsW4bJ8qddNziKW8THM7scehdz2rjYY/D2uweh68QHI6vT7xQ0A4AvZ5dvm1wOLvHobOM22qntu/2Z+vIavsFzwqrjeAQANZ3EAsAAMCYa/kIDhfc1EuWH9vhYTabXY/Q0LmxFwaHeqJS8Jsd2dv2vV1waFdVPg+oqrzzuKrya8w49BVLsWcDbm/523SXRr8kOLSfWVBV5Wm/n3lWWG0EhwCwvoNYAAAAxlzLR3A4xw4D12om4Uu9RXBou+uc62h3W4a3P+H23pHOvY0Q3zY4dJq/vtTxXnLmepdXD/149T0OzXMd7HgzHbf3dHx+7IWC7rLiFwWH7oPQWW5nGg5u7R5Mn8NLnhVW21oEh/2yEqGQQkZBvSVcftTOKBxKqWpX+xg133uvwcn16kHVQ0Y91Svtd99Db2QqF7GeR2j2CMdSOqz2HvYSHFSt5xZWpm2/Mni7vQbf8jmMmqlH/XGPiGKpQ1V7y9rhcKReIWb9bhTf8XfjU7V+788U+63541v60u/9rWo//tR36k/0m19ddO7k+K4aP3vqPOuaFz9Q52f+5v9VrT/9K/2q7/wv/M5f6mt/8y9i8wcGsQAAACA4XMngcO1mEgJ4Z+sQHPZLcYXCMUVCUR2arx9AzQaHPVUKRVX773+9xcHhSN38+wRdmgaHkUxZzXZb7XZTzXpFxayhkPWMcm2v4ZngcKhuuaBS84Vx5TsFh4byza663clhql0tKG2HnLG8zCVlh4N2SYVy+4VVnuf5g8Nv64tf/46++NVv6ZemYV9bH//TL7xTfYHgV7/jnus/Pv5rdX4ecJ4/SPz4B7r+1P1d6Pzht6ev//Lcednv/Rt/oBjEAgAAMOYiOFztqsoAPmyrHxz2VIjZM+UqKhghRbLNdwyIgs0Eh694vWUHh7F8d3b24Mh9VuFM2319Jjh82zbeJTiMq9x//N6waT+PqA67q1hX+SE4/OKf+mb5/fynupgEir/zn+XsujANBL+l3/jRL5645OLz7n7w1/qCF1B+zQ4jf/5jZZ2f/1wf//gX0/6Yf/wdt92v/0A3n/I3ikEsAAAAY67PG8EhgI216sHhqJtXLBRxZtH1ioZC4ZSq/klzw7pS4aiyhUOlYhFFImFF4xkV25OT+irHwzIOC8olos77kWhCubI5DSCfXqo8VLuUVTzqWw5c6c0EdoN2UZl4xHk/YlhtF1OBwaFzD9NlvIZKfbePzUJGRiS4jdmHEhAcWtcpxYOCQ/9SZTe8DCeKKh+mFAvb7VrPKF1Qe/pQZp/DqFd2Zg5Gs1X1F3XpJcGhb8rhoFlQxnCfWShiKJ2vqz9y7+3Qetaxwuy9Oc8terhg1uLsUuVRO2t9x2mVig/fmf2dlMygVDggOLT9+Af6ojfr8OKneu/gUJ9+oo++4rb10T98Kv18oF/3ljBnm5/odhIS/vxfZP5goM4//JQCUwxiAQAAGHMRHBIcAvj8rHZwOFI7F1UokpOTffWKMkIhxf3plB0cOuFTWmVnH72ReuW0IuG4Ss6Uvr4TmIVCMeWqfSeMGppFJcIRpb0EMjg4HKlbMKxrp1Somur1ezIrOasPD59Vr+Tsv2jkKjJ71vvVQ8WdUDB4xqE5mXHohGBDtQ+tn8MJ5e02el01i2lFQ2GlKwHLiqfBoanhaKSRfQz7Vt+y1udiOpzMMHwmOLRDtbgX2I36VWWj9oxOL3T0P4d+RZlocGjonj4JDn3J3mioQbeinGEvVX4I/YbtQ8VCUWWKTXX7ffXaJff6OXs2qf3MY87S5ocJij0VjUVBqfs8HwWHdviaKqo9GDmzMMvpyNz1/J4IDj8d6KPf8gWAc0uQv/Sx//hz/eof/8T9fNCMw7+dzDj8jr7mzDD0zS702vni7/6Vfrv5jzJ/+gv+ODGIBQAAgAgOCQ4BfK5WOjgcNpW19/LLeWGWFyDNFEnxgsPEzFQ3f9DkBofhdN23xHkk8zCqULzkBGGBwaHVfiYcVmpmiqP1WTvMNErqTQK4uVDK2ZPxpUuVB1WnvVRltg0nMI0FFIMJKI5iH9FMVdPs7rngMJLVwyrmh/tynqT3HFLlihMoPhUauqcHFUexPpvwF0cZqJJ4vOR82Ey734H9GJyAOKa891BH3YJiIUOFxQ9jQXD48NmHaycClqI/FRz+RL/hzRD89R98+nxxlN8bzAWHD3scfuErvvN+94d6KDj/bzKbfz1THGWy3+JH3/tXCqQwiAUAAGDMRXBIcAjg87PKweGwbgc+9jLlhxDIXerrW/bqLVWeLZoyUjsTVihR1XCyVLk4mzoNqgmFwhknOAsMDnt2YLU4DAuF7dBtqGrC+nd6NgQbmTlFwy8LDkfmoaIhQ3Pds24rFRw+esFhNFtR2zRlmm6BlGr5UImwHZJW3JDvueBwpkr1XKDpPYfJ/Rr5p6sxT4uj1E2nKIrZLCtnPfdw/FD1weO+Lw4ZJ4GfG/ZGD3199ULeRc/zcXCYkD+HXfTag6eCw08CZhy+dKny3PGV7+jL3/yhrn6+6EO/0N2PP1Gj/Xf66OPJZ/5CtZ/xN4pBLAAAAGOuzxvBIYCNtbrB4UDVVChwFlsk44V1C4PDoZpp67zUE8Fh5fng0J3pFlW23lO/3589Bvai2qHbx0fB4eGrBYfNJ4LDRUt3B1U3wHOu92xwWHw2OHTCybK9Z6OhwhPFTRbucThsKmfvM2j4KiqP2s4s0li+/fiZ9gfT52h/P2F7T8Ohu+dhYtHmiV6/lxYcftLTl7w9Di9fY4/D+QHEP/ydfv132/rVi3/Unf+Nnw+8vRC/pd/8EUuWGcQCAAAw5vq8ERwC2FgrGxz2y87egdFcXd1eT73J0W2rlHD3EHSWtXpLleNulRHXTIENb6lyqqqH3GioZiaiULz8zFLlutLh0FzoOFK3mFEmX7euN1mqPFu0o19OvP1S5eripcoLs7rPMDh093rsu8/cei8oOwwqjuLuZ2j19XCy3NzbczJV0UyNm3ZemYyvOIv9XMJR5Uru7M2g7R6XFhx++q9qXHzbq6r8w1epqjxv/OO/84qvfFu/8bf/Nm377gff917/c51/QnDIIBYAAIAx1+eN4BDAxlrV4NDdJzAufx44MWrnnAIYTpGUSXEUu7hIvat+r61yNuZUX644n50UR4koXWw6BU7aJbv4SERZL9l7qjiKU8gkZChXaVufdQuQ2EFYouRFbv2yUuGQYlm7OEpf3XrBWS4cHBx6y63DaZWapvqjoRsSTvrf76pZyjjFUVJBs+y84DCSKavebKrpHHVVS+5SZXtZ7ySUfJ3g0K4xUnSKvsSLi6s9B1dV9u7PXobspavDuh3khZXIV2V6xVHsis3h9Gy4W8+4VZdnX3/U8qsFh7GvfFtftAudfP3b+uXpEuM/19f+ySt3/GRxFPv4rj7+p7dY0mz1vXHxLd9S5m/P7IX4S78/NxMRDGIBAAAYc30uCA4BbKzVDA57KsTmZwnOvu8USbGLh0xmHObzSsfCXjGOnMrdSWrnBoeRdF65RNQNomIpHVYfArDg4NA2ULOYUXyyL180rmypPVvYwywrO712WgXr/OClynYIV7b66u7p5yyxHvVVL6RleG1EDKt/lW7wnoJB+wRGYkpkS2pPHtorBofTCtN2mNtbUNs4MDjUtMiNvaeiO2NxpH7V+r6MiLdfpNXvXPnRbMZh2w0YM83hE78rrxgczhUn+dLv/61qk9DQOfWZ4ihvuxeic81/U6f5V/ry1x8CxF/6alsf/cl/0c2n/H1iEAsAAACCQ4JDAJ+jla6q/BJecPgQcM3r+wIzAPiwBrEAAACMuZaP4BDAxiI4xCb7td//yydmEK7G8cnP+M1lEAsAAMCY6/NEcAhgYxEcAsD6DmIBAAAYcy0fwSGAjbX2wSEAbPAgFgAAgDHX8hEcAthYBIcAsL6DWAAAAMZcy0dwCGBjERwCwPoOYgEAABhzLR/BIYCNRXAIAOs7iAUAAGDMtXwEhwA2FsEhAKzvIBYAAIAx1/IRHALYWASHALC+g1gAAADGXMtHcAhgYxEcAsD6DmIBAAAYcy0fwSGAjUVwCADrO4gFAABgzLV8BIcANhbBIQCs7yAWAACAMdfyERwC2FgEhwCwvoNYAAAAxlzLR3AIYGMRHALA+g5iAQAAGHMtH8EhgI1FcAgA6zuIBQAAYMy1fASHADYWwSEArO8gFgAAgDHX8hEcAthYBIcAsL6DWAAAAMZcy0dwCGBjERwCwPoOYgEAABhzLR/BIYCNRXAIAOs7iAUAAGDMtXwEhwA2FsEhAKzvIBYAAIAx1/IRHALYWASHALC+g1gAAADGXMtHcAhgYxEcAsD6DmIBAAAYcy0fwSGAjUVwCADrO4gFAABgzLV8BIcvVKvV9ObNm4WH/R6A9UNwCADrO4gFAABgzLV8BIcv8FRoSHgIrC+CQwBY30EsAAAAY67lIzicY5qmksnks0Hhc4d9DftaAFYXwSEArO8gFgAAgDHX8hEcznmN0NAfHq6We13XTrSf3PL6uKWd/RNdXt9Pz7ir7Vqv76p2t/gK4+tTbS+4162dnE4btxpPL9RQbsvQ3sUt/6VjZREcAsD6DmIBAAAYcy0fweGc1woNJ8fqGOv63A4FDe0enavWaqlVO9fxrmG9tqPTKzfye2lwuHNaU8u+hnU0ahc62d9yrp2bfHB8rfOjA5117l/cw+faBl4bwSEArO8gFgAAgDHX8hEcznkqBPzoo49mlh/b/85ms+sRHI5NHW29kZFraSbKG1/pZNvq635Ddl730uBwvzUfCN7ofMe6TvLM+te7ITjEZ43gEADWdxALAADAmGv5CA7nvKT4ye3trXNMlEqlNQgOO8rZS4qPrx6WE7tv6ObyVCfnrcXB4W1DB1vWveye63r8VHA41vXJtvXZnDp2A/cN7dkzEy8fntP4pqHTXFJbk2XSuTN17HbsUNOYe3a5jnXFezX2rH/vXMi/4PnmPPnQzvjKCUS3Dk51vGvPetzW6bV7h/dXlzre23avt7Wjg3NzJjQd39Sc9435/mBjEBwCwPoOYgEAABhzLR/B4ZygmYa2+cIp/gIoQTMPV8edGjl7WXJSx7VrBS0gngkO702dJK372D7WZMVxcHB4r5Z9/a1jXS0KDu9abgC5c6SLRket2ply9kzHnTNdj8e6u7mWebbjLJs+M691c+tc5MXBobME+/hcNeva9paN4+tz7VrtG3unqrU6apzlnMByd7Ln4n3H/dzusS5bdn9OtWe4/bnhb9PGIDgEgPUdxAIAADDmWj6CwzmLwr9JOLiocMqkAIp9zmoHh/Y3dqXzfa8wirGj/eNzNa5mp9hNg8Pba13YoZ2Rs/798P4kONxr3Gk8HjvH/d2NOhduMLc9mdE4FxzenNnPbm9mGbJ7rS0dB+6v+PLgcHYJtvW5fTvwPNHV+OE182jLec2dOXlitW3owHyYf3nfOdH+/rFazDrcGASHAPDug1gODg4ODg4ODo7lHwSHaxAc2uylyUHLkSfLllc+OJyEg1cNnR/va8dbHrydu5C3utcL75I6cALGpE6vZmcWBlVVtmf87RzVdDPJ4WaCwzvVdu3ZfZearbFszzS80d1Y7x0czizBHps6MOzXTN174aZ93DX2nOtfOrMpO9MZkOcNUzf3/D+BBIcEhwAAAAAA+BEcztmE4ND3Fer68sgJAifBmxvePfR/9+JmZk/EaVXl844zy9I0r3R1faPbRyuX/cHhrS7swil7LT2Vz71acHjfctpe/H0ldeatRR7ftnR2sOvtufhG23vHurwmQdwkBIcAAAAAAAQjOJzzrkuVW63WSgeH4+tLnZycLyj+ca+Ws6z31Jl16IZ3hnKX1+ocb7t7Dl6PfdcJ2uNw/rKzMw6dAHD3Uk+tAl4UHLbeacZhx5lxuH3ckHl1pauZ43o6w9H3dHR7VdPJrrs0u0V2uDEIDgEAAAAACEZwOGdR+HdwcOC8t87FUdw9/XzFQaZudWkHZslzpyjITHg3vnKLoyRPp3sFvltwONnjcH9mj0PdXmhvO6mTwD0Ox+ocGNN9CSevmcdbTweH9tJoJ6i8eLw02uv2bS2n5M7RTEg4Ng9kvNnWyfWYvwwbguAQAAAAAIBgBIdzgpYj/8Ef/MH0HHtp8mR5sq1UKgV+bnXcqWUXB3mzpT2n+nBLrcalzg7cIHTPC/jmw7vx9Zl27JD05MpZZvyuwaHuGu6egk4VY1OdxoWO7FBy53QaCo47dnBnaO+sppZXtOWuse8umT65VKPV0MXJnnXOm2eCQ/vlUyWd/RvPVOuYMls1ndr7Nu64AaluLpyqy1v7p977l96Mw4NpBWl8+AgOAQAAAAAIRnA4503g3nhvtL+/r+9973vTc+3ZhvZrT31mtdzr6vJE+ztb0/5t7eR02njYx3DRrL+bc/u1bR137t89OLSvdNPQyX7SC/62tHtwLtM/A3F8o4vcttuvg47Xp1u1Tva8giyGsw/h+Uny2eDQuRfzQge7k3vd0k7uTB3fFMR76/2j3e1pcRd3j0NmG24SgkMAAAAAAIIRHM55KgR8lwPA6iI4BAAAAAAgGMHhnK2trVcLDSeFUwCsJoJDAAAAAACCERzOmS+A8j6h4aRwCoDVRHAIAAAAAEAwgkMAG4vgEAAAAACAYASHADYWwSEAAAAAAMEIDgFsLIJDAAAAAACCERwC2FgEhwAAAAAABCM4BLCxCA4BAAAAAAhGcAhgYxEcAgAAAAAQjOAQwMYiOAQAAAAAIBjBIYCNRXAIAAAAAEAwgkMAG4vgEAAAAACAYASHADYWwSEAAAAAAMEIDgFsLIJDAAAAAACCERwC2FgEhwAAAAAABCM4BLCxCA4BAAAAAAhGcAhgYxEcAgAAAAAQjOAQwMYiOAQAAAAAIBjBIYCNRXAIAAAAAEAwgkMAG4vgEAAAAACAYASHADYWwSEAAAAAAMEIDgFsLIJDAAAAAACCERwC2FgEhwAAAAAABCM4BLCxCA4BAAAAAAhGcAhgYxEcAgAAAAAQjOAQwMYiOAQAAAAAIBjBIYCNRXAIAO/mj/7ojzg4ODg4ODg4OD6Dg+CQ4BAAwSEArF1wCAAAgA9/zEVwCGBjERwCwPoOYgEAABhzLR/BIYCNRXAIAOs7iAUAAGDMtXwEhwA2FsEhAKzvIBYAAIAx1/IRHALYWASHALC+g1gAAADGXMtHcAhgYxEcAsD6DmIBAAAYcy0fwSGAjUVwCADrO4gFAABgzLV8BIcANhbBIQCs7yAWAACAMdfyERy+0O3trb7xjW9of39fb968cY7d3V2dnp467wFYPwSHALC+g1gAAADGXMtHcPgCtVptGhYGHXaouNru1dqz+po8081n3fT4Ro3TnHa2vOdlJLV3fCHz7n0vfKuLPUNbuYbu+HuCd0BwCADrO4gFAABgzLV8BIfP+NrXvvZsaDg57HNX1+cVHN7qct+wnk9SB2eXarRaalycaN8OEbeP1bl/v3vqnB3o6Pxa47f41F1t1+rPrmqkjRuP4BAA1ncQCwAAwJhr+QgOn2Ca5otDw8nRarVW9NftcwoOr0+VtJd1X86mdOObc+1Yr+9cfPbLvAkOMUFwCADrO4gFAABgzLV8BIcLXFxczOxl+DZHMplc0V+354LDezXs93cu5I/ybs6T1n3l1JlM6bu/1uXxvpKGe7/G9p6OazeBM/7GV8fass7LteanFt6qcXais8ZDa3edMx3sbE2XM++fNnTrXfju0g77dnR6mnPb3mtYPb7VxY7975bu3cZ0tGV9B8fnOtlPynC+k23tnXjXGZs6Mua+s1zH7fv9lS6Odp2+2q9v7R7o4uqev1IfOIJDAFjfQSwAAABjruUjOJy7IbvgybsEhv7j+vp6BX/dXiM4vNWlfc7Wvk5rHZlmR7WTXSecO7kKiA7vTSfMe7NtB3HBU/zuzRNtW89u++BcjU5HjfMDZ6bi9rHphIJucGhfJ6ezy5oazgaJi4NDuz8HFx1d31yrc3HgXDd5cqWx9T931mvm2Y4TQp6Z17pxEsU7Nezl1IZ9Xy11Wpc63rWvs6dL6t580AgOAWB9B7EAAACMuZaP4NDHbv99Q0NnttrWlg4ODpylzqvjNYLDe12bHZm3vpBwbOrAeKPkWfAC6PH1pQ6S3gzF5J6Ozmqz19Cdak7b5zN9u73Ycdq2Jyu6wWFSs80sDg63jkzfDMixro639MbITfdTfLRU2buH7RPfXom3DR3t7evUHPOX6gNGcAgA6zuIBQAAYMy1fASHHnt58muEhvOHfd3V8EpLlce3ap0daC+55S0Fdo+Z0C3g+tetC53kJsuBt7R3ZnqBX0c5e1bg2dxMzfGdbm9ufTMO5/clDAgOj69m+jI2D6y+JjW5/OM9Du9U27eXR+/q+KKlq1uWKG8KgkMAWN9BLAAAAGOu5SM49LzWbMNFx2rMPHyN4PBOjQN7Se+eTmumrm9udXvTeDxb7znjGzVO7NmEhrv34X1De88USnmv4NDZZ3FLx95y6oXFUcbXqp3ktLPlfW/JfZ02bsR8ww8bwSEArO8gFgAAgDHX8hEcepYVGtpHNptdgV+354PD1nPB4V1Nu9b97PkTNy+sCwoOb2unOrGLnMy/MXb3PjQOTI3tGYfPLHd+n+DwvpNzZhyeXj8RHPrPvzV1eZR0ZkUeXxEdfsgIDgFgfQexAAAAjLmWj+DQs8zg0N7z8PP3XHA4VseeTbh9ouvxw2umvT/gJDi8vdDOXHA4vjl3XgsMDp19Ch9Cu4fuNLT/ZhLyTfY4vJjp210jp+3tA98ehy8LDo2Dju599905sPc4PAjc49C+h73k7myBlxfMgsT6IzgEgPUdxAIAADDmWj6CQ88ylyrbx+fPCw63DnTZ6qjT8R+mbuxwrrHv9HX35FKNVkMXJ3vePoZecDi+1qld5MTY08lFTbXzY+0ZXjg6U5DE36ypE+czOzo6s6/bUqN2riM78LMrG3uB4r157FY/PrpQy+pT6/JYu/YS6OPOW+9xaM8U3D+tqWNXfT517yF5+jALcdyx9zw0tHdWU8uu9Dy5r+0DnTfsatEtXTgzDp+oFo0PAsEhAKzvIBYAAIAx1/IRHHqWVRzFPj766KMV+HXzgsOFfZwsyb1V62TPCfDs/Qe39451fjJbHGV8U9Px7pb7ua1dHV3U3NBtbonzbNPXqp3mtLttTNtL7h/r8mq2CMld60y5He8cY0e5s9b0mm+1VDl3ptNc0gs9t7V30tBMEefxjS5y227gedBxA8W7js4OdrzCLXb1532dNG7Z4/ADR3AIAOs7iAUAAGDMtXwEhz7LmnW4GsVRNkDAHodAEIJDAFjfQSwAAABjruUjOJy7odcOD0ulEr/pnxWCQ7wlgkMAWN9BLAAAAGOu5SM4XKBWq713gGhXUmam4WeM4BBvieAQANZ3EAsAAMCYa/kIDgFsLIJDAFjfQSwAAABjruUjOASwsQgOAWB9B7EAAACMuZaP4BDAxiI4BID1HcQCAAAw5lo+gkMAG4vgEADWdxALAADAmGv5CA4BbCyCQwBY30EsAAAAY67lIzgEsLEIDgFgfQexAAAAjLmWj+AQwMZa7eBwqHYpp5QRUSgUso6wYomsCvW+RpNTRk2lrPfSzdGCz4/UK8QUMorqvVc/Ruo3S8qlDEXDIbcvkZgS2YLqPV+7830Z9VSvtDVY5iN6mzaG9See1dMG1YyMTPX17mWm36/1Pb1F8+2MwqGUqkO3L8VEXHlzxB8ErN0gFgAAgDHX8hEcAthYqxscjtQtGAqFokrny6o2m2rWKypk7dciylS9COvJ4FAatEsqlNsavkc/zGJCYasNI1NQud5Uu91WvVJQNh62+pJQqfcQFFYKRVX7Xv/zyw7D3rKNdw0OB3VlYvZ9Lq/f7/89vWUP/MGh/WjaOcWMvLpkh1izQSwAAABjruUjOASwsVY2OBx1lY+FFD00NZvlDFRJhRSKl9R3zmu+8yy6F3XDzCtmXT9R7Gq0oI8FI6Rwprkg8PpQgkO3jUim/oqh3mfxbJ7pwVxwKOu3qRSPKFUZ8EcBazWIBQAAYMy1fASHADbWKgeHhVhI4XTVDQj9b/VNmV1vufJccDjqlZWOhBTN2p+bXwI7Ur9eUCYedWYQ2kuOI/GMiu2gSGyoZiaiUCyvoFWso35P/cnHfX3pFQ1vebV9GCr1F3y2nVUkklIhn5YRiSgSjshIF1T3nTvqVZVPG4pOrhVNKFt2Q8zFbVhtV/NKT5Z3Rwxlit5MPi84TBVLyiWi0+vlKj0FRonDprJW3zJN/zNy20gZ4Wkb6UJd/clF7HbCUWULh0rFrPuKhBV1nrMbyj3u9+OlysNu2epjzPueoopnimoP/NePKVeyvsvJfT66j4HaxawSMa+PIffZNicTVR8Fh1K/FFf4cwwzwSAWAAAAqznmIjgEsLFWeY/DQTXrBmbRhDKHRZXrbfXmMz5/cNivKBOdhIbOmzOB1KhXkBEKK1VsqtcfqN9tqpgKW9c/XBwMerMeI9n2o2BtNBo9HIv6Yi9xnsyqCwod7eDQOj+cKMp09trrq5qNPgSVI1OH1v1EMmW1e30N+l3V83EnbCv2tLCNYdN+ZhHnHrv9vsxqzr3nSn8aHIZCcR1W2up2TVVyMefncv+pPiZU9U3EG9Qz1msRpYt1dXs9q428EmH7uTdnAspQJK1yz30WvXJakXDcW+483++54LBfVsq6XixTUrPbU69d0WHcup7hPZfJ9aMZlc2B9emhs5zcvo9JQNsv28vL48rXu+oP+tY1ys7vxmR26KLgcNS1Z5dOni2wHoNYAAAAxlzLR3AIYGOtelXlYbeuYi6teDQ0naUW88/K88K6VLmi7Exo6Lw5FxxWVSrVZ2YwjpppJ0CqL5p0OGorG7Hay/uXKY9k5qK+GXP2kZabFc4Gh88tx3VDuZgK/hMGFSVCEWXb1jWGpiql8sNMu/n3H7UxUDUVUjjlL2JinVPOq1DtaeQFboY/GXOuF1amvTjddGYHRg99e//1VTLsMHV2efawbj/HhBtAeu0kZtLInorG5FnO99v/PVnvHUYfz/Lsl51+pu0vyrt+3D+Nc+4++vWSitXe7PdmX9db4r4oOJwu5a4P+cOAtRnEAgAAMOZaPoJDABtr1YNDv9Ggq2Y5r1Qk5ARLXV9YNwnxjLw5ExbNL4EdDUxVSwUd5rJKJyZLgOcCpOnHu+6Mv7kZh6N+V6ZpOkc9b7xfcBjOaGbLQW+WoTEJxUZ9tSslFQ5zyqQSMiJudenMouDQ668RNGVuslTZv+x4ErwGVKU2c5HZexi1lQmHlJjfC7BfVjwUUc5O+7ylyoczyd9I7UxYoURVwyeDw4GqCXuJenN2lqc3+zNWeAhAZ/ZqXPCaHTqXi3nlsmmlJsvTnwoOvaA4HjT9EljBQSwAAABjruUjOASwsVY1OBz1Sspl8mouCPRG7ZyioZjydnLoBV/RbEXtckrhkKHCdHrcbHA4bOdl2OemssoXS6rU2zKr6ccB0tRQ9XRYodhh4B6Hg0riPYPD9KPgMBfxZtMN6srF7JA0rVy+qHKlKdMsKf6eweFM4PZscBi1rl96mKVpnf9uweFQzbR1L6n3Dw71bHBoXd+phB1RInOoQqmiettUPRclOMQHN4gFAABgzLV8BIcANtbKzjjs2wGZHaA9LtwxrGec/eucSXkzYV1fpUTICaC6j/bOs4Or8EM15mkz9p6BiYDg0M7xDp2qyvGCuaCqsHXNw9h7L1XOd3132CvK8JYiu6FkamZ/QXcfvoDgcLJUOe2vgGzvJ2golq5q8NbB4dsuVY7PLFWeWUrszaSMFV5vqXJgcGiHr9H5Jebus5mEoE8uVW6yVBnrM4gFAABgzLV8BIcANtbqLlUequ2EcmHFs3mVq3XV61WVCxln1mAkW3f38XtUVbnoBo7FnhNQ+QMpZ/acXbCjO9BoOFC3mlc8HHKCw/kJdA8ms9esNhNZZ/Za1epHpXiotFdV2Mh5+yrO9cUJ3cJplZrmQ8Vh/5W94ighI6eK2VPfrLpFQOJu0RA3jIsqW+1pOBpa71eUM9wl2UFtuMVRosqU2uoN+tY9HjozFP3FUd4mOJwUR/E/n0F1UhzFLcDSrRec5ePT72RSvCSccIuT9NoqZ63vIZxSpa8F/X5cHMUuthLLukVhes5zcWd+OgWwn51x2FPBfk4JuxLzUMNBT/VCynvW3n6XTxRHWVQBG1jVQSwAAABjruUjOASwsVZ7j8OhzLId0Hn709kViGMJZYvNhyBuLqxzgr6C4VbY7Q1nA6lhW4V0zLtWREY6r2q7pEQoqlxAcZCJgVlRPpNQLOKGhaFwTPFMXuX2IKCqsh1ilpW2lxqHYnPLdr3TnVDO0GE+IyPs9imeLfqKoQxUz6e8fRhDisYzKtabTijmztxb1MZIvWpeqZjXz0hc2ZI5U+34bYJD+5llI+G5giF2G4czbWQK9YfvZDLjMJ+3+uaeE03kVO765kHO9Hv4aC/KoVlWLuF97+GoEtZzaQ5mr//UHofDbkkZIzL9rlKHFbXtZenhtFMIZ1Fw6ISZT8wQBVZxEAsAAMCYa/kIDgFsrHUqjvKhWTSbbwV76QSxkbS/UvMzFgV7K8+epRhRujrgFxNrNYgFAABgzLV8BIcANhbB4ednPYJDOUVaMtG4ii+direGweGwnVPMyKs74vcS6zWIBQAAYMy1fASHADYWweHnZ22CQ7n7GhqZ+stmHa5bcDjqqZiIK2+SGmL9BrEAAACMuZaP4BDAxiI4BID1HcQCAAAw5lo+gkMAG4vgEADWd2k/ADYAAHs+SURBVBALAADAmGv5CA4BbCyCQwBY30EsAAAAY67lIzgEsLHWIjjsl5UIhRQyCuot4fKjdkbhUErVof1D873355tcrz4MOqGneqWt99vacKh2KaeUEVHIfjahsGKJrAr1vqY9f/JeRuoVYtYzLb7jMx3JzE3anjvCMSVy5eUVGnnf7+jTn+g3vvJniv3W3PGV7+jL3/yhzJ/5zv3xD/Sl31pw7uT4uKebp86zrpn9k/+i20991/zZJ7r4w+/qi9M+fFtf+r3v6/KfPuUPEoNYAAAArOCYi+AQwMZah+CwX4o7YVQkFNXhEgpYzAaHPVUKRVX773+9xcHhSN38+wR23jUKhkLW80jny6o2m2rWKypk7dciylS9SPKZgG3QLqlQbmv4jn1wgsNoTlWzq27XO8y26sWsYla7kWzzHa/9XNPv+R35g8Ovfkdf/Pp39IWv+sK+r39f5s+9c32B4C9/3T3Xf3zp4h91u/C8b+sLvnDyi3/8icZe21/7+uT1b7ltT4PGts5//Av+KDGIBQAAwIqNuQgOAWys1Q8OeyrEQormKioYywmjZoLDV7ze0oLDUVd5+5kcmpqNBAeqpEIKxUvqO+c1l1jd2AsOY/kFMwut9w6jCoUzaq9ioeJpcPgt/eaPHoK68Sf/qI+8APGLf/ovbtA3DQT/Qq2fP3HNhed9KvNP/tybefhXMj+12vjRX+uXncDSF05++lOd/44XOn7zJ267YBALAACAlRlzERwC2FirHhyOunnFQhHl2kP1ioZC4ZSq/jW+w7pS4aiyhUOlYhFFImFF4xkV25OT+irHwzIOC8olos77kWhCubI5DSCfXqpsLwnOKh51l+GGYykdVnozgd2gXVQm7i7bjRhW28VUYHDo3MN0Wa+hUt/tY7OQkREJbmPuoThhajhddQNC/1t9U2bXW648dy+jXllpq41o1v7c/FLlkfr1gnUfUavvbj8iznMMXG/9ZHDYnQ8Oh12VcwnFwu61o4msSuZw8lBkON/xzFNVJRVWOLMgKJ65LzeIDSeKKh+mvOtb33e6oMCuBwSHttv/p+3NOvw7Xdsrh98rOJTG//S3+qLz+nfV+JkdHH7fm2HY1td+8K/TkHD8ySfq/GCgzj+N+KPEIBYAAAArNuYiOASwsVY7OBypnYsqFMm5AZQTMIUUL/cfTrGDQzvoiqRV7rlBUq+cViQcV8lJxOzg0A6TYspV3UBtaBaVCEeU9hLI4ODQWxIcSalQNdXr92RWck7INfmseiVn/0UjV5HZs96vHiruBG/BMw7NyYxDJyMaqn1o/RxOKG+30euqWUwrGgorXQneBXFQzVrnWO1EE8ocFlWut9Wbb89/L/2KMtFJaOj2wx8cjnoF677CShWb1n0O1O82VUyFresfavHq8IDgcDRQt563nm9IkUzdC/2s78AOAeOHqrR76vdNVfMJha179n9HkWz7ISwdVKznGlF2Ufq3IDi0w8h4vq7+yA5Pq8pG567n90RwaAd9X/AHgL4lyF+wlyZ/7D/a+o2/9VoInHH4nZkZh/bswo9/x78P4nf05d//vj7+3iez+yCCQSwAAABWZsxFcAhgY610cDhsKhsJKZKbBEA9FY25IilecJjwh4neebF8155H54RS4XTdN3PNW0rrLekNDA6t9jPhsFIzUxztwMz6rFFSbxJazYVnzp6ML12qPKg67aUqs204gWns6WIww25dxVx6OhvSPmLpguqTR+HdS6pccYK0h9DQbWM2OKyqVKrPzGAcNdNPLrkOLI4SiiieLavrfW5kHioainuzK2e/o+hh1/luB5WUwpHsdJZgv5xw9k9cGFouCg7tz44ef0f9RV1/Kjj88d95MwTbqtlFUp4pjvLl7/2b+8EFexz+su+8L/3pTx+WIP/8J7r85nd9extOCqn8hc4pkMIgFgAAACs35iI4BLCxVjk4HNbt4Gp2Cau71NdXJMVbqjxbNGWkdiasUKKq4WSpcnE2ghtUE9OltIHBYa/gFPlYXDnYDqqGqiasf6dnl9OOzJyi4ZcFh26oZmiue9ZtpZ4IHxdcddBVs5xXyl7uPAkyvXuZ9NnI+/dEfFxVeTQwVS0VdJjLKp0w3BmNgXs/ToqjZN3iKKapZiWvhNV+LFvxZlN6z7oSDwgYrSPlBbqDqtLhiDJN+6e+SvFJ8Luo6QXB4UzF7Wf2kXynGYcvXao8e/zSV9v6qPmJ7hZ/a7r50Y91+ad/rS9/Za5KMxjEAgAAYGXGXASHPm/evJkepVKJ31DgA7e6weFA1VQoMHCKTPa+WxgcDtVM26HUE8Fh5fngcNS1g8OosnV7eW1/9hgMNbKu7vTxUXB4+GrBYXPRSt1eSblMfvF77Zx1vZjydnLo3Us0W1G7bO+7aKgwnRo5GxwO23lnGXg0lVW+WFKl3pZZTT9RNGbxUuWRWXCv4yti0y/Hnb0pK73+guf4sJdkMxNxvteBsyQ9pkIvYL+/hcFh8VWCw7vvffdV9zic9QtdN/9SX/6dtn69Pft/2/2BZefn/F1iEAsAAIBVGnMRHPr4g8OtrS2nowA+XCsbHPbLzt6B0Vxd3V5PvcnRbauU8GbC2at7vaXKcf862JGpw2hIsYJvqXKqqofFwG5IFYqXn1mqXFc6HJoLHUfqFjPK5OvW9SZLlWf3AXSW2b7tUuXq4qXK3UXZWb/k7KMYLz0uoDKs2/fiLQueCdj67nOz2nWv6Q8O7aA1/FCNedqMPVMw8VbBoft84s5y5Wx9sodkTpHQfLjbUzmbVq7y0OKonVUkklYpbzxddXpZweHPBvrtr3tVlf/kp69QVfmxafGVr/ylLn/8i4dn+ade9eWvfl9XrFZmEAsAAICVGnMRHC6QzWZnQsR3OXZ3d/kNB1bcqgaHbmg1vy+eyw2ivCIpk+IodnGRelf9XlvlbMyd4eZ8dlIcJaK0U/ijp3bJLj5iB1tD73rBxVGcQiYhQ7lK2/psX2Yl6yxfTpS8SKpfVirsLs81e3116wWnMMhTy4zd6tBplZqm+qOhGxJO+t/vqlnKOMVRUuV+wNPxCqpY58SzeZWrddXrVZXtysz2bMxs3Q1JH1VVLrqBY9EOHP3BobcnoF1gpjvQaDhQt5pX3LmPhBbXaHmiqrJd9dneizKac2dFjnoq2t9BNGPdc8+5x+ph3HmueXNmuqJy3n6N8cB71ysGh3ZQ5xY6sfck/KXJEuOvfl+dn3nnPlkcxTp+5/sy32ZJ888/mYaT7lLm2b0Qv9z+V/4oMYgFAADAio25CA4XME3zvYPDZDK5Yr9u92rtPe6nkdzT8eWV3mpu5V1DuS1Dexe33qUb2rOutXN5+8Rnatq1ztlr3PFfPlbGagaHPRVi87MEZ993iqTYxUMmMw7zeaVjYSd0iiZyKnenC2Xdir3pvHKJqPN+OJbSYfVhtl5wcGgbqFnMKB7xlklH48qW2jNLk4dmWdnptdMqWOcHL1W2c7Sy1Ve30rMzC2/UV72QluG1ETGs/lUC9vd7aFVm+VBpI2r1PeS1nVC22HQqC7sNzd+LVyXaDmR7w9k9DodtFdIx71oRGdbzqrbtitHRmT0mfXcRHBza75p5J2CNHnrPamiqlE1Yz2Vyj9Zzag4eXdOtkBwUVi66r/cMDmeKk3xH2W/+UObPfOc+UxzlrfdCtP3sE11887v6kq8PX/j4L/Tb3/upmOPPIBYAAACrN+YiOAxg9+V9gsNWq7Viv25ecLh1oItGy+lfq3Gps4Ok09/92lsEeuNrnR8d6Kzj/b95BIdYUytdVfklvODwIRyb5waH0Zz5TBAHAOs3iAUAAGDMtXwEhwFqtdo7h4b2UufV4wWHybPZqpXja51uW6/vNfTOkR7BIdYUwSE2yf/3r+MnZg+uxvE/lv9fvigGsQAAAFihMRfB4RPs5cbvEhzaS51XT0BwaP10lrSDw5obHI5NHRhvtH167W6O77hTbdc6Z9c7Zz4oXBAc3l9f6mhny30m23s6Pj/VzkxwONZt61T7ScM9x0hq/6Sh2zF/GPDZITgEgPUdxAIAADDmWj6Cwye8y6zD3/zN31zRX7dJcHiq6/uxxmPruL9R53xfxpstHbS8QO81gkN7D0TDbutAZ7WGGpenym27z2cSHI6vT5W094I8ulCj01LtLKdt6+ft4yuRHeKzsvbBIQBs8CAWAACAMdfyERw+421nHd7e3q7or9vi4ihOIZcT82FT+lcIDm/Od6zr7ujC9yjGN2dOUDgJDm8v7HP21HhoWFdnOe0dXeqWvw34jBAcAsD6DmIBAAAYcy0fweEzSqXSi0ND+9zVNSmOcqSaeaWrK+swO85Mvy070Lu4cYPC9w4OrXb2rXN3zmeXRM/tcTi+OnFnGObOrP7c6I5phvgcEBwCwPoOYgEAABhzLR/B4TNeOuPwo48+cm5sdQXtcXivzoHhBIqmHd69d3B4p8tdt9jKzNNYUBzlrnOuo71t7xluaffoQia1U/AZIjgEgPUdxAIAADDmWj6CwydMZhva/Vp/QcHhZGnxnmp2aPdaMw5355YcP1VVeXyn69aZ9u19EfdYqozPDsEhAKzvIBYAAIAx1/IRHD5ha8utCtxqtT6AX7eg4PBOrZx/xuG1TrbfyDjo+GYMepWX32qPw33NZIS3576qyvfqHCWVzNV8IeFY1yfbemMcuP0APgMEhwCwvoNYAAAAxlzLR3D4hElw+LbHaprscXigy1ZHnU5HrVZN50c7Tp93ziYzDO1Qz77vpI4uGmo1LnW67y0nfouqyvasRWP/TK3rG91c1XSyO1tV+a6Rk2H9vHtyqZZpqlM7dWcc7nttAJ8BgkMAWN9BLAAAAGOu5SM4fIJpmm9dVXnlg8P5/m7v6uDcnA3r7k2d7fv3HjzX2VtUVXZeur7U0Y4XvG7t6ODsdG6p8r2uL4+1lzS8drbdPQ7v+cOAzw7BIQCs7yAWAACAMdfyERwC2FgEhwCwvoNYAAAAxlzLR3D4hMmMQ/uw//2+5wFYLQSHALC+g1gAAADGXMtHcPgE/zJl+9/vex6A1UJwCADrO4gFAABgzLV8BIdPIDgEPmwEhwCwvoNYAAAAxlzLR3D4BJYqAx82gkMAWN9BLAAAAGOu5SM4BLCxCA4BYH0HsQAAAIy5lo/gEMDGIjgEgPUdxAIAADDmWj6CQwAbi+AQANZ3EAsAAMCYa/kIDgFsLIJDAFjfQSwAAABjruUjOASwsQgOAWB9B7EAAACMuZaP4BDAxiI4BID1HcQCAAAw5lo+gkMAG4vgEADWdxALAADAmGv5CA4BbCyCQwBY30EsAAAAY67lIzgEsLEIDgFgfQexAAAAjLmWj+AQwMYiOASA9R3EAgAAMOZaPoJDABuL4BAA1ncQCwAAwJhr+QgOAWwsgkMAWN9BLAAAAGOu5SM4BLCxCA4BYH0HsQAAAIy5lo/gEMDGIjgEgPUdxAIAADDmWj6CQwAbi+AQANZ3EAsAAMCYa/kIDgFsLIJDAHj3QSwHBwcHBwcHB8fyD4JDgkMABIcAAAAAAKwcgkMAG4vgEAAAAACAYASHADYWwSEAAAAAAMEIDgFsLIJDAAAAAACCERwC2FgEhwAAAAAABCM4BLCxCA4BAAAAAAhGcAhgYxEcAgAAAAAQjOAQwMYiOAQAAAAAIBjBIYCNRXAIAAAAAEAwgkMAG4vgEAAAAACAYASHADYWwSEAAAAAAMEIDgFsLIJDAAAAAACCERwC2FgEhwAAAAAABCM4BLCxCA4BAAAAAAhGcPgWbm9vdXBwoGQy6Rz2v+3XAKwngkMAAAAAAIIRHL6QHRBubW3pzZs3M4f92vqFh/fqHBhW//dUu3vhR+5q2rXud69x914tj80jbb/Z0en1+B0+fK2T7TePvoOZwziQOX7/J3RX27Wut/vy54O1RHAIAAAAAEAwgsMX+uijjwLDKvu9tXLfUs5w+757+cLQ87WCw5tLHR2c6N0uc68bs6VWyz0a5/sy7Hs4a0xfa3WurbPeH8HhZiA4BAAAAAAgGMHhCy2abTg57GXL6+SusW/1O6ncrtX/nXO9KDp8peDwNY2vjrX1xtDBa0wxfHS7BIebgOAQAAAAAIBgBIcv9OEEh3eq7Vn93r3UdSsn401SZzcLvtzrSx3tePe8vafj81Pt+ILDu0s7WNvX5eWJ9rYN5zwjmdOZeac781wHk89u7ero8kaTaG9sHlhtbntLle/V2bf7cq7WxZF2t7zl37vHarwgzXwqOLztnOlgd/KdbWkndy7zbvY5dM5y2vHaNOx7vLye9vNRcHjb0MGW21d3lfVYt61T7ScNb4l0UvsnDd2O+aOyTggOAQAAAAAIRnD4Qh/MUuXbS2fmoLNE2VuyvH36EJg57hruUubkgc5qDTUuT5Xz9hacDQ7dc87tc2pn3jlb2jJ2dHReU6NxqdN9O1jb0bkXTi4MDu3gbufIuk5LjYtjJ6B8s1/Tc5P9goLD8dWJtq1r7BxdqNEx1Wmc62B79po3F3b/t5U7b6jTaejiKGn9bF2r5S50ngkO702dJO0A9Vgdbx30+PpUSTs0dtpoqXaWc9rcPr4S2eH6IDgEAAAAACAYweELfSjFUW4vdpwg78Lp8r1aOUNvtk905Uu7bs7957jGN2dOUDYbHO7o3HfOfSv3eN/E20snCNz1pu4tDA63DqaBnD2T7+pk+0VFTgKDw9srdTrXM8Gje9/7cnPBezXsWZc7Fw/LtMc3ujjYU+7cDVGnweHttS7sc42c9e/56+2p4e/3WU57R5eizvb6IDgEAAAAACAYweFbsANCe3ahvTTZPux/r1dF5Rud78wGZvfOcuUtHU+Tw3u19t29D2dWMM/tcegGh/7gbBLk+a/lNKB9e/afl0IuDA6Ts23dnvtDvmBPLVW+v7rUyf6OtrcMX9D70F83HN3S/umlOtd3j2YJusFhUgf7W87/Pr26n2vbndW4nTtTzbzRHdMM1xLBIQAAAAAAwQgON4k3azB5fq378Vhj+7itOcHe1pHpVSO+06VdNGWvMVudeI2Cw/H1mTPL0V5G3Lq60c3tra7O52cI3uvq8ti3R+GOcmedaaDqBocPM0t3L24eh4udcx3tbU/3Udy12jMpprJWCA4BAAAAAAhGcLgxxro+3Q7cp9FeGtzxlvE6Mw5355bcrk1wONbV8ZazH6G/G4v6+9DHG3UuDpwZhEmvUowbHBrKXV6rc7ztLMs+uw6YVji+03XrTPv2vpB7LFVeJwSHAAAAAAAEIzh8gevra33jG9/Q/v6+s0TZX03Zfs1+zz5npY2vdGIXCNk5U8s0ZfqOzsW+DDsk85K6Gy+4a8xsEni+oKryagaH5oExFxzeq3W09dBf+1nsJrV37p9FeKuLnYeZljPFUezz7eIoyVPvmla/j5JK5mq+kHCs6xfuzYjVQXAIAAAAAEAwgsMn2GGgHQwGztKbO+xzVzVAdEM2q4+Nu0Vv6njLrjrccAuK3DV0YLyRsX+m1vWNbq5qOtldVFV5NZcq3zXsfRvfKHlwrlrtUqe5Sdi7q0uvKEznyN278OiiJdPsqHHuVkXeOffPOPSCQ/mWP59cucGi18buyaUTxHZqp+6MwxdUg8bqIDgEAAAAACAYwWGAVqv14sBw/rA/u1ruZdpBmeGvXuw3Wca8Nw3K7q8vdbTjVZHe2tHB2ekaFUex7vc8p6Qd5FnvJ/dPVbvcd/49PXd8o8bJvpJbb6b3aO9xOAn95oND+xndnNuvbevYeYj3ur481t5kj0TrdWePw3v+qKwTgkMAAAAAAIIRHAbwL0l+28P+LIDVR3AIAAAAAEAwgsMA7xoaTg4Aq4/gEAAAAACAYASHAQgOgQ8fwSEAAAAAAMEIDgFsLIJDAAAAAACCERwC2FgEhwAAAAAABCM4BLCxCA4BAAAAAAhGcAhgYxEcAgAAAAAQjOAQwMYiOAQAAAAAIBjBIYCNRXAIAO/v73/yM44XHgAAAOuG4BDAxiI4BID3RyBIcAgAAD5cBIcANhbBIQC8PwJBgkMAAPDhIjgEsLEIDgHg/Tmh2D//J/3vh0n9d+GQQqGI3vzqV/X71wSFzwaHo67yMeuZRXNqD+ff7KscDymcbWvEr9kLDGVWKurysAAAeFUEhwA2FsEhALy/v//JnaqH/71C/82v6Lf+z7/Rn337D/Rr/z6k0H/4WH9GWPiy4DAUUvSwrdnskODwbYzaWUVCCVUHPAsAAF4TwSGAjUVwCADv7+9/9E0lwyFt/8cfPoRkVx/rTejf6de+fUdg+KIZhxGFQjEdzkw7JDh8GwSHAAAsB8EhgI1FcAgA76/77f9J/23of9D/YvpCsn/+C/3P/y6kN//r3xAYviA4jOXrKiZCCsXyMqcp4ePgcNSrKp+KKRxyl4THM0U1vaBsUEkpFE6r7s8eh01lIiElKoNnP69hValwTLliTnHrM6FIRvVHIVxfpXhY8XxRWSPshJ25tt27odqlrOJRd/ZkOJbSYaXn9Xukbt5qM55XIRtXNBJROBJT6rCini8RfbJvTv9MlXMpGRG3jVDYvkZVfesaIzOnaMh73ToS1SH/YQIA8EoIDgFsLIJDAHh/3/vDpEKhpP7jj/wh2X/Sb/37kP7r/T9Xl8Dw+eCw0NWoV1IiZIeIphe4zQWHg6oTAhrZstq9vvrdpoqpiEJG3t3Xb1hXOhxWyjflbtjMKBxOubPwnv18VSk7eItmVGq21Wyaehy/2cFhyA0My021m031RiN1C4ZCkZQKVVO9fk9mJScjFFHaadgNDu1Az8g35fRu0FTeCCmabbptPNc366x6xvo5llPF7GswcNuIWddMeaHosOnOOKz0mZ8JAMBrIjgEsLEIDgHg/X3v/7CDw1/R7/+zPyT7of63/xDSf/Wr/xfB4YuCQ3t23ki9Ytx6lobyzrTD2eCwVzScGYkzxT8GFSVCYWWadvw2VDMTUThVlRelqZ4OK5yuO+Hcs5/3gkOj2Hvi2/aCw8SkDbmzGucCSzssNHNRhYySepPg0C4A42vbDjUjXqj5/L0N1C4XVTH9UWZPRcMOWrvO82GpMgAAy0FwCGBjERwCwPv73h/9SvCMwz2Cw5cHh/bPPRXtYM4oqDv0B4dDNdMPS3Hnj3ip717ODs/CKVW8GYapcETZSaj43Oe94PD/Z+/uYttK8zvP8453y0sCc7GEbpo3E/EmAgeIAAIRAmJ0w9bNUDc9BBaItBm0QAxaFbXHbWxbCMxSYVNEw4iIXo+WRiCE3hE8XCvlZpRMTMEJzDTcKzbGpaEbUYdOBIOx0C5GHsTUeBr47XnOOZRIikcvtqpMid8PwLRNnpfnHNJS+Kv/8/zjpZMq9pzgMJiqHK27WFuwK//6HtufVLnlTlXuDBvt/TIK+4KarTbOdG3mGmqlvDLpWSUTMUVCfvt1gkMAAL5eBIcAhhbBIQB8uOqf/W/2Goff3+pe4/DfsMbh+YND+6mMIqbyb6Foh4jt4LAY88kXyapar6ve82gc7lzRbNCvaL5ur3noP6zyO8P+dnDoV6J8huBwttIxXhMcBpUs1o4dt95o2pWUTnCY7wkOFxT2hZSuNs5wbXXl4wH5/GElZheUyRVUqpS0QMUhAABfO4JDAEOL4BAAPtx/++V9/bbfr7H/63hX5W/TVfncwaG9JqBZM9AXUMjfMVV5IWQ3LCl1ztZtFJSKJ5U9nOPbDukyykT9XQHfqfu/Z3DorK3YO8XZGkcmoUS6qEZ7qnIg2TVVubOZy6ljs6sTA0p2dp1ulpUMWGMhOAQA4GtFcAhgaBEcAsCH+2+/2lNh9n+V738Z17//f/5aX/zZ/63v/Eu/fP/yh/qCsPA9gkPneVNNZ3cobjdHqecV8/sUiC2oWHUaiCzE/PbagV2Bmx2yOQ1M0p2LBp62//sGh2Y9Q7v5SVipfFm1el2VfNKevhzN1tTZHCWYcJqfVIsL9lhC7eOcNrZ6zm4cY5qr1JstNWtlZRNB55jutOlWZVZBU/mYK6lKeAgAwIUhOAQwtAgOAeDDOVOTn+n/TI3rX/hNYOXXv/jtf68fbxMUvndwaF6qpO0A8DA4tDfPazYWkt/n3OdQLK1CrXdPt4FJOKPasdOdsP97B4dGQ6VMQpGAuzZhMKJktux2ZXaDw1BS6WREAfN6IKz4QtE62hnHZhrH5FOKBN0wNRi1jl9S0TRgieSc47QqysScMDFyYoMXAABwHgSHAIYWwSEAfDgCwQ8IDoeCGxz2CTIBAMDgIzgEMLQIDgHgwxEIEhyejOAQAIDLjOAQwNAiOASAD0cgSHB4MoJDAAAuM4JDAEOL4BAAAAAAAG8EhwCGFsEhAAAAAADeCA4BDC2CQwAAAAAAvBEcAhhaBIcAcNGaKqdCCibLanEzzqCmhZBPPt/xhz8YUTJTtu7ogGnVVMyX1Tj7DqrMBuWL5FQ/0/YN5SI+BVMVa8/2vtkz7gsAAC4awSGAoUVwCAAXqanyQlR+n08BgsMzcoJDfzyvSrWqqvuolIvKpSLy+fyK5xsDNN73aXRy3uCwqWpuQdlSo2NfgkMAAD4WgkMAQ4vgEAAuSL2odDQgnz+ksJ/g8Oyc4LD//aopE/bJFytocKLDbyI47LcvwSEAAB8LwSGAoUVwCAAXo1lMKJrIqFyvKx8lODy7k4LDurImOIweBYetWkHpWMiu6vT5AopY97zUONo+F/ErPLugVDSoQMCvQDCqVK7SNd25UVpQIhxwpkQHwoqni6ofnryletF6PRJ0z2GNLZJQpuwcoZYJd0ynDitb7/tpUCWXUjTosysmQ/G0Monu4NC+jnhYwfaxrHEmc1X3HnhNVW6pnLL+HFpQtfNm1TIK+0JKV/nEAQDwdSA4BDC0CA4B4KI1CA7P5Sg47Az3Ws2aSpm4Aj6/Yvm6e2sLSgR8CidzKtfqqldLysQC8oXTbpBWtwM3ny+kVKFu3/9mJaOoP6B4wUkXm+VZhXxBJTIlVet11cpZJYImpCvZ52/VFhQ257Rer9Ub7jn88gVnVbHP0VKlXXHo8QY3CnH5zTlyZdVqVRUXYk4I2Q4OWxXNWucMJJzraNStbdIRO4jM1JzPkNcah61q2hp/d0hYWzhvBSQAADgPgkMAQ4vgEAAuGsHh+Xg3R/H5w0p0NEexq/1C6e5qu0ZeUZ9fiZLZygkO/fFiRwjZGby135tSV0jZLJmgLyaTLZpKwGy22DUtuOW+Xmw6xzt5qnJd2UhvENpQIdYRHDYrymdzKjd6ryOgZLmlk5ujWPcrbL02W3E+X62q0tb9i/QvfQQAABeA4BDA0CI4BICLRnB4Pu3mKDmVTVOUSlmFhbiCvqDi2WrHPWyqFPcIGH3t4MydqpzpjvQahah8/oTKzYpSAa9jHFXxtRoVFbILmk0lFY+2pxPHVDhLcNgqK+H3KdrT0MWEnv7ONQ5bdZXzWS3MppSIRRUOONOaE6cGh9ZVZiPyBVN2BWSrMqugP6qB6h8DAMAVQ3AIYGgRHALARSM4PJ9+axy2VMtG3Y7Kdfe5pop21V7WnmJc73k0Dqcq9wkO8+3gsKxkwKdQunxs/3q9YVcINstphX0+BWNJpTNZ5YtlVQpuReJFBYeNolKmyjIUVyqdUS5fUqWSVeSMwaHqObc6sWGveegfqOYxAABcPQSHfYyMjFzIY3Dsa3MmbI1pWut7/V7f0dK4NebxJetPB9peHNfI2Jwq+9/sKPc2VzQ3Naawff9GNT59Xatb+/wrxddmcIND76lr/mBEyUz3WlgDoVVTMV8+4ctbU5V8/nCKXaucVMB3QpVIq6SYdb3x0vtFD616yfrCW7+ga/uwsQDDheDwfX7eH79fdeXM2oL+mHLujzJ7Lb9AQqWuTicFpeJJZe0fru5U5a4gralSIuBOE3bXQIzlu35Wm7AwkVhQuWmqGv3HOhjbFX7Wz+vCeaYqJzqnQzdVtI/rBId2kOlOjT78MWuvXXjG4NCe+uxXMJFRMhhQvNjkYwQAwNeI4LCPqxccSgeVOY1aY5rulxzuLGncem1iecf+6976dc3Mr2rn4Jsb395ayh5feHJOS6trWl1Z1MyEuY9jmt8kPMTXY9CDQ388r0q1qqr7qJSLyqUibhXKINVXnPZF8igobH9RPD04rCm/kFGh/j7jcb4cH66B9cGXR3AInB3B4fv8vO97v+pZRc1/MIq7QWA9r5jf2ja2oGLVaY6yYDcuSblhYrs5SkBxu7lJTeWsmfYcUNIN15rFpN1wJZouqOI2R4kH2udoqWK6FgfiylWtvzUbqhbSivh9dnDY/nltr7XojytbqnR0Y+74BNjnCCqRLdtjKNljOFrjsFl0mqckCzU1W03VK3mlws5/HHN+zp4WHLaPYbpCJ7uDVAAAcOEIDofFwZbmR0c0Mr2u3uhwZ2lcIyMTWtn9SGPb37D+H8YRhafX1DWEg20tmfBw7Lq2DngLcfEGPTjs/8W7poz5gjVQU7O+huDwgxAcAh8PweHF/bxvqZaJ2EFgouj8sGxV85qNhZzQzOdXKJZW4bC9sfOzLxBPKxUNOlXqoZhmC7WuadD1QlrxcMBtwBJSNJU7arjSLGsh3j5+QGHrWIWyCTCDSpXdNRBrOcVDzrqIs5VW398JtfysYiG/fY5gbFbZ2VDHGocNFdMxd+1E6/VIQpliyW56Elow6zqeHhyqWbKnXTvbAACArxPB4dA40Nb8qDNduauAb0fLZpry5Kob2h1o+/qYRsJzqhwc7buzdl3T42G7kjI8Pq3FDTd+3FvXtPXc5OpRHHmwZaobRzXfkfbtrk56TpXeW5+2KwsXt4+ng/ubMwpbx5pzB7O7MmFtO6WNjms42Jo/dr79rVXNT4051Z+jE5pZrqi9y8H2osZGwpqpdJzvYFMpa9txt+rSeW5XG0spTYSdCtKxqXmt7ZBgXiWXMzisK2uCw+hRcGi6YKZjR1/0IomMSg11fJH0Kzy7YH+RDAT8CgSjSuUqXdOdG6UFJdpfJANhxdPFjkoS64tm0Xo9EnTPYY3NfNErO0ewq08Op1OH1dvcslVJHX5BNI9ooekGhxEtZI++XAYiSWUr7qh6w7qG9aUyHlbQ73xZDkY7tu0TWhyOJzjrfCFuVpRLxdwF+J0vy7HZwtE1nnT8nrHYX5rNF9ZkQXX+GQEYGPWOwO2Ka5jqy6OGLgAA4OtDcNjHVZyqbBxsX9eYma7cmbrtLNvTlCdX27V+x4PD3bVpe93ByflVbWyua2XGVCiOu0HfrlYnretNbbjBnLu/CdoWt+UcYl8bqc5wsmtUTqAZnlGlXya3t6pJM43aLYc8S3B4sL1s7xOeWtTaxqbWl5xp0JPuMc4WHO5pY2bUvs65lXVtbqxq3lQ/js6JmdNXx2UIDjujsVazplImbk8zi7UXzG8UlAj4FE7mVK45U9cysYB84bRbQdKeuhZSqlCXk6FlFPUHFHfL/5rlWYXMtLJMyV5030xdSwTNl09njapWbUFhc0576lvDPYffDuWcYpOWKu2KQ4/vcM2SW2HoJnVOcGgWx08qW6qqVikqbcYZcsfdFdY1VUwE5I8uqGRdY6NeUT4ZtKfnlfsWu9TsNbZMxaE7Oc/e3xdKKV+x9m/UVMmnrGv2WfexcfrxO8dSzzv3htAQwMAZguCwWVWpWFAmHpS/twoRAAB8LQgO+7iqwaGZ+rs4NqLwYchncsNxO4hbO6wE7AkODyqaG7X2mTnaxz7OuHlu037Onuo8Ou9OJ3YarYxNjmpkfFl2DOdOk+6q5jsalDZTznTk7X7B4f6GXdHYDiFPDw73tT7dO715X5W50cNznCU4NNuYQHVqtSPq3F2xA8mptT1+clwRl7E5is8fVqKjOYpd7dcO29oaeUXNIvP2wk/uYvnxYkcI2Tn1qz2tsNQVUjZLbhfNhlPRmM0Wu76gtdzXi2daLN9rqnJQqY5pbs453QX4u4LD9vS7/FEw2aypXK56NInpnarcUDmXUb6rQtGZ8h1Km2lxpxzfHUssl1eS0BDAwBqC4NB0VDaV4aGEcjWqDQEA+CYQHA6ZbRPyhVNu8LajZVNFN7XWse5hd3DohGwjSm3s6eDgwH24XZrtLsztSsZx2Znb7rImwpNa2TQNV9x1E3es50bGdL1vMnjBweFBRTPhEY3OV7R/ON4D7a1PWftNysyoPktw6JzH2n736BgH+1t28Do6tyUmLF8Ng98cJaeyaYpSKauwYBaXDyqerXZ8ITQdMD0CRusRsecMu1OVM92RXqMQlc+fULlZUSrgdYyjaWCtRkWF7IJmU0nFo2F36nHsjF02vYLDSNcah2ZK8+FzPdODG6VZhdtrekUTms0UVGmc8uW5a43DpmqlvDLpWSUTMUXc6dFOcHjK8d2xtO9LOM2aWgAAAACGA8HhsLE7KIeVMsmbHej1dlruCQ4rc/Y05b5Vle0qQ1OVGB7R5NquvZZheGJZu3ZVYtiuzrNDu9G5/lORO6Yqb17EVOX9DU15VoGOa2nnLMGhdQ8Wx7yrSac3xWzlq+FyrXHYUi0bdTsq193nmirGfHbloJliXO95NA6nKvcJDvPt4LBsLzAfSpeP7V+vN+yKu2Y5bYdqwVhS6UxW+WJZlYJbkfhBwWH0zMGhc7k1lQtZpZMxhU3FiT+mXL3f2XqDw7ry8YBTrTm7oEyuoFLFXYg/3RHEeh3fHUswmVc5F7OuO6wF1tUCAAAAMAQIDvu4slOVbU6VoZmuvLVsQrhUVwh3vOLwuh2ypVYr2tra6n5s7x6tYTgdto65ppWpsMaXdg6PYzolr8+Mdk2P7uVUA57SHGXrjM1RDjbtisOx+XVVese7ta29M05V3l12Kg5XNreOX/cOseFVcfmao9SVM2sLdgRmtYWQfIGESl2dTgpKxZPKVo+m+fq7ujA3VTJr/tkdLt01EGP5ri7NJixMJBZUbpqqRv+xjpb1rOn0Gf2GgsO6Cgtp93qOrtG8Hu3blrknOKxlFPYFlCw3Oy/Q6cjpTlU+8fg9Y8ma5ivWtZIdAgAAALjqCA77uNrBYTt8m9BUz3qHjp41DvedIG78sNFJe7O9rv321pzwb7RjSrIT6I1pYjR88rqAextKhUfs4LGrecrBjpYnu9crdEJGdwp0+4O4kbLDRWeNwz2tTZlGLCs9jVgOtNce8K5TaTnVWWm561Q2Hq5x6IaRcz2dUA7295imfIVcyq7K9ayiPjON2Q0C66azpLVtbEHFqtMcZcFuXJJyw8R2c5SA4nZzk5rKWTPtOaBk0W0dUkzaDVei6YIqbnMU0zXYOUdLlVRQvkBcuar1t2ZD1UJaEbv78FHwZ6+16I8rW6p0dGM+0qrM2lOtk7mSqo3zBocN5c01hWdVqJrmJnWVc6ZJjFdHzYYKJtyLWPekUlPTrIllTzEuqd5sqVkrK5sI2tOOnbXATjn+sa7KGUXMVPBMjSnLwOE/u7IyichhB/VgJHnYeR2n/7zvt1yEPxhRMlPWwN3FVk3FfFmNK/+RzqvQXkexWTxeBf9N3e5yomNNYQAAvnkEh8PIbfIxYqrujrUI7u2qfKCd5Ul726nrq9qoVLS5tqQZ0wDlesdaf9YxJ0acrsOHTUnc9QZ7g76+Q1pzOh+PTs1reXVNa6tLmpsI29OLr3eO0T1PeNp0TF7X2vKcc97OrspbTmOTsdSS1jYrqmysaXF6VCMT7WYt27o+ZgLJlJbXNrTuXs9IV1flXa2lwnbV4fzKhiqVTa2vWOcKj/a5Z7isLmVwaKYsZyJ2EJgoOl/bWtW8ZmMh64uFu0ZfLH30Zeew8UdaqagTlvlDMc0Wal3ToOuFtOLhgNuAJaRoKndUUdcsayHePn5AYetYhbIJMINKldthWk7xkLMu4mylb3KoTMw5vx24nXeqsh1KhJ1OzNYjEI4pXfAO7hqFpDPd2FRjtqx7lk8pEmx/GY8qmS2paAJRu+rylOMfmzbdUnUhbG0XUZbF+QH7Z5bpZO6LzKpQMcscVJRPhe3/uGAvtYpTf97743lVqlVV3UelXFQuFXGXpxikiO70CvMrwQ4K/UqUCQ4BACA4HEq7WjWVfGZdwWMZWG9waL/V2l6d19RY2KmmDI9r+vq6djpL79odm2c61//b12bqqInKafY2lzU3Nda9puLYvDb2use3szanyVHn9fB4SovLcxrrCA7tY1VWNGM6O7uh4kRqSZudVYpb1uvj7vWMTmhmaVnT4Z7Ozwc7Wr8+rfGwe66xKc2vbrO+4RUyuMHhRRqCLpsAPqpWdUGh3grgVkWpoO/Y+qroddJ/KHK6v/u6lpr46O82weE3fccJDgEAHxnBYR9XfaryZbG/5YR5I+FpLW8zQRgXj+AQAC4i2airWqm6DZnazxEcns1JwWFdWRMcRo+Cw1atoHTsqAI8ksio1Oj8ee9XeHbBrjAPBPwKBKNK5Spd050bpQUl2hXmgbDi6WLHEhMt1YvW65Ggew5rbJHE4bRze1mKw+nUYc+KUu9zdK6x2/lxMctZhNX+uJw0RhOkBQLWmNIxe2q8P/Z/6H839zDVfQ9NEzB/IKn+M+ZbqhXSioX9R+dYcM/RKineOWU8YR3XDQ5jmexh9b7P3Nt8Z+V7U+Vs8qi63VT3H77uBK7+aMau4Ler7xeqfX8vN8oZ6/4H3Op36zozsa7g0P4MxMOHywKYcSRz7rHspTn8ineljM499w9UAA0AuEwIDvsgOBwgextanFnU5h63AheP4BAAvqafPHnTed1rHVIcOQoOO6OeVrOmUiZurz8by9edJxsFJQI+hZM5lWvOmraZWEC+cNpdWqK9pm1IqULd/pnfrGQU9QcUdztTNcuzCvmCSmRKqrpr2iaC5ndEyT5/q7agsDmnvSZuwz2HWTd3Vs4qFC1V2hWHHm/tqecoO8tSHIWO1jFng4dNuE7fP2GHmn6ztm+5ZD0aTsOurpDQuhfRjiZZPRrFhDUGs/ZvUdVaTZVC2rpP1vZJ5xxOgyy/4u3OY25waJaomM2XVa2a6fgh++9OszJ3CYtATAuFir2ecCWfshtzOfferdS0jhmZLahcLqrUb0HgmrOOcTiVV8Ue16y9pq6vHRy2Kpq17kUg4XwGGvWqiumIHeI6oWtDBev96goJrbHH/WZ5E0oWAQDvh+AQwNAajuAQAL5ZzVJaYbsh0QA29hg43s1RfP6wEh3NUexqv1C6u6N7I29XmCXsgMsJDv3xYsd97wzlGspHTUhZ6npfmqW4XdFm8i1TzZbNFrurAd3XndzptKnKp5+jHX5F2slhq2xXp0btBO4MY7SDw6BmO2+EXWkXcO+D7EZiEc/g2qnkPHaOojlH1AkCPaYqd1XQtu+92aZZUsLvV6zQWdPnNhcLZ1Vr3zd/QiXPfxTuNj3vsR2Ktu9/s6J8Nqdyo/czEFDSHWv7OtpLYzYKsRMqLwEAOB3BIYChRXAIABfJNFpKKeTzKZQqMi3yTNrNUXIqm6YolbIKC3G7C308W+2aBluKewSMvnYI505V7pke3ihE7cCq3KwoFfA6xlHI1mpUVMguaDaVVDzanhIbU+EswWHrLOfoPobdLMt/FCqetr8THHY31zqstHNDUztk9RxjWQm/T9HepjP1nCK+gFKmtNIjOIx1pn5u46yYWfewtmB/7vsHwEmVW2dZG7KpQtTaPt4daJrGYUF/xxqHrbrK+awWZlNKxKIKB5zGaEdjLSkZ6Axi/cw6AAB8EIJDAEOL4BAALkpL1WzMnlobXaDS8Oz6rXHYUi0bdTsq193nmirGfHbloJm+W+95NA6nKvcJDvPt4LBsB0qhdPnY/vV6w37PmmWnWjQYSyqdySpfLKtScKv9zhQcnn4O57Iz1nnM9NqGs/5eu0ryDPu3g8NCT+5nV9r549bzVfueRrwWYGyV3js47GqO0hEcOg2CgkoWa8fH3Whad+2MwWGsX3A4exQcNopKmQrVUFypdEa5fEmViqmu7Bhru9IxklPNVGL6WTIAAPBhCA4BDC2CQwC4CCboitnTRxNdzSJwOq/mKHXlzNqC/pi7hp4pagvJF+iZ6tooKBVPKmsHQ+5U5a4mGJ3NSNw1EGP5rmpQExYmEgsqN01Vo/9wrcHDkdhTZaNnCw5PPcfRdlkTcqazigc6phifYX+v4FB2MGrWZ5xV2B89vG/9xug9VTnSPVW5dLbg0FlHsLcZkHWvMgkl0qb69izBYXuqcns9SXe0uejhVGU7BG5P+W7vVU0r1BUctp+LaGEhIn94QbQoAgB8CIJDAEOL4BAALkAtazdwCMSzKpZKKnU8yjVqD0+5ed5dletOowx/3A0C63nF/Na2pilI1WmOsmA3Lkm5YWK7OYpp+lGyG3SUs2bac0BJd55rs5h0qkLTBVXcxiPxQPscbqVaIK5c1fpbs6FqIa2I32cHh+0CPXsasD+ubKmifv09Tj7HEScEM12BzVTes+/vGRy2x+/zndpBuFFoN0dxGrBUiwuKBcz74E6xd6sSQ6aRSbV5enDYbhrjCyuVL1v3vq5KPmlPX45m7QnZZwgOZVc9mvc4lDTNUZxxRf1HzVGccDOoZKGmZqupeiWvVNiZEt01NvO5CndOYwcA4P0RHAIYWgSHAPDh7CDJY303r662OLx73sGhqeTMROwgMFF0YrBWNa/ZWMjuKmymModiaRUO2xs7wWEgnlYq6gZooZhmC7WuadD1QlrxcMBdfy+kaCp31IyjWdZCvH38gMLWsQplE2AGlXLTvVYtp3jIWXNwttLv3T3lHG125+J+n5GT9/cODo+q7+KndhC27m1hVrGQ3zlHIKLEQrEjCG2qnI4oYIeQeTVODQ7tC1Ipk1CkvUZjMKJktj1t/4zBoTlzJafk4fsX14J1zKM1DhsqpmPuupPWvYsklCmW7JAwtFDtuo/1bNgOfL0rLwEAOBuCQwBDi+AQAHB1OMHhMDfCaJYSCgSSJ3QuHhamm3bo1MpLAADOguAQwNAiOAQAXB3DGxy2amWVClklQ6axSnWoq1wb5ZKKuVlF/EElSVABABeA4BDA0CI4BABcHcMbHDpr/5lu0BlVhjora6/zGFA0XaK7OQDgQhAcAhhaBIcAAAAAAHgjOAQwtAgOAQAAAADwRnAIYGgRHAIAAAAA4I3gEMDQIjgEgA/XKifs9eV8/R7x0lA3qjhdTQuh/vfOH4womSkP3jp1rZqK+fJgdOttlRSz7lW81O9TZjoLB+WLZFXngwYAwHsjOAQwtAgOAeACNGsql8sdj5KKmaj8vqCSxQb350ROcOiP51WpVlV1H5VyUblURD6fX/H8IN3DlqrpkHzhjDXyQRgOwSEAAF83gkMAQ4vgEAC+Bs2yUkGfQrNlurqeygkOA8lyn8rMmjJhn3yxggYnOiQ4BABg2BAcAhhaBIcAcNHcYCmQVJHU8AxOCg7ryprgMHoUHLZqBaVjIXdqeECRREalxtH2uYhf4dkFpaJBBQJ+BYJRpXKVrgC3UVpQIhxwpkQHwoqni6q3jt6/etF6PRI8nH4eiCSUKTtHqGXCHdOpw8rWu0fcLJlp6zEVDgdc0WzQXEP+6Bqqswr6o3IKKZsqZ5OKBN3p2aGYZvO1rntx4jX3BIetWk7xgE/BZMG6G53BYUvllPXn0IKqnQevZRT2hZSuMqEeAAAvBIcAhhbBIQBcsHpeUZ9P0Vyde3EmR8FhZ7jXatZUysQV8PkVy7v3slFQIuBTOJlTuVZXvVpSJhaQL5x2wzATHJpwLaRUoW6Hb81KRlF/QHE3yWuWZxXyBZXIlFSt11UrZ5UI+hRMlezzt2oLCptzWq/X6g33HH75grOq2OdoqdKuOOyXtTWLivv9SpTcq7GDOWtM/oQOn1oIyR/J2WFedSEsXyCmhULFOl9NlXzK2v5ovKdec2dwaH327GuxQ0N3rB0Vh61q2rr27pDQjGVgqicBABhQBIcAhhbBIQBcpKNqwzLVhmfk3RzF5w8r0dEcxa72C6W7K+YaJqhtB3VOcOiPFztCyM7wrKF81ISUpa6QslmKH1YJmuq+bLbYNbW35b7uVJCeNlXZOkfMr2CqYgeXjXxUgXBCEX9Qs3byaKoo/QqbUsVmSQm/X7FCo+szVDGVgeGsffxTr9kNDmO5vJJdoWHvtbv3OmxtM+uMTa2q0ta9j/SWTQIAgC4EhwCGFsEhAFwgd1rqYTCDM2g3R8mpbJqiVMoqLMQV9AUVz1Y77mNTpbhHwOhrh1/uVOVMd6TXKETtir9ys6JUwOsYR5V4rUZFheyCZlNJxaNhayzm9ZgKZwoOrVHkIvLbU4KbKsYDimTKh+NqNXKK+sOyh1hbUMirG7c/qXLrDNfsBoft58Lpzs/e8TUO69mIfMGUXT3ZqnROmQYAAF4IDgEMLYJDALg4zlTQoGZZL+4c+q1x2FItG3U7Ktfd55oqxnx2CGamGNd7Ho3Dqcp9gsN8OzgsKxnwKZQuH9u/Xm/YVYjNctqeWhyMJZXOZJUvllUpuBWJZwwOVc8q4o8oWy0pGTSBZFO1hbD80byqhZj8bgVhq7pgf16Sxdrx8TSa1pnOcM1ucBhM5lXOWcf2hbVw+Pnr0xylnlPUF1Cy3LDXPPQPVOMZAAAGE8EhgKFFcAgAF8eu5jLTlMkNz8GrOUpdObO2oD+m9nKR9np8gaO1Am2NglLxpLJVZxqwPVW5KwxrqpQIyGevKeiugRjLd4VlJixMJBZUbpoKP/+xLsT2++qLnj04tKcE+xWZTSoUdD4PrUrKru5LRQMKtStS7fUQfT1Bp3X8TEKJdNEe46nX3NUcpa5s1GePrdpej/FYV+WGCmYqdSKjZDCgOB18AAA4FcEhgKFFcAgAF6WlUsLf1T0XZ3FCV+V61m4044+7QWA9r5jf2ja2oGLVaRSyYDcuSbnBWrs5SkBxu7lJTeWsmfYcUNINyJrFpN1wJZouqOI2RzFdiJ1zuOsLBuLKVa2/NRuqFtKK+H12cNie0muvO+iPK1uqdHRj7v4s2OGiGXvMXW/RXs/QHCeoVKWjItDeLqxUvmyNt65KPmlPX45m3TDxtGs+1lU5o4iZxmymRfcNDs09iDsdmgPJ7kASAAD0RXAIYGgRHALARXGr3RJl1jc8lxOCQzNlOROxg8BE0UntWtW8ZmMhJ/jy+RWKpVU4bG/svAeBeFqpaNAJ7kIxzRZqXdOg64W04uGAu5ZgSNFU7qj5SLOshXj7+AGFrWMVyibADCpVbodzOcVDzrqIs5X+77a9fqAJ8A67a5tKP1+fitSGSpmEIu21F4MRJbM9HaZPuuae4FDtTs2+iLK1Zt/g0ISYZsp2u4ELAAA4GcEhgKFFcAgAuDqc4JBA7BQNU8V41AwGAACcjOAQwNAiOAQAXB0EhydqVlUqFpSJB+XvrUIEAACeCA4BDC2CQwDA1UFwePLtySlq1lkMJZSrcYcAADgrgkMAQ4vgEAAAAAAAbwSHAIYWwSEAAAAAAN4IDgEMLYJDAAAAAAC8ERwCGFoEhwAAAAAAeCM4BDC0CA4BAAAAAPBGcAhgaBEcAgAAAADgjeDwHH72s59pcXFR3/nOd/Sv/tW/sh/mz+Y58xqAy4XgEAAAAAAAbwSHZ/CLX/xC/+7f/bvDsNDrYbYx2wK4HAgOAQAAAADwRnB4ChME/s7v/I4dDJpB3rlzpyscNH82z5nXzDZm28EMD/e1PjWikZHuR3h8SvMrW9arH9lBRXPhEY3ObenAa+zjS9qx/76rlamwRlPr2uPfMD4AwSEAAAAAAN4IDk/QGRrevHnTHvhJN8NsM7jhoRu+jc5oZX1DGxvWY31VSzPjdoA4sbTdJ7D7Bp0rONzX5tKM5pbPMeadZY1b1zm9uc+/ehwiOAQAAAAAwBvB4Ql+7/d+7zA0PKt2eGimLQ+W3vCtbU9r0yZQnFPlYyaH5woO3wPBIfogOAQAAAAAwBvBoQfT7KQ9PblfpaF5zUxR7ndT2tOWB6thinf4trM8oZGRSa3tSQfbixobCWumM0U82FRqZETjy+6eO0saHxnV3Pq6FqfHFTbTnsPjSi13Tnk+0O7GoqbHw860aOv16evr2vUKJ887VXnC+vvUxtH59re0MjepUXcK9ujkjFa29u19N3qnaI/Oa+ugvduK5qbG3GsY09T8qrY73u691UlrnwktLqY0HjbnvKf/NxU+FrTub6Ss7cZ0feuAnyqXCMEhAAAAAADeCA49tCsH+4WDxkmvmefPW6n49fMKDvdVmRvVSDglU4x39uBwxA7KphdXtb6+pqXUqBOcbTv7meOYbcbnVrS+uaG1pZR13BGNzW/1n17cDg5nNrV3cKCDrseu1k4MDve0Ph22rmFai2sb2txY1fykGd+UVnetQ+/uaHtj3j7/1OqWdnb27DEcbC9pwoSM04ta29jUxup1TZlwcHJZO+4gneDQem4spaXVNa1X9rS/OaOwCU4P79G+Nk2YOHZd2+SGlwrBIQAAAAAA3ggOPXznO9+xwz+vtQpPCg7NPuZ1c4zB4QaHY4va2ncCuf29HVVWZtxAr2KHcOcJDieWOyLIvTVNmedWdu2/7q5M2MHd+mH13oG2llKamlvVbr/hucFhb/OWrodXcGjtO2PtO3a9Y83D3XXNTU1rsX0dx6Yqm7BxxA77OosE9yvzGrWuP7XhRpJ2cDiupc60dd8a66ipjqw459vfdM6/+JHXicS5ERwCAAAAAOCN4NCDCf7M46TXvYLDs+z/zevfVdlujDK/dlhhd57gMLXZvY0Jz8YXt52/bl13AsnUktYqO9o7LVFzg8Pw9Io2KxVVuh4bWpo4ueLQXqcxPKn5lQ1t7fZZx7A3OOwXNjoD17wJBd3KSCc4dKZxd2zkVGm6U54PKnMaHRnTIuWGlw7BIQAAAAAA3ggOO3zxxReHgV/vw7zWqV1ReFJF4kAGh6NzWnMDuY3lKXt68XxHyd1FBIftZ/c2l+31A52AclSTcyuq7HkM70PXODzY1tr1lCZG29WJ01pc3zk6Vm9wuL/eVSF5ZEfL49b+qc0TgkOTL5rKxFHr3u1pa37UHts2P08uHYJDAAAAAAC8ERz26Bce9oaGhml88u1vf9t+PZvNdjVQGeipyp1rHB5sa9GEZJMrh9OHLzI4PHptT9sbS5q2m4ucPFX5vYPDzq13K1qdG7fDysNQ1KvicNGj4nBu68Tg0Ny762NmuxXNW/87vrTDT5NLiOAQAAAAAABvBId9dIaH/ULDTma6shl8Z0h4mZqj7K2nFDZBobumn3aX7YYhU+sdSdnuqibPFRzua3NuXOOptY6Q8EDb18c0Ep7p6kZ89PL7B4cHO8uaGp/s7mjcW1Hotcbh+GJXQxNninXvGod9gkNzPYvjbjVlzxqIuDQIDgEAAAAA8EZw6MEEhqeFhm0vX748nLJsLu53fud37ODQVCUODo+uygc7Whp3nt92Wg3blXSmi/Dy2obW15Y0M+5M/z1PxaETSI5o8vqqNioVba4tOhWH02vqO1v5QyoO25WTYzNaXt+010RcsSsOx47CRLd5y2hqWeub224jGLercmrJes4do5nqPLF8GCZ6B4dH92FkfFnkhpcTwSEAAAAAAN4IDi+YqTI0oeHv/d7vDdjIPIJD88rmjB3yTbvp2P7WimbGw0413eiEZpaW7dDvfFOV97W9Oq+p9nFGxpw1Dvc9hvehU5X3NrU0M6FRt+FLeHxa19d3O461r62lKef18aNOyvsV61onR50xhsc0Nb+qrY4xnhgcHmzZ3ZW7ukvjUiE4BAAAAADAG8HhGZgw8Pd///e71jHsdzMWFxft0NBcjFfTFFwdToOUCa3sci8uK4JDAAAAAAC8ERyewkxDNoMzgaCZgvwf/+N/7AoFzZ/Nc+3pyYSGQ2CvovXVJaXGRhROrWuPO3JpERwCAAAAAOCN4PAMTBBoph73dlvufZhtCA2vvv1NZ/3GselFbZIaXmoEhwAAAAAAeCM4PAfT7MRMWzYdlNthofmzeW6wGqEAOAuCQwAAAAAAvBEcAhhaBIcAAAAAAHgjOAQwtAgOAQAAAADwRnAIYGgRHAIAAAAA4I3gEMDQIjgEAAAAAMAbwSGAoUVwCAAAAACAN4JDAEOL4BAAAAAAAG8EhwCGFsEhAAAAAADeCA4BDC2CQwAAAAAAvBEcAhhaBIcAAAAAAHgjOAQwtAgOAQAAAADwRnAIYGgRHAIAAAAA4I3gEMDQIjgEAAAAAMAbwSGAoUVwCAAAAACAN4JDAEOL4BAAAAAAAG8EhwCGFsEhAAAAAADeCA4BDC2CQwAAAAAAvBEcAhhaBIcAAAAAAHgjOAQwtAgOAQAAAADwRnAIYGgRHAIAAAAA4I3gEMDQIjgEAAAAAMAbwSGAoUVwCAAAAACAN4JDAEOL4BAAAAAAAG8EhwCGFsEhAAAAAADeCA4BDC2CQwAAAAAAvBEcAhhaBIcAAAAAAHgjOAQwtAgOAQAAAADwRnAIYGgRHAIAAAAA4I3gEMDQIjgEAAAAAMDbRQSH9+7dO/OD4BDAwCA4BAAAAADA20UFh//lv/yXUx8EhwAGCsEhAAAAAADeCA4BDC2CQwAAAAAAvBEc9qhUKhofH9fIyEjfx/z8PJ8a4IogOAQAAAAAwBvBYY+TQsMrER4e7Gh9MaWJsbBzPeFxTV9f0/b+BRx7b02T1jGn1vf4l4VLgeAQAAAAAABvBIc9TgsNz/owAaSpXhwoB9tamjTjG9fM0qrWN9a1tjynCTPmyWVtH3zg8QkOcckQHAIAAAAA4I3gsMdFBYft8HCQ7CxP2KHh9a3u8sL9zTmNWuOd/tDAj+AQlwzBIQAAAAAA3ggOe1xkcGgeg2NHS+PWmKbWdCzWO9jSvPXa2FxFh0WHe5tanpm0A8WRkbDGp69rfae7JHF/e1VzE6POtY5NaX550a5e7AoO9yrWcSbc44xqcm71YqZFAxeA4BAAAAAAAG8Ehz2ubHC4v6Fpazxji9s6dUbyfkXzYyYMnNHy+qY211c0P2HWQ0xpbdfdZm9dqbD13PiMltbWtb66qNSYc82HwaF1nOsmrBxLWdtsaGNtUVPWPuHUuqhJxCAgOAQAAAAAwBvBYY8rGxy604gnVnZP3XR3xUxpntDyTuf+TlA4Or9lB4/OtOcJdR7uYGdJ4x3B4e7qpHucg47DTB8/NvCREBwCAAAAAOCN4LAHweGe1qessU+sqHvLfW2mwhoZX9KO9eeNabPNsnb6nMMJDved41jbbx8c6KD92FmxpzNPbzBfGR8fwSEAAAAAAN4IDntc9anK46dOVd7VipmWPLWh7mjvQFvzoxoZndfWwZ5WTXfmqfXubbqCw12tTnjfl8k1Jivj4yM4BAAAAADAG8Fhj+FsjrKtxckxTVw305D3z15xOLnavU1XcOhWLo4vamNrS1s9jx0KDjEACA4BAAAAAPBGcNjj6gaH7XUJx7W43dMduTJvdz2ebq9NaK9xONm1fqGpWJwxaxy6nZedY02rs4Gydpe7uirvLI9rJNyzjTnU3gH/8jAQCA4BAAAAAPBGcNjjKgeHOtjSkt0deVJzy2va2FjX2vKcJk135MllHfYw2d90uiqPz2hlfVOVjVVdnwzbIeBqR1dlEySGp5e0sb2jna01a5versqbmht1jmO6M1c2N7R6fUph6zjMVMYgIDgEAAAAAMAbwWGPKx0c2u/atlbnpzUedsc4OqHp62va7p06vLeppdSEXYk4MhLW+PR1re30VCpur2puYvTwODNLix1TlV27Gx3HGdHY5JxWKqSGGAwDGxy2qkqHfPL5eh6BsGKzeVWbH3NwDeUiPgVTFbXOukc5r0LN3bpVUsy6lnipxQcQAAAAAAYcwWGPKx8cAjg06MGhP5ZVqVxWuVxSqVRUPpNU2ASI4bQqHy13a6qaW1C21Djj5kXFfH4lyu3gsKb8QkaFOp8/4HJ7q2e3P9Enn3Q8rt3U56uP9Pz1uwEZ42s9/vyabtyp6s1AHGdQzvM1eVPVnWvX9Pnj1xf/aXuesz5jt/ToFf/yAAD4phEc9hgdHb2w0HB8fJxPGDDABj04DPSp6mtV0nZ4GMnULsdN7g0OAVwRbnB4444eV5/p2bOqnjy6r9xNEyLe1qOX7wZijM8f3NXdRy909tG80/OcdQ23HurVuw85zjc13gHy7oUe3b2rB88vPvYkOAQA4OMhOOxRqVTswO8iQkNzLACD6zIGh6birxAzVYcZtaPDVq2gdCwkvz2lOaBIIqPOgsBmJatkJOi+HrReX+h6vVXNa/Zw/6CiyZw7HbqubMSvSDqjZNhvvRZSqlzvmKrcUjVt7RdJayEZUTAQkD8QsqdT2zOTWyXFO6Za+xNltY5NVa6rtJBQOOBuE4ppNl87vO5WOalAIK5sJqlI0NkmEE4oW2nyAQY+Kjc4vPlAXRnh2xd6cMsJ3l5ezvSrT3CIj/5pIzgEAOCjITgEMLQuZ3Ao1RZC8vnjsrO3RkGJgE/hZE7lWl31akmZWMCezly1w7uKUkHr9XRR1XrDer2g2bBP/nhRdvTWyCvu9ymYyNr718o5JaztAwnzugkOfU5gmCupXCqp1mocCw5NmBdOl2RnkY2S0tbxg8mSe/yCXXEYL7lBX1dw2FR51lxLVOlCRbVaVaVMXEGzfd5JNu3g0ASKsYzKjZY91TkXt64v5F4fgI/EIzg0rzy/q2uf3NDqi44X3jzXo7uf6YY9rfmGPrv7WC/edu70Qo8PX/9ENz67q0c7b7uO++b5Q9357IY7LfqWbt+vqj0r+s2Tz6znP9P9B3d0y7x+u2qN8LUemRDz9jPZR3q3o9Ubn+jmvYe6d/umNUZzrpu6fc85zruXD3Tzk+7p158/NdVzPcexvdPLp/d0+9Y1Z9sbn+nuo52jKcbtc1ljfHLvc/e6rlnX/eSEQPX4ed69fGqP9RP3vt2680CeBX3uOW9Y26x+fsO+tvvuyd6+eGw9d/Pw3t15uNM9Hdp6fx7mbnXck0d68Jn15zvP7erHdy/vW/fmmu7udAz+3XPlrO1vPXTTvLdVfW79/TN3qnL/98Ts91rPHuR065pzj2/evqenXSntO72y7u3nN9qfhVU9evg5wSEAAB8JwSGAoXVZg8N6NiyfL6ZiU6plwsdDtEZeUTM92IR1Zqqw36dotqp2jV6rXla52rCPbR8rkFS5o4CvWc4onSmq0Q4OowUdFSj2CQ6DKXXORG6WEgr4YyqYnY6tcdgRHNqhok+xfOd6iS2VU0HrmhbsikonOAwp3XGBzVJcfl9UBYoOgY/IOzg0a92ZAOlWO+V5u6P7ZgrzjZwePn2mZ0/u6/a1T3Qt99QNr97oae6aPrl2Ww+ePNPz6mPd+8yZ8vzkdfsQ9+xQ7+adh6o+e6bqo7t2GHVj9bkdRjkhlRnPHT14/FTV56/1ziM4NMHY3cfP9fLVSz1/fMcO9W7ef2H9HnijVy9f6PHn5jj39OzlK722dzwe6L1+fNsOAj+/90TPnj/T0wc5+zi37rvTjA/PZT1njflJtaon92/bwdxnnulXz3nePtddc4zP7unxs+eH982zmvPwnNfstSafVJ/p5VsT+j3UZ9Z5r92+ryfm3j10xvr5Y3cc717pkX2/P9O9x9b9f/ZUD3JuQPvBwWHve/JGz+7esEPAu4+qevbMfa9vrOq5e3PfPl+1x3cj98C5bw+d95rgEACAj4PgEMDQupzBoRvW+RMqt5oqxft0X3YfkWxdpqqvshA9mqYcTymTL6veco5VTvjli+bVv9WJExx2d1A+Hhz6u4JFmTRTYetcsybsOyE4bFVmFfSF1btcY7MYOwxGneAwqs5ssd9zAL5pJwSH757rzrVPdOOeE6K9fuxUiz3sqCp7U+2Yemptf/eaCe9eHq3t9/qpVm/ndN8Oql7ryefu9OGO07x+ZIKpnJ69bYdU3eeQR3B4Y3WnYw3Bd9q5d0OfXLvjBlf9pir3CfRM8Hm3pwLxwS1rDJ87YWc7xLv9tKOy75V7nKre9r2n3ec5DOueH4327fN7un17Vc/6VR2657x2p3Ncb1Q113PjnnY612xcvWE/Z4pC3724Zwd1uWrHQd+90L0bFxEcdr8n7arO2086Gqi8fmwHm7ft6s43emp/ru6rs2D19RMqDgEA+FgIDgEMrcsZHDaUj/rki2RVV1PFmPPnar2ues+j0bFzq15RMbugVDxiT/31RRZUbbWDw8LJweHsacFhT/BYW1C4XSX4AcFhieAQGGBnDQ7fqnq7XSX3zv5Zaz9eOWFRzqR+eu2ERdc+tyveXrx+e/x4pirwwcvupiGmQvDV646Kw8/1tCtQ8wgO73U3H3n3/I6ufXJTD+wLOT04fPfieKBne/XQroyzr6nvud6oagLQzx6rf9/h3oDymVNxeOuuHlV39OrtKW9Jv3Naz5mQ04Slbzvu/5vqbbvC0OR3rx9/Zld3dt27dy/14OZFBIfd74lzLhOudnwW3r6wK1LtQLc93p73iDUOAQD4eAgOAQyty9pVOeTzKZqr23+31zsMJFTqnLbbKCgVTyprgrtGSZl0pnsqcskEb05gZ091PjbVOKlQKGkd82zBoT3VuWP/Rj5mr8FoKgYPg8PSCVOVC/2nKpvhExwCg+qkqcpPO6Yqv9bjz7rXDexaQ/CJmyq9e6mn93P6zJ3e+8nNnO5XXznh0duqbncEUv18UHBoV9zd0L0XZwwOd+7aQeP93gt3r9u+posIDs25Xj/Tgzsdaz/evqcnLzwSxH7nfPvMvnf977+pBvxnp1LSVFx23ZSvIzg0VZk3PT8Ln+Ss67bGm+uc5t6+DIJDAAA+GoJDAENr0INDfyyrYqmkknkUC8otJBX2m2rBzNGahvW8vYZhILagYtVpjrIQ89thoB0mNktKBkyzkpzK9YYa9YryydDRuoZuc5RQKq+KaZ5SyStpQsvkUXOUU4NDn2mu4jRnqRYX7PGE2vu0SkrYfy+obFo19zZHMSGhaY5SrKper6qUTdjNUWJuMEpwCAyqE5qjPLvjNEexQ6Y3empPM36gZzsv9OJF9+Nlnym3b1/v6MnqLbsZyD1zDLeC8VZvxWGHDwkO3z6/Y697eO6Kw52vueKwyzu9fvFU983+1+6cOFW5u+LQuXc3V59q50Xv/X+pN++OKg6rnSf9mioOXz1ypnM/en78s/Di1dvDCsne6lKCQwAAPh6CQwBDa9CDw941C/3BiBLp/LFuwq1qXrOxkLuOoV+hWFqFWkczkUpWyUjQPY55PaVcx0Fa1ZxS0dDhOojRVPscZwwOQ0mlk+4U6EBY8YWitefh2VVOR9zOyHk1uoJDc/K6igtxhQPONQbCMc3mq4fnIzgEBpVHcGgaodxygsL2868emoq2XE+oZ236xtnANO+4feszdz3D9otuleEjE0K5axx+9qhrjcM31Tu6efNuxxqHZwsOr9193hHMvdXzu9fea43DdmMWxzvnOq0xPO5Y4/BDgsPXT3K6dcu5vsOzPPeodpT3OZ+45+zO3N7pjXtcp+Lymu6csMahXj2yQ9Hbndu8fuJUlp4jOGxXd64+745G3719447ZXePQeq8779Gbp7cJDgEA+EgIDgEMrYENDi8NNzgMZ1TjZgBDxg0Ob9zVk2fP9fzZMz19dF85U6X2yed62BlsvXnmNAqx1+p7rp3nVT2+97muXXPX1Xv3wgkbb97RQ/v1Z3psVxze1H23Q0a7q/Ktu49Uff5czx7fs9dI7O6qfLbg0FQy5h481XPrOE8fOJ2Ob7a7IVv/94VplmI6DD95pp3X744fx4SEblfl2/ef6NnOc1Uf3nG6Pt/bOaG68ZwVh68e2UHctdsP9PT5jnaePXE6EF+7q+f9Zit7TsW+73SgzjnHeW4dx+6afBjEvnI6SVv3777pam29Pw/v3OzqqmwqEJ3O2NZ79LSq6pOHunPL7Rp9juDQXs/SdNBud3A29+7Rqj67dkN33YS0/V5/dv+pXrx6pRfVB043aYJDAAA+CoJDAEOL4PBDERwCw8sNDjvXqLt2U5/ffahnr49Xwx1bq+/zu3q005EovXmmhx2vX7vVscah6/WzB7pz65p7rlvKPXim9qnONVX5zkPdz92yA0MTIn5+r6quIb9+qrt2KHbN7fTbbwrxW718sqrPb7rXfuNz3X30/KiD8gVNVX6780h3P2+vC3hNN2+v6slLjwnbHsGhfWZznM9uuMe5oc/u9LxPb57r4eE9uanb9x44jVnawaEZy4tHR/f/xme68+ChctfOGxyacb6y17O8dc19r2/e1uqTl93Vm0/v6fMbHZ+FBzlrbASHAAB8DASHAIYWweGHIjgEcImcEKyh9151r3EIAACGF8EhgKFFcAgAQ4Tg8Bz3iuAQAAA4CA4BDC2CQwAYIgSH57hXBIcAAMBBcAhgaBEcAgAAAADgjeAQwNAiOAQAAAAAwBvBIYChRXAIAAAAAIA3gkMAQ4vgEAAAAAAAbwSHAIYWwSEAAAAAAN4IDgEMLYJDAAAAAAC8ERwCGFoEhwAAAAAAeCM4BDC0CA4BAAAAAPBGcAhgaBEcAgAAAADgjeAQwNAiOAQAAAAAwBvBIYChRXAIAAAAAIA3gkMAQ4vgEAAAAAAAbwSHAIYWwSEAAAAAAN4IDgEMLYJDAAAAAAC8ERwCGFoEhwAAAAAAeCM4BDC0CA4BAAAAAPBGcAhgaBEcAgAAAADgjeAQwNAiOAQAAAAAwBvB4Rmtra1pfn5ek5OTGhkZsR/mz+a5P//zP+eTBFxCBIcAAAAAAHgjODzFxsaGxsfHD8NCr4fZxmwL4PIgOAQAAAAAwBvB4Qlu3rx5amDY+1hcXORTBVwSBIcA8H4++eQTHjx48LgUDwAAweE3Fhq2qwp3d3fth1c1otl38OxrY6on6AyPa2puWZu7B/xLAMEhwSEAAAAAAF0IDvswgWC/0NAMvN9N6BceDt60ZTc4HJ3RyvqGNb51ra1cV2rMBIhTWt4mPMTwITgEAAAAAMAbwWEfJwWBlUrFft08zJ8Nr6BxsLjB4fiSdrqe3tLihPs82SGGDMEhAAAAAADeCA57mO7J/dYubFcbdoaK7XDQTFvut89gVR16BIfmlc0ZhUdGNb/VkRzubWp5ZlKj9rWENT59Xes9yeLBzroWU+PuNqOaSC1pc6/zwFtamWsfY0SjkzNa2drnXx0GBsEhAAAAAADeCA57fO973ztzI5TTgkNzrMHhHRxqb11T1ngnlt1X9iuaN1OYx2a0vL6pzfUVzZuqxHBKa7vtfTY0M2o9NzGnFWubjbUlZ9rzxJKcWc97Wp8OW/tMa3FtQ5sbq5qfNPdlSqu7/MPDYCA4BAAAAADAG8FhDzOGswaH7YrClZWVvq9PTk4O0Ft9QnB4sKmZ8IjGrm/LZH67KxPW+Ce03Lnh3rpS1jaj81v2NjtL43YIuNZRYXiwvaixduXiQaXrmLbddc1NTWuxwpxoDAaCQwAAAAAAvBEc9jhraGimNBvb29saHR313G5wnDU43NO62W5iRbs9+2+mwu7+e1oz1YOTqz3bWHvvWK+6FYdr06ZKcVLzKxva2mWKMgYPwSEAAAAAAN4IDnucJTS8efOmve1poeGlCQ731jqmKu9qxUxLntpQd9R3oK1561pH57V14LVNj4NtrV1PaWLUvR/j01pc3xH1hhgUBIcAAAAAAHgjOOxxlqnKJjA0fvd3f/fE7cyxBsfpzVHm7OYo+2eqOLS3mVzV3lnPvlvR6ty43USlqwkL8BERHAIAAAAA4I3gsMdZmqO0nbbdpWiOsl/R9XHz/KLb1KS9xuGkVjqTw/0Nezrz6FylY43D6a41Dq0dNTU2rutbBzrYWdbU+KT956NjuE1YVuiOgsFAcAgAAAAAgDeCwx5m7cKzrnN41uYpg8ENDkdntLq5qc3NDa2tXNe06YQ8Mqnl7c6Ab9Ppqjw+Y3dMrmys6vqk0yH5sCPy3rrTVXlyXqsbFbvz8pwJICfcAPJgW4vjR52ZK5UNrdgVh2PdYSLwEREcAgAAAADgjeCwj/Hx8Q8ODc0xBosbHHaOMzymqbllbez2CfL2NrWUmtCovW1Y49PXtbbTvd3BzrquT48rbG8zqsmZZVX2eo4x0z7GiMLj07q+vssahxgYBIcAAAAAAHgjOOzDVAp+6FTlwao2BNAPwSEAAAAAAN4IDj2YzsnvGxy2uy4DGGwEhwAAAAAAeCM4PMFJ4SGhIXD5ERwCAAAAAOCN4PAUZsrxWdY8NNswPRm4XAgOAQAAAADwRnB4RiYU/N73viczxnZYaP5sniMwBC4ngkMAAAAAALwRHAIYWgSHAAAAAAB4IzgEMLQIDgEAAAAA8EZwCGBoERwCAAAAAOCN4BDA0CI4BAAAAADAG8EhgKFFcAgAAAAAgDeCQwBDi+AQAAAAAABvBIcAhhbBIQAAAAAA3ggOAQwtgkMAAAAAALwRHAIYWgSHAAAAAAB4IzgEMLQIDgEAAAAA8EZwCGBoERwCAAAAAOCN4BDA0CI4BAAAAADAG8EhgKFFcAgAAAAAgDeCQwBDi+AQAAAAAABvBIcAhhbBIQAAAAAA3ggOAQwtgkMAAAAAALwRHAIYWgSHAAAAAAB4IzgEMLQIDgEAAAAA8EZwCGBoERwCAAAAAOCN4BDA0CI4BAAAAADAG8EhgKFFcAgAuAq/x3hczgcAAJcBwSGAof/CRXAIALhsv7/M767/+T//p/3763/8j/9hPw4ODngM+MO8T+Y9M+9d+8sXAACDjOAQwFB/8SI4BABctt9dv/71r+3fW+Z/cTl1voeEhwCAQUZwCGCov3wRHAIALpP27yxCw8uvXTFq3lMAAAYVwSGAoUVwCAC4bL+3TNj0z//8z9yMK8K8l+Y9peoQADCoCA4BDPUXMIJDAMBl+r1lfl999dVX3Iwrotls2u8pwSEAYFARHAIY6i9gBIcAgMv0e8s019jb2+NmXBHmvTTvKcEhAGBQERwCGOovYASHAIDL9HvLdOb9x3/8R27GFWHeS4JDAMAgIzgEMNRfwAgOAQCX6feWCQ4bjQY344ow76V5TwkOAQCDiuAQwFB/ASM4BABcpt9bBIdXC8EhAGDQERwCGOovYASHAIDL9HuL4PBqITgEAAw6gkMAQ/0FjOAQAHCZfm8RHF4tBIcAgEFHcAhgqL+AERwCAC7T7y2Cw6uF4BAAMOgIDgEM9RcwgkMAwGX6vUVweLUQHAIABh3BIYCh/gJGcAgAuEy/twgOrxaCQwDAoCM4BDDUX8AIDgEAl+n3FsHh1UJwCAAYdASHAIb6CxjBIQDgMv3eep/g8OCrhlb+5K/12z/8QqHvf6Fv/fAvlfyTmja/+nXHVr/W1p/8RKE/+K/aftd7BOu1//RnCv3w5+5rZts/s4/V//Fnuvn3vz7fMd/9k5Y//cL7mD/4qSrvjl/b3s8enzAO8/hLrXzVsYN1nk//wDz/WKtf9btbv9belzV990d/od9wj/Ebn/61vld+pb2jg2jzj6zX/vBvtduz785fPbH3+9f/+ZX2z/DeEBwCAAYdwSGAof4CRnAIALhMv7fOGxwe/P2X+rYJwD79qT79m5eq/PKVNv7mS/2uHdKVdfOX7TTuPYLDH/xUq1++UuUXvY9faffdOY/ZDg5/VNPGL/oc85f/1D+Ie/PV0TZf/p1+9wdf6Fs//lttHu77lfbedd6Pn+u3vv8T/Za13W+Xjn/X2P/l/2e9/oV+a+VLrf28oc0v/0Gr//mJftM89yftMLBfcPhr7f7N+UJDg+AQADDoCA4BDPUXMIJDAMBl+r11ruDw3Ve6+Qdf6Fs/+tvjwd27/65VE3798Kkqb80T7xEc/sHP+2zbs985g8NvrbzSwfveIPd6f/NPfuVxjF+rYsb96Zda+xPn3Fvvel5fscb7aa2nklDaKf+lQt//a62/sU/UExz+Wrs/+6kdLv7rPz17aGgQHAIABh3BIYCh/gJGcAgAuEy/t84THO5/+VN96/t/4U4b7uPll/rt73+h5M9bGorg8G1D3/3BF/qtP/0nu7LwN7//E333F++6xlT545/YYermm959/0lbv/wnt3qxMzjsDA1/da7Q0CA4BAAMOoJDAEP9BYzgEABwmX5vnT04/LW2//NfeK4NaHv3lf7DD7/Qb9hB2/sFh1tvf62Ddz2Pzv3OHRw2tP/u+DHP5JTgcP/nT+wg9dOX1vHe/cq+9m/9+B861i6UDl79nZI/MNO4/0Lf/uOfa/lvXmrrq2PlmofBYeVnT+3QMPSjvztWpXgWBIcAgEFHcAhgqL+AERwCAC7T763zBIdO9dxJVYHuuoI/brxfcOjVkOTTmnba+11Qc5Tf/E9fnV6JeGJw2NK6CfsOx+Ke//vl401S3vxKa3/6VMlPf3J4/m99+lMt/7LVPpETHH7/J/qW9dpv/+gv7IYw3/2yde73lOAQADDoCA4BDPUXMIJDAMBl+r11sRWHv+qpOPSaftz7mvv3H/5Ua7/8lbb+vufxsuUGd+c4Zrvi8I/+VpW/P37M7a/OUHV4UnD41d/ZTWLMNOX2a6ZRiqkW7Nck5dDb/66tn/+tvveHP7FDxpVX9onc4PALfbv0lQ7MepE/cjo/r78533tKcAgAGHQEhwCG+gsYwSEA4DL93jr/God/5r3G4St3jcOfOWscbv+pV9D4Tps/7q0kPNsah2c+5te8xuGu3dzEo6Kx3STl7a+0/Mc/1ad/3+ei3r7UvzXrGP7VP+swOPy0o6vyV3+npKlM/KMX55qyTHAIABh0BIcAhvoLGMEhAOAy/d56n67KoR/VDgO+g1881W/+oKzvlv9By3/kNgJ56/4/918+sYPG//DLnuDs7St9z1Qm/vGrM1QS9nxhOOsxv87g0Dr2p+Y+fPpftfnyn7Rz+PhKm3/6l/aUY7tJSrsL9Y9fdK17aPvqhV2x6ISsvV2VHbt/89f21OVvl//7ma+B4BAAMOgIDgEM9RcwgkMAwGX6vXWu4FBmOm7NDrxCn/5Un/7NS1V+2dDqH/+FW233E/3bn3Wsy2eCM3udwbK++6d/p/Wfv9T6X32p7/6h89zyy3blohsc/uCJVr5saLPPY6s9tfisx2yvcfijmjb6HfMXv9LO21Mu1iM4NFOSf+sw9Ovx5h/sSsJ2k5S9n/9Uv2H9/Td+9FSf/tU/WGN5qbXyz/VvTfD4Bz9XxR5D/+BQ+met/fgnPffqZASHAIBBR3AIYKi/gBEcAgAu0++t/7+9+/mJMs8TOL7/iTdOa3aTdX8Nye6Ot75sOnPx5s1b37yYDgdNPHDx4EETD1wc40ET063E1hCCsY20UQjTXR1j+2NAQxAGa2gURST5bH2fqoKiqh6kit4Ziuf1Sj7T01hdFE9VfPi+8/zoNBwmq+X5uHTlXhw+WbvRx8nROHK5FOcvj2V3GT723WL8Wn/w8nwMXb4b/QPDG3Hx8LmJuLTl9N3P3BwlXTdw7O3mw3fynJ+5OcqB7U653niOduFwPcazyPmwFv2aNd8kZT0WnjyO4+dGs4CYfe+Bkcr2ehrjG9cvzAuHkYXIYwPVoxsn1z7/3giHAOx1wiFQ6AWYcAhAL+23ugmH2/5CPzMdQ4/edn96MLsiHAKw1wmHQKEXYMIhAL203/qtwyF/X8IhAHudcAgUegEmHALQS/st4XB/EQ4B2OuEQ6DQCzDhEIBe2m8Jh/uLcAjAXiccAoVegAmHAPTSfks43F+EQwD2OuEQKPQCTDgEoJf2W8Lh/iIcArDXCYdAoRdgwiEAvbTfEg73F+EQgL1OOAQKvQATDgHopf2WcLi/CIcA7HXCIVDoBZhwCEAv7beEw/1FOARgrxMOgUIvwIRDAHppvyUc7i/pvfz48aNwCMCeJRwChV6ACYcA9NJ+K0Wm169f2xj7QPr9I72XwiEAe5lwCBR6ASYcAtBL+620v1pYWIh3797ZID1ueXk5ey/TeyocArBXCYdAoRdgwiEAvbTf+vTpU7x58yamp6ezf6b9F70nBcOZmZkol8vZeyocArBXCYdAoRdgwiEAvWR9fX1jf/XTTz9lv2R/++23ce3aNdMD880332TvWalUyq5vmI4cTb+HAMBeJRwChSUcAtCL+650Tbz0C3XaZ/3yyy9ZhEoR0ez9Se9Ves/Se5feQ9c3BGCvEw6BQi++hEMAenH/lfZb6Wi1paWl7HTXxcVF0wOT3qv0nqX3zrUNAegFwiFQ6IWXcAhAr+/HTG8OAPQC4RAo/IJLOAQAAIBWwiFQWMIhAAAA5BMOgcISDgEAACCfcAgUlnAIAAAA+YRDoLCEQwAAAMgnHAKFJRwCAABAPuEQKCzhEAAAAPIJh0BhCYcAAACQTzgECks4BAAAgHzCIVBYwiEAAADkEw6BwhIOAQAAIJ9wCBSWcAgAAAD5hEOgsIRDAAAAyCccAoUlHAIAAEA+4RAoLOEQAAAA8gmHQGEJhwAAAJBPOAQKSzgEAACAfMIhUFjCIQAAAOQTDoHCEg4BAAAgn3AIFJZwCAAAAPmEQ6CwhEMAAADIJxwChSUcAgAAQD7hECgs4RAAAADyCYdAYQmHAAAAkE84BApLOAQAAIB8wiFQWMIhAAAA5BMOgcISDgH4rfcpxuzlAYBOCYdA4Rd5wiEAu9mXpP3Ip0+fsn3Jx48fs1ldXTVmT0z6PKbPZvqM1hd8ALBTwiFQ6MWecAjAbvYj6+vr2T4k/RP2ssbPqngIwE4Jh0ChF3zCIQDdqu8/REN6Rf3I2PTZBYCdEA6BwhIOAdjNPiRFmJWVFRuDnpI+s+mz66hDAHZCOAQKvegTDgHodh+S9h3lctnGoKf89a9/zT67wiEAOyEcAoVe9AmHAHS7D0k3nVhYWLAx6CnpM5s+u8IhADshHAKFXvQJhwB0uw9Jd6x9/fq1jUFPSZ9Z4RCAnRIOgUIv+oRDALrdh6RwODc3Z2PQU9JnNn12hUMAdkI4BAq96BMOAeh2HyIc0ouEQwA6IRwChV70CYcAdLsPEQ7pRcIhAJ0QDoFCL/qEQwC63YcIh/Qi4RCATgiHQKEXfcIhAN3uQ4RDepFwCEAnhEOg0Is+4RCAbvchwiG9SDgEoBPCIVDoRZ9wCEC3+xDhkF4kHALQCeEQKPSiTzgEoNt9iHBILxIOAeiEcAgUetEnHALQ7T5kZ+FwJS6dHY4DZ57Gq+3+/NzLWIj1GL94Mw4MluLZWvqz9Zi8fCsOnBjOmVtxamY9Xn0/Vvn/9+L2+8bnXYs7Qzezxx2Z+rD1l/jS/eg7MRaXyq2vZrV0L+d73Yz+c1NxfX696bE5z/MkfY/RGJqv/hzj2WsZjcGZ9aZHrsfP10biwOmp+Hmt/rUPMf79RBwZvLn5vc8+iMGpt7Gau50r2+pKZVudbHyevD9r3s7Vry2UHsdXZ0fiYO1nPjh4L46PzVfel6qFR3e3eS+Gs59vqGFb/DozHacujMWh+vOdHotj16ZjsvF9WluKwdPtn6/v5Fh8Vfn+v9a2ye30mk/cjUvzbX78+afxZeW/6b+yWHt8PuEQgE4Ih0ChF33CIQDd7kN2esThwqN7WVQ63y74lJ/GFyduxrFSKlg54XDgQVwqzcf4k+ZZjFeVx63O/hj9J27F8cYot7YYx08Ox8GBygzNNcSkWkQ73RjNNlVj4GicKpXj59nazCzG+KNSHK08Xwp8k2uNj+0kHA5nP9vWsNccDiv/fmM0i6JHr72I66W5uDM1HYMXR7OAeKwpgkbzz9VlOPz1+URlGw5H/1Aprk5VvmfpZVy6dj+Lfv2Xa/Fuuby57Usv4lhl2/ZdeBp3Nt6PcizUnu/Vo4fZ8x08OxFDj+YqfzYX18cm4kjahifvx9Vy7b2qhcO+Cy9icnZzm08+n41Ll0ezbXb00Ur1scuz1e957kVThF6JS+dq7837z392hUMAOiEcAoVe9AmHAHS7D9nxqcrvZ+PoieE4/F3r77bPvhuNAwMPYzwLPjnh8HS7GNagFgkPj73d+FI1Jt6NobG70XdyYiP2RbyNocHhOHR5se3Re9vFwOqRirfi61qg7Dwc3sqO5vuish02v3dTOFwrx6nTldd3pdz0+lbiaopjg3lHbu4mHNZe3+Djlud+NjaaHc15fbl5m9deZ7vtWH4RR7LgONd69N/yXHydjjA8W/s5auHw4MX5Nu/HUpwfTI99uXnU49SDbBse+WFl41GvfrhX2dYjcer52o4+u8IhAJ0QDoFCL/qEQwC63Yfs/BqHa3Gn5dTY2IhGh67U41OX4bDy/LcvVE93roeqV2Oj0XfmaTybT0c0jsSp2doRbssv40g6cu9J+yfcNhw+ebC7cFh5PbevjWb/zfn662kJh/Uj8KZbIt5qeTEmZ1ZyTlfeZThM/37yYdxpDoTvl2Ly+dLGkYSbmzwvHK5XY3C72FjfjlP3q6EvbYNtw2E18h44O70RDlNAvX6h8loH7lefv/J+Hh0Yjv5ri9ucxr2VcAhAJ4RDoNCLPuEQgG73IZ3cHGX1+UQcOjESg7MN1wicmYr+LV/LD4eT79djda1pGp5/4YexLHxVjyxciatnh6P/xlLlcdUwVT8acfX5wzi4TdTajIGNpz2vxcLMdBwf3OWpymdexKv35TiVnufM442fsfkah+mouuy6gCfH4tiVUlyamo9ny+uf2cL1ODjRZlutffZU5dX5F3FkIF1bcCS+vDgV53+YjcnyNrU2Nxx+iOvbHhlZsTydXY/wi+9XtoTDxqMTV9+/jTvf3Ws5urD631dj4aHLL+N69nP82HBE6ecJhwB0QjgECr3oEw4B6HYf0tFdlWuhqf9aeePowixmDT6OZxsP6vDmKI3/7fzjOFy/jmI6NXqgfs3D2nNkR62tx7MbI9vcqGW7m6MMx6GzE7u7OcqZF9mRc9VgOhxfZjGz3c1RKguN2Zdx/vL9+OLk5vfvv/Bj3C7nBcTa9tzu5iXb3hylYnkxrt542HBTluHoG3wQ559/yH0/W8PhSgydqZ5enHuTkvdzm6eub3NzlAMDo3Hsu/m2z7OQnZ5cvSHLqZn1jj67wiEAnRAOgUIv+oRDALrdh3QUDuunsG6ckjufXZfwyy1Hk+WEw5MP4urzdJpu08x+2IxWa+X4uvJ8Rx59yE4pPjjwIO7UbpRR/ff7lX/fPBIxTzUGjsSp0mL8PFOOydKLOH5mOPrOTMXt5XaP3Xon4Y0/2yYcplOrJ6+M1O4QvNY2HG55rnI57nw/Vb2xyOkfcx5XC4cD7bbVfFxN3/9z4bDR+7cxOfW08rPfzOLoUPONbbY74nDbu2hH2yMO0w1PxtP2rrzW6zfSTVluxdGxcv7px7Xv33dh7rN3UW4mHALQCeEQKPSiTzgEoNt9SGfhMGp3UK5eIzCLeS2nDHd7jcNkLe4M3YxDF+di/Mqt6Gu43mH1uoaV7/sk3ZW36e7LTdoeRfh+Louc2SmxDXftrZ723HD9xAYLP9zNwmD152sOh+k557ObhPSdfRq3r2yGw9XZp3F8aKr1WoOxebp3u++3q2scvl+M8xcfxOBMm41cu7FNFvm2bO78m6N89hqHpc9d43A9no3dze4ifbT5NOWN71+9cUrf0PyOr21YJxwC0AnhECj0ok84BKDbfUjH4bB27cFDl+fi9tDNODjUfLTYbsJhxMKju9E3OJFdi3Br6FqJS2duxuHL9+NQw5GI7eSdfvzr84ns9OL+Kw2hrHbk3OEtd0lOPsT1C41HB7YJh+k5n0xk1zI8eHJ482fMbuZSef1jSy1B7NfSg4ajGJvtIhxuHL03veX1ZcrVnzEdybnFtndVns7uqpze55bnqwXTjSMSc2+O8jYupWslnrjX9lRw4RCAvxXhECj0ok84BKDbfUjn4TDd+ONe9A2MRv+JW3H8eXPhygmHA/djqDQXd9rMZOM1/8rV6Hagfq3DhuetHgVXvfPywjavL/+6hWsxnl1vcaThmnprcSf72s348vLjuDo1G7cfPY3BoZGmo+Xah8PN52wIh+lr2WnMw/HF0I9x6VHlOadexqUbD+JwioxDszmvfzd3Va7ekCXdiOTg2Ycx+P3LuF2ajatjU3H0dPW1jTfH1u3CYfZ8D7PQevDcRAxNzcX48/m4XT/d+uT9uFq/VuR2d1Wef5pFy7ZBUzgE4G9EOAQKvegTDgHodh/STThMp/0eG6jeqGOyTeDq6OYoJzbvlpypxax28SzdkORQu1Num2x3w5NYnouvslOWS5vPv7YSd757EF+e3ryhyKHB+3Hq0dKWU2/bh8PYPA16y1GVH2Ly+4k4OnirdgOQ4eg7fTe++m4uXuUeebm7cJi+tvDkcRw/N5oFxOrNSUbiyOWnMd7ulOPPhMNssTT7MgYvjkX/QO1nSHeJvjYdk43Pt104zILvWBZhj001H/EoHALwtyEcAoVe9AmHAHS7D+kqHMLfmXAIQCeEQ6DQiz7hEIBu9yHCIb1IOASgE8IhUOhFn3AIQLf7EOGQXiQcAtAJ4RAo9KJPOASg232IcEgvEg4B6IRwCBR60SccAtDtPkQ4pBcJhwB0QjgECr3oEw4B6HYfIhzSi4RDADohHAKFXvQJhwB0uw8RDulFwiEAnRAOgUIv+oRDALrdhwiH9CLhEIBOCIdAoRd9wiEA3e5DhEN6kXAIQCeEQ6DQiz7hEIBu9yHCIb0ofWY/fvwoHAKwI8IhUOhFn3AIQLf7kBRfXr9+bWPQM9LvPOkzKxwCsFPCIVDoRZ9wCEC3+5C071hYWIh3797ZIPSE5eXl7DObPrvCIQA7IRwChV70CYcAdLsP+fTpU7x58yamp6ezf6Z9CexVKRjOzMxEuVzOPrvCIQA7IRwChV70CYcAdGt9fX1j3/HTTz9lv/B+++23ce3aNWP2zHzzzTfZZ7NUKmXXN0xHyKbffQBgJ4RDoLCEQwB2ux9J14pLv9ym/ccvv/ySxZkUEY3ZK5M+k+mzmT6j6bPq+oYAdEI4BAq94BMOAdjtviTtQ9JRXEtLS9lpoIuLi8bsmUmfyfTZTJ9R1zYEoFPCIVDoxZ5wCMBvuU8xZi8PAHRKOAQKv8gTDgEAAKCVcAgUlnAIAAAA+YRDoLCEQwAAAMgnHAKFJRwCAABAPuEQKCzhEAAAAPIJh0BhCYcAAACQTzgECks4BAAAgHzCIVBYwiEAAADkEw6Bwkt/6X369CnevXsXc3NzNggAAABUpDVyWiunNfNOg2GdcAjsC8IhAAAAtBIOgcKrh8OVlZV4/fq1DQIAAAAVaY2c1srCIVBY6S+/9fV14RAAAAAa1MNhWjMLh0Ah1W+Q8uHDh/jLX/5igwAAAEBFWiOntXL9xiidEA6BfSP9Bbi6uhrlcjn+/Oc/x8TERIyMjMT169db5saNG8YYY4wxxhhjzL6ZxjVvWgunNXFaG6c1clordxoNhUNg34XDdM2GdJv5+fn57C/IUqkUf/rTn2JqamrLpK8ZY4wxxhhjjDH7ZRrXu2ktnNbEaW2c1sjdXN9QOAT2nXTo9draWnbHqKWlpXjz5k02i4uLxhhjjDHGGGPMvp/6OjitidPaOK2R01q5G8IhsC/jYbroa/rLMc3Hjx+NMcYYY4wxxpjCTH09nNbG3UZD4RDY96cuG2OMMcYYY4wxRZ3dEg4BAAAAgBbCIQAAAADQQjgEAAAAAFoIhwAAAABAC+EQAAAAAGghHAIAAAAALYRDAAAAAKCFcAgAAAAAtBAOAQAAAIAWwiEAAAAA0EI4BAAAAABaCIcAAAAAQAvhEAAAAABoIRwCAAAAAC2EQwAAAACgRWM43OkIhwAAAACwz9UjYDcjHAIAAADAPiUcAgAAAAAthEMAAAAAoIVwCAAAAAC0EA4BAAAAgBbNMfCPf/xj7giHAAAAAFAQ7Y4k3Ek0FA4BAAAAYB/LOw35c9FQOAQAAACAfWy7axhuFw2FQwAAAADYx9wcBQAAAABoIRwCAAAAAC2EQwAAAACgxW8eDtP/CIcAAAAA0Nv+X8LhH/7wv/Ef//4v8c//9I/Zg4wxxhhjjDHGGGOMMcWa1AZTI9wSDg///r/id//5r1lRTA9IddEYY4wxxhhjjDHGGFOMSU0wtcHUCDfCYfL7//nv6P/dv2V/kKpiepAxxhhjjDHGGGOMMaYYk5pgaoOpEaZW+A91qSCmL6SaaIwxxhhjjDHGGGOMKeakRrhxtGGj9EVjjDHGGGOMMcYYY0wxp7EV/h84lD3pbbQCkgAAAABJRU5ErkJggg=="></image></g><path fill="#000000" fill-opacity="0.0" d="m537.4803 70.5538l78.86615 -0.5354309" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m537.4803 70.5538l66.866455 -0.45396423" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m604.36914 73.40323l9.053589 -3.3650055l-9.09845 -3.241768z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m526.2834 64.74803l101.25983 0l0 40.661415l-101.25983 0z" fill-rule="nonzero"></path><path fill="#000000" d="m547.1466 83.2824l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm2.828308 3.265625l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm9.0633545 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm10.943726 3.1875q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm5.6156006 2.375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.812378 -1.15625l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm12.7560425 3.0l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.593628 0.1875q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm2.6624756 1.375l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625zm7.1171875 2.015625l0 -9.3125l1.140625 0l0 5.3125l2.703125 -2.734375l1.484375 0l-2.578125 2.5l2.84375 4.234375l-1.40625 0l-2.234375 -3.453125l-0.8125 0.78125l0 2.671875l-1.140625 0zm6.2109375 -2.015625l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m4.8923655 478.97165l0 0c0 -13.959625 11.316493 -25.276123 25.276096 -25.276123l395.9045 0c6.703644 0 13.132721 2.663025 17.872894 7.4031982c4.7401733 4.740204 7.4031982 11.169281 7.4031982 17.872925l0 101.10135c0 13.959595 -11.316498 25.276062 -25.276093 25.276062l-395.9045 0c-13.959602 0 -25.276096 -11.316467 -25.276096 -25.276062z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m4.8923655 478.97165l0 0c0 -13.959625 11.316493 -25.276123 25.276096 -25.276123l395.9045 0c6.703644 0 13.132721 2.663025 17.872894 7.4031982c4.7401733 4.740204 7.4031982 11.169281 7.4031982 17.872925l0 101.10135c0 13.959595 -11.316498 25.276062 -25.276093 25.276062l-395.9045 0c-13.959602 0 -25.276096 -11.316467 -25.276096 -25.276062z" fill-rule="nonzero"></path><path fill="#000000" d="m26.654856 479.2424l0 -1.078125l3.9375 -0.015625l0 3.453125q-0.90625 0.71875 -1.875 1.09375q-0.953125 0.359375 -1.96875 0.359375q-1.375 0 -2.5 -0.578125q-1.125 -0.59375 -1.703125 -1.703125q-0.5625 -1.109375 -0.5625 -2.484375q0 -1.359375 0.5625 -2.53125q0.578125 -1.1875 1.640625 -1.75q1.078125 -0.578125 2.453125 -0.578125q1.015625 0 1.828125 0.328125q0.8125 0.328125 1.28125 0.921875q0.46875 0.578125 0.703125 1.515625l-1.109375 0.296875q-0.203125 -0.703125 -0.515625 -1.109375q-0.3125 -0.40625 -0.890625 -0.640625q-0.578125 -0.25 -1.28125 -0.25q-0.84375 0 -1.46875 0.265625q-0.609375 0.25 -0.984375 0.671875q-0.375 0.40625 -0.59375 0.90625q-0.34375 0.875 -0.34375 1.875q0 1.25 0.421875 2.09375q0.421875 0.828125 1.234375 1.234375q0.828125 0.40625 1.75 0.40625q0.796875 0 1.5625 -0.296875q0.765625 -0.3125 1.15625 -0.671875l0 -1.734375l-2.734375 0zm5.445177 0.28125q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.6312256 3.375l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm2.570465 -3.375q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m256.89383 64.74822l121.76376 0l0 29.07087l-121.76376 0z" fill-rule="nonzero"></path><path fill="#000000" d="m265.8782 86.548225l3.578125 -9.3125l1.3125 0l3.8125 9.3125l-1.40625 0l-1.078125 -2.8125l-3.890625 0l-1.03125 2.8125l-1.296875 0zm2.6875 -3.828125l3.15625 0l-0.984375 -2.578125q-0.4375 -1.171875 -0.65625 -1.921875q-0.171875 0.890625 -0.5 1.78125l-1.015625 2.71875zm11.45224 3.828125l0 -0.84375q-0.640625 1.0 -1.890625 1.0q-0.796875 0 -1.484375 -0.4375q-0.671875 -0.453125 -1.046875 -1.25q-0.375 -0.796875 -0.375 -1.828125q0 -1.015625 0.34375 -1.828125q0.34375 -0.828125 1.015625 -1.265625q0.671875 -0.4375 1.5 -0.4375q0.609375 0 1.078125 0.265625q0.484375 0.25 0.78125 0.65625l0 -3.34375l1.140625 0l0 9.3125l-1.0625 0zm-3.609375 -3.359375q0 1.296875 0.53125 1.9375q0.546875 0.640625 1.296875 0.640625q0.75 0 1.265625 -0.609375q0.53125 -0.625 0.53125 -1.875q0 -1.390625 -0.53125 -2.03125q-0.53125 -0.65625 -1.3125 -0.65625q-0.765625 0 -1.28125 0.625q-0.5 0.625 -0.5 1.96875zm11.021851 3.359375l0 -0.84375q-0.640625 1.0 -1.890625 1.0q-0.796875 0 -1.484375 -0.4375q-0.671875 -0.453125 -1.046875 -1.25q-0.375 -0.796875 -0.375 -1.828125q0 -1.015625 0.34375 -1.828125q0.34375 -0.828125 1.015625 -1.265625q0.671875 -0.4375 1.5 -0.4375q0.609375 0 1.078125 0.265625q0.484375 0.25 0.78125 0.65625l0 -3.34375l1.140625 0l0 9.3125l-1.0625 0zm-3.609375 -3.359375q0 1.296875 0.53125 1.9375q0.546875 0.640625 1.296875 0.640625q0.75 0 1.265625 -0.609375q0.53125 -0.625 0.53125 -1.875q0 -1.390625 -0.53125 -2.03125q-0.53125 -0.65625 -1.3125 -0.65625q-0.765625 0 -1.28125 0.625q-0.5 0.625 -0.5 1.96875zm6.9437256 3.359375l0 -1.296875l1.296875 0l0 1.296875q0 0.71875 -0.25 1.15625q-0.25 0.4375 -0.8125 0.6875l-0.3125 -0.484375q0.359375 -0.171875 0.53125 -0.484375q0.171875 -0.296875 0.1875 -0.875l-0.640625 0zm11.4841 0l0 -0.84375q-0.640625 1.0 -1.890625 1.0q-0.796875 0 -1.484375 -0.4375q-0.671875 -0.453125 -1.046875 -1.25q-0.375 -0.796875 -0.375 -1.828125q0 -1.015625 0.34375 -1.828125q0.34375 -0.828125 1.015625 -1.265625q0.671875 -0.4375 1.5 -0.4375q0.609375 0 1.078125 0.265625q0.484375 0.25 0.78125 0.65625l0 -3.34375l1.140625 0l0 9.3125l-1.0625 0zm-3.609375 -3.359375q0 1.296875 0.53125 1.9375q0.546875 0.640625 1.296875 0.640625q0.75 0 1.265625 -0.609375q0.53125 -0.625 0.53125 -1.875q0 -1.390625 -0.53125 -2.03125q-0.53125 -0.65625 -1.3125 -0.65625q-0.765625 0 -1.28125 0.625q-0.5 0.625 -0.5 1.96875zm11.256226 1.1875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.5218506 4.015625l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm7.601715 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm9.053101 3.0l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.812378 -1.15625l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.8499756 4.015625l0 -1.296875l1.296875 0l0 1.296875q0 0.71875 -0.25 1.15625q-0.25 0.4375 -0.8125 0.6875l-0.3125 -0.484375q0.359375 -0.171875 0.53125 -0.484375q0.171875 -0.296875 0.1875 -0.875l-0.640625 0zm7.0934753 0l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm9.0633545 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm10.928101 4.015625l0 -0.84375q-0.640625 1.0 -1.890625 1.0q-0.796875 0 -1.484375 -0.4375q-0.671875 -0.453125 -1.046875 -1.25q-0.375 -0.796875 -0.375 -1.828125q0 -1.015625 0.34375 -1.828125q0.34375 -0.828125 1.015625 -1.265625q0.671875 -0.4375 1.5 -0.4375q0.609375 0 1.078125 0.265625q0.484375 0.25 0.78125 0.65625l0 -3.34375l1.140625 0l0 9.3125l-1.0625 0zm-3.609375 -3.359375q0 1.296875 0.53125 1.9375q0.546875 0.640625 1.296875 0.640625q0.75 0 1.265625 -0.609375q0.53125 -0.625 0.53125 -1.875q0 -1.390625 -0.53125 -2.03125q-0.53125 -0.65625 -1.3125 -0.65625q-0.765625 0 -1.28125 0.625q-0.5 0.625 -0.5 1.96875zm6.2249756 -0.015625q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375z" fill-rule="nonzero"></path><path fill="#000000" d="m269.2532 101.5326l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.5935974 0.1875q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm2.6624756 1.375l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625zm7.1171875 2.015625l0 -9.3125l1.140625 0l0 5.3125l2.703125 -2.734375l1.484375 0l-2.578125 2.5l2.84375 4.234375l-1.40625 0l-2.234375 -3.453125l-0.8125 0.78125l0 2.671875l-1.140625 0zm6.2109375 -2.015625l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m535.1826 125.79086l8.692932 -9.039459l0 4.346451l0 0c10.374512 -0.84072876 18.934692 -3.1356812 23.202026 -6.2203827c4.0509644 2.9282684 3.8136597 6.2664185 -0.649353 9.135063c-4.4630737 2.8686523 -12.704285 4.9801407 -22.552673 5.7782364l0 4.346451z" fill-rule="nonzero"></path><path fill="#a5b4c2" d="m569.9543 119.22393c0 -6.027298 -15.56781 -10.9133835 -34.771667 -10.9133835l0 -8.692917l0 0c19.203857 0 34.771667 4.886093 34.771667 10.9133835z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m569.9543 119.22393c0 -6.027298 -15.56781 -10.9133835 -34.771667 -10.9133835l0 -8.692917l0 0c19.203857 0 34.771667 4.886093 34.771667 10.9133835l0 8.692917c0 4.976486 -10.72644 9.322716 -26.078735 10.566841l0 4.346451l-8.692932 -8.346359l8.692932 -9.039459l0 4.346451l0 0c10.374512 -0.84072876 18.934692 -3.1356812 23.202026 -6.2203827" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m569.9543 119.22393c0 -6.027298 -15.56781 -10.9133835 -34.771667 -10.9133835l0 -8.692917l0 0c19.203857 0 34.771667 4.886093 34.771667 10.9133835l0 8.692917c0 4.976486 -10.72644 9.322716 -26.078735 10.566841l0 4.346451l-8.692932 -8.346359l8.692932 -9.039459l0 4.346451l0 0c10.374512 -0.84072876 18.934692 -3.1356812 23.202026 -6.2203827" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m575.7664 111.24077l110.17322 0l0 29.070862l-110.17322 0z" fill-rule="nonzero"></path><path fill="#000000" d="m592.8289 132.04077q0.84375 0.59375 1.578125 0.859375l-0.359375 0.859375q-1.015625 -0.359375 -2.0 -1.140625q-1.046875 0.578125 -2.296875 0.578125q-1.265625 0 -2.296875 -0.609375q-1.015625 -0.609375 -1.578125 -1.703125q-0.546875 -1.109375 -0.546875 -2.5q0 -1.3750076 0.546875 -2.5000076q0.5625 -1.140625 1.59375 -1.71875q1.03125 -0.59375 2.3125 -0.59375q1.28125 0 2.3125 0.609375q1.046875 0.609375 1.578125 1.71875q0.546875 1.09375 0.546875 2.4843826q0 1.140625 -0.34375 2.0625q-0.34375 0.921875 -1.046875 1.59375zm-2.71875 -1.578125q1.0625 0.3125 1.765625 0.890625q1.078125 -0.984375 1.078125 -2.96875q0 -1.1406326 -0.390625 -1.9843826q-0.375 -0.84375 -1.125 -1.296875q-0.734375 -0.46875 -1.65625 -0.46875q-1.375 0 -2.28125 0.9375q-0.90625 0.9375 -0.90625 2.8125076q0 1.8125 0.890625 2.796875q0.90625 0.96875 2.296875 0.96875q0.671875 0 1.25 -0.25q-0.578125 -0.375 -1.21875 -0.53125l0.296875 -0.90625zm10.304565 2.578125l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.1718826l1.140625 0l0 3.7343826q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.6093826l1.140625 0l0 6.7343826l-1.015625 0zm7.5999756 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.6406326q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.5781326q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.2812576q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.5156326 -0.59375 1.4062576zm10.974976 4.015625l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.1718826l1.140625 0l0 3.7343826q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.6093826l1.140625 0l0 6.7343826l-1.015625 0zm7.5999756 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.6406326q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.5781326q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.2812576q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.5156326 -0.59375 1.4062576z" fill-rule="nonzero"></path><path fill="#000000" d="m585.61017 149.04077l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm9.0633545 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.5531006 6.59375l0 -9.3125l1.03125 0l0 0.875q0.375 -0.515625 0.828125 -0.765625q0.46875 -0.265625 1.140625 -0.265625q0.859375 0 1.515625 0.453125q0.65625 0.4375 0.984375 1.25q0.34375 0.796875 0.34375 1.765625q0 1.03125 -0.375 1.859375q-0.359375 0.828125 -1.078125 1.28125q-0.703125 0.4375 -1.484375 0.4375q-0.5625 0 -1.015625 -0.234375q-0.453125 -0.25 -0.75 -0.625l0 3.28125l-1.140625 0zm1.03125 -5.90625q0 1.296875 0.53125 1.921875q0.53125 0.625 1.265625 0.625q0.765625 0 1.3125 -0.640625q0.546875 -0.65625 0.546875 -2.0q0 -1.296875 -0.53125 -1.9375q-0.53125 -0.640625 -1.265625 -0.640625q-0.734375 0 -1.296875 0.6875q-0.5625 0.671875 -0.5625 1.984375zm10.990601 1.15625l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm10.943726 3.1875q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm5.6156006 2.375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.812378 -1.15625l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm10.928101 4.015625l0 -0.84375q-0.640625 1.0 -1.890625 1.0q-0.796875 0 -1.484375 -0.4375q-0.671875 -0.453125 -1.046875 -1.25q-0.375 -0.796875 -0.375 -1.828125q0 -1.015625 0.34375 -1.828125q0.34375 -0.828125 1.015625 -1.265625q0.671875 -0.4375 1.5 -0.4375q0.609375 0 1.078125 0.265625q0.484375 0.25 0.78125 0.65625l0 -3.34375l1.140625 0l0 9.3125l-1.0625 0zm-3.609375 -3.359375q0 1.296875 0.53125 1.9375q0.546875 0.640625 1.296875 0.640625q0.75 0 1.265625 -0.609375q0.53125 -0.625 0.53125 -1.875q0 -1.390625 -0.53125 -2.03125q-0.53125 -0.65625 -1.3125 -0.65625q-0.765625 0 -1.28125 0.625q-0.5 0.625 -0.5 1.96875zm12.8498535 2.34375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.593567 0.1875q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm2.6624756 1.375l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625zm7.1171875 2.015625l0 -9.3125l1.140625 0l0 5.3125l2.703125 -2.734375l1.484375 0l-2.578125 2.5l2.84375 4.234375l-1.40625 0l-2.234375 -3.453125l-0.8125 0.78125l0 2.671875l-1.140625 0zm6.2109375 -2.015625l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m384.44284 128.67548l144.94492 0l0 23.244095l-144.94492 0z" fill-rule="nonzero"></path><path fill="#000000" d="m401.08347 147.20984l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm5.3595276 3.265625l0 -8.203125l-3.0625 0l0 -1.109375l7.375 0l0 1.109375l-3.078125 0l0 8.203125l-1.234375 0zm9.53186 0l0 -9.3125l6.28125 0l0 1.109375l-5.046875 0l0 2.875l4.375 0l0 1.09375l-4.375 0l0 4.234375l-1.234375 0zm7.9226074 0l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm4.0321045 -3.375q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.6624756 3.375l0 -6.734375l1.03125 0l0 0.953125q0.734375 -1.109375 2.140625 -1.109375q0.609375 0 1.109375 0.21875q0.515625 0.21875 0.765625 0.578125q0.265625 0.34375 0.359375 0.84375q0.0625 0.3125 0.0625 1.109375l0 4.140625l-1.140625 0l0 -4.09375q0 -0.703125 -0.140625 -1.046875q-0.125 -0.34375 -0.46875 -0.546875q-0.328125 -0.21875 -0.78125 -0.21875q-0.734375 0 -1.265625 0.46875q-0.53125 0.453125 -0.53125 1.75l0 3.6875l-1.140625 0zm9.912476 -1.015625l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.812378 -1.15625l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.5531006 4.015625l0 -6.734375l1.03125 0l0 0.953125q0.734375 -1.109375 2.140625 -1.109375q0.609375 0 1.109375 0.21875q0.515625 0.21875 0.765625 0.578125q0.265625 0.34375 0.359375 0.84375q0.0625 0.3125 0.0625 1.109375l0 4.140625l-1.140625 0l0 -4.09375q0 -0.703125 -0.140625 -1.046875q-0.125 -0.34375 -0.46875 -0.546875q-0.328125 -0.21875 -0.78125 -0.21875q-0.734375 0 -1.265625 0.46875q-0.53125 0.453125 -0.53125 1.75l0 3.6875l-1.140625 0zm11.787476 0l0 -0.84375q-0.640625 1.0 -1.890625 1.0q-0.796875 0 -1.484375 -0.4375q-0.671875 -0.453125 -1.046875 -1.25q-0.375 -0.796875 -0.375 -1.828125q0 -1.015625 0.34375 -1.828125q0.34375 -0.828125 1.015625 -1.265625q0.671875 -0.4375 1.5 -0.4375q0.609375 0 1.078125 0.265625q0.484375 0.25 0.78125 0.65625l0 -3.34375l1.140625 0l0 9.3125l-1.0625 0zm-3.609375 -3.359375q0 1.296875 0.53125 1.9375q0.546875 0.640625 1.296875 0.640625q0.75 0 1.265625 -0.609375q0.53125 -0.625 0.53125 -1.875q0 -1.390625 -0.53125 -2.03125q-0.53125 -0.65625 -1.3125 -0.65625q-0.765625 0 -1.28125 0.625q-0.5 0.625 -0.5 1.96875z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m335.40323 279.56268l124.409454 -123.33858" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m335.40323 279.56268l115.88757 -114.89006" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m453.61658 167.0186l4.1197205 -8.736008l-8.771301 4.044052z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m402.2914 195.39896l153.98422 0l0 34.866135l-153.98422 0z" fill-rule="nonzero"></path><path fill="#000000" d="m412.2914 217.19894l0 -9.3125l3.515625 0q0.921875 0 1.40625 0.09375q0.6875 0.109375 1.15625 0.4375q0.46875 0.3125 0.75 0.890625q0.28125 0.578125 0.28125 1.28125q0 1.1875 -0.765625 2.015625q-0.75 0.8125 -2.71875 0.8125l-2.390625 0l0 3.78125l-1.234375 0zm1.234375 -4.875l2.40625 0q1.1875 0 1.6875 -0.4375q0.515625 -0.453125 0.515625 -1.265625q0 -0.578125 -0.296875 -0.984375q-0.296875 -0.421875 -0.78125 -0.5625q-0.3125 -0.078125 -1.15625 -0.078125l-2.375 0l0 3.328125zm7.092865 1.5q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.6312256 3.375l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm2.96109 0l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm6.960968 0l0 -5.859375l-1.0 0l0 -0.875l1.0 0l0 -0.71875q0 -0.6875 0.125 -1.015625q0.171875 -0.4375 0.578125 -0.71875q0.421875 -0.28125 1.171875 -0.28125q0.484375 0 1.0625 0.125l-0.171875 0.984375q-0.359375 -0.0625 -0.671875 -0.0625q-0.515625 0 -0.734375 0.234375q-0.21875 0.21875 -0.21875 0.828125l0 0.625l1.3125 0l0 0.875l-1.3125 0l0 5.859375l-1.140625 0zm3.0154724 -3.375q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.6468506 3.375l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm8.156982 0l0 -6.734375l1.03125 0l0 0.953125q0.734375 -1.109375 2.140625 -1.109375q0.609375 0 1.109375 0.21875q0.515625 0.21875 0.765625 0.578125q0.265625 0.34375 0.359375 0.84375q0.0625 0.3125 0.0625 1.109375l0 4.140625l-1.140625 0l0 -4.09375q0 -0.703125 -0.140625 -1.046875q-0.125 -0.34375 -0.46875 -0.546875q-0.328125 -0.21875 -0.78125 -0.21875q-0.734375 0 -1.265625 0.46875q-0.53125 0.453125 -0.53125 1.75l0 3.6875l-1.140625 0zm12.021851 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm7.7874756 4.015625l-2.0625 -6.734375l1.1875 0l1.078125 3.890625l0.390625 1.4375q0.03125 -0.109375 0.359375 -1.390625l1.0625 -3.9375l1.171875 0l1.015625 3.90625l0.34375 1.28125l0.375 -1.296875l1.15625 -3.890625l1.109375 0l-2.109375 6.734375l-1.171875 0l-1.078125 -4.03125l-0.265625 -1.15625l-1.359375 5.1875l-1.203125 0zm14.5937805 -1.015625l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.5935974 0.1875q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm2.6624756 1.375l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625zm7.1171875 2.015625l0 -9.3125l1.140625 0l0 5.3125l2.703125 -2.734375l1.484375 0l-2.578125 2.5l2.84375 4.234375l-1.40625 0l-2.234375 -3.453125l-0.8125 0.78125l0 2.671875l-1.140625 0zm6.2109375 -2.015625l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.2187805 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.2500305 -0.3125 -1.7344055 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0000305 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.7812805 0 -1.1250305 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.0156555 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125305 0 -2.0000305 -0.546875q-0.6875 -0.546875 -0.875 -1.625z" fill-rule="nonzero"></path><path fill="#000000" d="m418.4008 223.88644l1.234375 0l0 5.390625q0 1.390625 -0.328125 2.21875q-0.3125 0.828125 -1.140625 1.34375q-0.828125 0.515625 -2.171875 0.515625q-1.3125 0 -2.140625 -0.453125q-0.828125 -0.453125 -1.1875 -1.296875q-0.359375 -0.859375 -0.359375 -2.328125l0 -5.390625l1.234375 0l0 5.375q0 1.21875 0.21875 1.796875q0.234375 0.5625 0.78125 0.875q0.546875 0.3125 1.34375 0.3125q1.359375 0 1.9375 -0.609375q0.578125 -0.625 0.578125 -2.375l0 -5.375zm3.3751526 11.890625l0 -9.3125l1.03125 0l0 0.875q0.375 -0.515625 0.828125 -0.765625q0.46875 -0.265625 1.140625 -0.265625q0.859375 0 1.515625 0.453125q0.65625 0.4375 0.984375 1.25q0.34375 0.796875 0.34375 1.765625q0 1.03125 -0.375 1.859375q-0.359375 0.828125 -1.078125 1.28125q-0.703125 0.4375 -1.484375 0.4375q-0.5625 0 -1.015625 -0.234375q-0.453125 -0.25 -0.75 -0.625l0 3.28125l-1.140625 0zm1.03125 -5.90625q0 1.296875 0.53125 1.921875q0.53125 0.625 1.265625 0.625q0.765625 0 1.3125 -0.640625q0.546875 -0.65625 0.546875 -2.0q0 -1.296875 -0.53125 -1.9375q-0.53125 -0.640625 -1.265625 -0.640625q-0.734375 0 -1.296875 0.6875q-0.5625 0.671875 -0.5625 1.984375zm10.756226 3.328125l0 -0.84375q-0.640625 1.0 -1.890625 1.0q-0.796875 0 -1.484375 -0.4375q-0.671875 -0.453125 -1.046875 -1.25q-0.375 -0.796875 -0.375 -1.828125q0 -1.015625 0.34375 -1.828125q0.34375 -0.828125 1.015625 -1.265625q0.671875 -0.4375 1.5 -0.4375q0.609375 0 1.078125 0.265625q0.484375 0.25 0.78125 0.65625l0 -3.34375l1.140625 0l0 9.3125l-1.0625 0zm-3.609375 -3.359375q0 1.296875 0.53125 1.9375q0.546875 0.640625 1.296875 0.640625q0.75 0 1.265625 -0.609375q0.53125 -0.625 0.53125 -1.875q0 -1.390625 -0.53125 -2.03125q-0.53125 -0.65625 -1.3125 -0.65625q-0.765625 0 -1.28125 0.625q-0.5 0.625 -0.5 1.96875zm11.037476 2.53125q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm5.6156006 2.375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.8123474 -1.15625l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm11.4904785 4.015625l-2.0625 -6.734375l1.1875 0l1.078125 3.890625l0.390625 1.4375q0.03125 -0.109375 0.359375 -1.390625l1.0625 -3.9375l1.171875 0l1.015625 3.90625l0.34375 1.28125l0.375 -1.296875l1.15625 -3.890625l1.109375 0l-2.109375 6.734375l-1.171875 0l-1.078125 -4.03125l-0.265625 -1.15625l-1.359375 5.1875l-1.203125 0zm8.390778 -7.984375l0 -1.328125l1.140625 0l0 1.328125l-1.140625 0zm0 7.984375l0 -6.734375l1.140625 0l0 6.734375l-1.140625 0zm5.46109 -1.015625l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm1.2029724 1.015625l0 -9.3125l1.140625 0l0 3.34375q0.796875 -0.921875 2.015625 -0.921875q0.75 0 1.296875 0.296875q0.5625 0.296875 0.796875 0.8125q0.234375 0.515625 0.234375 1.515625l0 4.265625l-1.140625 0l0 -4.265625q0 -0.859375 -0.375 -1.25q-0.359375 -0.390625 -1.046875 -0.390625q-0.5 0 -0.953125 0.265625q-0.453125 0.25 -0.640625 0.703125q-0.1875 0.453125 -0.1875 1.25l0 3.6875l-1.140625 0zm11.0998535 0l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm9.0633545 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.0999756 2.0l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625zm11.5390625 2.015625l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.171875l1.140625 0l0 3.734375q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.609375l1.140625 0l0 6.734375l-1.015625 0zm2.9593506 0l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm5.4923706 -1.015625l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm0.7498169 -1.0l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m251.09613 296.99576l133.74805 0l0 52.299225l-133.74805 0z" fill-rule="nonzero"></path><path fill="#a5b4c2" d="m384.84418 296.99576l17.433044 -17.433075l0 52.299225l-17.433044 17.433075z" fill-rule="nonzero"></path><path fill="#d8e7f5" d="m251.09613 296.99576l17.433075 -17.433075l133.74802 0l-17.433044 17.433075z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m251.09613 296.99576l17.433075 -17.433075l133.74802 0l0 52.299225l-17.433044 17.433075l-133.74805 0zm0 0l133.74805 0l17.433044 -17.433075m-17.433044 17.433075l0 52.299225" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m251.09613 296.99576l17.433075 -17.433075l133.74802 0l0 52.299225l-17.433044 17.433075l-133.74805 0zm0 0l133.74805 0l17.433044 -17.433075m-17.433044 17.433075l0 52.299225" fill-rule="nonzero"></path><path fill="#000000" d="m294.5096 315.53012l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm5.3595276 3.265625l0 -8.203125l-3.0625 0l0 -1.109375l7.375 0l0 1.109375l-3.078125 0l0 8.203125l-1.234375 0zm9.43811 0l0 -9.3125l1.84375 0l2.203125 6.59375q0.3125 0.921875 0.453125 1.375q0.15625 -0.5 0.484375 -1.484375l2.234375 -6.484375l1.65625 0l0 9.3125l-1.1875 0l0 -7.78125l-2.703125 7.78125l-1.109375 0l-2.6875 -7.921875l0 7.921875l-1.1875 0zm15.383667 -0.828125q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm2.6624756 1.375l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625zm9.6171875 1.0l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.812378 -1.15625l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.5374756 4.015625l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0z" fill-rule="nonzero"></path><path fill="#000000" d="m297.7147 326.81137l0 -1.328125l1.140625 0l0 1.328125l-1.140625 0zm0 7.984375l0 -6.734375l1.140625 0l0 6.734375l-1.140625 0zm2.96109 0l0 -6.734375l1.03125 0l0 0.953125q0.734375 -1.109375 2.140625 -1.109375q0.609375 0 1.109375 0.21875q0.515625 0.21875 0.765625 0.578125q0.265625 0.34375 0.359375 0.84375q0.0625 0.3125 0.0625 1.109375l0 4.140625l-1.140625 0l0 -4.09375q0 -0.703125 -0.140625 -1.046875q-0.125 -0.34375 -0.46875 -0.546875q-0.328125 -0.21875 -0.78125 -0.21875q-0.734375 0 -1.265625 0.46875q-0.53125 0.453125 -0.53125 1.75l0 3.6875l-1.140625 0zm15.6154785 -3.65625l0 -1.078125l3.9375 -0.015625l0 3.453125q-0.90625 0.71875 -1.875 1.09375q-0.953125 0.359375 -1.96875 0.359375q-1.375 0 -2.5 -0.578125q-1.125 -0.59375 -1.703125 -1.703125q-0.5625 -1.109375 -0.5625 -2.484375q0 -1.359375 0.5625 -2.53125q0.578125 -1.1875 1.640625 -1.75q1.078125 -0.578125 2.453125 -0.578125q1.015625 0 1.828125 0.328125q0.8125 0.328125 1.28125 0.921875q0.46875 0.578125 0.703125 1.515625l-1.109375 0.296875q-0.203125 -0.703125 -0.515625 -1.109375q-0.3125 -0.40625 -0.890625 -0.640625q-0.578125 -0.25 -1.28125 -0.25q-0.84375 0 -1.46875 0.265625q-0.609375 0.25 -0.984375 0.671875q-0.375 0.40625 -0.59375 0.90625q-0.34375 0.875 -0.34375 1.875q0 1.25 0.421875 2.09375q0.421875 0.828125 1.234375 1.234375q0.828125 0.40625 1.75 0.40625q0.796875 0 1.5625 -0.296875q0.765625 -0.3125 1.15625 -0.671875l0 -1.734375l-2.734375 0zm5.44516 0.28125q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.6312256 3.375l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm2.570465 -3.375q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m52.205914 512.2373l57.905514 0l0 52.299194l-57.905514 0z" fill-rule="nonzero"></path><path fill="#a5b4c2" d="m110.11143 512.2373l17.433067 -17.433075l0 52.299225l-17.433067 17.433044z" fill-rule="nonzero"></path><path fill="#d8e7f5" d="m52.205914 512.2373l17.433071 -17.433075l57.90551 0l-17.433067 17.433075z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m52.205914 512.2373l17.433071 -17.433075l57.90551 0l0 52.299225l-17.433067 17.433044l-57.905514 0zm0 0l57.905514 0l17.433067 -17.433075m-17.433067 17.433075l0 52.299194" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m52.205914 512.2373l17.433071 -17.433075l57.90551 0l0 52.299225l-17.433067 17.433044l-57.905514 0zm0 0l57.905514 0l17.433067 -17.433075m-17.433067 17.433075l0 52.299194" fill-rule="nonzero"></path><path fill="#000000" d="m79.91604 530.77167l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm5.3595276 3.265625l0 -8.203125l-3.0625 0l0 -1.109375l7.375 0l0 1.109375l-3.078125 0l0 8.203125l-1.234375 0z" fill-rule="nonzero"></path><path fill="#000000" d="m72.109184 550.0373l0 -9.3125l3.484375 0q1.078125 0 1.71875 0.296875q0.640625 0.28125 1.0 0.875q0.375 0.578125 0.375 1.21875q0 0.59375 -0.328125 1.125q-0.328125 0.515625 -0.96875 0.84375q0.84375 0.25 1.296875 0.84375q0.453125 0.59375 0.453125 1.40625q0 0.65625 -0.28125 1.21875q-0.28125 0.5625 -0.6875 0.875q-0.40625 0.296875 -1.015625 0.453125q-0.609375 0.15625 -1.5 0.15625l-3.546875 0zm1.234375 -5.390625l2.015625 0q0.8125 0 1.171875 -0.109375q0.46875 -0.140625 0.703125 -0.46875q0.234375 -0.328125 0.234375 -0.8125q0 -0.46875 -0.21875 -0.8125q-0.21875 -0.359375 -0.640625 -0.484375q-0.40625 -0.125 -1.40625 -0.125l-1.859375 0l0 2.8125zm0 4.296875l2.3125 0q0.59375 0 0.84375 -0.046875q0.421875 -0.078125 0.703125 -0.25q0.28125 -0.1875 0.46875 -0.515625q0.1875 -0.34375 0.1875 -0.796875q0 -0.515625 -0.265625 -0.890625q-0.265625 -0.390625 -0.75 -0.546875q-0.46875 -0.15625 -1.359375 -0.15625l-2.140625 0l0 3.203125zm7.1397552 -2.28125q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm9.162476 2.359375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m133.37349 512.2373l57.905502 0l0 52.299194l-57.905502 0z" fill-rule="nonzero"></path><path fill="#a5b4c2" d="m191.27899 512.2373l17.433075 -17.433075l0 52.299225l-17.433075 17.433044z" fill-rule="nonzero"></path><path fill="#d8e7f5" d="m133.37349 512.2373l17.43306 -17.433075l57.905518 0l-17.433075 17.433075z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m133.37349 512.2373l17.43306 -17.433075l57.905518 0l0 52.299225l-17.433075 17.433044l-57.905502 0zm0 0l57.905502 0l17.433075 -17.433075m-17.433075 17.433075l0 52.299194" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m133.37349 512.2373l17.43306 -17.433075l57.905518 0l0 52.299225l-17.433075 17.433044l-57.905502 0zm0 0l57.905502 0l17.433075 -17.433075m-17.433075 17.433075l0 52.299194" fill-rule="nonzero"></path><path fill="#000000" d="m161.0836 530.77167l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm5.3595276 3.265625l0 -8.203125l-3.0625 0l0 -1.109375l7.375 0l0 1.109375l-3.078125 0l0 8.203125l-1.234375 0z" fill-rule="nonzero"></path><path fill="#000000" d="m153.27675 550.0373l0 -9.3125l3.484375 0q1.078125 0 1.71875 0.296875q0.640625 0.28125 1.0 0.875q0.375 0.578125 0.375 1.21875q0 0.59375 -0.328125 1.125q-0.328125 0.515625 -0.96875 0.84375q0.84375 0.25 1.296875 0.84375q0.453125 0.59375 0.453125 1.40625q0 0.65625 -0.28125 1.21875q-0.28125 0.5625 -0.6875 0.875q-0.40625 0.296875 -1.015625 0.453125q-0.609375 0.15625 -1.5 0.15625l-3.546875 0zm1.234375 -5.390625l2.015625 0q0.8125 0 1.171875 -0.109375q0.46875 -0.140625 0.703125 -0.46875q0.234375 -0.328125 0.234375 -0.8125q0 -0.46875 -0.21875 -0.8125q-0.21875 -0.359375 -0.640625 -0.484375q-0.40625 -0.125 -1.40625 -0.125l-1.859375 0l0 2.8125zm0 4.296875l2.3125 0q0.59375 0 0.84375 -0.046875q0.421875 -0.078125 0.703125 -0.25q0.28125 -0.1875 0.46875 -0.515625q0.1875 -0.34375 0.1875 -0.796875q0 -0.515625 -0.265625 -0.890625q-0.265625 -0.390625 -0.75 -0.546875q-0.46875 -0.15625 -1.359375 -0.15625l-2.140625 0l0 3.203125zm7.1397552 -2.28125q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm9.162476 2.359375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m214.54106 512.2373l57.905502 0l0 52.299194l-57.905502 0z" fill-rule="nonzero"></path><path fill="#a5b4c2" d="m272.44656 512.2373l17.433075 -17.433075l0 52.299225l-17.433075 17.433044z" fill-rule="nonzero"></path><path fill="#d8e7f5" d="m214.54106 512.2373l17.43306 -17.433075l57.905518 0l-17.433075 17.433075z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m214.54106 512.2373l17.43306 -17.433075l57.905518 0l0 52.299225l-17.433075 17.433044l-57.905502 0zm0 0l57.905502 0l17.433075 -17.433075m-17.433075 17.433075l0 52.299194" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m214.54106 512.2373l17.43306 -17.433075l57.905518 0l0 52.299225l-17.433075 17.433044l-57.905502 0zm0 0l57.905502 0l17.433075 -17.433075m-17.433075 17.433075l0 52.299194" fill-rule="nonzero"></path><path fill="#000000" d="m242.25117 530.77167l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm5.3595276 3.265625l0 -8.203125l-3.0625 0l0 -1.109375l7.375 0l0 1.109375l-3.078125 0l0 8.203125l-1.234375 0z" fill-rule="nonzero"></path><path fill="#000000" d="m234.44432 550.0373l0 -9.3125l3.484375 0q1.078125 0 1.71875 0.296875q0.640625 0.28125 1.0 0.875q0.375 0.578125 0.375 1.21875q0 0.59375 -0.328125 1.125q-0.328125 0.515625 -0.96875 0.84375q0.84375 0.25 1.296875 0.84375q0.453125 0.59375 0.453125 1.40625q0 0.65625 -0.28125 1.21875q-0.28125 0.5625 -0.6875 0.875q-0.40625 0.296875 -1.015625 0.453125q-0.609375 0.15625 -1.5 0.15625l-3.546875 0zm1.234375 -5.390625l2.015625 0q0.8125 0 1.171875 -0.109375q0.46875 -0.140625 0.703125 -0.46875q0.234375 -0.328125 0.234375 -0.8125q0 -0.46875 -0.21875 -0.8125q-0.21875 -0.359375 -0.640625 -0.484375q-0.40625 -0.125 -1.40625 -0.125l-1.859375 0l0 2.8125zm0 4.296875l2.3125 0q0.59375 0 0.84375 -0.046875q0.421875 -0.078125 0.703125 -0.25q0.28125 -0.1875 0.46875 -0.515625q0.1875 -0.34375 0.1875 -0.796875q0 -0.515625 -0.265625 -0.890625q-0.265625 -0.390625 -0.75 -0.546875q-0.46875 -0.15625 -1.359375 -0.15625l-2.140625 0l0 3.203125zm7.1397552 -2.28125q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm9.162476 2.359375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m289.91095 500.6158l40.59842 0l0 40.661407l-40.59842 0z" fill-rule="nonzero"></path><path fill="#000000" d="m302.64532 540.3358l0 -3.203125l3.203125 0l0 3.203125l-3.203125 0zm10.671875 0l0 -3.203125l3.203125 0l0 3.203125l-3.203125 0zm10.65625 0l0 -3.203125l3.21875 0l0 3.203125l-3.21875 0z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m330.49472 512.2373l57.905518 0l0 52.299194l-57.905518 0z" fill-rule="nonzero"></path><path fill="#a5b4c2" d="m388.40024 512.2373l17.433075 -17.433075l0 52.299225l-17.433075 17.433044z" fill-rule="nonzero"></path><path fill="#d8e7f5" d="m330.49472 512.2373l17.433075 -17.433075l57.905518 0l-17.433075 17.433075z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m330.49472 512.2373l17.433075 -17.433075l57.905518 0l0 52.299225l-17.433075 17.433044l-57.905518 0zm0 0l57.905518 0l17.433075 -17.433075m-17.433075 17.433075l0 52.299194" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m330.49472 512.2373l17.433075 -17.433075l57.905518 0l0 52.299225l-17.433075 17.433044l-57.905518 0zm0 0l57.905518 0l17.433075 -17.433075m-17.433075 17.433075l0 52.299194" fill-rule="nonzero"></path><path fill="#000000" d="m358.20486 530.77167l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm5.3595276 3.265625l0 -8.203125l-3.0625 0l0 -1.109375l7.375 0l0 1.109375l-3.078125 0l0 8.203125l-1.234375 0z" fill-rule="nonzero"></path><path fill="#000000" d="m350.398 550.0373l0 -9.3125l3.484375 0q1.078125 0 1.71875 0.296875q0.640625 0.28125 1.0 0.875q0.375 0.578125 0.375 1.21875q0 0.59375 -0.328125 1.125q-0.328125 0.515625 -0.96875 0.84375q0.84375 0.25 1.296875 0.84375q0.453125 0.59375 0.453125 1.40625q0 0.65625 -0.28125 1.21875q-0.28125 0.5625 -0.6875 0.875q-0.40625 0.296875 -1.015625 0.453125q-0.609375 0.15625 -1.5 0.15625l-3.546875 0zm1.234375 -5.390625l2.015625 0q0.8125 0 1.171875 -0.109375q0.46875 -0.140625 0.703125 -0.46875q0.234375 -0.328125 0.234375 -0.8125q0 -0.46875 -0.21875 -0.8125q-0.21875 -0.359375 -0.640625 -0.484375q-0.40625 -0.125 -1.40625 -0.125l-1.859375 0l0 2.8125zm0 4.296875l2.3125 0q0.59375 0 0.84375 -0.046875q0.421875 -0.078125 0.703125 -0.25q0.28125 -0.1875 0.46875 -0.515625q0.1875 -0.34375 0.1875 -0.796875q0 -0.515625 -0.265625 -0.890625q-0.265625 -0.390625 -0.75 -0.546875q-0.46875 -0.15625 -1.359375 -0.15625l-2.140625 0l0 3.203125zm7.13974 -2.28125q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm9.162476 2.359375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m68.708664 575.5328l333.60632 0l0 17.417297l-333.60632 0z" fill-rule="nonzero"></path><path fill="#000000" d="m82.552414 596.75006l-1.140625 0l0 -7.28125q-0.421875 0.390625 -1.09375 0.796875q-0.65625 0.390625 -1.1875 0.578125l0 -1.109375q0.953125 -0.4375 1.671875 -1.078125q0.71875 -0.640625 1.015625 -1.25l0.734375 0l0 9.34375zm3.1156006 -4.59375q0 -1.640625 0.328125 -2.640625q0.34375 -1.015625 1.015625 -1.5625q0.671875 -0.546875 1.6875 -0.546875q0.75 0 1.3125 0.3125q0.5625 0.296875 0.921875 0.859375q0.375 0.5625 0.578125 1.390625q0.21875 0.8125 0.21875 2.1875q0 1.640625 -0.34375 2.65625q-0.328125 1.0 -1.0 1.546875q-0.671875 0.546875 -1.6875 0.546875q-1.34375 0 -2.125 -0.96875q-0.90625 -1.15625 -0.90625 -3.78125zm1.171875 0q0 2.296875 0.53125 3.0625q0.53125 0.75 1.328125 0.75q0.78125 0 1.3125 -0.75q0.546875 -0.765625 0.546875 -3.0625q0 -2.296875 -0.546875 -3.046875q-0.53125 -0.75 -1.328125 -0.75q-0.78125 0 -1.265625 0.65625q-0.578125 0.859375 -0.578125 3.140625zm6.2406006 0q0 -1.640625 0.328125 -2.640625q0.34375 -1.015625 1.015625 -1.5625q0.671875 -0.546875 1.6875 -0.546875q0.75 0 1.3125 0.3125q0.5625 0.296875 0.921875 0.859375q0.375 0.5625 0.578125 1.390625q0.21875 0.8125 0.21875 2.1875q0 1.640625 -0.34375 2.65625q-0.328125 1.0 -1.0 1.546875q-0.671875 0.546875 -1.6875 0.546875q-1.34375 0 -2.125 -0.96875q-0.90625 -1.15625 -0.90625 -3.78125zm1.171875 0q0 2.296875 0.53125 3.0625q0.53125 0.75 1.328125 0.75q0.78125 0 1.3125 -0.75q0.546875 -0.765625 0.546875 -3.0625q0 -2.296875 -0.546875 -3.046875q-0.53125 -0.75 -1.328125 -0.75q-0.78125 0 -1.265625 0.65625q-0.578125 0.859375 -0.578125 3.140625zm13.599838 4.59375l0 -2.234375l-4.03125 0l0 -1.046875l4.234375 -6.03125l0.9375 0l0 6.03125l1.265625 0l0 1.046875l-1.265625 0l0 2.234375l-1.140625 0zm0 -3.28125l0 -4.1875l-2.921875 4.1875l2.921875 0zm8.459351 0.8125l1.125 0.140625q-0.171875 1.171875 -0.9375 1.828125q-0.765625 0.65625 -1.859375 0.65625q-1.390625 0 -2.234375 -0.90625q-0.828125 -0.90625 -0.828125 -2.59375q0 -1.09375 0.359375 -1.90625q0.359375 -0.828125 1.09375 -1.234375q0.734375 -0.40625 1.609375 -0.40625q1.09375 0 1.796875 0.5625q0.703125 0.546875 0.890625 1.5625l-1.109375 0.171875q-0.15625 -0.671875 -0.5625 -1.015625q-0.390625 -0.34375 -0.96875 -0.34375q-0.859375 0 -1.40625 0.625q-0.53125 0.609375 -0.53125 1.953125q0 1.359375 0.515625 1.984375q0.515625 0.609375 1.359375 0.609375q0.671875 0 1.125 -0.40625q0.453125 -0.421875 0.5625 -1.28125zm1.8515625 -0.90625q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.6468506 3.375l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm9.06337 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm11.302963 4.015625l-1.0625 0l0 -9.3125l1.15625 0l0 3.328125q0.71875 -0.90625 1.84375 -0.90625q0.625 0 1.171875 0.25q0.5625 0.25 0.921875 0.703125q0.359375 0.453125 0.5625 1.09375q0.203125 0.640625 0.203125 1.375q0 1.734375 -0.859375 2.6875q-0.859375 0.9375 -2.0625 0.9375q-1.1875 0 -1.875 -1.0l0 0.84375zm-0.015625 -3.421875q0 1.21875 0.34375 1.75q0.53125 0.890625 1.453125 0.890625q0.75 0 1.296875 -0.65625q0.546875 -0.65625 0.546875 -1.9375q0 -1.328125 -0.53125 -1.953125q-0.515625 -0.625 -1.265625 -0.625q-0.75 0 -1.296875 0.65625q-0.546875 0.640625 -0.546875 1.875zm10.771851 2.59375q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm3.0999756 3.390625l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm9.06337 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.0999756 1.21875l0 -1.140625l3.515625 0l0 1.140625l-3.515625 0zm4.8914948 2.796875l0 -6.734375l1.015625 0l0 0.9375q0.328125 -0.5 0.84375 -0.796875q0.53125 -0.296875 1.203125 -0.296875q0.75 0 1.21875 0.3125q0.484375 0.3125 0.6875 0.859375q0.796875 -1.171875 2.078125 -1.171875q1.0 0 1.53125 0.5625q0.546875 0.546875 0.546875 1.703125l0 4.625l-1.125 0l0 -4.25q0 -0.6875 -0.109375 -0.984375q-0.109375 -0.296875 -0.40625 -0.484375q-0.296875 -0.1875 -0.6875 -0.1875q-0.71875 0 -1.1875 0.484375q-0.46875 0.46875 -0.46875 1.5l0 3.921875l-1.140625 0l0 -4.375q0 -0.765625 -0.28125 -1.140625q-0.28125 -0.390625 -0.90625 -0.390625q-0.484375 0 -0.890625 0.265625q-0.40625 0.25 -0.59375 0.734375q-0.1875 0.484375 -0.1875 1.40625l0 3.5l-1.140625 0zm15.711807 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm9.053101 3.0l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.5936127 0.1875q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm3.0843506 3.390625l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm6.6953278 0l0 -6.734375l1.015625 0l0 0.9375q0.328125 -0.5 0.84375 -0.796875q0.53125 -0.296875 1.203125 -0.296875q0.75 0 1.21875 0.3125q0.484375 0.3125 0.6875 0.859375q0.796875 -1.171875 2.078125 -1.171875q1.0 0 1.53125 0.5625q0.546875 0.546875 0.546875 1.703125l0 4.625l-1.125 0l0 -4.25q0 -0.6875 -0.109375 -0.984375q-0.109375 -0.296875 -0.40625 -0.484375q-0.296875 -0.1875 -0.6875 -0.1875q-0.71875 0 -1.1875 0.484375q-0.46875 0.46875 -0.46875 1.5l0 3.921875l-1.140625 0l0 -4.375q0 -0.765625 -0.28125 -1.140625q-0.28125 -0.390625 -0.90625 -0.390625q-0.484375 0 -0.890625 0.265625q-0.40625 0.25 -0.59375 0.734375q-0.1875 0.484375 -0.1875 1.40625l0 3.5l-1.140625 0zm15.493057 -0.828125q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm7.5062256 0.921875l1.125 0.140625q-0.171875 1.171875 -0.9375 1.828125q-0.765625 0.65625 -1.859375 0.65625q-1.390625 0 -2.234375 -0.90625q-0.828125 -0.90625 -0.828125 -2.59375q0 -1.09375 0.359375 -1.90625q0.359375 -0.828125 1.09375 -1.234375q0.734375 -0.40625 1.609375 -0.40625q1.09375 0 1.796875 0.5625q0.703125 0.546875 0.890625 1.5625l-1.109375 0.171875q-0.15625 -0.671875 -0.5625 -1.015625q-0.390625 -0.34375 -0.96875 -0.34375q-0.859375 0 -1.40625 0.625q-0.53125 0.609375 -0.53125 1.953125q0 1.359375 0.515625 1.984375q0.515625 0.609375 1.359375 0.609375q0.671875 0 1.125 -0.40625q0.453125 -0.421875 0.5625 -1.28125zm2.2734375 2.46875l0 -9.3125l1.140625 0l0 3.34375q0.796875 -0.921875 2.015625 -0.921875q0.75 0 1.296875 0.296875q0.5625 0.296875 0.796875 0.8125q0.234375 0.515625 0.234375 1.515625l0 4.265625l-1.140625 0l0 -4.265625q0 -0.859375 -0.375 -1.25q-0.359375 -0.390625 -1.046875 -0.390625q-0.5 0 -0.953125 0.265625q-0.453125 0.25 -0.640625 0.703125q-0.1875 0.453125 -0.1875 1.25l0 3.6875l-1.140625 0zm7.4124756 -7.984375l0 -1.328125l1.140625 0l0 1.328125l-1.140625 0zm0 7.984375l0 -6.734375l1.140625 0l0 6.734375l-1.140625 0zm2.96109 0l0 -6.734375l1.03125 0l0 0.953125q0.734375 -1.109375 2.140625 -1.109375q0.609375 0 1.109375 0.21875q0.515625 0.21875 0.765625 0.578125q0.265625 0.34375 0.359375 0.84375q0.0625 0.3125 0.0625 1.109375l0 4.140625l-1.140625 0l0 -4.09375q0 -0.703125 -0.140625 -1.046875q-0.125 -0.34375 -0.46875 -0.546875q-0.328125 -0.21875 -0.78125 -0.21875q-0.734375 0 -1.265625 0.46875q-0.53125 0.453125 -0.53125 1.75l0 3.6875l-1.140625 0zm12.021851 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.0999756 2.0l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625zm12.054535 2.015625l-2.0625 -6.734375l1.1875 0l1.078125 3.890625l0.390625 1.4375q0.03125 -0.109375 0.359375 -1.390625l1.0625 -3.9375l1.171875 0l1.015625 3.90625l0.34375 1.28125l0.375 -1.296875l1.15625 -3.890625l1.109375 0l-2.109375 6.734375l-1.171875 0l-1.078125 -4.03125l-0.265625 -1.15625l-1.359375 5.1875l-1.203125 0zm8.390778 -7.984375l0 -1.328125l1.140625 0l0 1.328125l-1.140625 0zm0 7.984375l0 -6.734375l1.140625 0l0 6.734375l-1.140625 0zm5.46109 -1.015625l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm1.2030029 1.015625l0 -9.3125l1.140625 0l0 3.34375q0.796875 -0.921875 2.015625 -0.921875q0.75 0 1.296875 0.296875q0.5625 0.296875 0.796875 0.8125q0.234375 0.515625 0.234375 1.515625l0 4.265625l-1.140625 0l0 -4.265625q0 -0.859375 -0.375 -1.25q-0.359375 -0.390625 -1.046875 -0.390625q-0.5 0 -0.953125 0.265625q-0.453125 0.25 -0.640625 0.703125q-0.1875 0.453125 -0.1875 1.25l0 3.6875l-1.140625 0zm15.506073 -0.828125q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm5.6156006 2.375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm3.703003 0l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.5935974 0.1875q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm7.5062256 0.921875l1.125 0.140625q-0.171875 1.171875 -0.9375 1.828125q-0.765625 0.65625 -1.859375 0.65625q-1.390625 0 -2.234375 -0.90625q-0.828125 -0.90625 -0.828125 -2.59375q0 -1.09375 0.359375 -1.90625q0.359375 -0.828125 1.09375 -1.234375q0.734375 -0.40625 1.609375 -0.40625q1.09375 0 1.796875 0.5625q0.703125 0.546875 0.890625 1.5625l-1.109375 0.171875q-0.15625 -0.671875 -0.5625 -1.015625q-0.390625 -0.34375 -0.96875 -0.34375q-0.859375 0 -1.40625 0.625q-0.53125 0.609375 -0.53125 1.953125q0 1.359375 0.515625 1.984375q0.515625 0.609375 1.359375 0.609375q0.671875 0 1.125 -0.40625q0.453125 -0.421875 0.5625 -1.28125zm2.2734375 2.46875l0 -9.3125l1.140625 0l0 3.34375q0.796875 -0.921875 2.015625 -0.921875q0.75 0 1.296875 0.296875q0.5625 0.296875 0.796875 0.8125q0.234375 0.515625 0.234375 1.515625l0 4.265625l-1.140625 0l0 -4.265625q0 -0.859375 -0.375 -1.25q-0.359375 -0.390625 -1.046875 -0.390625q-0.5 0 -0.953125 0.265625q-0.453125 0.25 -0.640625 0.703125q-0.1875 0.453125 -0.1875 1.25l0 3.6875l-1.140625 0zm12.021851 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm10.928101 4.015625l0 -0.84375q-0.640625 1.0 -1.890625 1.0q-0.796875 0 -1.484375 -0.4375q-0.671875 -0.453125 -1.046875 -1.25q-0.375 -0.796875 -0.375 -1.828125q0 -1.015625 0.34375 -1.828125q0.34375 -0.828125 1.015625 -1.265625q0.671875 -0.4375 1.5 -0.4375q0.609375 0 1.078125 0.265625q0.484375 0.25 0.78125 0.65625l0 -3.34375l1.140625 0l0 9.3125l-1.0625 0zm-3.609375 -3.359375q0 1.296875 0.53125 1.9375q0.546875 0.640625 1.296875 0.640625q0.75 0 1.265625 -0.609375q0.53125 -0.625 0.53125 -1.875q0 -1.390625 -0.53125 -2.03125q-0.53125 -0.65625 -1.3125 -0.65625q-0.765625 0 -1.28125 0.625q-0.5 0.625 -0.5 1.96875zm10.4748535 3.359375l0 -9.3125l1.265625 0l4.890625 7.3125l0 -7.3125l1.1875 0l0 9.3125l-1.265625 0l-4.890625 -7.3125l0 7.3125l-1.1875 0zm9.187653 -2.4375l1.1875 -0.109375q0.140625 0.890625 0.625 1.328125q0.484375 0.4375 1.171875 0.4375q0.828125 0 1.390625 -0.625q0.578125 -0.625 0.578125 -1.640625q0 -0.984375 -0.546875 -1.546875q-0.546875 -0.5625 -1.4375 -0.5625q-0.5625 0 -1.015625 0.25q-0.4375 0.25 -0.6875 0.640625l-1.0625 -0.140625l0.890625 -4.765625l4.625 0l0 1.078125l-3.703125 0l-0.5 2.5q0.828125 -0.578125 1.75 -0.578125q1.21875 0 2.046875 0.84375q0.84375 0.84375 0.84375 2.171875q0 1.265625 -0.734375 2.1875q-0.890625 1.125 -2.4375 1.125q-1.265625 0 -2.078125 -0.703125q-0.796875 -0.71875 -0.90625 -1.890625zm7.2718506 0.421875l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m228.12071 453.69553l-129.5433 41.102386" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m228.12071 453.69553l-118.10524 37.473236" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m109.01641 488.02l-7.652115 5.8936768l9.650238 0.40386963z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m228.12071 453.69553l-48.34645 41.102386" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m228.12071 453.69553l-39.20392 33.329742" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m186.77707 484.50842l-4.775223 8.39566l9.054672 -3.3619995z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m228.12071 453.69553l32.818893 41.102386" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m228.12071 453.69553l25.33133 31.724945" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m250.87053 487.48172l8.244736 5.031372l-3.081726 -9.15387z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m228.12071 453.69553l148.7559 41.102386" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m228.12071 453.69553l137.18929 37.906433" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m364.4302 494.7861l9.628204 -0.76690674l-7.8685913 -5.6013794z" fill-rule="evenodd"></path><path fill="#cfe2f3" d="m556.27344 261.26715l0 0c0 -12.304169 9.974487 -22.278671 22.278625 -22.278671l136.2616 0c5.9086304 0 11.575317 2.3472137 15.753357 6.5252686c4.1781006 4.17807 6.5252686 9.844727 6.5252686 15.753403l0 89.11197c0 12.304169 -9.974487 22.278656 -22.278625 22.278656l-136.2616 0c-12.304138 0 -22.278625 -9.974487 -22.278625 -22.278656z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m556.27344 261.26715l0 0c0 -12.304169 9.974487 -22.278671 22.278625 -22.278671l136.2616 0c5.9086304 0 11.575317 2.3472137 15.753357 6.5252686c4.1781006 4.17807 6.5252686 9.844727 6.5252686 15.753403l0 89.11197c0 12.304169 -9.974487 22.278656 -22.278625 22.278656l-136.2616 0c-12.304138 0 -22.278625 -9.974487 -22.278625 -22.278656z" fill-rule="nonzero"></path><path fill="#000000" d="m577.15796 263.65744l0 -1.078125l3.9375 -0.015625l0 3.453125q-0.90625 0.71875 -1.875 1.09375q-0.953125 0.359375 -1.96875 0.359375q-1.375 0 -2.5 -0.578125q-1.125 -0.59375 -1.703125 -1.703125q-0.5625 -1.109375 -0.5625 -2.484375q0 -1.359375 0.5625 -2.53125q0.578125 -1.1875 1.640625 -1.75q1.078125 -0.578125 2.453125 -0.578125q1.015625 0 1.828125 0.328125q0.8125 0.328125 1.28125 0.921875q0.46875 0.578125 0.703125 1.515625l-1.109375 0.296875q-0.203125 -0.703125 -0.515625 -1.109375q-0.3125 -0.40625 -0.890625 -0.640625q-0.578125 -0.25 -1.28125 -0.25q-0.84375 0 -1.46875 0.265625q-0.609375 0.25 -0.984375 0.671875q-0.375 0.40625 -0.59375 0.90625q-0.34375 0.875 -0.34375 1.875q0 1.25 0.421875 2.09375q0.421875 0.828125 1.234375 1.234375q0.828125 0.40625 1.75 0.40625q0.796875 0 1.5625 -0.296875q0.765625 -0.3125 1.15625 -0.671875l0 -1.734375l-2.734375 0zm5.4451904 0.28125q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.2406006 0q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.4437256 3.9375l1.125 0.15625q0.0625 0.515625 0.375 0.75q0.4375 0.328125 1.171875 0.328125q0.78125 0 1.21875 -0.328125q0.4375 -0.3125 0.578125 -0.890625q0.09375 -0.34375 0.09375 -1.453125q-0.75 0.875 -1.875 0.875q-1.390625 0 -2.15625 -1.0q-0.75 -1.0 -0.75 -2.40625q0 -0.96875 0.34375 -1.78125q0.359375 -0.8125 1.015625 -1.25q0.65625 -0.453125 1.5625 -0.453125q1.1875 0 1.96875 0.96875l0 -0.8125l1.046875 0l0 5.8125q0 1.578125 -0.328125 2.234375q-0.3125 0.65625 -1.015625 1.03125q-0.6875 0.390625 -1.703125 0.390625q-1.203125 0 -1.953125 -0.546875q-0.734375 -0.53125 -0.71875 -1.625zm0.953125 -4.046875q0 1.3125 0.515625 1.921875q0.53125 0.609375 1.328125 0.609375q0.796875 0 1.328125 -0.59375q0.53125 -0.609375 0.53125 -1.90625q0 -1.234375 -0.546875 -1.859375q-0.546875 -0.640625 -1.328125 -0.640625q-0.765625 0 -1.296875 0.625q-0.53125 0.625 -0.53125 1.84375zm6.6468506 3.484375l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm7.6017456 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm17.037292 0.75l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm2.812683 3.265625l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm2.5704346 -3.375q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm11.084351 3.375l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.171875l1.140625 0l0 3.734375q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.609375l1.140625 0l0 6.734375l-1.015625 0zm7.3656006 0l0 -0.84375q-0.640625 1.0 -1.890625 1.0q-0.796875 0 -1.484375 -0.4375q-0.671875 -0.453125 -1.046875 -1.25q-0.375 -0.796875 -0.375 -1.828125q0 -1.015625 0.34375 -1.828125q0.34375 -0.828125 1.015625 -1.265625q0.671875 -0.4375 1.5 -0.4375q0.609375 0 1.078125 0.265625q0.484375 0.25 0.78125 0.65625l0 -3.34375l1.140625 0l0 9.3125l-1.0625 0zm-3.609375 -3.359375q0 1.296875 0.53125 1.9375q0.546875 0.640625 1.296875 0.640625q0.75 0 1.265625 -0.609375q0.53125 -0.625 0.53125 -1.875q0 -1.390625 -0.53125 -2.03125q-0.53125 -0.65625 -1.3125 -0.65625q-0.765625 0 -1.28125 0.625q-0.5 0.625 -0.5 1.96875zm10.0686035 0.375l1.171875 -0.109375q0.078125 0.703125 0.375 1.15625q0.3125 0.4375 0.9375 0.71875q0.640625 0.265625 1.4375 0.265625q0.703125 0 1.234375 -0.203125q0.546875 -0.203125 0.8125 -0.5625q0.265625 -0.375 0.265625 -0.8125q0 -0.4375 -0.265625 -0.765625q-0.25 -0.328125 -0.828125 -0.546875q-0.375 -0.140625 -1.65625 -0.453125q-1.28125 -0.3125 -1.796875 -0.578125q-0.671875 -0.34375 -1.0 -0.859375q-0.328125 -0.53125 -0.328125 -1.171875q0 -0.703125 0.390625 -1.3125q0.40625 -0.609375 1.171875 -0.921875q0.78125 -0.328125 1.71875 -0.328125q1.03125 0 1.8125 0.34375q0.796875 0.328125 1.21875 0.984375q0.4375 0.640625 0.46875 1.453125l-1.1875 0.09375q-0.09375 -0.890625 -0.640625 -1.328125q-0.546875 -0.453125 -1.625 -0.453125q-1.109375 0 -1.625 0.40625q-0.515625 0.40625 -0.515625 0.984375q0 0.5 0.359375 0.828125q0.359375 0.328125 1.859375 0.671875q1.5 0.328125 2.0625 0.578125q0.8125 0.375 1.1875 0.953125q0.390625 0.578125 0.390625 1.328125q0 0.734375 -0.421875 1.390625q-0.421875 0.65625 -1.21875 1.03125q-0.796875 0.359375 -1.796875 0.359375q-1.265625 0 -2.125 -0.359375q-0.84375 -0.375 -1.328125 -1.109375q-0.484375 -0.75 -0.515625 -1.671875zm11.6710205 1.96875l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm0.7811279 -2.359375q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.6468506 3.375l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm8.8446045 -0.828125q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm2.8968506 3.953125l1.125 0.15625q0.0625 0.515625 0.375 0.75q0.4375 0.328125 1.171875 0.328125q0.78125 0 1.21875 -0.328125q0.4375 -0.3125 0.578125 -0.890625q0.09375 -0.34375 0.09375 -1.453125q-0.75 0.875 -1.875 0.875q-1.390625 0 -2.15625 -1.0q-0.75 -1.0 -0.75 -2.40625q0 -0.96875 0.34375 -1.78125q0.359375 -0.8125 1.015625 -1.25q0.65625 -0.453125 1.5625 -0.453125q1.1875 0 1.96875 0.96875l0 -0.8125l1.046875 0l0 5.8125q0 1.578125 -0.328125 2.234375q-0.3125 0.65625 -1.015625 1.03125q-0.6875 0.390625 -1.703125 0.390625q-1.203125 0 -1.953125 -0.546875q-0.734375 -0.53125 -0.71875 -1.625zm0.953125 -4.046875q0 1.3125 0.515625 1.921875q0.53125 0.609375 1.328125 0.609375q0.796875 0 1.328125 -0.59375q0.53125 -0.609375 0.53125 -1.90625q0 -1.234375 -0.546875 -1.859375q-0.546875 -0.640625 -1.328125 -0.640625q-0.765625 0 -1.296875 0.625q-0.53125 0.625 -0.53125 1.84375zm11.287476 1.3125l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625z" fill-rule="nonzero"></path><path fill="#d9d9d9" d="m606.09973 296.18896l0 0c0 -7.459442 18.169495 -13.506561 40.582703 -13.506561c22.413147 0 40.58264 6.047119 40.58264 13.506561l0 54.026245c0 7.4594727 -18.169495 13.506561 -40.58264 13.506561c-22.413208 0 -40.582703 -6.0470886 -40.582703 -13.506561z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m687.2651 296.18896l0 0c0 7.4594727 -18.169495 13.506561 -40.58264 13.506561c-22.413208 0 -40.582703 -6.0470886 -40.582703 -13.506561" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m606.09973 296.18896l0 0c0 -7.459442 18.169495 -13.506561 40.582703 -13.506561c22.413147 0 40.58264 6.047119 40.58264 13.506561l0 54.026245c0 7.4594727 -18.169495 13.506561 -40.58264 13.506561c-22.413208 0 -40.582703 -6.0470886 -40.582703 -13.506561z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m687.2651 296.18896l0 0c0 7.4594727 -18.169495 13.506561 -40.58264 13.506561c-22.413208 0 -40.582703 -6.0470886 -40.582703 -13.506561" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m606.09973 296.18896l0 0c0 -7.459442 18.169495 -13.506561 40.582703 -13.506561c22.413147 0 40.58264 6.047119 40.58264 13.506561l0 54.026245c0 7.4594727 -18.169495 13.506561 -40.58264 13.506561c-22.413208 0 -40.582703 -6.0470886 -40.582703 -13.506561z" fill-rule="nonzero"></path><path fill="#000000" d="m630.08545 324.28662l1.125 0.140625q-0.171875 1.171875 -0.9375 1.828125q-0.765625 0.65625 -1.859375 0.65625q-1.390625 0 -2.234375 -0.90625q-0.828125 -0.90625 -0.828125 -2.59375q0 -1.09375 0.359375 -1.90625q0.359375 -0.828125 1.09375 -1.234375q0.734375 -0.40625 1.609375 -0.40625q1.09375 0 1.796875 0.5625q0.703125 0.546875 0.890625 1.5625l-1.109375 0.171875q-0.15625 -0.671875 -0.5625 -1.015625q-0.390625 -0.34375 -0.96875 -0.34375q-0.859375 0 -1.40625 0.625q-0.53125 0.609375 -0.53125 1.953125q0 1.359375 0.515625 1.984375q0.515625 0.609375 1.359375 0.609375q0.671875 0 1.125 -0.40625q0.453125 -0.421875 0.5625 -1.28125zm2.2421875 2.46875l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm7.4142456 0l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.171875l1.140625 0l0 3.734375q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.609375l1.140625 0l0 6.734375l-1.015625 0zm2.5374756 -2.015625l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625zm9.6171875 1.0l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.812378 -1.15625l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.5374756 4.015625l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm4.0008545 -2.796875l0 -1.140625l3.515625 0l0 1.140625l-3.515625 0z" fill-rule="nonzero"></path><path fill="#000000" d="m622.6371 341.73975l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.812378 -1.15625l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.5218506 4.015625l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm7.6017456 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.5531006 4.015625l0 -6.734375l1.015625 0l0 0.9375q0.328125 -0.5 0.84375 -0.796875q0.53125 -0.296875 1.203125 -0.296875q0.75 0 1.21875 0.3125q0.484375 0.3125 0.6875 0.859375q0.796875 -1.171875 2.078125 -1.171875q1.0 0 1.53125 0.5625q0.546875 0.546875 0.546875 1.703125l0 4.625l-1.125 0l0 -4.25q0 -0.6875 -0.109375 -0.984375q-0.109375 -0.296875 -0.40625 -0.484375q-0.296875 -0.1875 -0.6875 -0.1875q-0.71875 0 -1.1875 0.484375q-0.46875 0.46875 -0.46875 1.5l0 3.921875l-1.140625 0l0 -4.375q0 -0.765625 -0.28125 -1.140625q-0.28125 -0.390625 -0.90625 -0.390625q-0.484375 0 -0.890625 0.265625q-0.40625 0.25 -0.59375 0.734375q-0.1875 0.484375 -0.1875 1.40625l0 3.5l-1.140625 0zm15.711792 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm9.053101 3.0l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm1.1873779 1.015625l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm4.4071045 2.59375l-0.140625 -1.0625q0.375 0.09375 0.65625 0.09375q0.390625 0 0.609375 -0.125q0.234375 -0.125 0.375 -0.359375q0.109375 -0.171875 0.359375 -0.84375q0.03125 -0.09375 0.09375 -0.28125l-2.5625 -6.75l1.234375 0l1.40625 3.890625q0.265625 0.75 0.484375 1.5625q0.203125 -0.78125 0.46875 -1.53125l1.453125 -3.921875l1.140625 0l-2.5625 6.84375q-0.421875 1.109375 -0.640625 1.53125q-0.3125 0.5625 -0.703125 0.828125q-0.390625 0.265625 -0.9375 0.265625q-0.328125 0 -0.734375 -0.140625z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m411.43878 453.4452l235.24408 -80.787415" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m411.43878 453.44516l223.89465 -76.8898" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m636.40643 379.67972l7.5111694 -6.072296l-9.6571045 -0.17642212z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m402.27722 305.71228l153.98425 0.12600708" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m402.27722 305.71228l141.98425 0.11618042" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m544.2588 309.13193l9.078918 -3.296051l-9.073547 -3.3108826z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m590.269 378.36484l115.93701 0l0 23.24408l-115.93701 0z" fill-rule="nonzero"></path><path fill="#000000" d="m599.8471 397.18045l1.171875 -0.109375q0.078125 0.703125 0.375 1.15625q0.3125 0.4375 0.9375 0.71875q0.640625 0.265625 1.4375 0.265625q0.703125 0 1.234375 -0.203125q0.546875 -0.203125 0.8125 -0.5625q0.265625 -0.375 0.265625 -0.8125q0 -0.4375 -0.265625 -0.765625q-0.25 -0.328125 -0.828125 -0.546875q-0.375 -0.140625 -1.65625 -0.453125q-1.28125 -0.3125 -1.796875 -0.578125q-0.671875 -0.34375 -1.0 -0.859375q-0.328125 -0.53125 -0.328125 -1.171875q0 -0.703125 0.390625 -1.3125q0.40625 -0.609375 1.171875 -0.921875q0.78125 -0.328125 1.71875 -0.328125q1.03125 0 1.8125 0.34375q0.796875 0.328125 1.21875 0.984375q0.4375 0.640625 0.46875 1.453125l-1.1875 0.09375q-0.09375 -0.890625 -0.640625 -1.328125q-0.546875 -0.453125 -1.625 -0.453125q-1.109375 0 -1.625 0.40625q-0.515625 0.40625 -0.515625 0.984375q0 0.5 0.359375 0.828125q0.359375 0.328125 1.859375 0.671875q1.5 0.328125 2.0625 0.578125q0.8125 0.375 1.1875 0.953125q0.390625 0.578125 0.390625 1.328125q0 0.734375 -0.421875 1.390625q-0.421875 0.65625 -1.21875 1.03125q-0.796875 0.359375 -1.796875 0.359375q-1.265625 0 -2.125 -0.359375q-0.84375 -0.375 -1.328125 -1.109375q-0.484375 -0.75 -0.515625 -1.671875zm11.6710205 1.96875l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm0.7811279 -2.359375q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.6468506 3.375l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm9.0633545 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm9.8342285 0.640625q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm11.084351 3.375l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.171875l1.140625 0l0 3.734375q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.609375l1.140625 0l0 6.734375l-1.015625 0zm5.4906006 -1.015625l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm1.2029419 3.59375l0 -9.3125l1.03125 0l0 0.875q0.375 -0.515625 0.828125 -0.765625q0.46875 -0.265625 1.140625 -0.265625q0.859375 0 1.515625 0.453125q0.65625 0.4375 0.984375 1.25q0.34375 0.796875 0.34375 1.765625q0 1.03125 -0.375 1.859375q-0.359375 0.828125 -1.078125 1.28125q-0.703125 0.4375 -1.484375 0.4375q-0.5625 0 -1.015625 -0.234375q-0.453125 -0.25 -0.75 -0.625l0 3.28125l-1.140625 0zm1.03125 -5.90625q0 1.296875 0.53125 1.921875q0.53125 0.625 1.265625 0.625q0.765625 0 1.3125 -0.640625q0.546875 -0.65625 0.546875 -2.0q0 -1.296875 -0.53125 -1.9375q-0.53125 -0.640625 -1.265625 -0.640625q-0.734375 0 -1.296875 0.6875q-0.5625 0.671875 -0.5625 1.984375zm10.803101 3.328125l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.171875l1.140625 0l0 3.734375q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.609375l1.140625 0l0 6.734375l-1.015625 0zm5.4906006 -1.015625l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m424.2047 277.20734l110.17322 0l0 25.606293l-110.17322 0z" fill-rule="nonzero"></path><path fill="#000000" d="m434.22034 299.00732l0 -9.3125l4.125 0q1.25 0 1.890625 0.265625q0.65625 0.25 1.046875 0.890625q0.390625 0.625 0.390625 1.390625q0 0.984375 -0.65625 1.671875q-0.640625 0.671875 -1.96875 0.859375q0.484375 0.234375 0.734375 0.46875q0.546875 0.484375 1.03125 1.234375l1.609375 2.53125l-1.546875 0l-1.234375 -1.9375q-0.53125 -0.84375 -0.890625 -1.28125q-0.34375 -0.4375 -0.625 -0.609375q-0.265625 -0.1875 -0.546875 -0.265625q-0.21875 -0.03125 -0.6875 -0.03125l-1.4375 0l0 4.125l-1.234375 0zm1.234375 -5.203125l2.65625 0q0.84375 0 1.3125 -0.171875q0.484375 -0.171875 0.71875 -0.546875q0.25 -0.390625 0.25 -0.84375q0 -0.65625 -0.484375 -1.078125q-0.46875 -0.4375 -1.5 -0.4375l-2.953125 0l0 3.078125zm12.843903 3.03125l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm10.943726 3.1875q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm7.4906006 3.390625l0 -0.84375q-0.640625 1.0 -1.890625 1.0q-0.796875 0 -1.484375 -0.4375q-0.671875 -0.453125 -1.046875 -1.25q-0.375 -0.796875 -0.375 -1.828125q0 -1.015625 0.34375 -1.828125q0.34375 -0.828125 1.015625 -1.265625q0.671875 -0.4375 1.5 -0.4375q0.609375 0 1.078125 0.265625q0.484375 0.25 0.78125 0.65625l0 -3.34375l1.140625 0l0 9.3125l-1.0625 0zm-3.609375 -3.359375q0 1.296875 0.53125 1.9375q0.546875 0.640625 1.296875 0.640625q0.75 0 1.265625 -0.609375q0.53125 -0.625 0.53125 -1.875q0 -1.390625 -0.53125 -2.03125q-0.53125 -0.65625 -1.3125 -0.65625q-0.765625 0 -1.28125 0.625q-0.5 0.625 -0.5 1.96875zm14.7404785 2.53125q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm3.1156006 3.390625l0 -6.734375l1.03125 0l0 0.953125q0.734375 -1.109375 2.140625 -1.109375q0.609375 0 1.109375 0.21875q0.515625 0.21875 0.765625 0.578125q0.265625 0.34375 0.359375 0.84375q0.0625 0.3125 0.0625 1.109375l0 4.140625l-1.140625 0l0 -4.09375q0 -0.703125 -0.140625 -1.046875q-0.125 -0.34375 -0.46875 -0.546875q-0.328125 -0.21875 -0.78125 -0.21875q-0.734375 0 -1.265625 0.46875q-0.53125 0.453125 -0.53125 1.75l0 3.6875l-1.140625 0zm11.787476 0l0 -0.84375q-0.640625 1.0 -1.890625 1.0q-0.796875 0 -1.484375 -0.4375q-0.671875 -0.453125 -1.046875 -1.25q-0.375 -0.796875 -0.375 -1.828125q0 -1.015625 0.34375 -1.828125q0.34375 -0.828125 1.015625 -1.265625q0.671875 -0.4375 1.5 -0.4375q0.609375 0 1.078125 0.265625q0.484375 0.25 0.78125 0.65625l0 -3.34375l1.140625 0l0 9.3125l-1.0625 0zm-3.609375 -3.359375q0 1.296875 0.53125 1.9375q0.546875 0.640625 1.296875 0.640625q0.75 0 1.265625 -0.609375q0.53125 -0.625 0.53125 -1.875q0 -1.390625 -0.53125 -2.03125q-0.53125 -0.65625 -1.3125 -0.65625q-0.765625 0 -1.28125 0.625q-0.5 0.625 -0.5 1.96875z" fill-rule="nonzero"></path><path fill="#000000" d="m438.4547 312.53857l1.125 0.140625q-0.171875 1.171875 -0.9375 1.828125q-0.765625 0.65625 -1.859375 0.65625q-1.390625 0 -2.234375 -0.90625q-0.828125 -0.90625 -0.828125 -2.59375q0 -1.09375 0.359375 -1.90625q0.359375 -0.828125 1.09375 -1.234375q0.734375 -0.40625 1.609375 -0.40625q1.09375 0 1.796875 0.5625q0.703125 0.546875 0.890625 1.5625l-1.109375 0.171875q-0.15625 -0.671875 -0.5625 -1.015625q-0.390625 -0.34375 -0.96875 -0.34375q-0.859375 0 -1.40625 0.625q-0.53125 0.609375 -0.53125 1.953125q0 1.359375 0.515625 1.984375q0.515625 0.609375 1.359375 0.609375q0.671875 0 1.125 -0.40625q0.453125 -0.421875 0.5625 -1.28125zm1.8515625 -0.90625q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.6624756 3.375l0 -6.734375l1.03125 0l0 0.953125q0.734375 -1.109375 2.140625 -1.109375q0.609375 0 1.109375 0.21875q0.515625 0.21875 0.765625 0.578125q0.265625 0.34375 0.359375 0.84375q0.0625 0.3125 0.0625 1.109375l0 4.140625l-1.140625 0l0 -4.09375q0 -0.703125 -0.140625 -1.046875q-0.125 -0.34375 -0.46875 -0.546875q-0.328125 -0.21875 -0.78125 -0.21875q-0.734375 0 -1.265625 0.46875q-0.53125 0.453125 -0.53125 1.75l0 3.6875l-1.140625 0zm6.9593506 -2.015625l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625zm6.6953125 -1.359375q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.6312256 3.375l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm2.99234 -7.984375l0 -1.328125l1.140625 0l0 1.328125l-1.140625 0zm0 7.984375l0 -6.734375l1.140625 0l0 6.734375l-1.140625 0zm7.33609 0l0 -0.84375q-0.640625 1.0 -1.890625 1.0q-0.796875 0 -1.484375 -0.4375q-0.671875 -0.453125 -1.046875 -1.25q-0.375 -0.796875 -0.375 -1.828125q0 -1.015625 0.34375 -1.828125q0.34375 -0.828125 1.015625 -1.265625q0.671875 -0.4375 1.5 -0.4375q0.609375 0 1.078125 0.265625q0.484375 0.25 0.78125 0.65625l0 -3.34375l1.140625 0l0 9.3125l-1.0625 0zm-3.609375 -3.359375q0 1.296875 0.53125 1.9375q0.546875 0.640625 1.296875 0.640625q0.75 0 1.265625 -0.609375q0.53125 -0.625 0.53125 -1.875q0 -1.390625 -0.53125 -2.03125q-0.53125 -0.65625 -1.3125 -0.65625q-0.765625 0 -1.28125 0.625q-0.5 0.625 -0.5 1.96875zm11.037476 2.53125q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm5.6156006 2.375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.812378 -1.15625l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625z" fill-rule="nonzero"></path><path fill="#000000" d="m433.6422 327.63232q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm11.084351 3.375l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.171875l1.140625 0l0 3.734375q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.609375l1.140625 0l0 6.734375l-1.015625 0zm5.4906006 -1.015625l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm1.2030029 3.59375l0 -9.3125l1.03125 0l0 0.875q0.375 -0.515625 0.828125 -0.765625q0.46875 -0.265625 1.140625 -0.265625q0.859375 0 1.515625 0.453125q0.65625 0.4375 0.984375 1.25q0.34375 0.796875 0.34375 1.765625q0 1.03125 -0.375 1.859375q-0.359375 0.828125 -1.078125 1.28125q-0.703125 0.4375 -1.484375 0.4375q-0.5625 0 -1.015625 -0.234375q-0.453125 -0.25 -0.75 -0.625l0 3.28125l-1.140625 0zm1.03125 -5.90625q0 1.296875 0.53125 1.921875q0.53125 0.625 1.265625 0.625q0.765625 0 1.3125 -0.640625q0.546875 -0.65625 0.546875 -2.0q0 -1.296875 -0.53125 -1.9375q-0.53125 -0.640625 -1.265625 -0.640625q-0.734375 0 -1.296875 0.6875q-0.5625 0.671875 -0.5625 1.984375zm10.803101 3.328125l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.171875l1.140625 0l0 3.734375q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.609375l1.140625 0l0 6.734375l-1.015625 0zm5.4906006 -1.015625l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm9.2966 0.1875q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm3.0999756 3.390625l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm6.9539795 -1.015625l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm1.2030029 -6.96875l0 -1.328125l1.140625 0l0 1.328125l-1.140625 0zm0 7.984375l0 -6.734375l1.140625 0l0 6.734375l-1.140625 0zm3.226715 0l0 -5.859375l-1.0 0l0 -0.875l1.0 0l0 -0.71875q0 -0.6875 0.125 -1.015625q0.171875 -0.4375 0.578125 -0.71875q0.421875 -0.28125 1.171875 -0.28125q0.484375 0 1.0625 0.125l-0.171875 0.984375q-0.359375 -0.0625 -0.671875 -0.0625q-0.515625 0 -0.734375 0.234375q-0.21875 0.21875 -0.21875 0.828125l0 0.625l1.3125 0l0 0.875l-1.3125 0l0 5.859375l-1.140625 0zm7.8279724 -0.828125q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm7.5062256 0.921875l1.125 0.140625q-0.171875 1.171875 -0.9375 1.828125q-0.765625 0.65625 -1.859375 0.65625q-1.390625 0 -2.234375 -0.90625q-0.828125 -0.90625 -0.828125 -2.59375q0 -1.09375 0.359375 -1.90625q0.359375 -0.828125 1.09375 -1.234375q0.734375 -0.40625 1.609375 -0.40625q1.09375 0 1.796875 0.5625q0.703125 0.546875 0.890625 1.5625l-1.109375 0.171875q-0.15625 -0.671875 -0.5625 -1.015625q-0.390625 -0.34375 -0.96875 -0.34375q-0.859375 0 -1.40625 0.625q-0.53125 0.609375 -0.53125 1.953125q0 1.359375 0.515625 1.984375q0.515625 0.609375 1.359375 0.609375q0.671875 0 1.125 -0.40625q0.453125 -0.421875 0.5625 -1.28125zm4.773468 1.453125l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.9687805 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.1406555 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm0.7498169 -1.0l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m269.79266 283.4672l-54.362213 -157.70079" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m269.79266 283.4672l-50.45146 -146.35593" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m222.46432 136.03467l-6.081024 -7.5040894l-0.16519165 9.657272z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m236.41995 160.09157l115.93701 0l0 41.13385l-115.93701 0z" fill-rule="nonzero"></path><path fill="#000000" d="m246.4512 181.89157l0 -9.3125l6.71875 0l0 1.109375l-5.484375 0l0 2.84375l5.140625 0l0 1.09375l-5.140625 0l0 3.171875l5.703125 0l0 1.09375l-6.9375 0zm8.71788 0l0 -6.734375l1.0156097 0l0 0.9375q0.328125 -0.5 0.84375 -0.796875q0.53125 -0.296875 1.203125 -0.296875q0.75 0 1.21875 0.3125q0.484375 0.3125 0.6875 0.859375q0.796875 -1.171875 2.078125 -1.171875q1.0 0 1.53125 0.5625q0.546875 0.546875 0.546875 1.703125l0 4.625l-1.125 0l0 -4.25q0 -0.6875 -0.109375 -0.984375q-0.109375 -0.296875 -0.40625 -0.484375q-0.296875 -0.1875 -0.6875 -0.1875q-0.71875 0 -1.1875 0.484375q-0.46875 0.46875 -0.46875 1.5l0 3.921875l-1.140625 0l0 -4.375q0 -0.765625 -0.28125 -1.140625q-0.28125 -0.390625 -0.90625 -0.390625q-0.484375 0 -0.890625 0.265625q-0.40625 0.25 -0.59375 0.734375q-0.1875 0.484375 -0.1875 1.40625l0 3.5l-1.1406097 0zm15.493057 -0.828125q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm3.1156006 -4.59375l0 -1.328125l1.140625 0l0 1.328125l-1.140625 0zm0 7.984375l0 -6.734375l1.140625 0l0 6.734375l-1.140625 0zm2.92984 0l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm11.1171875 0l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.171875l1.140625 0l0 3.734375q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.609375l1.140625 0l0 6.734375l-1.015625 0zm2.5374756 -2.015625l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625zm11.7265625 -0.15625l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.5374756 4.015625l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0z" fill-rule="nonzero"></path><path fill="#000000" d="m247.5137 197.89157l-2.0625 -6.734375l1.1875 0l1.078125 3.890625l0.390625 1.4375q0.03125 -0.109375 0.359375 -1.390625l1.0625 -3.9375l1.171875 0l1.015625 3.90625l0.34375 1.28125l0.375 -1.296875l1.15625 -3.890625l1.109375 0l-2.109375 6.734375l-1.171875 0l-1.078125 -4.03125l-0.265625 -1.15625l-1.359375 5.1875l-1.203125 0zm8.390778 -7.984375l0 -1.328125l1.140625 0l0 1.328125l-1.140625 0zm0 7.984375l0 -6.734375l1.140625 0l0 6.734375l-1.140625 0zm5.46109 -1.015625l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm1.2029724 1.015625l0 -9.3125l1.140625 0l0 3.34375q0.796875 -0.921875 2.015625 -0.921875q0.75 0 1.296875 0.296875q0.5625 0.296875 0.796875 0.8125q0.234375 0.515625 0.234375 1.515625l0 4.265625l-1.140625 0l0 -4.265625q0 -0.859375 -0.375 -1.25q-0.359375 -0.390625 -1.046875 -0.390625q-0.5 0 -0.953125 0.265625q-0.453125 0.25 -0.640625 0.703125q-0.1875 0.453125 -0.1875 1.25l0 3.6875l-1.140625 0zm11.0998535 0l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm9.0633545 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.0999756 2.0l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625zm11.5390625 2.015625l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.171875l1.140625 0l0 3.734375q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.609375l1.140625 0l0 6.734375l-1.015625 0zm2.9593506 0l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm5.49234 -1.015625l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm0.7498779 -1.0l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m236.41933 363.72363l77.133865 0l0 29.070862l-77.133865 0z" fill-rule="nonzero"></path><path fill="#000000" d="m246.41933 375.05908l0 -9.3125l3.515625 0q0.921875 0 1.40625 0.09375q0.6875 0.109375 1.15625 0.4375q0.46875 0.3125 0.75 0.890625q0.28125 0.578125 0.28125 1.28125q0 1.1875 -0.765625 2.015625q-0.75 0.8125 -2.71875 0.8125l-2.390625 0l0 3.78125l-1.234375 0zm1.234375 -4.875l2.40625 0q1.1875 0 1.6875 -0.4375q0.515625 -0.453125 0.515625 -1.265625q0 -0.578125 -0.296875 -0.984375q-0.296875 -0.421875 -0.78125 -0.5625q-0.3125 -0.078125 -1.15625 -0.078125l-2.375 0l0 3.328125zm12.12413 2.703125l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.5374756 4.015625l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm4.7196045 0l0 -5.859375l-1.0 0l0 -0.875l1.0 0l0 -0.71875q0 -0.6875 0.125 -1.015625q0.171875 -0.4375 0.578125 -0.71875q0.421875 -0.28125 1.171875 -0.28125q0.484375 0 1.0625 0.125l-0.171875 0.984375q-0.359375 -0.0625 -0.671875 -0.0625q-0.515625 0 -0.734375 0.234375q-0.21875 0.21875 -0.21875 0.828125l0 0.625l1.3125 0l0 0.875l-1.3125 0l0 5.859375l-1.140625 0z" fill-rule="nonzero"></path><path fill="#000000" d="m248.7787 390.04346l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.5936127 0.1875q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm2.6624756 1.375l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625zm7.1171875 2.015625l0 -9.3125l1.140625 0l0 5.3125l2.703125 -2.734375l1.484375 0l-2.578125 2.5l2.84375 4.234375l-1.40625 0l-2.234375 -3.453125l-0.8125 0.78125l0 2.671875l-1.140625 0zm6.2109375 -2.015625l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m486.90552 474.5963l0 0c0 -14.516235 11.767761 -26.283966 26.283997 -26.283966l368.21942 0c6.9709473 0 13.656372 2.7691956 18.585571 7.698395c4.929199 4.929199 7.6984253 11.614624 7.6984253 18.585571l0 105.13281c0 14.516235 -11.767761 26.283997 -26.283997 26.283997l-368.21942 0l0 0c-14.516235 0 -26.283997 -11.767761 -26.283997 -26.283997z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m486.90552 474.5963l0 0c0 -14.516235 11.767761 -26.283966 26.283997 -26.283966l368.21942 0c6.9709473 0 13.656372 2.7691956 18.585571 7.698395c4.929199 4.929199 7.6984253 11.614624 7.6984253 18.585571l0 105.13281c0 14.516235 -11.767761 26.283997 -26.283997 26.283997l-368.21942 0l0 0c-14.516235 0 -26.283997 -11.767761 -26.283997 -26.283997z" fill-rule="nonzero"></path><path fill="#000000" d="m508.96323 474.1544l0 -1.078125l3.9374695 -0.015625l0 3.453125q-0.9062195 0.71875 -1.8749695 1.09375q-0.953125 0.359375 -1.96875 0.359375q-1.375 0 -2.5 -0.578125q-1.125 -0.59375 -1.703125 -1.703125q-0.5625 -1.109375 -0.5625 -2.484375q0 -1.359375 0.5625 -2.53125q0.578125 -1.1875 1.640625 -1.75q1.078125 -0.578125 2.453125 -0.578125q1.015625 0 1.828125 0.328125q0.8125 0.328125 1.2812195 0.921875q0.46875 0.578125 0.703125 1.515625l-1.1093445 0.296875q-0.203125 -0.703125 -0.515625 -1.109375q-0.3125 -0.40625 -0.890625 -0.640625q-0.578125 -0.25 -1.28125 -0.25q-0.84375 0 -1.46875 0.265625q-0.609375 0.25 -0.984375 0.671875q-0.375 0.40625 -0.59375 0.90625q-0.34375 0.875 -0.34375 1.875q0 1.25 0.421875 2.09375q0.421875 0.828125 1.234375 1.234375q0.828125 0.40625 1.75 0.40625q0.796875 0 1.5625 -0.296875q0.765625 -0.3125 1.15625 -0.671875l0 -1.734375l-2.734375 0zm12.648285 0.390625l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm3.015808 3.265625l0 -9.3125l6.71875 0l0 1.109375l-5.484375 0l0 2.84375l5.140625 0l0 1.09375l-5.140625 0l0 3.171875l5.703125 0l0 1.09375l-6.9375 0z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m521.5387 518.0489l57.905457 0l0 52.299194l-57.905457 0z" fill-rule="nonzero"></path><path fill="#a5b4c2" d="m579.44415 518.0489l17.433105 -17.433075l0 52.299225l-17.433105 17.433044z" fill-rule="nonzero"></path><path fill="#d8e7f5" d="m521.5387 518.0489l17.433044 -17.433075l57.905518 0l-17.433105 17.433075z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m521.5387 518.0489l17.433044 -17.433075l57.905518 0l0 52.299225l-17.433105 17.433044l-57.905457 0zm0 0l57.905457 0l17.433105 -17.433075m-17.433105 17.433075l0 52.299194" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m521.5387 518.0489l17.433044 -17.433075l57.905518 0l0 52.299225l-17.433105 17.433044l-57.905457 0zm0 0l57.905457 0l17.433105 -17.433075m-17.433105 17.433075l0 52.299194" fill-rule="nonzero"></path><path fill="#000000" d="m549.2488 536.58325l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm5.359558 3.265625l0 -8.203125l-3.0625 0l0 -1.109375l7.375 0l0 1.109375l-3.078125 0l0 8.203125l-1.234375 0z" fill-rule="nonzero"></path><path fill="#000000" d="m541.44196 555.8489l0 -9.3125l3.484375 0q1.078125 0 1.71875 0.296875q0.640625 0.28125 1.0 0.875q0.375 0.578125 0.375 1.21875q0 0.59375 -0.328125 1.125q-0.328125 0.515625 -0.96875 0.84375q0.84375 0.25 1.296875 0.84375q0.453125 0.59375 0.453125 1.40625q0 0.65625 -0.28125 1.21875q-0.28125 0.5625 -0.6875 0.875q-0.40625 0.296875 -1.015625 0.453125q-0.609375 0.15625 -1.5 0.15625l-3.546875 0zm1.234375 -5.390625l2.015625 0q0.8125 0 1.171875 -0.109375q0.46875 -0.140625 0.703125 -0.46875q0.234375 -0.328125 0.234375 -0.8125q0 -0.46875 -0.21875 -0.8125q-0.21875 -0.359375 -0.640625 -0.484375q-0.40625 -0.125 -1.40625 -0.125l-1.859375 0l0 2.8125zm0 4.296875l2.3125 0q0.59375 0 0.84375 -0.046875q0.421875 -0.078125 0.703125 -0.25q0.28125 -0.1875 0.46875 -0.515625q0.1875 -0.34375 0.1875 -0.796875q0 -0.515625 -0.265625 -0.890625q-0.265625 -0.390625 -0.75 -0.546875q-0.46875 -0.15625 -1.359375 -0.15625l-2.140625 0l0 3.203125zm7.1397705 -2.28125q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm9.162476 2.359375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m605.7506 518.0489l57.905518 0l0 52.299194l-57.905518 0z" fill-rule="nonzero"></path><path fill="#a5b4c2" d="m663.6561 518.0489l17.433044 -17.433075l0 52.299225l-17.433044 17.433044z" fill-rule="nonzero"></path><path fill="#d8e7f5" d="m605.7506 518.0489l17.433044 -17.433075l57.905518 0l-17.433044 17.433075z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m605.7506 518.0489l17.433044 -17.433075l57.905518 0l0 52.299225l-17.433044 17.433044l-57.905518 0zm0 0l57.905518 0l17.433044 -17.433075m-17.433044 17.433075l0 52.299194" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m605.7506 518.0489l17.433044 -17.433075l57.905518 0l0 52.299225l-17.433044 17.433044l-57.905518 0zm0 0l57.905518 0l17.433044 -17.433075m-17.433044 17.433075l0 52.299194" fill-rule="nonzero"></path><path fill="#000000" d="m633.4607 536.58325l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm5.359558 3.265625l0 -8.203125l-3.0625 0l0 -1.109375l7.375 0l0 1.109375l-3.078125 0l0 8.203125l-1.234375 0z" fill-rule="nonzero"></path><path fill="#000000" d="m625.6539 555.8489l0 -9.3125l3.484375 0q1.078125 0 1.71875 0.296875q0.640625 0.28125 1.0 0.875q0.375 0.578125 0.375 1.21875q0 0.59375 -0.328125 1.125q-0.328125 0.515625 -0.96875 0.84375q0.84375 0.25 1.296875 0.84375q0.453125 0.59375 0.453125 1.40625q0 0.65625 -0.28125 1.21875q-0.28125 0.5625 -0.6875 0.875q-0.40625 0.296875 -1.015625 0.453125q-0.609375 0.15625 -1.5 0.15625l-3.546875 0zm1.234375 -5.390625l2.015625 0q0.8125 0 1.171875 -0.109375q0.46875 -0.140625 0.703125 -0.46875q0.234375 -0.328125 0.234375 -0.8125q0 -0.46875 -0.21875 -0.8125q-0.21875 -0.359375 -0.640625 -0.484375q-0.40625 -0.125 -1.40625 -0.125l-1.859375 0l0 2.8125zm0 4.296875l2.3125 0q0.59375 0 0.84375 -0.046875q0.421875 -0.078125 0.703125 -0.25q0.28125 -0.1875 0.46875 -0.515625q0.1875 -0.34375 0.1875 -0.796875q0 -0.515625 -0.265625 -0.890625q-0.265625 -0.390625 -0.75 -0.546875q-0.46875 -0.15625 -1.359375 -0.15625l-2.140625 0l0 3.203125zm7.1397705 -2.28125q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm9.162476 2.359375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m689.9644 518.0489l57.905518 0l0 52.299194l-57.905518 0z" fill-rule="nonzero"></path><path fill="#a5b4c2" d="m747.86993 518.0489l17.433044 -17.433075l0 52.299225l-17.433044 17.433044z" fill-rule="nonzero"></path><path fill="#d8e7f5" d="m689.9644 518.0489l17.433044 -17.433075l57.905518 0l-17.433044 17.433075z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m689.9644 518.0489l17.433044 -17.433075l57.905518 0l0 52.299225l-17.433044 17.433044l-57.905518 0zm0 0l57.905518 0l17.433044 -17.433075m-17.433044 17.433075l0 52.299194" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m689.9644 518.0489l17.433044 -17.433075l57.905518 0l0 52.299225l-17.433044 17.433044l-57.905518 0zm0 0l57.905518 0l17.433044 -17.433075m-17.433044 17.433075l0 52.299194" fill-rule="nonzero"></path><path fill="#000000" d="m717.67456 536.58325l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm5.359497 3.265625l0 -8.203125l-3.0625 0l0 -1.109375l7.375 0l0 1.109375l-3.078125 0l0 8.203125l-1.234375 0z" fill-rule="nonzero"></path><path fill="#000000" d="m709.8677 555.8489l0 -9.3125l3.484375 0q1.078125 0 1.71875 0.296875q0.640625 0.28125 1.0 0.875q0.375 0.578125 0.375 1.21875q0 0.59375 -0.328125 1.125q-0.328125 0.515625 -0.96875 0.84375q0.84375 0.25 1.296875 0.84375q0.453125 0.59375 0.453125 1.40625q0 0.65625 -0.28125 1.21875q-0.28125 0.5625 -0.6875 0.875q-0.40625 0.296875 -1.015625 0.453125q-0.609375 0.15625 -1.5 0.15625l-3.546875 0zm1.234375 -5.390625l2.015625 0q0.8125 0 1.171875 -0.109375q0.46875 -0.140625 0.703125 -0.46875q0.234375 -0.328125 0.234375 -0.8125q0 -0.46875 -0.21875 -0.8125q-0.21875 -0.359375 -0.640625 -0.484375q-0.40625 -0.125 -1.40625 -0.125l-1.859375 0l0 2.8125zm0 4.296875l2.3125 0q0.59375 0 0.84375 -0.046875q0.421875 -0.078125 0.703125 -0.25q0.28125 -0.1875 0.46875 -0.515625q0.1875 -0.34375 0.1875 -0.796875q0 -0.515625 -0.265625 -0.890625q-0.265625 -0.390625 -0.75 -0.546875q-0.46875 -0.15625 -1.359375 -0.15625l-2.140625 0l0 3.203125zm7.1397705 -2.28125q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm9.162476 2.359375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m765.3343 509.33316l45.921265 0l0 40.661407l-45.921265 0z" fill-rule="nonzero"></path><path fill="#000000" d="m778.06866 549.05316l0 -3.203125l3.203125 0l0 3.203125l-3.203125 0zm10.671875 0l0 -3.203125l3.203125 0l0 3.203125l-3.203125 0zm10.65625 0l0 -3.203125l3.21875 0l0 3.203125l-3.21875 0z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m805.9162 518.0489l57.905518 0l0 52.299194l-57.905518 0z" fill-rule="nonzero"></path><path fill="#a5b4c2" d="m863.8217 518.0489l17.433044 -17.433075l0 52.299225l-17.433044 17.433044z" fill-rule="nonzero"></path><path fill="#d8e7f5" d="m805.9162 518.0489l17.433044 -17.433075l57.905518 0l-17.433044 17.433075z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m805.9162 518.0489l17.433044 -17.433075l57.905518 0l0 52.299225l-17.433044 17.433044l-57.905518 0zm0 0l57.905518 0l17.433044 -17.433075m-17.433044 17.433075l0 52.299194" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m805.9162 518.0489l17.433044 -17.433075l57.905518 0l0 52.299225l-17.433044 17.433044l-57.905518 0zm0 0l57.905518 0l17.433044 -17.433075m-17.433044 17.433075l0 52.299194" fill-rule="nonzero"></path><path fill="#000000" d="m833.62634 536.58325l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm5.359497 3.265625l0 -8.203125l-3.0625 0l0 -1.109375l7.375 0l0 1.109375l-3.078125 0l0 8.203125l-1.234375 0z" fill-rule="nonzero"></path><path fill="#000000" d="m825.81946 555.8489l0 -9.3125l3.484375 0q1.078125 0 1.71875 0.296875q0.640625 0.28125 1.0 0.875q0.375 0.578125 0.375 1.21875q0 0.59375 -0.328125 1.125q-0.328125 0.515625 -0.96875 0.84375q0.84375 0.25 1.296875 0.84375q0.453125 0.59375 0.453125 1.40625q0 0.65625 -0.28125 1.21875q-0.28125 0.5625 -0.6875 0.875q-0.40625 0.296875 -1.015625 0.453125q-0.609375 0.15625 -1.5 0.15625l-3.546875 0zm1.234375 -5.390625l2.015625 0q0.8125 0 1.171875 -0.109375q0.46875 -0.140625 0.703125 -0.46875q0.234375 -0.328125 0.234375 -0.8125q0 -0.46875 -0.21875 -0.8125q-0.21875 -0.359375 -0.640625 -0.484375q-0.40625 -0.125 -1.40625 -0.125l-1.859375 0l0 2.8125zm0 4.296875l2.3125 0q0.59375 0 0.84375 -0.046875q0.421875 -0.078125 0.703125 -0.25q0.28125 -0.1875 0.46875 -0.515625q0.1875 -0.34375 0.1875 -0.796875q0 -0.515625 -0.265625 -0.890625q-0.265625 -0.390625 -0.75 -0.546875q-0.46875 -0.15625 -1.359375 -0.15625l-2.140625 0l0 3.203125zm7.1397705 -2.28125q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm9.162476 2.359375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m616.3502 575.53314l159.77948 0l0 34.86615l-159.77948 0z" fill-rule="nonzero"></path><path fill="#000000" d="m631.8971 596.23944l0 1.09375l-6.15625 0q-0.015625 -0.40625 0.140625 -0.796875q0.234375 -0.625 0.75 -1.234375q0.515625 -0.609375 1.5 -1.40625q1.515625 -1.25 2.046875 -1.96875q0.53125 -0.734375 0.53125 -1.375q0 -0.6875 -0.484375 -1.140625q-0.484375 -0.46875 -1.265625 -0.46875q-0.828125 0 -1.328125 0.5q-0.484375 0.484375 -0.5 1.359375l-1.171875 -0.125q0.125 -1.3125 0.90625 -2.0q0.78125 -0.6875 2.109375 -0.6875q1.34375 0 2.125 0.75q0.78125 0.734375 0.78125 1.828125q0 0.5625 -0.234375 1.109375q-0.21875 0.53125 -0.75 1.140625q-0.53125 0.59375 -1.765625 1.625q-1.03125 0.859375 -1.328125 1.171875q-0.28125 0.3125 -0.46875 0.625l4.5625 0zm1.4124756 -3.5q0 -1.640625 0.328125 -2.640625q0.34375 -1.015625 1.015625 -1.5625q0.671875 -0.546875 1.6875 -0.546875q0.75 0 1.3125 0.3125q0.5625 0.296875 0.921875 0.859375q0.375 0.5625 0.578125 1.390625q0.21875 0.8125 0.21875 2.1875q0 1.640625 -0.34375 2.65625q-0.328125 1.0 -1.0 1.546875q-0.671875 0.546875 -1.6875 0.546875q-1.34375 0 -2.125 -0.96875q-0.90625 -1.15625 -0.90625 -3.78125zm1.171875 0q0 2.296875 0.53125 3.0625q0.53125 0.75 1.328125 0.75q0.78125 0 1.3125 -0.75q0.546875 -0.765625 0.546875 -3.0625q0 -2.296875 -0.546875 -3.046875q-0.53125 -0.75 -1.328125 -0.75q-0.78125 0 -1.265625 0.65625q-0.578125 0.859375 -0.578125 3.140625zm6.2406006 0q0 -1.640625 0.328125 -2.640625q0.34375 -1.015625 1.015625 -1.5625q0.671875 -0.546875 1.6875 -0.546875q0.75 0 1.3125 0.3125q0.5625 0.296875 0.921875 0.859375q0.375 0.5625 0.578125 1.390625q0.21875 0.8125 0.21875 2.1875q0 1.640625 -0.34375 2.65625q-0.328125 1.0 -1.0 1.546875q-0.671875 0.546875 -1.6875 0.546875q-1.34375 0 -2.125 -0.96875q-0.90625 -1.15625 -0.90625 -3.78125zm1.171875 0q0 2.296875 0.53125 3.0625q0.53125 0.75 1.328125 0.75q0.78125 0 1.3125 -0.75q0.546875 -0.765625 0.546875 -3.0625q0 -2.296875 -0.546875 -3.046875q-0.53125 -0.75 -1.328125 -0.75q-0.78125 0 -1.265625 0.65625q-0.578125 0.859375 -0.578125 3.140625zm8.943726 3.09375l0 -2.5625l-2.53125 0l0 -1.0625l2.53125 0l0 -2.53125l1.078125 0l0 2.53125l2.546875 0l0 1.0625l-2.546875 0l0 2.5625l-1.078125 0zm14.783264 0.40625l0 1.09375l-6.15625 0q-0.015625 -0.40625 0.140625 -0.796875q0.234375 -0.625 0.75 -1.234375q0.515625 -0.609375 1.5 -1.40625q1.515625 -1.25 2.046875 -1.96875q0.53125 -0.734375 0.53125 -1.375q0 -0.6875 -0.484375 -1.140625q-0.484375 -0.46875 -1.265625 -0.46875q-0.828125 0 -1.328125 0.5q-0.484375 0.484375 -0.5 1.359375l-1.171875 -0.125q0.125 -1.3125 0.90625 -2.0q0.78125 -0.6875 2.109375 -0.6875q1.34375 0 2.125 0.75q0.78125 0.734375 0.78125 1.828125q0 0.5625 -0.234375 1.109375q-0.21875 0.53125 -0.75 1.140625q-0.53125 0.59375 -1.765625 1.625q-1.03125 0.859375 -1.328125 1.171875q-0.28125 0.3125 -0.46875 0.625l4.5625 0zm6.1156006 -1.375l1.125 0.140625q-0.171875 1.171875 -0.9375 1.828125q-0.765625 0.65625 -1.859375 0.65625q-1.390625 0 -2.234375 -0.90625q-0.828125 -0.90625 -0.828125 -2.59375q0 -1.09375 0.359375 -1.90625q0.359375 -0.828125 1.09375 -1.234375q0.734375 -0.40625 1.609375 -0.40625q1.09375 0 1.796875 0.5625q0.703125 0.546875 0.890625 1.5625l-1.109375 0.171875q-0.15625 -0.671875 -0.5625 -1.015625q-0.390625 -0.34375 -0.96875 -0.34375q-0.859375 0 -1.40625 0.625q-0.53125 0.609375 -0.53125 1.953125q0 1.359375 0.515625 1.984375q0.515625 0.609375 1.359375 0.609375q0.671875 0 1.125 -0.40625q0.453125 -0.421875 0.5625 -1.28125zm1.8515625 -0.90625q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.6468506 3.375l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm9.0633545 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm10.2248535 4.015625l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm2.9923096 -7.984375l0 -1.328125l1.140625 0l0 1.328125l-1.140625 0zm0 7.984375l0 -6.734375l1.140625 0l0 6.734375l-1.140625 0zm2.9611206 0l0 -6.734375l1.03125 0l0 0.953125q0.734375 -1.109375 2.140625 -1.109375q0.609375 0 1.109375 0.21875q0.515625 0.21875 0.765625 0.578125q0.265625 0.34375 0.359375 0.84375q0.0625 0.3125 0.0625 1.109375l0 4.140625l-1.140625 0l0 -4.09375q0 -0.703125 -0.140625 -1.046875q-0.125 -0.34375 -0.46875 -0.546875q-0.328125 -0.21875 -0.78125 -0.21875q-0.734375 0 -1.265625 0.46875q-0.53125 0.453125 -0.53125 1.75l0 3.6875l-1.140625 0zm11.834351 0l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.171875l1.140625 0l0 3.734375q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.609375l1.140625 0l0 6.734375l-1.015625 0zm2.2249756 0l2.46875 -3.5l-2.28125 -3.234375l1.421875 0l1.046875 1.578125q0.28125 0.453125 0.46875 0.75q0.265625 -0.421875 0.5 -0.734375l1.140625 -1.59375l1.375 0l-2.34375 3.171875l2.515625 3.5625l-1.40625 0l-1.375 -2.09375l-0.375 -0.5625l-1.765625 2.65625l-1.390625 0zm13.929565 0l-3.59375 -9.3125l1.328125 0l2.421875 6.765625q0.28125 0.8125 0.484375 1.53125q0.21875 -0.765625 0.5 -1.53125l2.515625 -6.765625l1.25 0l-3.640625 9.3125l-1.265625 0zm6.2022095 0l0 -9.3125l1.84375 0l2.203125 6.59375q0.3125 0.921875 0.453125 1.375q0.15625 -0.5 0.484375 -1.484375l2.234375 -6.484375l1.65625 0l0 9.3125l-1.1875 0l0 -7.78125l-2.703125 7.78125l-1.109375 0l-2.6875 -7.921875l0 7.921875l-1.1875 0zm10.539978 -2.015625l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m697.29926 448.31235l-129.38586 52.31494" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m697.2992 448.31235l-118.2608 47.816742" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m577.8001 493.0665l-7.1760864 6.464813l9.65271 -0.33963013z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m697.29926 448.31235l-45.165405 52.31494" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m697.2992 448.31235l-37.323486 43.23175" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m657.4752 489.38528l-3.430664 9.02887l8.431702 -4.7113037z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m697.29926 448.31235l39.055115 52.31494" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m697.2992 448.31235l31.876465 42.699005" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m726.5285 492.98755l8.076721 5.296814l-2.7824097 -9.249237z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m697.29926 448.31235l154.99213 52.31494" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m697.2992 448.31235l143.62231 48.477264" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m839.86505 499.9196l9.656006 -0.22735596l-7.54303 -6.032593z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m315.98163 353.16797l97.25983 0l0 53.19687l-97.25983 0z" fill-rule="nonzero"></path><path fill="#000000" d="m325.966 376.5664l0 -9.3125l1.265625 0l4.890625 7.3125l0 -7.3125l1.1875 0l0 9.3125l-1.265625 0l-4.890625 -7.3125l0 7.3125l-1.1875 0zm9.078278 -3.375q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.6624756 3.375l0 -6.734375l1.03125 0l0 0.953125q0.734375 -1.109375 2.140625 -1.109375q0.609375 0 1.109375 0.21875q0.515625 0.21875 0.765625 0.578125q0.265625 0.34375 0.359375 0.84375q0.0625 0.3125 0.0625 1.109375l0 4.140625l-1.140625 0l0 -4.09375q0 -0.703125 -0.140625 -1.046875q-0.125 -0.34375 -0.46875 -0.546875q-0.328125 -0.21875 -0.78125 -0.21875q-0.734375 0 -1.265625 0.46875q-0.53125 0.453125 -0.53125 1.75l0 3.6875l-1.140625 0zm11.256073 0l0 -9.3125l3.515625 0q0.921875 0 1.40625 0.09375q0.6875 0.109375 1.15625 0.4375q0.46875 0.3125 0.75 0.890625q0.28125 0.578125 0.28125 1.28125q0 1.1875 -0.765625 2.015625q-0.75 0.8125 -2.71875 0.8125l-2.390625 0l0 3.78125l-1.234375 0zm1.234375 -4.875l2.40625 0q1.1875 0 1.6875 -0.4375q0.515625 -0.453125 0.515625 -1.265625q0 -0.578125 -0.296875 -0.984375q-0.296875 -0.421875 -0.78125 -0.5625q-0.3125 -0.078125 -1.15625 -0.078125l-2.375 0l0 3.328125zm12.1241455 2.703125l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm6.5374756 4.015625l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm4.7196045 0l0 -5.859375l-1.0 0l0 -0.875l1.0 0l0 -0.71875q0 -0.6875 0.125 -1.015625q0.171875 -0.4375 0.578125 -0.71875q0.421875 -0.28125 1.171875 -0.28125q0.484375 0 1.0625 0.125l-0.171875 0.984375q-0.359375 -0.0625 -0.671875 -0.0625q-0.515625 0 -0.734375 0.234375q-0.21875 0.21875 -0.21875 0.828125l0 0.625l1.3125 0l0 0.875l-1.3125 0l0 5.859375l-1.140625 0z" fill-rule="nonzero"></path><path fill="#000000" d="m339.44995 391.55078l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.593628 0.1875q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm2.6624756 1.375l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625zm7.1171875 2.015625l0 -9.3125l1.140625 0l0 5.3125l2.703125 -2.734375l1.484375 0l-2.578125 2.5l2.84375 4.234375l-1.40625 0l-2.234375 -3.453125l-0.8125 0.78125l0 2.671875l-1.140625 0zm6.2109375 -2.015625l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m764.1947 448.68927l-117.51184 -76.031494" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m764.19464 448.68927l-107.43671 -69.51279" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m658.5524 376.4029l-9.414795 -2.1568604l5.8257446 7.7039795z" fill-rule="evenodd"></path><path fill="#cfe2f3" d="m4.8923883 235.822l0 0c0 -13.342072 10.815888 -24.157959 24.157963 -24.157959l96.62895 0l0 0c6.407089 0 12.551758 2.5451965 17.08226 7.075699c4.5305023 4.5305023 7.075699 10.675171 7.075699 17.08226l0 175.21162c0 13.342072 -10.815887 24.157959 -24.157959 24.157959l-96.62895 0c-13.342075 0 -24.157963 -10.815887 -24.157963 -24.157959z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m4.8923883 235.822l0 0c0 -13.342072 10.815888 -24.157959 24.157963 -24.157959l96.62895 0l0 0c6.407089 0 12.551758 2.5451965 17.08226 7.075699c4.5305023 4.5305023 7.075699 10.675171 7.075699 17.08226l0 175.21162c0 13.342072 -10.815887 24.157959 -24.157959 24.157959l-96.62895 0c-13.342075 0 -24.157963 -10.815887 -24.157963 -24.157959z" fill-rule="nonzero"></path><path fill="#000000" d="m26.327389 236.88342l0 -1.078125l3.9375 -0.015625l0 3.453125q-0.90625 0.71875 -1.875 1.09375q-0.953125 0.359375 -1.96875 0.359375q-1.375 0 -2.5 -0.578125q-1.125 -0.59375 -1.703125 -1.703125q-0.5625 -1.109375 -0.5625 -2.484375q0 -1.359375 0.5625 -2.53125q0.578125 -1.1875 1.640625 -1.75q1.078125 -0.578125 2.453125 -0.578125q1.015625 0 1.828125 0.328125q0.8125 0.328125 1.28125 0.921875q0.46875 0.578125 0.703125 1.515625l-1.109375 0.296875q-0.203125 -0.703125 -0.515625 -1.109375q-0.3125 -0.40625 -0.890625 -0.640625q-0.578125 -0.25 -1.28125 -0.25q-0.84375 0 -1.46875 0.265625q-0.609375 0.25 -0.984375 0.671875q-0.375 0.40625 -0.59375 0.90625q-0.34375 0.875 -0.34375 1.875q0 1.25 0.421875 2.09375q0.421875 0.828125 1.234375 1.234375q0.828125 0.40625 1.75 0.40625q0.796875 0 1.5625 -0.296875q0.765625 -0.3125 1.15625 -0.671875l0 -1.734375l-2.734375 0zm12.6483 0.390625l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm3.0157776 3.265625l0 -9.3125l6.71875 0l0 1.109375l-5.484375 0l0 2.84375l5.140625 0l0 1.09375l-5.140625 0l0 3.171875l5.703125 0l0 1.09375l-6.9375 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m12.902574 389.92126l166.83464 0l0 41.13385l-166.83464 0z" fill-rule="nonzero"></path><path fill="#000000" d="m22.449448 412.85068l1.1875 -0.109375q0.140625 0.890625 0.625 1.328125q0.484375 0.4375 1.171875 0.4375q0.828125 0 1.390625 -0.625q0.578125 -0.625 0.578125 -1.640625q0 -0.984375 -0.546875 -1.546875q-0.546875 -0.5625 -1.4375 -0.5625q-0.5625 0 -1.015625 0.25q-0.4375 0.25 -0.6875 0.640625l-1.0625 -0.140625l0.890625 -4.765625l4.625 0l0 1.078125l-3.703125 0l-0.5 2.5q0.828125 -0.578125 1.75 -0.578125q1.21875 0 2.046875 0.84375q0.84375 0.84375 0.84375 2.171875q0 1.265625 -0.734375 2.1875q-0.890625 1.125 -2.4375 1.125q-1.265625 0 -2.078125 -0.703125q-0.796875 -0.71875 -0.90625 -1.890625zm11.115463 -0.015625l1.140625 -0.15625q0.203125 0.96875 0.671875 1.40625q0.46875 0.421875 1.15625 0.421875q0.796875 0 1.34375 -0.546875q0.5625 -0.5625 0.5625 -1.390625q0 -0.796875 -0.515625 -1.296875q-0.5 -0.515625 -1.296875 -0.515625q-0.328125 0 -0.8125 0.125l0.125 -1.0q0.125 0.015625 0.1875 0.015625q0.734375 0 1.3125 -0.375q0.59375 -0.390625 0.59375 -1.1875q0 -0.625 -0.4375 -1.03125q-0.421875 -0.421875 -1.09375 -0.421875q-0.671875 0 -1.109375 0.421875q-0.4375 0.421875 -0.578125 1.25l-1.140625 -0.203125q0.21875 -1.140625 0.953125 -1.765625q0.75 -0.640625 1.84375 -0.640625q0.765625 0 1.40625 0.328125q0.640625 0.328125 0.984375 0.890625q0.34375 0.5625 0.34375 1.203125q0 0.59375 -0.328125 1.09375q-0.328125 0.5 -0.953125 0.78125q0.8125 0.203125 1.265625 0.796875q0.46875 0.59375 0.46875 1.5q0 1.21875 -0.890625 2.078125q-0.890625 0.84375 -2.25 0.84375q-1.21875 0 -2.03125 -0.734375q-0.8125 -0.734375 -0.921875 -1.890625zm13.412476 1.359375l0 1.09375l-6.15625 0q-0.015625 -0.40625 0.140625 -0.796875q0.234375 -0.625 0.75 -1.234375q0.515625 -0.609375 1.5 -1.40625q1.515625 -1.25 2.046875 -1.96875q0.53125 -0.734375 0.53125 -1.375q0 -0.6875 -0.484375 -1.140625q-0.484375 -0.46875 -1.265625 -0.46875q-0.828125 0 -1.328125 0.5q-0.484375 0.484375 -0.5 1.359375l-1.171875 -0.125q0.125 -1.3125 0.90625 -2.0q0.78125 -0.6875 2.109375 -0.6875q1.34375 0 2.125 0.75q0.78125 0.734375 0.78125 1.828125q0 0.5625 -0.234375 1.109375q-0.21875 0.53125 -0.75 1.140625q-0.53125 0.59375 -1.765625 1.625q-1.03125 0.859375 -1.328125 1.171875q-0.28125 0.3125 -0.46875 0.625l4.5625 0zm6.1156006 -1.375l1.125 0.140625q-0.171875 1.171875 -0.9375 1.828125q-0.765625 0.65625 -1.859375 0.65625q-1.390625 0 -2.234375 -0.90625q-0.828125 -0.90625 -0.828125 -2.59375q0 -1.09375 0.359375 -1.90625q0.359375 -0.828125 1.09375 -1.234375q0.734375 -0.40625 1.609375 -0.40625q1.09375 0 1.796875 0.5625q0.703125 0.546875 0.890625 1.5625l-1.109375 0.171875q-0.15625 -0.671875 -0.5625 -1.015625q-0.390625 -0.34375 -0.96875 -0.34375q-0.859375 0 -1.40625 0.625q-0.53125 0.609375 -0.53125 1.953125q0 1.359375 0.515625 1.984375q0.515625 0.609375 1.359375 0.609375q0.671875 0 1.125 -0.40625q0.453125 -0.421875 0.5625 -1.28125zm1.8515625 -0.90625q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.6468506 3.375l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm9.06337 -2.171875l1.1875 0.140625q-0.28125 1.046875 -1.046875 1.625q-0.75 0.5625 -1.921875 0.5625q-1.484375 0 -2.359375 -0.90625q-0.859375 -0.921875 -0.859375 -2.5625q0 -1.703125 0.875 -2.640625q0.890625 -0.9375 2.28125 -0.9375q1.359375 0 2.203125 0.921875q0.859375 0.921875 0.859375 2.578125q0 0.109375 0 0.3125l-5.03125 0q0.0625 1.109375 0.625 1.703125q0.5625 0.59375 1.40625 0.59375q0.640625 0 1.078125 -0.328125q0.453125 -0.34375 0.703125 -1.0625zm-3.75 -1.84375l3.765625 0q-0.078125 -0.859375 -0.4375 -1.28125q-0.546875 -0.65625 -1.40625 -0.65625q-0.796875 0 -1.328125 0.53125q-0.53125 0.515625 -0.59375 1.40625zm10.224838 4.015625l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm2.99234 -7.984375l0 -1.328125l1.140625 0l0 1.328125l-1.140625 0zm0 7.984375l0 -6.734375l1.140625 0l0 6.734375l-1.140625 0zm2.96109 0l0 -6.734375l1.03125 0l0 0.953125q0.734375 -1.109375 2.140625 -1.109375q0.609375 0 1.109375 0.21875q0.515625 0.21875 0.765625 0.578125q0.265625 0.34375 0.359375 0.84375q0.0625 0.3125 0.0625 1.109375l0 4.140625l-1.140625 0l0 -4.09375q0 -0.703125 -0.140625 -1.046875q-0.125 -0.34375 -0.46875 -0.546875q-0.328125 -0.21875 -0.78125 -0.21875q-0.734375 0 -1.265625 0.46875q-0.53125 0.453125 -0.53125 1.75l0 3.6875l-1.140625 0zm11.834351 0l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.171875l1.140625 0l0 3.734375q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.609375l1.140625 0l0 6.734375l-1.015625 0zm2.2249756 0l2.46875 -3.5l-2.28125 -3.234375l1.421875 0l1.046875 1.578125q0.28125 0.453125 0.46875 0.75q0.265625 -0.421875 0.5 -0.734375l1.140625 -1.59375l1.375 0l-2.34375 3.171875l2.515625 3.5625l-1.40625 0l-1.375 -2.09375l-0.375 -0.5625l-1.765625 2.65625l-1.390625 0zm13.92955 0l-3.59375 -9.3125l1.328125 0l2.421875 6.765625q0.28125 0.8125 0.484375 1.53125q0.21875 -0.765625 0.5 -1.53125l2.515625 -6.765625l1.25 0l-3.640625 9.3125l-1.265625 0zm6.2022552 0l0 -9.3125l1.84375 0l2.203125 6.59375q0.3125 0.921875 0.453125 1.375q0.15625 -0.5 0.484375 -1.484375l2.234375 -6.484375l1.65625 0l0 9.3125l-1.1875 0l0 -7.78125l-2.703125 7.78125l-1.109375 0l-2.6875 -7.921875l0 7.921875l-1.1875 0zm10.539932 -2.015625l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m39.678505 261.03l57.90551 0l0 52.299225l-57.90551 0z" fill-rule="nonzero"></path><path fill="#a5b4c2" d="m97.584015 261.03l17.433075 -17.43306l0 52.29921l-17.433075 17.433075z" fill-rule="nonzero"></path><path fill="#d8e7f5" d="m39.678505 261.03l17.433071 -17.43306l57.905514 0l-17.433075 17.43306z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m39.678505 261.03l17.433071 -17.43306l57.905514 0l0 52.29921l-17.433075 17.433075l-57.90551 0zm0 0l57.90551 0l17.433075 -17.43306m-17.433075 17.43306l0 52.299225" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m39.678505 261.03l17.433071 -17.43306l57.905514 0l0 52.29921l-17.433075 17.433075l-57.90551 0zm0 0l57.90551 0l17.433075 -17.43306m-17.433075 17.43306l0 52.299225" fill-rule="nonzero"></path><path fill="#000000" d="m67.38863 279.5644l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5000038 0 -2.4531288 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.2656288 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.0781288 0 -1.7968788 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.5937538 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm5.3595276 3.265625l0 -8.203125l-3.0625 0l0 -1.109375l7.375 0l0 1.109375l-3.078125 0l0 8.203125l-1.234375 0z" fill-rule="nonzero"></path><path fill="#000000" d="m59.581776 298.83002l0 -9.3125l3.484375 0q1.0781288 0 1.7187538 0.296875q0.640625 0.28125 1.0 0.875q0.375 0.578125 0.375 1.21875q0 0.59375 -0.328125 1.125q-0.328125 0.515625 -0.96875 0.84375q0.84375 0.25 1.296875 0.84375q0.453125 0.59375 0.453125 1.40625q0 0.65625 -0.28125 1.21875q-0.28125 0.5625 -0.6875 0.875q-0.40625 0.296875 -1.015625 0.453125q-0.609375 0.15625 -1.5000038 0.15625l-3.546875 0zm1.234375 -5.390625l2.015625 0q0.8125 0 1.1718788 -0.109375q0.46875 -0.140625 0.703125 -0.46875q0.234375 -0.328125 0.234375 -0.8125q0 -0.46875 -0.21875 -0.8125q-0.21875 -0.359375 -0.640625 -0.484375q-0.4062538 -0.125 -1.4062538 -0.125l-1.859375 0l0 2.8125zm0 4.296875l2.3125 0q0.59375 0 0.84375 -0.046875q0.4218788 -0.078125 0.7031288 -0.25q0.28125 -0.1875 0.46875 -0.515625q0.1875 -0.34375 0.1875 -0.796875q0 -0.515625 -0.265625 -0.890625q-0.265625 -0.390625 -0.75 -0.546875q-0.4687538 -0.15625 -1.3593788 -0.15625l-2.140625 0l0 3.203125zm7.139759 -2.28125q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm9.162476 2.359375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m39.678505 339.83127l57.90551 0l0 52.299225l-57.90551 0z" fill-rule="nonzero"></path><path fill="#a5b4c2" d="m97.584015 339.83127l17.433075 -17.433044l0 52.299194l-17.433075 17.433075z" fill-rule="nonzero"></path><path fill="#d8e7f5" d="m39.678505 339.83127l17.433071 -17.433044l57.905514 0l-17.433075 17.433044z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m39.678505 339.83127l17.433071 -17.433044l57.905514 0l0 52.299194l-17.433075 17.433075l-57.90551 0zm0 0l57.90551 0l17.433075 -17.433044m-17.433075 17.433044l0 52.299225" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m39.678505 339.83127l17.433071 -17.433044l57.905514 0l0 52.299194l-17.433075 17.433075l-57.90551 0zm0 0l57.90551 0l17.433075 -17.433044m-17.433075 17.433044l0 52.299225" fill-rule="nonzero"></path><path fill="#000000" d="m67.38863 358.36566l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5000038 0 -2.4531288 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.2656288 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.0781288 0 -1.7968788 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.5937538 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm5.3595276 3.265625l0 -8.203125l-3.0625 0l0 -1.109375l7.375 0l0 1.109375l-3.078125 0l0 8.203125l-1.234375 0z" fill-rule="nonzero"></path><path fill="#000000" d="m59.581776 377.6313l0 -9.3125l3.484375 0q1.0781288 0 1.7187538 0.296875q0.640625 0.28125 1.0 0.875q0.375 0.578125 0.375 1.21875q0 0.59375 -0.328125 1.125q-0.328125 0.515625 -0.96875 0.84375q0.84375 0.25 1.296875 0.84375q0.453125 0.59375 0.453125 1.40625q0 0.65625 -0.28125 1.21875q-0.28125 0.5625 -0.6875 0.875q-0.40625 0.296875 -1.015625 0.453125q-0.609375 0.15625 -1.5000038 0.15625l-3.546875 0zm1.234375 -5.390625l2.015625 0q0.8125 0 1.1718788 -0.109375q0.46875 -0.140625 0.703125 -0.46875q0.234375 -0.328125 0.234375 -0.8125q0 -0.46875 -0.21875 -0.8125q-0.21875 -0.359375 -0.640625 -0.484375q-0.4062538 -0.125 -1.4062538 -0.125l-1.859375 0l0 2.8125zm0 4.296875l2.3125 0q0.59375 0 0.84375 -0.046875q0.4218788 -0.078125 0.7031288 -0.25q0.28125 -0.1875 0.46875 -0.515625q0.1875 -0.34375 0.1875 -0.796875q0 -0.515625 -0.265625 -0.890625q-0.265625 -0.390625 -0.75 -0.546875q-0.4687538 -0.15625 -1.3593788 -0.15625l-2.140625 0l0 3.203125zm7.139759 -2.28125q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm9.162476 2.359375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m149.83727 323.42783l-34.83464 -53.66928" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m149.83727 323.42783l-31.568031 -48.636475" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m119.65471 273.8921l-3.8561707 -2.907318l1.0852127 4.705841z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m149.83727 323.42783l-34.83464 25.13385" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m149.83727 323.42783l-29.96894 21.623138" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m118.90187 343.71152l-2.7137146 3.9947815l4.6466217 -1.3158264z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m163.30446 282.6824l85.543304 0l0 34.86615l-85.543304 0z" fill-rule="nonzero"></path><path fill="#000000" d="m179.94508 301.64987l1.234375 0.3125q-0.390625 1.515625 -1.40625 2.3125q-1.0 0.796875 -2.453125 0.796875q-1.5 0 -2.453125 -0.609375q-0.9375 -0.609375 -1.4375 -1.765625q-0.484375 -1.171875 -0.484375 -2.5q0 -1.453125 0.5625 -2.53125q0.5625 -1.09375 1.578125 -1.65625q1.03125 -0.5625 2.265625 -0.5625q1.390625 0 2.34375 0.71875q0.953125 0.703125 1.328125 2.0l-1.21875 0.28125q-0.328125 -1.015625 -0.9375 -1.46875q-0.609375 -0.46875 -1.546875 -0.46875q-1.078125 0 -1.796875 0.515625q-0.71875 0.515625 -1.015625 1.375q-0.28125 0.859375 -0.28125 1.78125q0 1.1875 0.34375 2.078125q0.34375 0.890625 1.0625 1.328125q0.734375 0.4375 1.59375 0.4375q1.03125 0 1.75 -0.59375q0.71875 -0.609375 0.96875 -1.78125zm2.8439026 3.265625l0 -9.3125l1.140625 0l0 3.34375q0.796875 -0.921875 2.015625 -0.921875q0.75 0 1.296875 0.296875q0.5625 0.296875 0.796875 0.8125q0.234375 0.515625 0.234375 1.515625l0 4.265625l-1.140625 0l0 -4.265625q0 -0.859375 -0.375 -1.25q-0.359375 -0.390625 -1.046875 -0.390625q-0.5 0 -0.953125 0.265625q-0.453125 0.25 -0.640625 0.703125q-0.1875 0.453125 -0.1875 1.25l0 3.6875l-1.140625 0zm7.3968506 0l0 -6.734375l1.03125 0l0 1.015625q0.390625 -0.71875 0.71875 -0.9375q0.34375 -0.234375 0.734375 -0.234375q0.578125 0 1.171875 0.359375l-0.390625 1.0625q-0.421875 -0.25 -0.828125 -0.25q-0.375 0 -0.6875 0.234375q-0.296875 0.21875 -0.421875 0.625q-0.1875 0.609375 -0.1875 1.328125l0 3.53125l-1.140625 0zm4.0321198 -3.375q0 -1.875 1.03125 -2.765625q0.875 -0.75 2.125 -0.75q1.390625 0 2.265625 0.90625q0.890625 0.90625 0.890625 2.515625q0 1.296875 -0.390625 2.046875q-0.390625 0.75 -1.140625 1.171875q-0.75 0.40625 -1.625 0.40625q-1.421875 0 -2.296875 -0.90625q-0.859375 -0.90625 -0.859375 -2.625zm1.171875 0q0 1.296875 0.5625 1.953125q0.5625 0.640625 1.421875 0.640625q0.84375 0 1.40625 -0.640625q0.578125 -0.65625 0.578125 -1.984375q0 -1.25 -0.578125 -1.890625q-0.5625 -0.65625 -1.40625 -0.65625q-0.859375 0 -1.421875 0.640625q-0.5625 0.640625 -0.5625 1.9375zm6.6624756 3.375l0 -6.734375l1.015625 0l0 0.9375q0.328125 -0.5 0.84375 -0.796875q0.53125 -0.296875 1.203125 -0.296875q0.75 0 1.21875 0.3125q0.484375 0.3125 0.6875 0.859375q0.796875 -1.171875 2.078125 -1.171875q1.0 0 1.53125 0.5625q0.546875 0.546875 0.546875 1.703125l0 4.625l-1.125 0l0 -4.25q0 -0.6875 -0.109375 -0.984375q-0.109375 -0.296875 -0.40625 -0.484375q-0.296875 -0.1875 -0.6875 -0.1875q-0.71875 0 -1.1875 0.484375q-0.46875 0.46875 -0.46875 1.5l0 3.921875l-1.140625 0l0 -4.375q0 -0.765625 -0.28125 -1.140625q-0.28125 -0.390625 -0.90625 -0.390625q-0.484375 0 -0.890625 0.265625q-0.40625 0.25 -0.59375 0.734375q-0.1875 0.484375 -0.1875 1.40625l0 3.5l-1.140625 0zm11.102432 -7.984375l0 -1.328125l1.140625 0l0 1.328125l-1.140625 0zm0 7.984375l0 -6.734375l1.140625 0l0 6.734375l-1.140625 0zm7.382965 0l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.171875l1.140625 0l0 3.734375q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.609375l1.140625 0l0 6.734375l-1.015625 0zm2.9906006 0l0 -6.734375l1.015625 0l0 0.9375q0.328125 -0.5 0.84375 -0.796875q0.53125 -0.296875 1.203125 -0.296875q0.75 0 1.21875 0.3125q0.484375 0.3125 0.6875 0.859375q0.796875 -1.171875 2.078125 -1.171875q1.0 0 1.53125 0.5625q0.546875 0.546875 0.546875 1.703125l0 4.625l-1.125 0l0 -4.25q0 -0.6875 -0.109375 -0.984375q-0.109375 -0.296875 -0.40625 -0.484375q-0.296875 -0.1875 -0.6875 -0.1875q-0.71875 0 -1.1875 0.484375q-0.46875 0.46875 -0.46875 1.5l0 3.921875l-1.140625 0l0 -4.375q0 -0.765625 -0.28125 -1.140625q-0.28125 -0.390625 -0.90625 -0.390625q-0.484375 0 -0.890625 0.265625q-0.40625 0.25 -0.59375 0.734375q-0.1875 0.484375 -0.1875 1.40625l0 3.5l-1.140625 0z" fill-rule="nonzero"></path><path fill="#000000" d="m177.9137 320.9155l-1.0625 0l0 -9.3125l1.15625 0l0 3.328125q0.71875 -0.90625 1.84375 -0.90625q0.625 0 1.171875 0.25q0.5625 0.25 0.921875 0.703125q0.359375 0.453125 0.5625 1.09375q0.203125 0.640625 0.203125 1.375q0 1.734375 -0.859375 2.6875q-0.859375 0.9375 -2.0625 0.9375q-1.1875 0 -1.875 -1.0l0 0.84375zm-0.015625 -3.421875q0 1.21875 0.34375 1.75q0.53125 0.890625 1.453125 0.890625q0.75 0 1.296875 -0.65625q0.546875 -0.65625 0.546875 -1.9375q0 -1.328125 -0.53125 -1.953125q-0.515625 -0.625 -1.265625 -0.625q-0.75 0 -1.296875 0.65625q-0.546875 0.640625 -0.546875 1.875zm10.803101 3.421875l0 -0.984375q-0.796875 1.140625 -2.140625 1.140625q-0.59375 0 -1.125 -0.234375q-0.515625 -0.234375 -0.765625 -0.578125q-0.25 -0.34375 -0.34375 -0.84375q-0.078125 -0.328125 -0.078125 -1.0625l0 -4.171875l1.140625 0l0 3.734375q0 0.890625 0.078125 1.203125q0.109375 0.453125 0.453125 0.71875q0.34375 0.25 0.859375 0.25q0.515625 0 0.96875 -0.265625q0.453125 -0.265625 0.640625 -0.71875q0.1875 -0.453125 0.1875 -1.3125l0 -3.609375l1.140625 0l0 6.734375l-1.015625 0zm2.9906006 -7.984375l0 -1.328125l1.140625 0l0 1.328125l-1.140625 0zm0 7.984375l0 -6.734375l1.140625 0l0 6.734375l-1.140625 0zm2.92984 0l0 -9.3125l1.140625 0l0 9.3125l-1.140625 0zm7.36734 0l0 -0.84375q-0.640625 1.0 -1.890625 1.0q-0.796875 0 -1.484375 -0.4375q-0.671875 -0.453125 -1.046875 -1.25q-0.375 -0.796875 -0.375 -1.828125q0 -1.015625 0.34375 -1.828125q0.34375 -0.828125 1.015625 -1.265625q0.671875 -0.4375 1.5 -0.4375q0.609375 0 1.078125 0.265625q0.484375 0.25 0.78125 0.65625l0 -3.34375l1.140625 0l0 9.3125l-1.0625 0zm-3.609375 -3.359375q0 1.296875 0.53125 1.9375q0.546875 0.640625 1.296875 0.640625q0.75 0 1.265625 -0.609375q0.53125 -0.625 0.53125 -1.875q0 -1.390625 -0.53125 -2.03125q-0.53125 -0.65625 -1.3125 -0.65625q-0.765625 0 -1.28125 0.625q-0.5 0.625 -0.5 1.96875zm12.849838 2.34375l0.15625 1.0q-0.484375 0.109375 -0.859375 0.109375q-0.625 0 -0.96875 -0.203125q-0.34375 -0.203125 -0.484375 -0.515625q-0.140625 -0.328125 -0.140625 -1.34375l0 -3.890625l-0.828125 0l0 -0.875l0.828125 0l0 -1.671875l1.140625 -0.6875l0 2.359375l1.15625 0l0 0.875l-1.15625 0l0 3.953125q0 0.484375 0.0625 0.625q0.0625 0.140625 0.1875 0.21875q0.140625 0.078125 0.390625 0.078125q0.203125 0 0.515625 -0.03125zm5.5936127 0.1875q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm2.6624756 1.375l1.125 -0.171875q0.09375 0.671875 0.53125 1.046875q0.4375 0.359375 1.21875 0.359375q0.78125 0 1.15625 -0.3125q0.390625 -0.328125 0.390625 -0.765625q0 -0.390625 -0.34375 -0.609375q-0.234375 -0.15625 -1.171875 -0.390625q-1.25 -0.3125 -1.734375 -0.546875q-0.484375 -0.234375 -0.734375 -0.640625q-0.25 -0.40625 -0.25 -0.90625q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.5625 -0.640625q0.265625 -0.203125 0.71875 -0.328125q0.46875 -0.140625 1.0 -0.140625q0.78125 0 1.375 0.234375q0.609375 0.21875 0.890625 0.609375q0.296875 0.390625 0.40625 1.046875l-1.125 0.15625q-0.078125 -0.53125 -0.4375 -0.8125q-0.359375 -0.296875 -1.03125 -0.296875q-0.78125 0 -1.125 0.265625q-0.34375 0.25 -0.34375 0.609375q0 0.21875 0.140625 0.390625q0.140625 0.1875 0.4375 0.3125q0.171875 0.0625 1.015625 0.28125q1.21875 0.328125 1.6875 0.53125q0.484375 0.203125 0.75 0.609375q0.28125 0.390625 0.28125 0.96875q0 0.578125 -0.34375 1.078125q-0.328125 0.5 -0.953125 0.78125q-0.625 0.28125 -1.421875 0.28125q-1.3125 0 -2.0 -0.546875q-0.6875 -0.546875 -0.875 -1.625zm7.1171875 2.015625l0 -9.3125l1.140625 0l0 5.3125l2.703125 -2.734375l1.484375 0l-2.578125 2.5l2.84375 4.234375l-1.40625 0l-2.234375 -3.453125l-0.8125 0.78125l0 2.671875l-1.140625 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m320.2782 349.60104l-92.157486 104.09448" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m320.2782 349.60104l-84.20303 95.10971" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m233.60176 442.52097l-3.5429382 8.985413l8.489761 -4.6058655z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m321.86615 349.60367l375.4331 98.70868" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m321.86615 349.60367l363.8275 95.65732" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m684.85364 448.4559l9.617859 -0.8870239l-7.937866 -5.5027466z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m251.09613 323.14536l-101.25984 0.28347778" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m251.09613 323.14536l-89.25989 0.24987793" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m161.827 320.0918l-9.06691 3.3288574l9.085403 3.2780457z" fill-rule="evenodd"></path></g></svg>
-
diff --git a/src/third_party/skia/site/dev/testing/ct-system-diagram.txt b/src/third_party/skia/site/dev/testing/ct-system-diagram.txt
deleted file mode 100644
index d659ee7..0000000
--- a/src/third_party/skia/site/dev/testing/ct-system-diagram.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Source for ct-system-diagram.svg is
-https://docs.google.com/document/d/1CUbitfUZxpHhvwX_1xgPa-bWSyLkVt1O_I_-jgSJe98/edit?usp=sharing
diff --git a/src/third_party/skia/site/dev/testing/ct.md b/src/third_party/skia/site/dev/testing/ct.md
deleted file mode 100644
index cba6f7b..0000000
--- a/src/third_party/skia/site/dev/testing/ct.md
+++ /dev/null
@@ -1,105 +0,0 @@
-Cluster Telemetry
-=================
-
-### Contents ###
-
-*   [Overview](#overview)
-*   [Framework Usage](#framework_usage)
-*   [System Architecture](#system_architecture)
-    +   [System Diagram](#system_diagram)
-    +   [Detailed explanation of steps](#detailed_explanation)
-*   [Code](#code)
-*   [Contact Us](#contact_us)
-
-<a name="overview"></a>
-Overview
---------
-
-Cluster Telemetry allows you to run [telemetry](https://www.chromium.org/developers/telemetry)'s benchmarks, lua scripts and other tasks using multiple repository patches through Alexa's [top 1 million](http://s3.amazonaws.com/alexa-static/top-1m.csv.zip) web pages.
-Developers can use the framework to measure the performance of their patch against the top subset of the internet on both Desktop and Android.
-tl;dr documentation is [here](https://www.chromium.org/developers/cluster-telemetry).
-
-SKP files are a binary format for the draw commands Chromium sends to Skia for rasterization. The goal of the project started off with wanting to collect a large repository of 10k SKP files. This repository, after incremental changes in approaches, has since grown to ~910k and now supports running all telemetry benchmarks. The top level feature request of this project was [skia:1268](https://bug.skia.org/1268).
-
-A web application has been created on Google Compute Engine that automates the process of capturing new archives and running telemetry benchmarks at a click of a button; results are emailed to the requester and the web application contains complete history of runs with links to results. You can run telemetry benchmarks at http://ct.skia.org.
-
-The framework also contains the ability to run lua scripts on the SKP repository to scrape web pages. It only takes a few minutes to run a lua scraping script on ~910k SKP files.
-
-Most users will use these three features:
-
-* Chromium Perf. Documentation [here](https://docs.google.com/document/d/1GhqosQcwsy6F-eBAmFn_ITDF7_Iv_rY9FhCKwAnk9qQ/). Webpage [here](https://ct.skia.org/chromium_perf/).
-* Chromium Analysis. Documentation [here](https://docs.google.com/document/d/1ziof4lNwDFXyerVbEocdF3_DdUHVnD3FKYB9rShztuE/). Webpage [here](https://ct.skia.org/chromium_analysis/).
-* Run Lua Scripts on SKP repositories. Documentation about lua bindings is [here](https://skia.org/user/special/lua). Webpage [here](https://ct.skia.org/lua_script/).
-
-Note: The top 1M web pages includes potentially offensive content. Please use caution when visiting page links from the framework.
-
-
-<a name="framework_usage"></a>
-Framework Usage
----------------
-
-The Chromium Perf page in CT has been used to gather perf data over the top 10k web pages for the following Chromium projects:
-
-* Slimming paint
-* Performance data for layer squashing and compositing overlap map
-* SkPaint in Graphics Context
-* Culling
-* New paint dictionary
-
-blink-dev threads discussing how to make Chrome faster using the results gathered from CT:
-
-* [Main thread attribution for top million sites](https://groups.google.com/a/chromium.org/d/msg/blink-dev/-R47hzmkdig/xILVgczlKgQJ)
-* [Layout time for top 10k sites](https://groups.google.com/a/chromium.org/d/msg/blink-dev/fkRYGcIQN1g/_uYcAt6G8XsJ)
-* [Perf profile for top million sites](https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/8qd5SmLF5n0)
-
-Documents detailing data generated by the framework:
-
-* [Loading measurement: alexa top 1,000](https://docs.google.com/a/chromium.org/document/d/1ca_Q7xePmCRqaYnHe7vkpCmKNFNLdDXvzgtUPt9iG8w/edit)
-* [Loading measurement: alexa top million](https://docs.google.com/a/google.com/document/d/1hDDUUNE5OUV8eCjtOj7Ow6EZ2DSBCTjQirnA3Rp5pOg/edit)
-* [Loading measurement: alexa top million netsim](https://docs.google.com/a/google.com/document/d/1cpLSSYpqi4SprkJcVxbS7af6avKM0qc-imxvkexmCZs/edit)
-* [Perf profile - alexa top million sites](https://docs.google.com/a/google.com/document/d/1di__87watociuZj_dm22Cn72UM2xsZBXixbl8TCFQmw/edit)
-
-The framework has also been used to run multiple lua scripts to scrape the SKP repositories for the the following:
-chars-vs-glyphs, bitmap transform types, gradient color counter, 3 color gradient checks, etc.
-This has been very useful for the Skia team to help determine which parts of the library to optimize and focus on.
-
-All runs are recorded [here](https://ct.skia.org/history/).
-
-
-<a name="system_architecture"></a>
-System Architecture
--------------------
-
-<a name="system_diagram"></a>
-### System Diagram
-
-![CT System Diagram](ct-system-diagram.svg)
-
-
-<a name="detailed_explanation"></a>
-### Detailed explanation of steps
-
-1. User submits a Lua script task, a Performance task, an Analysis task, or an Admin task (build chrome, recreate pagesets, recreate webpage archives, capture SKPs) using the GCE web application [here](http://ct.skia.org).
-
-2. Each task is exposed by the web application in JSON. The CT master polls the web application and picks up new tasks. It has the ability to run tasks in parallel.
-
-3. The master triggers swarming tasks using the master scripts [here](https://skia.googlesource.com/buildbot/+/master/ct/go/master_scripts/). The master scripts then check to see when the tasks are done.
-
-4. Swarming bots in the CT pool execute the task using the worker scripts [here](https://skia.googlesource.com/buildbot/+/master/ct/go/worker_scripts/). All generated artifacts (CSV files, logs, SKP files, archives, etc) are then copied to Google Storage.
-
-5. Once swarming tasks complete, master scripts read the generated artifacts from Google Storage and consolidate them (if required).
-
-6. The master scripts then email results of the task to the user who requested it. The scripts also update the status of the task to completed on the web application.
-
-
-<a name="code"></a>
-Code
-----
-
-Cluster Telemetry is primarily written in Go with a few python scripts. The framework lives in [master/ct](https://skia.googlesource.com/buildbot/+/master/ct).
-
-<a name="contact_us"></a>
-Contact Us
-----------
-
-If you have questions, please email <cluster-telemetry@chromium.org> or contact rmistry@ directly.
diff --git a/src/third_party/skia/site/dev/testing/fonts.md b/src/third_party/skia/site/dev/testing/fonts.md
index cf1eec6..05fdf1c 100644
--- a/src/third_party/skia/site/dev/testing/fonts.md
+++ b/src/third_party/skia/site/dev/testing/fonts.md
@@ -11,58 +11,6 @@
 The gm tests have a secondary purpose: they detect when rendering is different
 across platforms and configurations.
 
-The dm \(Diamond Master\) tool supports flags that minimize or eliminate the
-differences introduced by the font scaler native to each platform.
-
-
-Portable fonts
---------------
-
-The most portable font format uses Skia to draw characters directly from paths,
-and contains a idealized set of font metrics. This does not exercise platform
-specific fonts at all, but does support specifying the font name, font size,
-font style, and attributes like fakeBold. The paths are generated on a reference
-platform \(currently a Mac\) and are stored as data in
-'tools/test_font_data.cpp' .
-
-To use portable fonts, pass '\-\-portableFonts' to dm.
-
-
-Resource fonts
---------------
-
-The '\-\-resourceFonts' flag directs dm to use font files present in the resources
-directory. By using the same font set on all buildbots, the generated gm images
-become more uniform across platforms.
-
-Today, the set of fonts used by gm, and present in my resources directory,
-include:
-
-  * Courier New Bold Italic.ttf
-  * Courier New Bold.ttf
-  * Courier New Italic.ttf
-  * Courier New.ttf
-  * LiberationSans-Bold.ttf
-  * LiberationSans-BoldItalic.ttf
-  * LiberationSans-Italic.ttf
-  * LiberationSans-Regular.ttf
-  * Papyrus.ttc
-  * Pro W4.otf
-  * Times New Roman Bold Italic.ttf
-  * Times New Roman Bold.ttf
-  * Times New Roman Italic.ttf
-  * Times New Roman.ttf 
-
-
-System fonts
-------------
-
-If neither '\-\-portableFonts' nor '\-\-resourceFonts' is specified, dm uses the fonts
-present on the system. Also, if '\-\-portableFonts' or '\-\-resourceFonts' is specified
-and the desired font is not available, the native font lookup algorithm is
-invoked.
-
-
 GM font selection
 -----------------
 
@@ -70,49 +18,17 @@
 portable typeface on the paint, call:
 
 ~~~~
-sk_tool_utils::set_portable_typeface(SkPaint* , const char* name = nullptr,
-SkTypeface::Style style = SkTypeface::kNormal );
+ToolUtils::set_portable_typeface(SkPaint* , const char* name = nullptr,
+SkFontStyle style = SkFontStyle());
 ~~~~
 
 To create a portable typeface, use:
 
 ~~~~
-SkTypeface* typeface = sk_tool_utils::create_portable_typeface(const char* name,
-SkTypeface::Style style);
+SkTypeface* typeface = ToolUtils::create_portable_typeface(const char* name,
+SkFontStyle style);
 ~~~~
 
-Eventually, both 'set_portable_typeface()' and 'create_portable_typeface()' will be
-removed. Instead, a test-wide 'SkFontMgr' will be selected to choose portable
+Eventually, both `set_portable_typeface()` and `create_portable_typeface()` will be
+removed. Instead, a test-wide `SkFontMgr` will be selected to choose portable
 fonts or resource fonts.
-
-
-Adding new fonts and glyphs to a GM
------------------------------------
-
-If a font is missing from the portable data or the resource directory, the
-system font is used instead. If a glyph is missing from the portable data, the
-first character, usually a space, is drawn instead.
-
-Running dm with '\-\-portableFonts' and '\-\-reportUsedChars' generates
-'tools/test_font_data_chars.cpp', which describes the fonts and characters used by
-all gm tests. Subsequently running the 'create_test_font' tool generates new paths
-and writes them into 'tools/test_font_data.cpp' .
-
-
-Future work
------------
-
-The font set used by gm tests today is arbitrary and not intended to be
-cross-platform. By choosing fonts without licensing issues, all bots can freely
-contain the same fonts. By narrowing the font selection, the size of the test
-font data will be more manageable.
-
-Adding support for selecting from multiple font managers at runtime permits
-removing manual typeface selection in the gm tests. Today, options to dm like
-'\-\-pipe' fail with '\-\-portableFonts' because we're hard-coded to using the default
-font manage when pictures are serialized.
-
-Some gm tests explicitly always want to use system fonts and system metrics;
-other gm tests use text only to label the drawing; yet other gm tests use text
-to generate paths for testing. Additional discrimination is needed to
-distinguish these cases.
diff --git a/src/third_party/skia/site/dev/testing/fuzz.md b/src/third_party/skia/site/dev/testing/fuzz.md
new file mode 100644
index 0000000..8bb3744
--- /dev/null
+++ b/src/third_party/skia/site/dev/testing/fuzz.md
@@ -0,0 +1,32 @@
+Reproducing Skia Fuzzes
+=======================
+
+We assume that you can [build Skia](/user/build). Many fuzzes only reproduce
+when building with ASAN or MSAN; see [those instructions for more details](./xsan).
+
+When building, you should add the following args to BUILD.gn to make reproducing
+less machine- and platform- dependent:
+
+    skia_use_fontconfig=false
+    skia_use_freetype=true
+    skia_use_system_freetype2=false
+    skia_use_wuffs=true
+    skia_enable_skottie=true
+    skia_enable_fontmgr_custom=false
+    skia_enable_fontmgr_custom_empty=true
+
+All that is needed to reproduce a fuzz downloaded from ClusterFuzz, oss-fuzz or
+fuzzer.skia.org is to run something like:
+
+    out/ASAN/fuzz -b /path/to/downloaded/testcase
+
+The fuzz binary will try its best to guess what the type/name should be based on
+the name of the testcase. Manually providing type and name is also supported, like:
+
+    out/ASAN/fuzz -t filter_fuzz -b /path/to/downloaded/testcase
+    out/ASAN/fuzz -t api -n RasterN32Canvas -b /path/to/downloaded/testcase
+
+To enumerate all supported types and names, run the following:
+
+    out/ASAN/fuzz --help  # will list all types
+    out/ASAN/fuzz -t api  # will list all names
diff --git a/src/third_party/skia/site/dev/testing/ios.md b/src/third_party/skia/site/dev/testing/ios.md
index e6535e1..5ae5368 100644
--- a/src/third_party/skia/site/dev/testing/ios.md
+++ b/src/third_party/skia/site/dev/testing/ios.md
@@ -24,6 +24,7 @@
   (Note: All these are part of the *libimobiledevice* project but packaged/developed
   under different names. The *cask* extension to *brew* is necessary to install
   *osxfuse* and *ifuse*, which allows to mount the application directory on an iOS device).
+
 ```
 brew install libimobiledevice
 brew install ideviceinstaller
@@ -31,7 +32,9 @@
 brew install Caskroom/cask/osxfuse
 brew install ifuse
 ```
+
 * Install node.js and ios-deploy
+
 ```
 $ brew update
 $ brew install node
diff --git a/src/third_party/skia/site/dev/testing/skiagold.md b/src/third_party/skia/site/dev/testing/skiagold.md
index e8568c4..e03a7ef 100644
--- a/src/third_party/skia/site/dev/testing/skiagold.md
+++ b/src/third_party/skia/site/dev/testing/skiagold.md
@@ -10,9 +10,12 @@
 
 * Baselines are managed in Gold outside of Git, but in lockstep with Git commits.
 * Each commit creates >500k images.
-* Deviations from the baseline are triaged after a CL lands and images are triaged
-  as either `positive` or `negative`. If a CL causes Skia to break it is reverted
-  or an additional CL is landed to fix the problem.
+* Deviations from the baseline are triaged after a CL lands and images are
+  triaged as either `positive` or `negative`.  'Positive' means the diff is
+  considered acceptable.  'Negative' means the diff is considered unacceptable
+  and requires a fix.
+  If a CL causes Skia to break it is reverted or an additional CL is landed to
+  fix the problem.
 * We test across a range of dimensions, e.g.:
 
   - OS (Windows, Linux, Mac, Android, iOS)
diff --git a/src/third_party/skia/site/dev/testing/skialab.md b/src/third_party/skia/site/dev/testing/skialab.md
deleted file mode 100644
index 5ddb0de..0000000
--- a/src/third_party/skia/site/dev/testing/skialab.md
+++ /dev/null
@@ -1,225 +0,0 @@
-SkiaLab
-=======
-
-Overview
---------
-
-Skia's buildbots are hosted in three places:
-
-* Google Compute Engine. This is the preferred location for bots which don't
-  need to run on physical hardware, ie. anything that doesn't require a GPU,
-  stable performance numbers, or a specific hardware configuration. Most of our
-  compile bots live here, along with some non-GPU test bots on Linux and
-  Windows.
-* Chrome Golo. This is the preferred location for bots which require specific
-  hardware or OS configurations that are not supported by GCE. We have several
-  Mac, Linux, and Windows bots in the Golo.
-* The local SkiaLab in Chapel Hill. Anything we can't get in GCE or the Golo
-  lives here. This includes newer or uncommon GPUs and all Android, ChromeOS,
-  and iOS devices.
-
-This page covers the local SkiaLab in Chapel Hill.
-
-
-Layout
-------
-
-The SkiaLab consists of three wireframe racks which hold machines connected to
-two KVM switches. Each KVM switch has a monitor, mouse, and keyboard and is the
-primary mode of access to the lab machines. In general, the machines are on the
-same rack as the KVM switch used to access them. The switch nearest the door
-(labeled "DOOR"), is connected to machines on its own rack as well as a smaller
-rack closer to the door.
-
-Each machine is labeled with its hostname and the number or letter used to
-access it on the KVM switch. Android devices are located on the rack nearest
-the interior of the office (the KVM switch is labeled "OFFICE"). They are
-labeled with their serial number and the name of the buildslave they are
-associated with. Each device connects to a host machine, either directly or
-by way of a powered USB hub.
-
-**Disclaimer: Please ONLY make changes on a lab machine as a last resort, as it
-is disruptive to the running bots and can leave the machines in a dirty state.
-If you must make changes, such as cloning a copy of Skia to run tests and debug
-failures, be sure to clean up after yourself. If a permanent change needs to be
-made on the machine (such as a driver update), please contact an infra team
-member.**
-
-
-Common Tasks
-------------
-
-### Locating the host machine for a failing bot
-
-Sometimes failures can only be reproduced on a particular hardware
-configuration. In these cases, it is sometimes necessary to log into the host
-machine where a failing bot is running in order to debug the failure.
-
-From the [Status](https://status.skia.org/) page:
-
-1. Click on the box associated with a failed build.
-2. A popup will appear with some information about the build, including the
-   builder and buildslave. Click the "Lookup" link next to "Host machine". This
-   will bring you to the [SkiaLab Hosts](https://status.skia.org/hosts) page,
-   which contains information about the machines in the lab, pre-filtered to
-   select the machine which runs the buildslave in question.
-3. The information box will display the hostname of the machine as well as the
-   KVM switch and number used to access the machine, if the machine is in the
-   SkiaLab.
-4. Walk over to the lab. While standing at the KVM switch indicated by the host
-   information page, double tap \<ctrl\> and then press the number or letter from
-   the information page. It may be necessary to move or click the mouse to wake
-   the machine up.
-5. Log in to the machine if necessary. The password is stored in
-   [Valentine](https://valentine/) as "Chapel Hill buildbot slave password".
-
-### Rebooting a problematic Android device
-
-Follow the same process as above, with some slight changes:
-
-1. On the [Status](https://status.skia.org/) page, click the box for the failed
-   build.
-2. Click the "Lookup" link for the host machine. Remember the name of the
-   buildslave which ran the build.
-3. The hosts page will display the information used to access the host machine
-   for the device as well as the serial number for the device next to the name
-   of its buildsave.
-4. Walk over to the lab and find the Android device with the serial number from
-   the hosts page. Hold the power and volume-up buttons until the device
-   reboots.
-5. Access the host machine for the device, per the above instructions. Use the
-   `which_devices.py` script to verify that the device has re-attached. From
-   the home directory:
-
-        $ python buildbot/scripts/which_devices.py
-
-
-Maintenance Tasks
------------------
-
-### Bringing up a new buildbot host machine
-
-This assumes that we're just adding a host machine for a new buildbot slave,
-and doesn't cover how to make changes to the buildbot code to change the
-behavior of the builder itself.
-
-1. Obtain the machine itself and place it on the racks in the lab. Connect
-   power, ethernet, and KVM cables.
-2. If we already have a disk image appropriate for this machine, follow the
-   instructions for flashing a disk image to a machine below. Otherwise, follow
-   the instructions for bringing up a new machine from scratch.
-3. Power on the machine. Be sure to kill any buildbot processes that start up,
-   eg. `killall python` on Linux and Mac, and just close any cmd instances which
-   pop up on Windows.
-4. Set the hostname for the machine.
-5. Ensure that the machine is labeled with its hostname and KVM number.
-6. Add the new slave to the slaves.cfg file on the appropriate master, eg.
-   https://chromium.googlesource.com/chromium/tools/build/+/master/masters/master.client.skia/slaves.cfg,
-   and upload the change for code review.
-7. Add an entry for the new host machine to the slave_hosts_cfg.py file in the
-   Skia infra repo: https://skia.googlesource.com/buildbot/+/master/site_config/slave_hosts_cfg.py,
-   and upload it for review.
-8. Commit the change to add the slave to the master. Once it lands, commit the
-   slave_hosts_cfg.py change immediately afterward.
-9. Restart the build master. Either ask borenet@ to do this or file a
-   [ticket](https://code.google.com/p/chromium/issues/entry?template=Build%20Infrastructure&labels=Infra-Labs,Restrict-View-Google,Infra-Troopers&summary=Restart%20request%20for%20[%20name%20]&comment=Please%20provide%20the%20reason%20for%20restart.%0A%0ASet%20to%20Pri-0%20if%20immediate%20restarted%20is%20required,%20otherwise%20please%20set%20to%20Pri-1%20and%20the%20restart%20will%20happen%20when%20the%20trooper%20gets%20a%20free%20moment.) for a trooper to do it.
-10. Reboot the machine and monitor the build master to ensure that it connects.
-    This can take some time, since the bot needs to sync Chrome.
-
-
-### Bringing up a new Android bot
-
-1. Locate or add a host machine. We generally want to keep the number of
-   devices attached to each host below 5 or so. If a new host machine is
-   required, follow the above instructions for bringing up a new buildbot
-   host machine, with the exception that the slave corresponds to the Android
-   device, not the host machine itself.
-2. Ensure that the buildslave is not yet running:
-
-        $ killall python
-
-3. Disable MTP and PTP on the device.  Some devices require one or the other to
-   be enabled; in that case, select PTP and choose to 'do nothing' when
-   attaching to the host machine.
-4. Connect the device to the host machine, either through a powered USB hub or
-   directly to the machine.
-5. Make sure that the device is in developer mode and that USB debugging is
-   enabled.
-6. Authorize the device for USB debugging on the host machine by checking the
-   "always allow" box on dialog box which appears on the Android device after
-   plugging it into the host.
-7. Ensure that the device appears as "connected" when you run the
-   `which_devices.py` script:
-
-        $ python buildbot/scripts/which_devices.py
-
-8. Reboot the machine to start the buildslave.
-
-
-### Bringing up a new machine from scratch
-
-TODO(borenet): Migrate from Google Docs.
-
-OS-specific instructions are available in a
-[Google Doc](https://docs.google.com/document/d/1X7Hvsj33AlBmj-KEWfFbmdCArUJJAICLkB7ipDcxRV8/edit)
-
-
-### Flashing a disk image to a machine
-
-1. Find the USB key labeled, "Clonezilla" in the SkiaLab and insert it into the
-   machine.
-2. Turn on the machine and load the boot menu. For Shuttle machines, press
-   \<del\> or \<esc\>. Mac machines require that you plug in the Mac keyboard and
-   press the \<option\> key at boot. Boot from the USB key. It's typically UEFI
-   and named something like "FlashBlu" or "Kanguru".
-3. At the Clonezilla menu, choose the "to RAM" option.
-4. Choose your preferred language.
-5. "Don't touch keymap".
-6. "Start Clonezilla".
-7. "device-image".
-8. "local_dev".
-9. Unplug the flash drive and plug in the external hard drive labeled, "Disk
-   images." Wait for the "Attached Enclosure device" message to appear, then
-   hit \<enter\>.
-10. Select the external drive to use for /home/partimag, something like,
-    "1000GB_ntfs_My_Passport".
-11. Select the bot_img directory.
-12. Hit \<enter\> to continue.
-13. "Beginner"
-14. "restoredisk"
-15. Select the image to use. Make sure that it's compatible with this machine.
-16. Choose the hard drive in the machine. It should be the only option.
-17. "y" and "y"
-18. Choose "reboot" after flashing the image to the machine.
-19. Set the hostname of the machine so that it doesn't conflict with any
-    existing machines.
-
-### Capturing a disk image
-
-1. Make sure that the machine is in a clean state: no pre-existing buildslave
-   checkouts, extra software, etc.
-2. Find the USB key labeled, "Clonezilla" in the SkiaLab and insert it into the
-   machine.
-3. Turn on the machine and load the boot menu. For Shuttle machines, press
-   \<del\> or \<esc\>. Mac machines require that you plug in the Mac keyboard and
-   press the \<option\> key at boot. Boot from the USB key. It's typically UEFI
-   and named something like "FlashBlu" or "Kanguru".
-4. At the Clonezilla menu, choose the "to RAM" option.
-5. Choose your preferred language.
-6. "Don't touch keymap".
-7. "Start Clonezilla".
-8. "device-image".
-9. "local_dev"
-10. Unplug the flash drive and plug in the external hard drive labeled, "Disk
-    images." Wait for the "Attached Enclosure device" message to appear, then
-    hit \<enter\>.
-11. Select the external drive to use for /home/partimag, something like,
-    "1000GB_ntfs_My_Passport".
-12. Select the bot_img directory.
-13. "Beginner"
-14. "savedisk"
-15. Choose a name for the disk image. The convention is:
-    `skiabot-<hardware type>-<OS>-<disk image revision #>`
-12. Choose the hard drive in the machine. It should be the only option.
-13. "y"
-14. Choose "reboot" or "shut down" when finished.
diff --git a/src/third_party/skia/site/dev/testing/skiaperf.md b/src/third_party/skia/site/dev/testing/skiaperf.md
index 921df2e..005b30b 100644
--- a/src/third_party/skia/site/dev/testing/skiaperf.md
+++ b/src/third_party/skia/site/dev/testing/skiaperf.md
@@ -8,7 +8,7 @@
 <img src=Perf.png style="margin-left:30px" align="left" width="800"/> <br clear="left">
 
 Skia tests across a large number of platforms and configurations, and each
-commit to Skia generates 240,000 individual values are sent to Perf,
+commit to Skia generates 240,000 individual values that are sent to Perf,
 consisting mostly of performance benchmark results, but also including memory
 and coverage data.
 
diff --git a/src/third_party/skia/site/dev/testing/skqp.md b/src/third_party/skia/site/dev/testing/skqp.md
new file mode 100644
index 0000000..2c6dae7
--- /dev/null
+++ b/src/third_party/skia/site/dev/testing/skqp.md
@@ -0,0 +1,50 @@
+SkQP
+====
+
+Development APKs of SkQP are kept in Google storage.  Each file in named
+with a abbreviated Git hash that points at the commit in the Skia repository it
+was built with.
+
+These are universal APKs that contain native libraries for armeabi-v7a,
+arm64-v8a, x86, and x86\_64 architectures. The most recent is listed first.
+
+The listing can be found here:
+[https://storage.googleapis.com/skia-skqp/apklist](https://storage.googleapis.com/skia-skqp/apklist)
+
+If you are looking at Android CTS failures, use the most recent commit on the
+`origin/skqp/release` branch.
+
+To run tests:
+
+    adb install -r skqp-universal-{APK_SHA_HERE}.apk
+    adb logcat -c
+    adb shell am instrument -w org.skia.skqp
+
+Monitor the output with:
+
+    adb logcat TestRunner org.skia.skqp skia DEBUG "*:S"
+
+Note the test's output path on the device.  It will look something like this:
+
+    01-23 15:22:12.688 27158 27173 I org.skia.skqp:
+    output written to "/storage/emulated/0/Android/data/org.skia.skqp/files/skqp_report_2019-02-28T102058"
+
+Retrieve and view the report with:
+
+    OUTPUT_LOCATION="/storage/emulated/0/Android/data/org.skia.skqp/files/skqp_report_2019-02-28T102058"
+    adb pull "$OUTPUT_LOCATION" /tmp/
+
+(Your value of `$OUTPUT_LOCATION` will differ from mine.
+
+Open the file `/tmp/output/skqp_report_2019-02-28T102058/report.html` .
+
+**Zip up that directory to attach to a bug report:**
+
+    cd /tmp
+    zip -r skqp_report_2019-02-28T102058.zip skqp_report_2019-02-28T102058
+    ls -l skqp_report_2019-02-28T102058.zip
+
+* * *
+
+For more information about building your own APK, refer to
+https://skia.googlesource.com/skia/+/master/tools/skqp/README.md
diff --git a/src/third_party/skia/site/dev/testing/swarmingbots.md b/src/third_party/skia/site/dev/testing/swarmingbots.md
new file mode 100644
index 0000000..a2626f3
--- /dev/null
+++ b/src/third_party/skia/site/dev/testing/swarmingbots.md
@@ -0,0 +1,78 @@
+Skia Swarming Bots
+==================
+
+Overview
+--------
+
+Skia's Swarming bots are hosted in three places:
+
+* Google Compute Engine. This is the preferred location for bots which don't need to run on physical
+  hardware, ie. anything that doesn't require a GPU or a specific hardware configuration. Most of
+  our compile bots live here, along with some non-GPU test bots on Linux and Windows. We get
+  surprisingly stable performance numbers from GCE, despite very few guarantees about the physical
+  hardware.
+* Chrome Golo. This is the preferred location for bots which require specific hardware or OS
+  configurations that are not supported by GCE. We have several Mac, Linux, and Windows bots in the
+  Golo.
+* The Skolo (local Skia lab in Chapel Hill). Anything we can't get in GCE or the Golo lives
+  here. This includes a wider variety of GPUs and all Android, ChromeOS, iOS, and other devices.
+
+[go/skbl](https://goto.google.com/skbl) lists all Skia Swarming bots.
+
+
+<a name="connecting-to-swarming-bots"></a>
+Connecting to Swarming Bots
+---------------------------
+
+- Machine name like “skia-gce-NNN”, “skia-ct-gce-NNN”, “skia-i-gce-NNN”, “ct-gce-NNN”, “ct-xxx-builder-NNN” -> GCE
+  * First determine the project for the bot:
+     + skia-gce-NNN, skia-ct-gce-NNN: [skia-swarming-bots](https://console.cloud.google.com/compute/instances?project=skia-swarming-bots)
+     + skia-i-gce-NNN: [google.com:skia-buildbots](https://console.cloud.google.com/compute/instances?project=google.com:skia-buildbots)
+     + ct-gce-NNN, ct-xxx-builder-NNN: [ct-swarming-bots](https://console.cloud.google.com/compute/instances?project=ct-swarming-bots)
+  * To log in to a Linux bot in GCE, use `gcloud compute ssh --project <project> default@<machine name>`. Choose the zone listed on the VM's detail page (see links above). You may also specify the zone using the `--zone` command-line flag.
+  * To log in to a Windows bot in GCE, on the VM's detail page, first click the "Set Windows password" button, then click the "RDP" button. (If it hasn't been installed, you will be instructed to install the Chrome RDP Extension for GCP.)
+
+- Machine name ends with “a9”, “m3”, "m5" -> Chrome Golo/Labs
+  * To log in to Golo bots, see [go/chrome-infra-build-access](https://goto.google.com/chrome-infra-build-access).
+
+- Machine name starts with “skia-e-”, “skia-i-” (other than “skia-i-gce-NNN”), “skia-rpi-” -> Chapel Hill lab (aka Skolo)<br/>
+  To log in to Skolo bots, see the [Skolo maintenance doc][remote access] remote access section. See the following for OS specific instructions:<br/>
+  * [Remotely debug an Android device in Skolo][remotely debug android]
+  * [VNC to Skolo Windows bots][vnc to skolo windows]
+  * [ChromeOS Debugging][chromeos debugging]
+
+
+Debugging
+---------
+
+If you need to run code on a specific machine/device to debug an issue, the simplest option is to
+run tryjobs (after adding debugging output to the relevant code). In some cases you may also need to
+[create or modify tryjobs](automated_testing#adding-new-jobs).
+
+For Googlers: If you need more control (e.g. to run GDB) and need run to directly on a swarming bot then you can use [leasing.skia.org](https://leasing.skia.org).<br/>
+If that does not work then the [current trooper][current trooper] can help you bring the device back to your desk and connect
+it to GoogleGuest Wifi or the [Google Test Network](http://go/gtn-criteria).
+
+If you need to make changes on a Skolo device, please check with an Infra team member. Most can be
+flashed/imaged back to a clean state, but others can not.
+
+If a permanent change needs to be made on the machine (such as an OS or driver update), please [file
+a bug][infra bug] and assign to jcgregorio for reassignment.
+
+[current trooper]: http://skia-tree-status.appspot.com/trooper
+[remote access]:
+    https://docs.google.com/document/d/1zTR1YtrIFBo-fRWgbUgvJNVJ-s_4_sNjTrHIoX2vulo/edit#heading=h.2nq3yd1axg0n
+[infra bug]: https://bugs.chromium.org/p/skia/issues/entry?template=Infrastructure+Bug
+[remotely debug android]: https://docs.google.com/document/d/1nxn7TobfaLNNfhSTiwstOnjV0jCxYUI1uwW0T_V7BYg/
+[vnc to skolo windows]:
+    https://docs.google.com/document/d/1zTR1YtrIFBo-fRWgbUgvJNVJ-s_4_sNjTrHIoX2vulo/edit#heading=h.7cqd856ft0s
+[chromeos debugging]:
+    https://docs.google.com/document/d/1yJ2LLfLzV6pXKjiameid1LHEz1mj71Ob4wySIYxlBdw/edit#heading=h.9arg79l59xrf
+
+Maintenance Tasks
+-----------------
+
+See the [Skolo maintenance doc][skolo maintenance].
+
+[skolo maintenance]:
+    https://docs.google.com/document/d/1zTR1YtrIFBo-fRWgbUgvJNVJ-s_4_sNjTrHIoX2vulo/edit
diff --git a/src/third_party/skia/site/dev/testing/testing.md b/src/third_party/skia/site/dev/testing/testing.md
index d58abfb..39af4b9 100644
--- a/src/third_party/skia/site/dev/testing/testing.md
+++ b/src/third_party/skia/site/dev/testing/testing.md
@@ -6,7 +6,7 @@
 
 <!--?prettify lang=sh?-->
 
-    python tools/git-sync-deps
+    python2 tools/git-sync-deps
     bin/gn gen out/Debug
     ninja -C out/Debug dm
     out/Debug/dm -v -w dm_output
@@ -82,30 +82,31 @@
 status line for one of those tasks.
 ~~~
 (  25MB  1857) 1.36ms   8888 image mandrill_132x132_12x12.astc-5-subsets
+   [1]   [2]   [3]      [4]
 ~~~
 
 This status line tells us several things.
 
-First, it tells us that at the time we wrote the status line, the maximum
-amount of memory DM had ever used was 25MB.  Note this is a high water mark,
-not the current memory usage.  This is mostly useful for us to track on our
-buildbots, some of which run perilously close to the system memory limit.
+  1. The maximum amount of memory DM had ever used was 25MB. Note this is a 
+  high water mark, not the current memory usage.  This is mostly useful for us 
+  to track on our buildbots, some of which run perilously close to the system 
+  memory limit.
 
-Next, the status line tells us that there are 1857 unfinished tasks, either
-currently running or waiting to run.  We generally run one task per hardware
-thread available, so on a typical laptop there are probably 4 or 8 running at
-once.  Sometimes the counts appear to show up out of order, particularly at DM
-startup; it's harmless, and doesn't affect the correctness of the run.
+  2. The number of unfinished tasks, in this example there are 1857, either
+  currently running or waiting to run.  We generally run one task per hardware
+  thread available, so on a typical laptop there are probably 4 or 8 running at
+  once.  Sometimes the counts appear to show up out of order, particularly at DM
+  startup; it's harmless, and doesn't affect the correctness of the run.
 
-Next, we see this task took 1.36 milliseconds to run.  Generally, the precision
-of this timer is around 1 microsecond.  The time is purely there for
-informational purposes, to make it easier for us to find slow tests.
+  3. Next, we see this task took 1.36 milliseconds to run.  Generally, the 
+  precision of this timer is around 1 microsecond.  The time is purely there for
+  informational purposes, to make it easier for us to find slow tests.
 
-Finally we see the configuration and name of the test we ran.  We drew the test
-"mandrill_132x132_12x12.astc-5-subsets", which is an "image" source, into an
-"8888" sink.
+  4. The configuration and name of the test we ran.  We drew the test
+  "mandrill_132x132_12x12.astc-5-subsets", which is an "image" source, into an
+  "8888" sink.
 
-When DM finishes running, you should find a directory with file named dm.json,
+When DM finishes running, you should find a directory with file named `dm.json`,
 and some nested directories filled with lots of images.
 ~~~
 $ ls dm_output
@@ -127,9 +128,9 @@
 
 The directories are nested first by sink type (`--config`), then by source type (`--src`).
 The image from the task we just looked at, "8888 image mandrill_132x132_12x12.astc-5-subsets",
-can be found at dm_output/8888/image/mandrill_132x132_12x12.astc-5-subsets.png.
+can be found at `dm_output/8888/image/mandrill_132x132_12x12.astc-5-subsets.png`.
 
-dm.json is used by our automated testing system, so you can ignore it if you
+`dm.json` is used by our automated testing system, so you can ignore it if you
 like.  It contains a listing of each test run and a checksum of the image
 generated for that run.
 
@@ -142,7 +143,7 @@
 Unit tests don't generally output anything but a status update when they pass.
 If a test fails, DM will print out its assertion failures, both at the time
 they happen and then again all together after everything is done running.
-These failures are also included in the dm.json file.
+These failures are also included in the `dm.json` file.
 
 DM has a simple facility to compare against the results of a previous run:
 
diff --git a/src/third_party/skia/site/dev/testing/tests.md b/src/third_party/skia/site/dev/testing/tests.md
index c24a173..fc1a961 100644
--- a/src/third_party/skia/site/dev/testing/tests.md
+++ b/src/third_party/skia/site/dev/testing/tests.md
@@ -9,7 +9,7 @@
 
 <!--?prettify lang=sh?-->
 
-    python tools/git-sync-deps
+    python2 tools/git-sync-deps
     bin/gn gen out/Debug
     bin/gn gen out/Release --args='is_debug=false'
 
@@ -78,12 +78,12 @@
         ninja -C out/Debug dm
         out/Debug/dm --match newgmtest
 
-4.  Run the GM inside SampleApp:
+4.  Run the GM inside Viewer:
 
     <!--?prettify lang=sh?-->
 
-        ninja -C out/Debug SampleApp
-        out/Debug/SampleApp --slide GM:newgmtest
+        ninja -C out/Debug viewer
+        out/Debug/viewer --slide GM_newgmtest
 
 <span id="bench"></span>
 
diff --git a/src/third_party/skia/site/dev/testing/xsan.md b/src/third_party/skia/site/dev/testing/xsan.md
index 8b71a13..b1d7052 100644
--- a/src/third_party/skia/site/dev/testing/xsan.md
+++ b/src/third_party/skia/site/dev/testing/xsan.md
@@ -3,53 +3,86 @@
 
 *Testing Skia with memory, address, and thread santizers.*
 
-Downloading Clang Binaries (Googlers Only)
+Compiling Skia with ASAN, UBSAN, or TSAN can be done with the latest version of Clang.
+
+- UBSAN works on Linux, Mac, Android, and Windows, though some checks are platform-specific.
+- ASAN works on Linux, Mac, Android.
+- TSAN works on Linux and Mac.
+- MSAN works on Linux[1].
+
+We find that testing sanitizer builds with libc++ uncovers more issues than
+with the system-provided C++ standard library, which is usually libstdc++.
+libc++ proactively hooks into sanitizers to help their analyses.
+We ship a copy of libc++ with our Linux toolchain in /lib.
+
+[1]To compile and run with MSAN, an MSAN-instrumented version of libc++ is needed.
+It's generally easiest to run one of the following 2 steps to build/download a recent version
+of Clang and the instrumented libc++, located in /msan.
+
+Downloading Clang binaries (Googlers Only)
 ------------------------------------------
+This requires gsutil, part of the [gcloud sdk](https://cloud.google.com/sdk/downloads).
+
+<!--?prettify lang=sh?-->
 
     CLANGDIR="${HOME}/clang"
-    python infra/bots/assets/clang_linux/download.py -t $CLANGDIR
+    python2 infra/bots/assets/clang_linux/download.py -t $CLANGDIR
 
-Building Clang from scratch
+Building Clang binaries from scratch (Other users)
 ---------------------------
 
+<!--?prettify lang=sh?-->
+
     CLANGDIR="${HOME}/clang"
 
-    python tools/git-sync-deps
+    python2 tools/git-sync-deps
     CC= CXX= infra/bots/assets/clang_linux/create.py -t "$CLANGDIR"
 
 Configure and Compile Skia with MSAN
 ------------------------------------
 
+<!--?prettify lang=sh?-->
+
     CLANGDIR="${HOME}/clang"
     mkdir -p out/msan
     cat > out/msan/args.gn <<- EOF
         cc = "${CLANGDIR}/bin/clang"
         cxx = "${CLANGDIR}/bin/clang++"
-        extra_ldflags = [ "-Wl,-rpath", "-Wl,${CLANGDIR}/msan" ]
+        extra_cflags = [ "-B${CLANGDIR}/bin" ]
+        extra_ldflags = [
+            "-B${CLANGDIR}/bin",
+            "-fuse-ld=lld",
+            "-L${CLANGDIR}/msan",
+            "-Wl,-rpath,${CLANGDIR}/msan" ]
         sanitize = "MSAN"
         skia_use_fontconfig = false
     EOF
-    python tools/git-sync-deps
+    python2 tools/git-sync-deps
     bin/gn gen out/msan
     ninja -C out/msan
 
 Configure and Compile Skia with ASAN
 ------------------------------------
 
+<!--?prettify lang=sh?-->
+
     CLANGDIR="${HOME}/clang"
     mkdir -p out/asan
     cat > out/asan/args.gn <<- EOF
         cc = "${CLANGDIR}/bin/clang"
         cxx = "${CLANGDIR}/bin/clang++"
         sanitize = "ASAN"
+        extra_ldflags = [ "-fuse-ld=lld", "-Wl,-rpath,${CLANGDIR}/lib" ]
     EOF
-    python tools/git-sync-deps
+    python2 tools/git-sync-deps
     bin/gn gen out/asan
     ninja -C out/asan
 
 Configure and Compile Skia with TSAN
 ------------------------------------
 
+<!--?prettify lang=sh?-->
+
     CLANGDIR="${HOME}/clang"
     mkdir -p out/tsan
     cat > out/tsan/args.gn <<- EOF
@@ -57,9 +90,9 @@
         cxx = "${CLANGDIR}/bin/clang++"
         sanitize = "TSAN"
         is_debug = false
+        extra_ldflags = [ "-Wl,-rpath,${CLANGDIR}/lib" ]
     EOF
-    python tools/git-sync-deps
+    python2 tools/git-sync-deps
     bin/gn gen out/tsan
     ninja -C out/tsan
 
-
diff --git a/src/third_party/skia/site/dev/tools/codesearch.md b/src/third_party/skia/site/dev/tools/codesearch.md
index 82beb2d..8859c7c 100644
--- a/src/third_party/skia/site/dev/tools/codesearch.md
+++ b/src/third_party/skia/site/dev/tools/codesearch.md
@@ -15,7 +15,7 @@
 main [skia](http://cs/#skia/skia/) repo, internal Code Search indexes the
 [buildbot](http://cs/#skia/buildbot/), [common](http://cs/#skia/common/),
 and [skia_internal](https://cs/#skia/skia_internal/) repos. However,
-cross-references, history/blame, and code analysis are not available.
+cross-references and code analysis are not available.
 
 The Github mirrors of the [skia](https://github.com/google/skia) and
 [skia-buildbot](https://github.com/google/skia-buildbot) repos are useful for
@@ -29,9 +29,9 @@
 appear here first.
 
   Code search option  |Search |XRef |History |Repos                         |Branches |Freshness
-  --------------------|-------|-----|--------|------------------------------|---------|----------------------
+  --------------------|-------|-----|--------|------------------------------|---------|---------------
   [cs.skia.org][1]    |regexp | yes |yes     |skia                          |master   |last DEPS roll
-  [Internal][2]       |regexp | no  |no      |skia buildbot common internal |master   |hours
+  [Internal][2]       |regexp | no  |yes     |skia buildbot common internal |master   |hours
   [Github][3]         |basic  | no  |yes     |skia buildbot                 |all      |hour
   [googlesource][4]   |none   | no  |yes     |all                           |all      |N/A
 
@@ -39,3 +39,11 @@
 [2]: http://cs/#skia/                "Internal Code Search"
 [3]: https://github.com/google/skia  "Github mirror of skia"
 [4]: https://skia.googlesource.com/  "Master Skia repos on googlesource.com"
+
+Client code search
+------------------
+
+There is an [internal tool for
+Googlers](https://goto.google.com/skia-client-search) to make it easier to
+search the repos of Skia clients, e.g. Chromium, Android, and Mozilla. If you
+use it and have suggestions, please let dogben know.
diff --git a/src/third_party/skia/site/dev/tools/markdown.md b/src/third_party/skia/site/dev/tools/markdown.md
index 939e8a3..fb49339 100644
--- a/src/third_party/skia/site/dev/tools/markdown.md
+++ b/src/third_party/skia/site/dev/tools/markdown.md
@@ -1,11 +1,11 @@
 Markdown
 ========
 
-This site can handle normal MarkDown and many common extensions. To learn
+This site can handle normal Markdown and many common extensions. To learn
 how the following is done please see the [source for this page](./markdown.md).
 Any file you put under `/site/` that has the extension `.md` will be processed
-as MarkDown. All other files will be served directly. For example, images
-can be added and they will be served correctly and referenced from within MarkDown files.
+as Markdown. All other files will be served directly. For example, images
+can be added and they will be served correctly and referenced from within Markdown files.
 
 When preparing for a code review of site docs you can get a preview of how the
 page will render by visiting the skia.org site and add a query parameter `cl`
@@ -13,12 +13,19 @@
 
     https://skia.org/path/to/markdown-file?cl=REITVELD_ISSUE_NUMBER
 
-You can also run a local copy of the documentation server, which will allow
-you to preview changes much quicker. You must have [Go](https://golang.org)
-installed on your computer, which you will have if you are running on a Google
-corporate workstation. Run:
+This is the preferred method of previewing docs changes.
 
-    go get -u skia.googlesource.com/buildbot.git/doc/go/docserver
+If for some reason you can't use the method above to preview docs changes you
+can also run a local copy of the documentation server, which will allow you to
+preview changes much quicker. You must have a recent version (>=8.9) of
+[node](https://nodejs.org/) installed on your machine. You must also have
+[Go](https://golang.org) installed on your computer, which you will have if
+you are running on a Google corporate workstation. Installation also means
+that you have `$GOPATH/bin` [added to your PATH](https://golang.org/doc/code.html#GOPATH). Run:
+
+    go get -u go.skia.org/infra/doc/go/docserver
+    cd $GOPATH/src/go.skia.org/infra/doc
+    make
 
 And then **from within** the directory of your local Git checkout of Skia run:
 
@@ -55,7 +62,7 @@
 files and directories that aren't controlled by a METADATA file are sorted in
 alphabetical order by their filename.
 
-Some Example MarkDown
+Some Example Markdown
 ---------------------
 
 This is a [link](https://www.google.com). You can also create
@@ -129,7 +136,7 @@
 > ###### Deep
 
 And you can <b>always</b> use HTML, which is useful for features that can't be
-done in MarkDown, such as iframes, but try to avoid using HTML outside of
+done in Markdown, such as iframes, but try to avoid using HTML outside of
 sitations like that.
 <svg viewBox="0 0 24 24" height="24px" width="24px" style="display: inline;">
   <g>
@@ -143,14 +150,14 @@
 Reference
 =========
 
-Below is a longer reference on the MarkDown that docserver accepts.
+Below is a longer reference on the Markdown that docserver accepts.
 
 Paragraphs
 ----------
 
 A paragraph is simply one or more consecutive lines of text, separated
 by one or more blank lines. (A blank line is any line that looks like a
-blank line -- a line containing nothing spaces or tabs is considered
+blank line -- a line containing nothing. Note: all spaces or tabs is considered
 blank.) Normal paragraphs should not be intended with spaces or tabs.
 
 Headers and Blockquotes
@@ -398,7 +405,8 @@
 
 
 To specify an entire block of pre-formatted code, indent every line of
-the block by 4 spaces or 1 tab. Just like with code spans, `&`, `<`,
+the block by 4 spaces or 1 tab, or add a line containing three backticks before
+and after the code block. Just like with code spans, `&`, `<`,
 and `>` characters will be escaped automatically.
 
 Markdown:
@@ -410,6 +418,17 @@
             <p>For example.</p>
         </blockquote>
 
+or
+
+    If you want your page to validate under XHTML 1.0 Strict,
+    you've got to put paragraph tags in your blockquotes:
+
+    ```
+    <blockquote>
+        <p>For example.</p>
+    </blockquote>
+    ```
+
 Output:
 
     <p>If you want your page to validate under XHTML 1.0 Strict,
@@ -420,6 +439,7 @@
     &lt;/blockquote&gt;
     </code></pre>
 
+
 ### Floating Menu ###
 
 To create a floating menu for a single page that always appears
diff --git a/src/third_party/skia/site/dev/tools/tracing.md b/src/third_party/skia/site/dev/tools/tracing.md
new file mode 100644
index 0000000..33f875b
--- /dev/null
+++ b/src/third_party/skia/site/dev/tools/tracing.md
@@ -0,0 +1,109 @@
+Tracing Skia Execution
+======================
+
+Introduction
+------------
+
+Skia is instrumented to provide execution traces in several ways. Within Chrome, Skia is traced
+with the standard [tracing interface](chrome://tracing), along with the rest of Chromium. In
+the Android framework, Skia's tracing is integrated into
+[atrace](https://source.android.com/devices/tech/debug/ftrace).
+
+For standalone builds, Skia's tools (DM, nanobench, and Viewer) are capable of tracing execution
+in three ways, controlled by the `--trace` command line argument.
+
+Standalone Tracing
+------------------
+
+Most arguments to `--trace` will be interpreted as a filename (the two exceptions are described
+below), and trace events will be written to that file in JSON format, suitable for viewing with
+[chrome://tracing](chrome://tracing).
+
+<!--?prettify lang=sh?-->
+
+    # Run DM on several GMs to get tracing data
+    out/Release/dm --config gl --match bleed --trace gl_bleed_gms.json
+
+This creates a file `gl_bleed_gms.json` in the current directory. There are limitations in Chrome's
+tracing tool that prevent loading a file larger than 256 MB. To stay under that limit (and avoid
+clutter and slowdown in the interface), it's best to run a small number of tests/benchmarks when
+tracing. Once you have generated a file in this way, go to
+[chrome://tracing](chrome://tracing), click Load:
+
+![Load Button](tracing_load.png)
+
+... then select the JSON file. The data will be loaded and can be navigated/inspected using the
+tracing tools. Tip: press '?' for a help screen explaining the available keyboard and mouse
+controls.
+
+![Tracing interface](tracing.png)
+
+Android ATrace
+--------------
+
+Running any tool with `--trace atrace` on an Android device will cause the application to forward
+tracing information to [atrace](https://source.android.com/devices/tech/debug/ftrace). On other
+platforms, this has no effect.
+
+If you run `systrace` from the host command line, you will need to supply `-a <app_name>`,
+and the `<app_name>` argument will need to exactly match the command line used on the target
+device. For example, if you use `adb shell "cd /data/local/tmp; ./nanobench --trace atrace ..."`
+you must pass `-a ./nanobench` or systrace will ignore events from the application.
+
+Console Logging
+---------------
+
+For simple situations, all tracing events can be directed to the console with `--trace debugf`:
+
+<!--?prettify lang=sh?-->
+
+    # Run DM on a single GM with SkDebugf tracing
+    out/Release/dm --config gl --match ^gamma$ --trace debugf
+
+~~~
+[ 0] <skia.gpu> GrDrawingManager::internalFlush id=1 #0 {
+[ 0] } GrDrawingManager::internalFlush
+[ 0] <skia.gpu> GrGpu::createTexture id=1 #1 {
+[ 0] } GrGpu::createTexture
+[ 0] <skia.gpu> GrRenderTargetContext::discard id=1 #2 {
+[ 0] } GrRenderTargetContext::discard
+[ 0] <skia.gpu> SkGpuDevice::clearAll id=1 #3 {
+[ 1]  <skia.gpu> GrRenderTargetContext::clear id=1 #4 {
+[ 1]  } GrRenderTargetContext::clear
+[ 0] } SkGpuDevice::clearAll
+[ 0] <skia> SkCanvas::drawRect() #5 {
+[ 1]  <skia.gpu> SkGpuDevice::drawRect id=1 #6 {
+[ 2]   <skia.gpu> GrRenderTargetContext::drawRect id=1 #7 {
+[ 3]    <skia.gpu> GrRenderTargetContext::addDrawOp id=1 #8 {
+[ 3]    } GrRenderTargetContext::addDrawOp
+[ 2]   } GrRenderTargetContext::drawRect
+[ 1]  } SkGpuDevice::drawRect
+[ 0] } SkCanvas::drawRect()
+...
+~~~
+
+Adding More Trace Events
+------------------------
+
+Adding more trace events involves using a set of `TRACE_` macros. The simplest example, to record
+the time spent in a function or other scope, is:
+
+~~~
+#include "SkTraceEvent.h"
+...
+void doSomething() {
+  // Add an event for the duration of the current function (or other scope)
+  // "skia" is a category name, for filtering events while recording
+  // TRACE_FUNC is the event name, and expands to the name of the current function
+  TRACE_EVENT0("skia", TRACE_FUNC);
+
+  if (doExtraWork) {
+    TRACE_EVENT0("skia", "ExtraWorkBeingDone");
+    ...
+  }
+}
+~~~
+
+For more examples, including other kinds of trace events and attaching parameters to events, see
+the comments in
+[SkTraceEventCommon.h](https://cs.chromium.org/chromium/src/third_party/skia/src/core/SkTraceEventCommon.h).
diff --git a/src/third_party/skia/site/dev/tools/tracing.png b/src/third_party/skia/site/dev/tools/tracing.png
new file mode 100644
index 0000000..a971fba
--- /dev/null
+++ b/src/third_party/skia/site/dev/tools/tracing.png
Binary files differ
diff --git a/src/third_party/skia/site/dev/tools/tracing_load.png b/src/third_party/skia/site/dev/tools/tracing_load.png
new file mode 100644
index 0000000..35e5c28
--- /dev/null
+++ b/src/third_party/skia/site/dev/tools/tracing_load.png
Binary files differ
diff --git a/src/third_party/skia/site/index.md b/src/third_party/skia/site/index.md
index 7a83f59..245283a 100644
--- a/src/third_party/skia/site/index.md
+++ b/src/third_party/skia/site/index.md
@@ -17,6 +17,8 @@
     [bug.skia.org](https://bug.skia.org/).
   * Discussion forum:
     [skia-discuss@googlegroups.com](https://groups.google.com/forum/#!forum/skia-discuss).
+  * API Reference and Overview: [skia.org/user/api](https://skia.org/user/api/).
+  * Skia Fiddle: [fiddle.skia.org](https://fiddle.skia.org/c/@skcanvas_paint).
 
 Showcase
 --------
@@ -65,7 +67,14 @@
 
 Roadmap
 -------
-For a look at high level items we have on tap the next 6-12 months, view our
-roadmap [here](https://docs.google.com/document/d/1C9w8qpPpdgNGThqmgNnTToLZ5UYK4TsUGl5X3B_q6oM/edit?usp=sharing).
+For a look at high level themes we have on tap the next 6-12 months, view our
+roadmap [here](https://docs.google.com/document/d/1LSdO3I-IdZVZCtEnW9pu3k_32gfPIcB_YeSn-OJBGZI/edit?usp=sharing).
 Note it is a living document that changes based on the requirements of our users.
 
+Platforms
+---------
+  * Windows 7, 8, 8.1, 10
+  * macOS 10.10.5 or later
+  * iOS 8 or later
+  * Android 4.1 (JellyBean) or later
+  * Ubuntu 14.04+, Debian 8+, openSUSE 13.3+, or Fedora Linux 24+
diff --git a/src/third_party/skia/site/index_zh.md b/src/third_party/skia/site/index_zh.md
new file mode 100644
index 0000000..d415814
--- /dev/null
+++ b/src/third_party/skia/site/index_zh.md
@@ -0,0 +1,111 @@
+Skia图形库
+=====================
+
+Skia是一个开源的二维图形库,提供各种常用的API,并可在多种软硬件平台上运行。谷歌Chrome浏览器、Chrome
+OS、安卓、火狐浏览器、火狐操作系统以及其它许多产品都使用它作为图形引擎。
+
+<!-- Skia is an open source 2D graphics library which provides common APIs that work
+across a variety of hardware and software platforms.  It serves as the graphics
+engine for Google Chrome and Chrome OS, Android, Mozilla Firefox and Firefox
+OS, and many other products.
+ -->
+
+Skia由谷歌出资管理,任何人都可基于BSD免费软件许可证使用Skia。Skia开发团队致力于开发其核心部分,
+并广泛采纳各方对于Skia的开源贡献。
+
+<!-- Skia is sponsored and managed by Google, but is available for use by anyone
+under the BSD Free Software License.  While engineering of the core components
+is done by the Skia development team, we consider contributions from any
+source.
+ -->
+
+<!-- Canonical source tree: -->
+  * 源代码:
+    [skia.googlesource.com/skia](https://skia.googlesource.com/skia).
+<!-- Issue tracker -->
+  * 提议:
+    [bug.skia.org](https://bug.skia.org/).
+<!-- Discussion forum -->
+  * 论坛:
+    [skia-discuss@googlegroups.com](https://groups.google.com/forum/#!forum/skia-discuss).
+
+<!-- Showcase -->
+示例
+--------
+
+<!-- Click on any image below to see the source code that generated the image. -->
+点击以下任意图像查看生成该图像的源代码。
+<table>
+  <tr><th><!-- Shapes -->几何形状</th><th><!-- Bézier Curves -->贝塞尔曲线</th></tr>
+  <tr>
+    <td>
+      <a href='https://fiddle.skia.org/c/@shapes'>
+        <img src='https://fiddle.skia.org/i/@shapes_raster.png'>
+      </a>
+    </td>
+    <td>
+      <a href='https://fiddle.skia.org/c/@bezier_curves'>
+        <img src='https://fiddle.skia.org/i/@bezier_curves_raster.png'>
+      </a>
+    </td>
+  </tr>
+
+  <tr>
+    <th><!-- Translations and Rotations -->平移与旋转</th>
+    <th><!-- Text Rendering -->文字渲染</th>
+  </tr>
+  <tr>
+    <td>
+      <a href='https://fiddle.skia.org/c/@rotations'>
+        <img src='https://fiddle.skia.org/i/@rotations_raster.png'>
+      </a>
+    </td>
+    <td>
+      <a href='https://fiddle.skia.org/c/@text_rendering'>
+        <img src='https://fiddle.skia.org/i/@text_rendering_raster.png'>
+      </a>
+    </td>
+  </tr>
+
+  <tr>
+    <th><!-- Discrete Path Effects -->离散路径特效</th>
+    <th><!-- Composed Path Effects -->合成路径特效</th>
+  </tr>
+  <tr>
+    <td>
+      <a href='https://fiddle.skia.org/c/@discrete_path'>
+        <img src='https://fiddle.skia.org/i/@discrete_path_raster.png'>
+      </a>
+    </td>
+    <td>
+      <a href='https://fiddle.skia.org/c/@compose_path'>
+        <img src='https://fiddle.skia.org/i/@compose_path_raster.png'>
+      </a>
+    </td>
+  </tr>
+  <tr><th><!-- Sum Path Effects -->叠加路径特效</th><th><!-- Shaders -->着色器</th></tr>
+  <tr>
+    <td>
+      <a href='https://fiddle.skia.org/c/@sum_path_effect'>
+        <img src='https://fiddle.skia.org/i/@sum_path_effect_raster.png'>
+      </a>
+    </td>
+    <td>
+      <a href='https://fiddle.skia.org/c/@shader'>
+        <img src='https://fiddle.skia.org/i/@shader_raster.png'>
+      </a>
+    </td>
+  </tr>
+</table>
+
+<!-- Roadmap -->
+发展规划
+-------
+<!-- For a look at high level items we have on tap the next 6-12 months, view our
+roadmap [here]
+(https://docs.google.com/document/d/1C9w8qpPpdgNGThqmgNnTToLZ5UYK4TsUGl5X3B_q6oM/edit?usp=sharing).
+Note it is a living document that changes based on the requirements of our users. -->
+
+如果想大概了解我们接下来6-12个月会触及的项目,请查看[该文档]
+(https://docs.google.com/document/d/1C9w8qpPpdgNGThqmgNnTToLZ5UYK4TsUGl5X3B_q6oM/edit?usp=sharing)。
+请注意,该文档会根据我们用户的需求实时更新。
diff --git a/src/third_party/skia/site/user/METADATA b/src/third_party/skia/site/user/METADATA
index 6dd6513..0569e6f 100644
--- a/src/third_party/skia/site/user/METADATA
+++ b/src/third_party/skia/site/user/METADATA
@@ -1,4 +1,4 @@
 {
-  "dirOrder": ["sample", "quick", "api", "special"],
+  "dirOrder": ["sample", "release", "modules", "quick", "api", "special"],
   "fileOrder": ["download", "build"]
 }
diff --git a/src/third_party/skia/site/user/api/METADATA b/src/third_party/skia/site/user/api/METADATA
index 27625c5..799eace 100644
--- a/src/third_party/skia/site/user/api/METADATA
+++ b/src/third_party/skia/site/user/api/METADATA
@@ -1,3 +1,32 @@
 {
-  "fileOrder": ["skcanvas", "skpaint", "skrect", "skregion", "skmatrix", "grcontext", "canvas"]
+  "fileOrder": [
+    "SkAutoCanvasRestore_Reference",
+    "SkBitmap_Reference",
+    "SkBlendMode_Reference",
+    "SkCanvas_Reference",
+    "SkColor_Reference",
+    "SkColor4f_Reference",
+    "SkFont_Reference",
+    "SkImage_Reference",
+    "SkImageInfo_Reference",
+    "SkIPoint_Reference",
+    "SkIRect_Reference",
+    "SkMatrix_Reference",
+    "SkPaint_Reference",
+    "SkPath_Reference",
+    "SkPicture_Reference",
+    "SkPixmap_Reference",
+    "SkPoint_Reference",
+    "SkRRect_Reference",
+    "SkRect_Reference",
+    "SkRegion_Reference",
+    "SkSurface_Reference",
+    "SkTextBlob_Reference",
+    "SkTextBlobBuilder_Reference",
+    "skcanvas_overview",
+    "skcanvas_creation",
+    "SkBlendMode_Overview",
+    "SkPath_Overview",
+    "skpaint_overview"
+  ]
 }
diff --git a/src/third_party/skia/site/user/api/SkAutoCanvasRestore_Reference.md b/src/third_party/skia/site/user/api/SkAutoCanvasRestore_Reference.md
new file mode 100644
index 0000000..aad7e18
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkAutoCanvasRestore_Reference.md
@@ -0,0 +1,104 @@
+SkAutoCanvasRestore Reference
+===
+
+
+<a name='SkAutoCanvasRestore'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkAutoCanvasRestore_Reference#SkAutoCanvasRestore'>SkAutoCanvasRestore</a> {
+
+    <a href='#SkAutoCanvasRestore_SkCanvas_star'>SkAutoCanvasRestore</a>(<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>* <a href='SkCanvas_Reference#Canvas'>canvas</a>, bool doSave);
+    <a href='#SkAutoCanvasRestore_destructor'>~SkAutoCanvasRestore()</a>;
+    void <a href='#SkAutoCanvasRestore_restore'>restore()</a>;
+};
+
+</pre>
+
+Stack helper class calls <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_restoreToCount'>restoreToCount</a> when <a href='SkAutoCanvasRestore_Reference#SkAutoCanvasRestore'>SkAutoCanvasRestore</a>
+goes out of scope. Use this to guarantee that the <a href='SkCanvas_Reference#Canvas'>canvas</a> is restored to a known
+state.
+
+<a name='SkAutoCanvasRestore_SkCanvas_star'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkAutoCanvasRestore_SkCanvas_star'>SkAutoCanvasRestore</a>(<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>* <a href='SkCanvas_Reference#Canvas'>canvas</a>, bool doSave)
+</pre>
+
+Preserves <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_save'>save()</a> count. Optionally saves <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> clip and <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> <a href='SkMatrix_Reference#Matrix'>matrix</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkAutoCanvasRestore_SkCanvas_star_canvas'><code><strong>canvas</strong></code></a></td>
+    <td><a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> to guard</td>
+  </tr>
+  <tr>    <td><a name='SkAutoCanvasRestore_SkCanvas_star_doSave'><code><strong>doSave</strong></code></a></td>
+    <td>call <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_save'>save()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+utility to restore <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> state on destructor
+
+### Example
+
+<div><fiddle-embed name="@AutoCanvasRestore_SkCanvas_star"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_save'>save</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_restore'>restore</a>
+
+<a name='SkAutoCanvasRestore_destructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkAutoCanvasRestore_destructor'>~SkAutoCanvasRestore()</a>
+</pre>
+
+Restores <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> to saved state. Destructor is called when container goes out of
+scope.
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_save'>save</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_restore'>restore</a>
+
+<a name='SkAutoCanvasRestore_restore'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkAutoCanvasRestore_restore'>restore()</a>
+</pre>
+
+Restores <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> to saved state immediately. Subsequent calls and
+<a href='#SkAutoCanvasRestore_destructor'>~SkAutoCanvasRestore()</a> have no effect.
+
+### Example
+
+<div><fiddle-embed name="@AutoCanvasRestore_restore">
+
+#### Example Output
+
+~~~~
+saveCanvas: false  before restore: 2
+saveCanvas: false  after restore: 2
+saveCanvas: true  before restore: 2
+saveCanvas: true  after restore: 2
+saveCanvas: false  before restore: 2
+saveCanvas: false  after restore: 1
+saveCanvas: true  before restore: 2
+saveCanvas: true  after restore: 1
+final count: 1
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_save'>save</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_restore'>restore</a>
+
diff --git a/src/third_party/skia/site/user/api/SkBitmap_Reference.md b/src/third_party/skia/site/user/api/SkBitmap_Reference.md
new file mode 100644
index 0000000..b8816b0
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkBitmap_Reference.md
@@ -0,0 +1,3369 @@
+SkBitmap Reference
+===
+
+
+<a name='SkBitmap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> {
+
+    <a href='#SkBitmap_empty_constructor'>SkBitmap()</a>;
+    <a href='#SkBitmap_copy_const_SkBitmap'>SkBitmap</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& src);
+    <a href='#SkBitmap_move_SkBitmap'>SkBitmap</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>&& src);
+    <a href='#SkBitmap_destructor'>~SkBitmap()</a>;
+    <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='#SkBitmap_copy_operator'>operator=</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& src);
+    <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='#SkBitmap_move_operator'>operator=</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>&& src);
+    void <a href='#SkBitmap_swap'>swap</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& other);
+    const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& <a href='#SkBitmap_pixmap'>pixmap()</a> const;
+    const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& <a href='#SkBitmap_info'>info()</a> const;
+    int <a href='#SkBitmap_width'>width()</a> const;
+    int <a href='#SkBitmap_height'>height()</a> const;
+    <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkBitmap_colorType'>colorType</a>() const;
+    <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkBitmap_alphaType'>alphaType</a>() const;
+    <a href='undocumented#SkColorSpace'>SkColorSpace</a>* <a href='#SkBitmap_colorSpace'>colorSpace</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> <a href='#SkBitmap_refColorSpace'>refColorSpace</a>() const;
+    int <a href='#SkBitmap_bytesPerPixel'>bytesPerPixel</a>() const;
+    int <a href='#SkBitmap_rowBytesAsPixels'>rowBytesAsPixels</a>() const;
+    int <a href='#SkBitmap_shiftPerPixel'>shiftPerPixel</a>() const;
+    bool <a href='#SkBitmap_empty'>empty()</a> const;
+    bool <a href='#SkBitmap_isNull'>isNull</a>() const;
+    bool <a href='#SkBitmap_drawsNothing'>drawsNothing</a>() const;
+    size_t <a href='#SkBitmap_rowBytes'>rowBytes</a>() const;
+    bool <a href='#SkBitmap_setAlphaType'>setAlphaType</a>(<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkBitmap_alphaType'>alphaType</a>);
+    void* <a href='#SkBitmap_getPixels'>getPixels</a>() const;
+    size_t <a href='#SkBitmap_computeByteSize'>computeByteSize</a>() const;
+    bool <a href='#SkBitmap_isImmutable'>isImmutable</a>() const;
+    void <a href='#SkBitmap_setImmutable'>setImmutable</a>();
+    bool <a href='#SkBitmap_isOpaque'>isOpaque</a>() const;
+    bool <a href='#SkBitmap_isVolatile'>isVolatile</a>() const;
+    void <a href='#SkBitmap_setIsVolatile'>setIsVolatile</a>(bool <a href='#SkBitmap_isVolatile'>isVolatile</a>);
+    void <a href='#SkBitmap_reset'>reset()</a>;
+    static bool <a href='#SkBitmap_ComputeIsOpaque'>ComputeIsOpaque</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& bm);
+    void <a href='#SkBitmap_getBounds'>getBounds</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* bounds) const;
+    void <a href='#SkBitmap_getBounds'>getBounds</a>(<a href='SkIRect_Reference#SkIRect'>SkIRect</a>* bounds) const;
+    <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkBitmap_bounds'>bounds()</a> const;
+    <a href='undocumented#SkISize'>SkISize</a> <a href='#SkBitmap_dimensions'>dimensions()</a> const;
+    <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkBitmap_getSubset'>getSubset</a>() const;
+    bool <a href='#SkBitmap_setInfo'>setInfo</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo, size_t <a href='#SkBitmap_rowBytes'>rowBytes</a> = 0);
+
+    enum <a href='#SkBitmap_AllocFlags'>AllocFlags</a> {
+        <a href='#SkBitmap_kZeroPixels_AllocFlag'>kZeroPixels_AllocFlag</a> = 1 << 0,
+    };
+
+    bool <a href='#SkBitmap_tryAllocPixelsFlags'>tryAllocPixelsFlags</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, uint32_t flags);
+    void <a href='#SkBitmap_allocPixelsFlags'>allocPixelsFlags</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, uint32_t flags);
+    bool <a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, size_t <a href='#SkBitmap_rowBytes'>rowBytes</a>);
+    void <a href='#SkBitmap_allocPixels'>allocPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, size_t <a href='#SkBitmap_rowBytes'>rowBytes</a>);
+    bool <a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info);
+    void <a href='#SkBitmap_allocPixels'>allocPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info);
+    bool <a href='#SkBitmap_tryAllocN32Pixels'>tryAllocN32Pixels</a>(int width, int height, bool <a href='#SkBitmap_isOpaque'>isOpaque</a> = false);
+    void <a href='#SkBitmap_allocN32Pixels'>allocN32Pixels</a>(int width, int height, bool <a href='#SkBitmap_isOpaque'>isOpaque</a> = false);
+    bool <a href='#SkBitmap_installPixels'>installPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, void* pixels, size_t <a href='#SkBitmap_rowBytes'>rowBytes</a>,
+                       void (*releaseProc)(void* addr, void* context), void* context);
+    bool <a href='#SkBitmap_installPixels'>installPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, void* pixels, size_t <a href='#SkBitmap_rowBytes'>rowBytes</a>);
+    bool <a href='#SkBitmap_installPixels'>installPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& <a href='SkPixmap_Reference#Pixmap'>pixmap</a>);
+    void <a href='#SkBitmap_setPixels'>setPixels</a>(void* pixels);
+    bool <a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a>();
+    void <a href='#SkBitmap_allocPixels'>allocPixels</a>();
+    bool <a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a>(<a href='#SkBitmap_Allocator'>Allocator</a>* allocator);
+    void <a href='#SkBitmap_allocPixels'>allocPixels</a>(<a href='#SkBitmap_Allocator'>Allocator</a>* allocator);
+    <a href='undocumented#SkPixelRef'>SkPixelRef</a>* <a href='#SkBitmap_pixelRef'>pixelRef</a>() const;
+    <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> <a href='#SkBitmap_pixelRefOrigin'>pixelRefOrigin</a>() const;
+    void <a href='#SkBitmap_setPixelRef'>setPixelRef</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkPixelRef'>SkPixelRef</a>> <a href='#SkBitmap_pixelRef'>pixelRef</a>, int dx, int dy);
+    bool <a href='#SkBitmap_readyToDraw'>readyToDraw</a>() const;
+    uint32_t <a href='#SkBitmap_getGenerationID'>getGenerationID</a>() const;
+    void <a href='#SkBitmap_notifyPixelsChanged'>notifyPixelsChanged</a>() const;
+    void <a href='#SkBitmap_eraseColor'>eraseColor</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> c) const;
+    void <a href='#SkBitmap_eraseARGB'>eraseARGB</a>(<a href='undocumented#U8CPU'>U8CPU</a> a, <a href='undocumented#U8CPU'>U8CPU</a> r, <a href='undocumented#U8CPU'>U8CPU</a> g, <a href='undocumented#U8CPU'>U8CPU</a> b) const;
+    void <a href='#SkBitmap_erase'>erase</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> c, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& area) const;
+    <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='#SkBitmap_getColor'>getColor</a>(int x, int y) const;
+    float <a href='#SkBitmap_getAlphaf'>getAlphaf</a>(int x, int y) const;
+    void* <a href='#SkBitmap_getAddr'>getAddr</a>(int x, int y) const;
+    uint32_t* <a href='#SkBitmap_getAddr32'>getAddr32</a>(int x, int y) const;
+    uint16_t* <a href='#SkBitmap_getAddr16'>getAddr16</a>(int x, int y) const;
+    uint8_t* <a href='#SkBitmap_getAddr8'>getAddr8</a>(int x, int y) const;
+    bool <a href='#SkBitmap_extractSubset'>extractSubset</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>* dst, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& subset) const;
+    bool <a href='#SkBitmap_readPixels'>readPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& dstInfo, void* dstPixels, size_t dstRowBytes,
+                    int srcX, int srcY) const;
+    bool <a href='#SkBitmap_readPixels'>readPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst, int srcX, int srcY) const;
+    bool <a href='#SkBitmap_readPixels'>readPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst) const;
+    bool <a href='#SkBitmap_writePixels'>writePixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& src, int dstX, int dstY);
+    bool <a href='#SkBitmap_writePixels'>writePixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& src);
+    bool <a href='#SkBitmap_extractAlpha'>extractAlpha</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>* dst) const;
+    bool <a href='#SkBitmap_extractAlpha'>extractAlpha</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>* dst, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>,
+                      <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>* offset) const;
+    bool <a href='#SkBitmap_extractAlpha'>extractAlpha</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>* dst, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>, <a href='#SkBitmap_Allocator'>Allocator</a>* allocator,
+                      <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>* offset) const;
+    bool <a href='#SkBitmap_peekPixels'>peekPixels</a>(<a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>* <a href='SkPixmap_Reference#Pixmap'>pixmap</a>) const;
+    void <a href='#SkBitmap_validate'>validate()</a> const;
+};
+
+</pre>
+
+<a href='SkBitmap_Reference#Bitmap'>Bitmap</a> describes a two-dimensional raster <a href='undocumented#Pixel'>pixel</a> array. <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> is built on
+<a href='#Image_Info'>Image_Info</a>, containing integer width and height, <a href='#Image_Info_Color_Type'>Color_Type</a> and <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>
+describing the <a href='undocumented#Pixel'>pixel</a> format, and <a href='#Color_Space'>Color_Space</a> describing the range of colors.
+<a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='SkPoint_Reference#Point'>points</a> to <a href='#Pixel_Ref'>Pixel_Ref</a>, which describes the physical array of pixels.
+<a href='#Image_Info'>Image_Info</a> bounds may be located anywhere fully inside <a href='#Pixel_Ref'>Pixel_Ref</a> bounds.
+
+<a href='SkBitmap_Reference#Bitmap'>Bitmap</a> can be drawn using <a href='SkCanvas_Reference#Canvas'>Canvas</a>. <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> can be a drawing destination for <a href='SkCanvas_Reference#Canvas'>Canvas</a>
+draw member functions. <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> flexibility as a <a href='undocumented#Pixel'>pixel</a> container limits some
+optimizations available to the target platform.
+
+If <a href='undocumented#Pixel'>pixel</a> array is primarily read-only, use <a href='SkImage_Reference#Image'>Image</a> for better performance.
+If <a href='undocumented#Pixel'>pixel</a> array is primarily written to, use <a href='SkSurface_Reference#Surface'>Surface</a> for better performance.
+
+Declaring <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> const prevents altering <a href='#Image_Info'>Image_Info</a>: the <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> height, width,
+and so on cannot change. It does not affect <a href='#Pixel_Ref'>Pixel_Ref</a>: a caller may write its
+pixels. Declaring <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> const affects <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> configuration, not its contents.
+
+<a href='SkBitmap_Reference#Bitmap'>Bitmap</a> is not thread safe. Each thread must have its own copy of <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> fields,
+although threads may share the underlying <a href='undocumented#Pixel'>pixel</a> array.
+
+<a name='Row_Bytes'></a>
+
+<a href='SkBitmap_Reference#Bitmap'>Bitmap</a> pixels may be contiguous, or may have a gap at the end of each row.
+<a href='#Bitmap_Row_Bytes'>Row_Bytes</a> is the interval from one row to the next. <a href='#Bitmap_Row_Bytes'>Row_Bytes</a> may be specified;
+sometimes passing zero will compute the <a href='#Bitmap_Row_Bytes'>Row_Bytes</a> from the row width and the
+number of bytes in a <a href='undocumented#Pixel'>pixel</a>. <a href='#Bitmap_Row_Bytes'>Row_Bytes</a> may be larger than the row requires. This
+is useful to position one or more <a href='SkBitmap_Reference#Bitmap'>Bitmaps</a> within a shared <a href='undocumented#Pixel'>pixel</a> array.
+
+<a name='SkBitmap_Allocator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    class <a href='#SkBitmap_Allocator'>Allocator</a> : public <a href='undocumented#SkRefCnt'>SkRefCnt</a> {
+
+        virtual bool <a href='#SkBitmap_Allocator_allocPixelRef'>allocPixelRef</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>* <a href='SkBitmap_Reference#Bitmap'>bitmap</a>) = 0;
+    };
+
+</pre>
+
+Abstract subclass of <a href='#SkBitmap_HeapAllocator'>HeapAllocator</a>.
+
+<a name='SkBitmap_Allocator_allocPixelRef'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+virtual bool <a href='#SkBitmap_Allocator_allocPixelRef'>allocPixelRef</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>* <a href='SkBitmap_Reference#Bitmap'>bitmap</a>) = 0
+</pre>
+
+Allocates the <a href='undocumented#Pixel'>pixel</a> memory for the <a href='#SkBitmap_Allocator_allocPixelRef_bitmap'>bitmap</a>, given its dimensions and
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>. Returns true on success, where success means either <a href='#SkBitmap_setPixels'>setPixels</a>()
+or <a href='#SkBitmap_setPixelRef'>setPixelRef</a>() was called.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_Allocator_allocPixelRef_bitmap'><code><strong>bitmap</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> containing <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> as input, and <a href='undocumented#SkPixelRef'>SkPixelRef</a> as output</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='undocumented#SkPixelRef'>SkPixelRef</a> was allocated
+
+### See Also
+
+<a href='#SkBitmap_HeapAllocator'>HeapAllocator</a>
+
+<a name='SkBitmap_HeapAllocator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    class <a href='#SkBitmap_HeapAllocator'>HeapAllocator</a> : public <a href='#SkBitmap_Allocator'>Allocator</a> {
+
+        bool <a href='#SkBitmap_HeapAllocator_allocPixelRef'>allocPixelRef</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>* <a href='SkBitmap_Reference#Bitmap'>bitmap</a>) override;
+    };
+
+</pre>
+
+Subclass of <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_Allocator'>Allocator</a> that returns a <a href='#Pixel_Ref'>Pixel_Ref</a> that allocates its <a href='undocumented#Pixel'>pixel</a>
+memory from the heap. This is the default <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_Allocator'>Allocator</a> invoked by
+<a href='#SkBitmap_allocPixels'>allocPixels</a>.
+
+<a name='SkBitmap_HeapAllocator_allocPixelRef'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_HeapAllocator_allocPixelRef'>allocPixelRef</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>* <a href='SkBitmap_Reference#Bitmap'>bitmap</a>) override
+</pre>
+
+Allocates the <a href='undocumented#Pixel'>pixel</a> memory for the <a href='#SkBitmap_HeapAllocator_allocPixelRef_bitmap'>bitmap</a>, given its dimensions and
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>. Returns true on success, where success means either <a href='#SkBitmap_setPixels'>setPixels</a>()
+or <a href='#SkBitmap_setPixelRef'>setPixelRef</a>() was called.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_HeapAllocator_allocPixelRef_bitmap'><code><strong>bitmap</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> containing <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> as input, and <a href='undocumented#SkPixelRef'>SkPixelRef</a> as output</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels are allocated
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_HeapAllocator_allocPixelRef">
+
+#### Example Output
+
+~~~~
+#Volatile
+pixel address = (nil)
+pixel address = 0x560ddd0ac670
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_Allocator'>Allocator</a> <a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a>
+
+<a name='SkBitmap_empty_constructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkBitmap_empty_constructor'>SkBitmap()</a>
+</pre>
+
+Creates an empty <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> without pixels, with <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>,
+<a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, and with a width and height of zero. <a href='undocumented#SkPixelRef'>SkPixelRef</a> origin is
+set to (0, 0). <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> is not volatile.
+
+Use <a href='#SkBitmap_setInfo'>setInfo</a>() to associate <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, width, and height
+after <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> has been created.
+
+### Return Value
+
+empty <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_empty_constructor">
+
+#### Example Output
+
+~~~~
+width:  0  height:  0  color: kUnknown_SkColorType  alpha: kUnknown_SkAlphaType
+width: 25  height: 35  color: kRGBA_8888_SkColorType  alpha: kOpaque_SkAlphaType
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_setInfo'>setInfo</a>
+
+<a name='SkBitmap_copy_const_SkBitmap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkBitmap_copy_const_SkBitmap'>SkBitmap</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& src)
+</pre>
+
+Copies settings from <a href='#SkBitmap_copy_const_SkBitmap_src'>src</a> to returned <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>. Shares pixels if <a href='#SkBitmap_copy_const_SkBitmap_src'>src</a> has pixels
+allocated, so both <a href='SkBitmap_Reference#Bitmap'>bitmaps</a> reference the same pixels.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_copy_const_SkBitmap_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> to copy <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, and share <a href='undocumented#SkPixelRef'>SkPixelRef</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+copy of <a href='#SkBitmap_copy_const_SkBitmap_src'>src</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_copy_const_SkBitmap">
+
+#### Example Output
+
+~~~~
+original has pixels before copy: true
+original has pixels after copy: true
+copy has pixels: true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_setInfo'>setInfo</a> <a href='#SkBitmap_setPixelRef'>setPixelRef</a> <a href='#SkBitmap_setPixels'>setPixels</a> <a href='#SkBitmap_swap'>swap</a>
+
+<a name='SkBitmap_move_SkBitmap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkBitmap_move_SkBitmap'>SkBitmap</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>&& src)
+</pre>
+
+Copies settings from <a href='#SkBitmap_move_SkBitmap_src'>src</a> to returned <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>. Moves ownership of <a href='#SkBitmap_move_SkBitmap_src'>src</a> pixels to
+<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_move_SkBitmap_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> to copy <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, and reassign <a href='undocumented#SkPixelRef'>SkPixelRef</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+copy of <a href='#SkBitmap_move_SkBitmap_src'>src</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_move_SkBitmap">
+
+#### Example Output
+
+~~~~
+original has pixels before move: true
+original has pixels after move: false
+copy has pixels: true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_setInfo'>setInfo</a> <a href='#SkBitmap_setPixelRef'>setPixelRef</a> <a href='#SkBitmap_setPixels'>setPixels</a> <a href='#SkBitmap_swap'>swap</a>
+
+<a name='SkBitmap_destructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkBitmap_destructor'>~SkBitmap()</a>
+</pre>
+
+Decrements <a href='undocumented#SkPixelRef'>SkPixelRef</a> reference count, if <a href='undocumented#SkPixelRef'>SkPixelRef</a> is not nullptr.
+
+### See Also
+
+<a href='#Pixel_Ref'>Pixel_Ref</a>
+
+<a name='SkBitmap_copy_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='#SkBitmap_copy_operator'>operator=</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& src)
+</pre>
+
+Copies settings from <a href='#SkBitmap_copy_operator_src'>src</a> to returned <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>. Shares pixels if <a href='#SkBitmap_copy_operator_src'>src</a> has pixels
+allocated, so both <a href='SkBitmap_Reference#Bitmap'>bitmaps</a> reference the same pixels.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_copy_operator_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> to copy <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, and share <a href='undocumented#SkPixelRef'>SkPixelRef</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+copy of <a href='#SkBitmap_copy_operator_src'>src</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_copy_operator">
+
+#### Example Output
+
+~~~~
+original has pixels before copy: true
+original has pixels after copy: true
+copy has pixels: true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_setInfo'>setInfo</a> <a href='#SkBitmap_setPixelRef'>setPixelRef</a> <a href='#SkBitmap_setPixels'>setPixels</a> <a href='#SkBitmap_swap'>swap</a>
+
+<a name='SkBitmap_move_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='#SkBitmap_move_operator'>operator=</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>&& src)
+</pre>
+
+Copies settings from <a href='#SkBitmap_move_operator_src'>src</a> to returned <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>. Moves ownership of <a href='#SkBitmap_move_operator_src'>src</a> pixels to
+<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_move_operator_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> to copy <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, and reassign <a href='undocumented#SkPixelRef'>SkPixelRef</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+copy of <a href='#SkBitmap_move_operator_src'>src</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_move_operator">
+
+#### Example Output
+
+~~~~
+original has pixels before move: true
+original has pixels after move: false
+copy has pixels: true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_setInfo'>setInfo</a> <a href='#SkBitmap_setPixelRef'>setPixelRef</a> <a href='#SkBitmap_setPixels'>setPixels</a> <a href='#SkBitmap_swap'>swap</a>
+
+<a name='SkBitmap_swap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_swap'>swap</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& other)
+</pre>
+
+Swaps the fields of the two <a href='SkBitmap_Reference#Bitmap'>bitmaps</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_swap_other'><code><strong>other</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> exchanged with original</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_swap">
+
+#### Example Output
+
+~~~~
+one width:1 height:1 colorType:kRGBA_8888_SkColorType alphaType:kOpaque_SkAlphaType
+two width:2 height:2 colorType:kBGRA_8888_SkColorType alphaType:kPremul_SkAlphaType
+one width:2 height:2 colorType:kBGRA_8888_SkColorType alphaType:kPremul_SkAlphaType
+two width:1 height:1 colorType:kRGBA_8888_SkColorType alphaType:kOpaque_SkAlphaType
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_move_SkBitmap'>SkBitmap</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>&& src) <a href='#SkBitmap_move_operator'>operator=</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>&& src)
+
+<a name='Property'></a>
+
+<a name='SkBitmap_pixmap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& <a href='#SkBitmap_pixmap'>pixmap()</a>const
+</pre>
+
+Returns a constant reference to the <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> holding the <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> <a href='undocumented#Pixel'>pixel</a>
+address, row bytes, and <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>.
+
+### Return Value
+
+reference to <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> describing this <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_pixmap">
+
+#### Example Output
+
+~~~~
+----------
+---xx-----
+--x--x----
+--x-------
+--xx------
+--x-x---x-
+-x---x--x-
+-x----xx--
+-xx---x---
+--xxxx-xx-
+----------
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_peekPixels'>peekPixels</a> <a href='#SkBitmap_installPixels'>installPixels</a> <a href='#SkBitmap_readPixels'>readPixels</a> <a href='#SkBitmap_writePixels'>writePixels</a>
+
+<a name='SkBitmap_info'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& <a href='#SkBitmap_info'>info()</a>const
+</pre>
+
+Returns width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, and <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+
+### Return Value
+
+reference to <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_info">
+
+#### Example Output
+
+~~~~
+width: 56 height: 56 color: BGRA_8888 alpha: Opaque
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Image_Info'>Image_Info</a>
+
+<a name='SkBitmap_width'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkBitmap_width'>width()</a>const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> count in each row. Should be equal or less than
+<code><a href='#SkBitmap_rowBytes'>rowBytes</a>() / <a href='#SkBitmap_info'>info()</a>.<a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>()</code>.
+
+May be less than <a href='#SkBitmap_pixelRef'>pixelRef</a>().<a href='#SkPixelRef_width'>width()</a>. Will not exceed <a href='#SkBitmap_pixelRef'>pixelRef</a>().<a href='#SkPixelRef_width'>width()</a> less
+<a href='#SkBitmap_pixelRefOrigin'>pixelRefOrigin</a>().<a href='#SkIPoint_fX'>fX</a>.
+
+### Return Value
+
+<a href='undocumented#Pixel'>pixel</a> width in <a href='#Image_Info'>Image_Info</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_width">
+
+#### Example Output
+
+~~~~
+bitmap width: 16  info width: 16
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_height'>height()</a> <a href='undocumented#SkPixelRef'>SkPixelRef</a>::<a href='#SkPixelRef_width'>width()</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_width'>width()</a>
+
+<a name='SkBitmap_height'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkBitmap_height'>height()</a>const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> row count.
+
+Maybe be less than <a href='#SkBitmap_pixelRef'>pixelRef</a>().<a href='#SkPixelRef_height'>height()</a>. Will not exceed <a href='#SkBitmap_pixelRef'>pixelRef</a>().<a href='#SkPixelRef_height'>height()</a> less
+<a href='#SkBitmap_pixelRefOrigin'>pixelRefOrigin</a>().<a href='#SkIPoint_fY'>fY</a>.
+
+### Return Value
+
+<a href='undocumented#Pixel'>pixel</a> height in <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_height">
+
+#### Example Output
+
+~~~~
+bitmap height: 32  info height: 32
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_width'>width()</a> <a href='undocumented#SkPixelRef'>SkPixelRef</a>::<a href='#SkPixelRef_height'>height()</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_height'>height()</a>
+
+<a name='SkBitmap_colorType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkBitmap_colorType'>colorType</a>()const
+</pre>
+
+Returns <a href='#Image_Info_Color_Type'>Color_Type</a>, one of: <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+.
+
+### Return Value
+
+<a href='#Image_Info_Color_Type'>Color_Type</a> in <a href='#Image_Info'>Image_Info</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_colorType">
+
+#### Example Output
+
+~~~~
+color type: kAlpha_8_SkColorType
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_alphaType'>alphaType</a>() <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_colorType'>colorType</a>
+
+<a name='SkBitmap_alphaType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkBitmap_alphaType'>alphaType</a>()const
+</pre>
+
+Returns <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, one of: <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+.
+
+### Return Value
+
+<a href='#Image_Info_Alpha_Type'>Alpha_Type</a> in <a href='#Image_Info'>Image_Info</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_012">
+
+#### Example Output
+
+~~~~
+alpha type: kPremul_SkAlphaType
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_colorType'>colorType</a>() <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_alphaType'>alphaType</a>
+
+<a name='SkBitmap_colorSpace'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkColorSpace'>SkColorSpace</a>* <a href='#SkBitmap_colorSpace'>colorSpace</a>()const
+</pre>
+
+Returns <a href='undocumented#SkColorSpace'>SkColorSpace</a>, the range of colors, associated with <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>. The
+reference count of <a href='undocumented#SkColorSpace'>SkColorSpace</a> is unchanged. The returned <a href='undocumented#SkColorSpace'>SkColorSpace</a> is
+immutable.
+
+### Return Value
+
+<a href='undocumented#SkColorSpace'>SkColorSpace</a> in <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_colorSpace"><div><a href='undocumented#SkColorSpace'>SkColorSpace</a>::<a href='#SkColorSpace_MakeSRGBLinear'>MakeSRGBLinear</a> creates <a href='#Color_Space'>Color_Space</a> with linear gamma
+and an sRGB gamut. This <a href='#Color_Space'>Color_Space</a> gamma is not close to sRGB gamma.
+</div>
+
+#### Example Output
+
+~~~~
+gammaCloseToSRGB: false  gammaIsLinear: true  isSRGB: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Color_Space'>Color_Space</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_colorSpace'>colorSpace</a>
+
+<a name='SkBitmap_refColorSpace'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; <a href='#SkBitmap_refColorSpace'>refColorSpace</a>()const
+</pre>
+
+Returns smart pointer to <a href='undocumented#SkColorSpace'>SkColorSpace</a>, the range of colors, associated with
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>. The smart pointer tracks the number of objects sharing this
+<a href='undocumented#SkColorSpace'>SkColorSpace</a> reference so the memory is released when the owners destruct.
+
+The returned <a href='undocumented#SkColorSpace'>SkColorSpace</a> is immutable.
+
+### Return Value
+
+<a href='undocumented#SkColorSpace'>SkColorSpace</a> in <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> wrapped in a smart pointer
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_refColorSpace">
+
+#### Example Output
+
+~~~~
+gammaCloseToSRGB: false  gammaIsLinear: true  isSRGB: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Color_Space'>Color_Space</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_colorSpace'>colorSpace</a>
+
+<a name='SkBitmap_bytesPerPixel'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkBitmap_bytesPerPixel'>bytesPerPixel</a>()const
+</pre>
+
+Returns number of bytes per <a href='undocumented#Pixel'>pixel</a> required by <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>.
+Returns zero if <a href='#SkBitmap_colorType'>colorType</a>( is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
+
+### Return Value
+
+bytes in <a href='undocumented#Pixel'>pixel</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_bytesPerPixel"><a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+#### Example Output
+
+~~~~
+color: kUnknown_SkColorType      bytesPerPixel: 0
+color: kAlpha_8_SkColorType      bytesPerPixel: 1
+color: kRGB_565_SkColorType      bytesPerPixel: 2
+color: kARGB_4444_SkColorType    bytesPerPixel: 2
+color: kRGBA_8888_SkColorType    bytesPerPixel: 4
+color: kRGB_888x_SkColorType     bytesPerPixel: 4
+color: kBGRA_8888_SkColorType    bytesPerPixel: 4
+color: kRGBA_1010102_SkColorType bytesPerPixel: 4
+color: kRGB_101010x_SkColorType  bytesPerPixel: 4
+color: kGray_8_SkColorType       bytesPerPixel: 1
+color: kRGBA_F16_SkColorType     bytesPerPixel: 8
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_rowBytes'>rowBytes</a> <a href='#SkBitmap_rowBytesAsPixels'>rowBytesAsPixels</a> <a href='#SkBitmap_width'>width</a> <a href='#SkBitmap_shiftPerPixel'>shiftPerPixel</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>
+
+<a name='SkBitmap_rowBytesAsPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkBitmap_rowBytesAsPixels'>rowBytesAsPixels</a>()const
+</pre>
+
+Returns number of pixels that fit on row. Should be greater than or equal to
+<a href='#SkBitmap_width'>width()</a>.
+
+### Return Value
+
+maximum pixels per row
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_rowBytesAsPixels">
+
+#### Example Output
+
+~~~~
+rowBytes: 4 rowBytesAsPixels: 1
+rowBytes: 5 rowBytesAsPixels: 1
+rowBytes: 6 rowBytesAsPixels: 1
+rowBytes: 7 rowBytesAsPixels: 1
+rowBytes: 8 rowBytesAsPixels: 2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_rowBytes'>rowBytes</a> <a href='#SkBitmap_shiftPerPixel'>shiftPerPixel</a> <a href='#SkBitmap_width'>width</a> <a href='#SkBitmap_bytesPerPixel'>bytesPerPixel</a>
+
+<a name='SkBitmap_shiftPerPixel'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkBitmap_shiftPerPixel'>shiftPerPixel</a>()const
+</pre>
+
+Returns bit shift converting row bytes to row pixels.
+Returns zero for <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
+
+### Return Value
+
+one of: 0, 1, 2, 3; left shift to convert pixels to bytes
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_shiftPerPixel"><a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+#### Example Output
+
+~~~~
+color: kUnknown_SkColorType       shiftPerPixel: 0
+color: kAlpha_8_SkColorType       shiftPerPixel: 0
+color: kRGB_565_SkColorType       shiftPerPixel: 1
+color: kARGB_4444_SkColorType     shiftPerPixel: 1
+color: kRGBA_8888_SkColorType     shiftPerPixel: 2
+color: kRGB_888x_SkColorType      shiftPerPixel: 2
+color: kBGRA_8888_SkColorType     shiftPerPixel: 2
+color: kRGBA_1010102_SkColorType  shiftPerPixel: 2
+color: kRGB_101010x_SkColorType   shiftPerPixel: 2
+color: kGray_8_SkColorType        shiftPerPixel: 0
+color: kRGBA_F16_SkColorType      shiftPerPixel: 3
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_rowBytes'>rowBytes</a> <a href='#SkBitmap_rowBytesAsPixels'>rowBytesAsPixels</a> <a href='#SkBitmap_width'>width</a> <a href='#SkBitmap_bytesPerPixel'>bytesPerPixel</a>
+
+<a name='SkBitmap_empty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_empty'>empty()</a>const
+</pre>
+
+Returns true if either <a href='#SkBitmap_width'>width()</a> or <a href='#SkBitmap_height'>height()</a> are zero.
+
+Does not check if <a href='undocumented#SkPixelRef'>SkPixelRef</a> is nullptr; call <a href='#SkBitmap_drawsNothing'>drawsNothing</a>() to check <a href='#SkBitmap_width'>width()</a>,
+<a href='#SkBitmap_height'>height()</a>, and <a href='undocumented#SkPixelRef'>SkPixelRef</a>.
+
+### Return Value
+
+true if dimensions do not enclose area
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_empty">
+
+#### Example Output
+
+~~~~
+width: 0 height: 0 empty: true
+width: 0 height: 2 empty: true
+width: 2 height: 0 empty: true
+width: 2 height: 2 empty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_height'>height()</a> <a href='#SkBitmap_width'>width()</a> <a href='#SkBitmap_drawsNothing'>drawsNothing</a>
+
+<a name='SkBitmap_isNull'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_isNull'>isNull</a>()const
+</pre>
+
+Returns true if <a href='undocumented#SkPixelRef'>SkPixelRef</a> is nullptr.
+
+Does not check if <a href='#SkBitmap_width'>width()</a> or <a href='#SkBitmap_height'>height()</a> are zero; call <a href='#SkBitmap_drawsNothing'>drawsNothing</a>() to check
+<a href='#SkBitmap_width'>width()</a>, <a href='#SkBitmap_height'>height()</a>, and <a href='undocumented#SkPixelRef'>SkPixelRef</a>.
+
+### Return Value
+
+true if no <a href='undocumented#SkPixelRef'>SkPixelRef</a> is associated
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_isNull">
+
+#### Example Output
+
+~~~~
+empty bitmap does not have pixels
+bitmap with dimensions does not have pixels
+allocated bitmap does have pixels
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_empty'>empty()</a> <a href='#SkBitmap_drawsNothing'>drawsNothing</a> <a href='#SkBitmap_pixelRef'>pixelRef</a>
+
+<a name='SkBitmap_drawsNothing'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_drawsNothing'>drawsNothing</a>()const
+</pre>
+
+Returns true if <a href='#SkBitmap_width'>width()</a> or <a href='#SkBitmap_height'>height()</a> are zero, or if <a href='undocumented#SkPixelRef'>SkPixelRef</a> is nullptr.
+If true, <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> has no effect when drawn or drawn into.
+
+### Return Value
+
+true if drawing has no effect
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_drawsNothing">
+
+#### Example Output
+
+~~~~
+empty:true  isNull:true  drawsNothing:true
+empty:true  isNull:false drawsNothing:true
+empty:false isNull:true  drawsNothing:true
+empty:false isNull:false drawsNothing:false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_empty'>empty()</a> <a href='#SkBitmap_isNull'>isNull</a> <a href='#SkBitmap_pixelRef'>pixelRef</a>
+
+<a name='SkBitmap_rowBytes'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkBitmap_rowBytes'>rowBytes</a>()const
+</pre>
+
+Returns row bytes, the interval from one <a href='undocumented#Pixel'>pixel</a> row to the next. Row bytes
+is at least as large as: <code><a href='#SkBitmap_width'>width()</a> * <a href='#SkBitmap_info'>info()</a>.<a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>()</code>.
+
+Returns zero if <a href='#SkBitmap_colorType'>colorType</a> is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, or if row bytes supplied to
+<a href='#SkBitmap_setInfo'>setInfo</a> is not large enough to hold a row of pixels.
+
+### Return Value
+
+byte length of <a href='undocumented#Pixel'>pixel</a> row
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_rowBytes">
+
+#### Example Output
+
+~~~~
+setInfo returned:false rowBytes:0
+setInfo returned:true  rowBytes:8
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_info'>info()</a> <a href='#SkBitmap_setInfo'>setInfo</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>
+
+<a name='SkBitmap_setAlphaType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_setAlphaType'>setAlphaType</a>(<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkBitmap_alphaType'>alphaType</a>)
+</pre>
+
+Sets <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, if <a href='#SkBitmap_setAlphaType_alphaType'>alphaType</a> is compatible with <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>.
+Returns true unless <a href='#SkBitmap_setAlphaType_alphaType'>alphaType</a> is <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a> and current <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>
+is not <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>.
+
+Returns true if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>. <a href='#SkBitmap_setAlphaType_alphaType'>alphaType</a> is ignored, and
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> remains <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>.
+
+Returns true if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a> or <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>.
+<a href='#SkBitmap_setAlphaType_alphaType'>alphaType</a> is ignored, and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> remains <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>.
+
+If <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is <a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, or <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>: returns true unless
+<a href='#SkBitmap_setAlphaType_alphaType'>alphaType</a> is <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a> and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is not <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>.
+If <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='#SkBitmap_setAlphaType_alphaType'>alphaType</a> is ignored.
+
+If <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, returns true unless
+<a href='#SkBitmap_setAlphaType_alphaType'>alphaType</a> is <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a> and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is not <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>.
+If <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='#SkBitmap_setAlphaType_alphaType'>alphaType</a> is ignored. If <a href='#SkBitmap_setAlphaType_alphaType'>alphaType</a> is
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>, it is treated as <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>.
+
+This changes <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> in <a href='undocumented#SkPixelRef'>SkPixelRef</a>; all <a href='SkBitmap_Reference#Bitmap'>bitmaps</a> sharing <a href='undocumented#SkPixelRef'>SkPixelRef</a>
+are affected.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_setAlphaType_alphaType'><code><strong>alphaType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+
+### Return Value
+
+true if <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is set
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_setAlphaType"><a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Image_Info_Alpha_Type'>Alpha_Type</a> <a href='#Image_Info_Color_Type'>Color_Type</a> <a href='#Image_Info'>Image_Info</a> <a href='#SkBitmap_setInfo'>setInfo</a>
+
+<a name='SkBitmap_getPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void* <a href='#SkBitmap_getPixels'>getPixels</a>()const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> address, the base address corresponding to the <a href='undocumented#Pixel'>pixel</a> origin.
+
+### Return Value
+
+<a href='undocumented#Pixel'>pixel</a> address
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_getPixels">
+
+#### Example Output
+
+~~~~
+bitmap.getColor(0, 1) == 0x00000000
+bitmap.getColor(0, 0) == 0xFFFFFFFF
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_isNull'>isNull</a> <a href='#SkBitmap_drawsNothing'>drawsNothing</a>
+
+<a name='SkBitmap_computeByteSize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkBitmap_computeByteSize'>computeByteSize</a>()const
+</pre>
+
+Returns minimum memory required for <a href='undocumented#Pixel'>pixel</a> storage.
+Does not include unused memory on last row when <a href='#SkBitmap_rowBytesAsPixels'>rowBytesAsPixels</a>() exceeds <a href='#SkBitmap_width'>width()</a>.
+Returns zero if result does not fit in size_t.
+Returns zero if <a href='#SkBitmap_height'>height()</a> or <a href='#SkBitmap_width'>width()</a> is 0.
+Returns <a href='#SkBitmap_height'>height()</a> times <a href='#SkBitmap_rowBytes'>rowBytes</a>() if <a href='#SkBitmap_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
+
+### Return Value
+
+<a href='undocumented#Size'>size</a> in bytes of <a href='SkImage_Reference#Image'>image</a> buffer
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_computeByteSize">
+
+#### Example Output
+
+~~~~
+width:       1 height:       1 computeByteSize:             4
+width:       1 height:    1000 computeByteSize:          4999
+width:       1 height: 1000000 computeByteSize:       4999999
+width:    1000 height:       1 computeByteSize:          4000
+width:    1000 height:    1000 computeByteSize:       4999000
+width:    1000 height: 1000000 computeByteSize:    4999999000
+width: 1000000 height:       1 computeByteSize:       4000000
+width: 1000000 height:    1000 computeByteSize:    4999000000
+width: 1000000 height: 1000000 computeByteSize: 4999999000000
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_computeByteSize'>computeByteSize</a>
+
+<a name='SkBitmap_isImmutable'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_isImmutable'>isImmutable</a>()const
+</pre>
+
+Returns true if pixels can not change.
+
+Most immutable <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> checks trigger an assert only on debug builds.
+
+### Return Value
+
+true if pixels are immutable
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_isImmutable">
+
+#### Example Output
+
+~~~~
+original is immutable
+copy is immutable
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_setImmutable'>setImmutable</a> <a href='undocumented#SkPixelRef'>SkPixelRef</a>::<a href='#SkPixelRef_isImmutable'>isImmutable</a> <a href='SkImage_Reference#SkImage'>SkImage</a>
+
+<a name='SkBitmap_setImmutable'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_setImmutable'>setImmutable</a>()
+</pre>
+
+Sets internal flag to mark <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> as immutable. Once set, pixels can not change.
+Any other <a href='SkBitmap_Reference#Bitmap'>bitmap</a> sharing the same <a href='undocumented#SkPixelRef'>SkPixelRef</a> are also marked as immutable.
+Once <a href='undocumented#SkPixelRef'>SkPixelRef</a> is marked immutable, the setting cannot be cleared.
+
+Writing to immutable <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> pixels triggers an assert on debug builds.
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_setImmutable"><div>Triggers assert if SK_DEBUG is true, runs fine otherwise.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_isImmutable'>isImmutable</a> <a href='undocumented#SkPixelRef'>SkPixelRef</a>::<a href='#SkPixelRef_setImmutable'>setImmutable</a> <a href='SkImage_Reference#SkImage'>SkImage</a>
+
+<a name='SkBitmap_isOpaque'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_isOpaque'>isOpaque</a>()const
+</pre>
+
+Returns true if <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is set to hint that all pixels are opaque; their
+<a href='SkColor_Reference#Alpha'>alpha</a> value is implicitly or explicitly 1.0. If true, and all pixels are
+not opaque, Skia may draw incorrectly.
+
+Does not check if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> allows <a href='SkColor_Reference#Alpha'>alpha</a>, or if any <a href='undocumented#Pixel'>pixel</a> value has
+transparency.
+
+### Return Value
+
+true if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_isOpaque"><div><a href='#SkBitmap_isOpaque'>isOpaque</a> ignores whether all pixels are opaque or not.
+</div>
+
+#### Example Output
+
+~~~~
+isOpaque: false
+isOpaque: false
+isOpaque: true
+isOpaque: true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_ComputeIsOpaque'>ComputeIsOpaque</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_isOpaque'>isOpaque</a>
+
+<a name='SkBitmap_isVolatile'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_isVolatile'>isVolatile</a>()const
+</pre>
+
+Provides a hint to caller that pixels should not be cached. Only true if
+<a href='#SkBitmap_setIsVolatile'>setIsVolatile</a>() has been called to mark as volatile.
+
+Volatile state is not shared by other <a href='SkBitmap_Reference#Bitmap'>bitmaps</a> sharing the same <a href='undocumented#SkPixelRef'>SkPixelRef</a>.
+
+### Return Value
+
+true if marked volatile
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_isVolatile">
+
+#### Example Output
+
+~~~~
+original is volatile
+copy is not volatile
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_setIsVolatile'>setIsVolatile</a>
+
+<a name='SkBitmap_setIsVolatile'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_setIsVolatile'>setIsVolatile</a>(bool <a href='#SkBitmap_isVolatile'>isVolatile</a>)
+</pre>
+
+Sets if pixels should be read from <a href='undocumented#SkPixelRef'>SkPixelRef</a> on every access. <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> are not
+volatile by default; a GPU back end may upload <a href='undocumented#Pixel'>pixel</a> values expecting them to be
+accessed repeatedly. Marking temporary <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> as volatile provides a hint to
+<a href='undocumented#SkBaseDevice'>SkBaseDevice</a> that the <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> pixels should not be cached. This can
+improve performance by avoiding overhead and reducing resource
+consumption on <a href='undocumented#SkBaseDevice'>SkBaseDevice</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_setIsVolatile_isVolatile'><code><strong>isVolatile</strong></code></a></td>
+    <td>true if backing pixels are temporary</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_setIsVolatile"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_setIsVolatile_isVolatile'>isVolatile</a>
+
+<a name='SkBitmap_reset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_reset'>reset()</a>
+</pre>
+
+Resets to its initial state; all fields are set to zero, as if <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> had
+been initialized by <a href='#SkBitmap_empty_constructor'>SkBitmap()</a>.
+
+Sets width, height, row bytes to zero; <a href='undocumented#Pixel'>pixel</a> address to nullptr; <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> to
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>; and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> to <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>.
+
+If <a href='undocumented#SkPixelRef'>SkPixelRef</a> is allocated, its reference count is decreased by one, releasing
+its memory if <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> is the sole owner.
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_reset">
+
+#### Example Output
+
+~~~~
+width:1 height:1 isNull:false
+width:0 height:0 isNull:true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_empty_constructor'>SkBitmap()</a> <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>
+
+<a name='SkBitmap_ComputeIsOpaque'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static bool <a href='#SkBitmap_ComputeIsOpaque'>ComputeIsOpaque</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& bm)
+</pre>
+
+Returns true if all pixels are opaque. <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> determines how pixels
+are encoded, and whether <a href='undocumented#Pixel'>pixel</a> describes <a href='SkColor_Reference#Alpha'>alpha</a>. Returns true for <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>
+without <a href='SkColor_Reference#Alpha'>alpha</a> in each <a href='undocumented#Pixel'>pixel</a>; for other <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, returns true if all
+pixels have <a href='SkColor_Reference#Alpha'>alpha</a> values equivalent to 1.0 or greater.
+
+For <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a> or <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>: always
+returns true. For <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>: returns true if all <a href='undocumented#Pixel'>pixel</a> <a href='SkColor_Reference#Alpha'>alpha</a> values are 255.
+For <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>: returns true if all <a href='undocumented#Pixel'>pixel</a> <a href='SkColor_Reference#Alpha'>alpha</a> values are 15.
+For <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>: returns true if all <a href='undocumented#Pixel'>pixel</a> <a href='SkColor_Reference#Alpha'>alpha</a> values are 1.0 or
+greater.
+
+Returns false for <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_ComputeIsOpaque_bm'><code><strong>bm</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> to check</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if all pixels have opaque values or <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is opaque
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_ComputeIsOpaque">
+
+#### Example Output
+
+~~~~
+computeIsOpaque: false
+computeIsOpaque: true
+computeIsOpaque: false
+computeIsOpaque: true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_isOpaque'>isOpaque</a> <a href='#Image_Info_Color_Type'>Color_Type</a> <a href='SkColor_Reference#Alpha'>Alpha</a>
+
+<a name='SkBitmap_getBounds'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_getBounds'>getBounds</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* bounds)const
+</pre>
+
+Returns <a href='SkRect_Reference#SkRect'>SkRect</a> { 0, 0, <a href='#SkBitmap_width'>width()</a>, <a href='#SkBitmap_height'>height()</a> }.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_getBounds_bounds'><code><strong>bounds</strong></code></a></td>
+    <td>container for floating <a href='SkPoint_Reference#Point'>point</a> rectangle</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_getBounds"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_bounds'>bounds()</a>
+
+<a name='SkBitmap_getBounds_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_getBounds'>getBounds</a>(<a href='SkIRect_Reference#SkIRect'>SkIRect</a>* bounds)const
+</pre>
+
+Returns <a href='SkIRect_Reference#SkIRect'>SkIRect</a> { 0, 0, <a href='#SkBitmap_width'>width()</a>, <a href='#SkBitmap_height'>height()</a> }.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_getBounds_2_bounds'><code><strong>bounds</strong></code></a></td>
+    <td>container for integral rectangle</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_getBounds_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_bounds'>bounds()</a>
+
+<a name='SkBitmap_bounds'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkBitmap_bounds'>bounds()</a>const
+</pre>
+
+Returns <a href='SkIRect_Reference#SkIRect'>SkIRect</a> { 0, 0, <a href='#SkBitmap_width'>width()</a>, <a href='#SkBitmap_height'>height()</a> }.
+
+### Return Value
+
+integral rectangle from origin to <a href='#SkBitmap_width'>width()</a> and <a href='#SkBitmap_height'>height()</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_bounds"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_getBounds'>getBounds</a>
+
+<a name='SkBitmap_dimensions'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkISize'>SkISize</a> <a href='#SkBitmap_dimensions'>dimensions()</a>const
+</pre>
+
+Returns <a href='undocumented#SkISize'>SkISize</a> { <a href='#SkBitmap_width'>width()</a>, <a href='#SkBitmap_height'>height()</a> }.
+
+### Return Value
+
+integral <a href='undocumented#Size'>size</a> of <a href='#SkBitmap_width'>width()</a> and <a href='#SkBitmap_height'>height()</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_dimensions"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_height'>height</a> <a href='#SkBitmap_width'>width</a>
+
+<a name='SkBitmap_getSubset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkBitmap_getSubset'>getSubset</a>()const
+</pre>
+
+Returns the bounds of this <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, offset by its <a href='undocumented#SkPixelRef'>SkPixelRef</a> origin.
+
+### Return Value
+
+bounds within <a href='undocumented#SkPixelRef'>SkPixelRef</a> bounds
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_getSubset">
+
+#### Example Output
+
+~~~~
+source: 0, 0, 512, 512
+subset: 100, 100, 412, 412
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_extractSubset'>extractSubset</a> <a href='#SkBitmap_getBounds'>getBounds</a>
+
+<a name='SkBitmap_setInfo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_setInfo'>setInfo</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo, size_t <a href='#SkBitmap_rowBytes'>rowBytes</a> = 0)
+</pre>
+
+Sets width, height, <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, <a href='#Image_Info_Color_Type'>Color_Type</a>, <a href='#Color_Space'>Color_Space</a>, and optional
+<a href='#SkBitmap_setInfo_rowBytes'>rowBytes</a>. Frees pixels, and returns true if successful.
+
+<a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>() may be altered to a value permitted by <a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_colorSpace'>colorSpace</a>().
+If <a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>() is
+set to <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>.
+If <a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a> and <a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>() is
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>, <a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>() is replaced by <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>.
+If <a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a> or <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>,
+<a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>() is set to <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>.
+If <a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, or <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>: <a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>() remains
+unchanged.
+
+<a href='#SkBitmap_setInfo_rowBytes'>rowBytes</a> must equal or exceed <a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>(). If <a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_colorSpace'>colorSpace</a>() is
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='#SkBitmap_setInfo_rowBytes'>rowBytes</a> is ignored and treated as zero; for all other
+<a href='#Color_Space'>Color_Space</a> values, <a href='#SkBitmap_setInfo_rowBytes'>rowBytes</a> of zero is treated as <a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>().
+
+Calls <a href='#SkBitmap_reset'>reset()</a> and returns false if:
+
+<table>  <tr>
+    <td><a href='#SkBitmap_setInfo_rowBytes'>rowBytes</a> exceeds 31 bits</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_width'>width()</a> is negative</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_height'>height()</a> is negative</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_setInfo_rowBytes'>rowBytes</a> is positive and less than <a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_width'>width()</a> times <a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>()</td>
+  </tr>
+</table>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_setInfo_imageInfo'><code><strong>imageInfo</strong></code></a></td>
+    <td>contains width, height, <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, <a href='#Image_Info_Color_Type'>Color_Type</a>, <a href='#Color_Space'>Color_Space</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_setInfo_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td><a href='#SkBitmap_setInfo_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>() or larger; or zero</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#Image_Info'>Image_Info</a> set successfully
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_setInfo"></fiddle-embed></div>
+
+### See Also
+
+<a href='#Image_Info_Alpha_Type'>Alpha_Type</a> <a href='#Image_Info_Color_Type'>Color_Type</a> <a href='#Color_Space'>Color_Space</a> <a href='#SkBitmap_height'>height</a> <a href='#SkBitmap_setInfo_rowBytes'>rowBytes</a> <a href='#SkBitmap_width'>width</a>
+
+<a name='SkBitmap_AllocFlags'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkBitmap_AllocFlags'>AllocFlags</a> {
+        <a href='#SkBitmap_kZeroPixels_AllocFlag'>kZeroPixels_AllocFlag</a> = 1 << 0,
+    };
+
+</pre>
+
+<a href='#SkBitmap_AllocFlags'>AllocFlags</a> provides the option to zero <a href='undocumented#Pixel'>pixel</a> memory when allocated.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBitmap_kZeroPixels_AllocFlag'><code>SkBitmap::kZeroPixels_AllocFlag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Instructs <a href='#SkBitmap_tryAllocPixelsFlags'>tryAllocPixelsFlags</a> and <a href='#SkBitmap_allocPixelsFlags'>allocPixelsFlags</a> to zero <a href='undocumented#Pixel'>pixel</a> memory.
+</td>
+  </tr>
+</table>
+
+### See Also
+
+<a href='#SkBitmap_tryAllocPixelsFlags'>tryAllocPixelsFlags</a> <a href='#SkBitmap_allocPixelsFlags'>allocPixelsFlags</a> <a href='#SkBitmap_erase'>erase</a> <a href='#SkBitmap_eraseColor'>eraseColor</a>
+
+<a name='Allocate'></a>
+
+<a name='SkBitmap_tryAllocPixelsFlags'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_tryAllocPixelsFlags'>tryAllocPixelsFlags</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, uint32_t flags)
+</pre>
+
+Sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='#SkBitmap_tryAllocPixelsFlags_info'>info</a> following the rules in <a href='#SkBitmap_setInfo'>setInfo</a>() and allocates <a href='undocumented#Pixel'>pixel</a>
+memory. If <a href='#SkBitmap_tryAllocPixelsFlags_flags'>flags</a> is <a href='#SkBitmap_kZeroPixels_AllocFlag'>kZeroPixels_AllocFlag</a>, memory is zeroed.
+
+Returns false and calls <a href='#SkBitmap_reset'>reset()</a> if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> could not be set, or memory could
+not be allocated, or memory could not optionally be zeroed.
+
+On most platforms, allocating <a href='undocumented#Pixel'>pixel</a> memory may succeed even though there is
+not sufficient memory to hold pixels; allocation does not take place
+until the pixels are written to. The actual behavior depends on the platform
+implementation of malloc(), if <a href='#SkBitmap_tryAllocPixelsFlags_flags'>flags</a> is zero, and calloc(), if <a href='#SkBitmap_tryAllocPixelsFlags_flags'>flags</a> is
+<a href='#SkBitmap_kZeroPixels_AllocFlag'>kZeroPixels_AllocFlag</a>.
+
+<a href='#SkBitmap_tryAllocPixelsFlags_flags'>flags</a> set to <a href='#SkBitmap_kZeroPixels_AllocFlag'>kZeroPixels_AllocFlag</a> offers equal or better performance than
+subsequently calling <a href='#SkBitmap_eraseColor'>eraseColor</a>() with <a href='SkColor_Reference#SK_ColorTRANSPARENT'>SK_ColorTRANSPARENT</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_tryAllocPixelsFlags_info'><code><strong>info</strong></code></a></td>
+    <td>contains width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_tryAllocPixelsFlags_flags'><code><strong>flags</strong></code></a></td>
+    <td><a href='#SkBitmap_kZeroPixels_AllocFlag'>kZeroPixels_AllocFlag</a>, or zero</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels allocation is successful
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_tryAllocPixelsFlags">
+
+#### Example Output
+
+~~~~
+bitmap allocation succeeded!
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_allocPixelsFlags'>allocPixelsFlags</a> <a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a> <a href='undocumented#SkMallocPixelRef'>SkMallocPixelRef</a>::<a href='#SkMallocPixelRef_MakeZeroed'>MakeZeroed</a>
+
+<a name='SkBitmap_allocPixelsFlags'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_allocPixelsFlags'>allocPixelsFlags</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, uint32_t flags)
+</pre>
+
+Sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='#SkBitmap_allocPixelsFlags_info'>info</a> following the rules in <a href='#SkBitmap_setInfo'>setInfo</a>() and allocates <a href='undocumented#Pixel'>pixel</a>
+memory. If <a href='#SkBitmap_allocPixelsFlags_flags'>flags</a> is <a href='#SkBitmap_kZeroPixels_AllocFlag'>kZeroPixels_AllocFlag</a>, memory is zeroed.
+
+Aborts execution if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> could not be set, or memory could
+not be allocated, or memory could not optionally
+be zeroed. Abort steps may be provided by the user at compile time by defining
+SK_ABORT.
+
+On most platforms, allocating <a href='undocumented#Pixel'>pixel</a> memory may succeed even though there is
+not sufficient memory to hold pixels; allocation does not take place
+until the pixels are written to. The actual behavior depends on the platform
+implementation of malloc(), if <a href='#SkBitmap_allocPixelsFlags_flags'>flags</a> is zero, and calloc(), if <a href='#SkBitmap_allocPixelsFlags_flags'>flags</a> is
+<a href='#SkBitmap_kZeroPixels_AllocFlag'>kZeroPixels_AllocFlag</a>.
+
+<a href='#SkBitmap_allocPixelsFlags_flags'>flags</a> set to <a href='#SkBitmap_kZeroPixels_AllocFlag'>kZeroPixels_AllocFlag</a> offers equal or better performance than
+subsequently calling <a href='#SkBitmap_eraseColor'>eraseColor</a>() with <a href='SkColor_Reference#SK_ColorTRANSPARENT'>SK_ColorTRANSPARENT</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_allocPixelsFlags_info'><code><strong>info</strong></code></a></td>
+    <td>contains width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_allocPixelsFlags_flags'><code><strong>flags</strong></code></a></td>
+    <td><a href='#SkBitmap_kZeroPixels_AllocFlag'>kZeroPixels_AllocFlag</a>, or zero</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_allocPixelsFlags"><div><a href='undocumented#Text'>Text</a> is drawn on a transparent background; drawing the <a href='SkBitmap_Reference#Bitmap'>bitmap</a> a second time
+lets the first draw show through.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_tryAllocPixelsFlags'>tryAllocPixelsFlags</a> <a href='#SkBitmap_allocPixels'>allocPixels</a> <a href='undocumented#SkMallocPixelRef'>SkMallocPixelRef</a>::<a href='#SkMallocPixelRef_MakeZeroed'>MakeZeroed</a>
+
+<a name='SkBitmap_tryAllocPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, size_t <a href='#SkBitmap_rowBytes'>rowBytes</a>)
+</pre>
+
+Sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='#SkBitmap_tryAllocPixels_info'>info</a> following the rules in <a href='#SkBitmap_setInfo'>setInfo</a>() and allocates <a href='undocumented#Pixel'>pixel</a>
+memory. <a href='#SkBitmap_tryAllocPixels_rowBytes'>rowBytes</a> must equal or exceed <a href='#SkBitmap_tryAllocPixels_info'>info</a>.<a href='#SkImageInfo_width'>width()</a> times <a href='#SkBitmap_tryAllocPixels_info'>info</a>.<a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>(),
+or equal zero. Pass in zero for <a href='#SkBitmap_tryAllocPixels_rowBytes'>rowBytes</a> to compute the minimum valid value.
+
+Returns false and calls <a href='#SkBitmap_reset'>reset()</a> if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> could not be set, or memory could
+not be allocated.
+
+On most platforms, allocating <a href='undocumented#Pixel'>pixel</a> memory may succeed even though there is
+not sufficient memory to hold pixels; allocation does not take place
+until the pixels are written to. The actual behavior depends on the platform
+implementation of malloc().
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_tryAllocPixels_info'><code><strong>info</strong></code></a></td>
+    <td>contains width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_tryAllocPixels_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of <a href='undocumented#Pixel'>pixel</a> row or larger; may be zero</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if  <a href='undocumented#Pixel_Storage'>pixel storage</a> is allocated
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_tryAllocPixels"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_tryAllocPixelsFlags'>tryAllocPixelsFlags</a> <a href='#SkBitmap_allocPixels'>allocPixels</a> <a href='undocumented#SkMallocPixelRef'>SkMallocPixelRef</a>::<a href='#SkMallocPixelRef_MakeAllocate'>MakeAllocate</a>
+
+<a name='SkBitmap_allocPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_allocPixels'>allocPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, size_t <a href='#SkBitmap_rowBytes'>rowBytes</a>)
+</pre>
+
+Sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='#SkBitmap_allocPixels_info'>info</a> following the rules in <a href='#SkBitmap_setInfo'>setInfo</a>() and allocates <a href='undocumented#Pixel'>pixel</a>
+memory. <a href='#SkBitmap_allocPixels_rowBytes'>rowBytes</a> must equal or exceed <a href='#SkBitmap_allocPixels_info'>info</a>.<a href='#SkImageInfo_width'>width()</a> times <a href='#SkBitmap_allocPixels_info'>info</a>.<a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>(),
+or equal zero. Pass in zero for <a href='#SkBitmap_allocPixels_rowBytes'>rowBytes</a> to compute the minimum valid value.
+
+Aborts execution if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> could not be set, or memory could
+not be allocated. Abort steps may be provided by
+the user at compile time by defining SK_ABORT.
+
+On most platforms, allocating <a href='undocumented#Pixel'>pixel</a> memory may succeed even though there is
+not sufficient memory to hold pixels; allocation does not take place
+until the pixels are written to. The actual behavior depends on the platform
+implementation of malloc().
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_allocPixels_info'><code><strong>info</strong></code></a></td>
+    <td>contains width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_allocPixels_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of <a href='undocumented#Pixel'>pixel</a> row or larger; may be zero</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_allocPixels"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a> <a href='#SkBitmap_allocPixelsFlags'>allocPixelsFlags</a> <a href='undocumented#SkMallocPixelRef'>SkMallocPixelRef</a>::<a href='#SkMallocPixelRef_MakeAllocate'>MakeAllocate</a>
+
+<a name='SkBitmap_tryAllocPixels_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info)
+</pre>
+
+Sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='#SkBitmap_tryAllocPixels_2_info'>info</a> following the rules in <a href='#SkBitmap_setInfo'>setInfo</a>() and allocates <a href='undocumented#Pixel'>pixel</a>
+memory.
+
+Returns false and calls <a href='#SkBitmap_reset'>reset()</a> if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> could not be set, or memory could
+not be allocated.
+
+On most platforms, allocating <a href='undocumented#Pixel'>pixel</a> memory may succeed even though there is
+not sufficient memory to hold pixels; allocation does not take place
+until the pixels are written to. The actual behavior depends on the platform
+implementation of malloc().
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_tryAllocPixels_2_info'><code><strong>info</strong></code></a></td>
+    <td>contains width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if  <a href='undocumented#Pixel_Storage'>pixel storage</a> is allocated
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_tryAllocPixels_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_tryAllocPixelsFlags'>tryAllocPixelsFlags</a> <a href='#SkBitmap_allocPixels'>allocPixels</a> <a href='undocumented#SkMallocPixelRef'>SkMallocPixelRef</a>::<a href='#SkMallocPixelRef_MakeAllocate'>MakeAllocate</a>
+
+<a name='SkBitmap_allocPixels_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_allocPixels'>allocPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info)
+</pre>
+
+Sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='#SkBitmap_allocPixels_2_info'>info</a> following the rules in <a href='#SkBitmap_setInfo'>setInfo</a>() and allocates <a href='undocumented#Pixel'>pixel</a>
+memory.
+
+Aborts execution if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> could not be set, or memory could
+not be allocated. Abort steps may be provided by
+the user at compile time by defining SK_ABORT.
+
+On most platforms, allocating <a href='undocumented#Pixel'>pixel</a> memory may succeed even though there is
+not sufficient memory to hold pixels; allocation does not take place
+until the pixels are written to. The actual behavior depends on the platform
+implementation of malloc().
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_allocPixels_2_info'><code><strong>info</strong></code></a></td>
+    <td>contains width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_allocPixels_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a> <a href='#SkBitmap_allocPixelsFlags'>allocPixelsFlags</a> <a href='undocumented#SkMallocPixelRef'>SkMallocPixelRef</a>::<a href='#SkMallocPixelRef_MakeAllocate'>MakeAllocate</a>
+
+<a name='SkBitmap_tryAllocN32Pixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_tryAllocN32Pixels'>tryAllocN32Pixels</a>(int width, int height, bool <a href='#SkBitmap_isOpaque'>isOpaque</a> = false)
+</pre>
+
+Sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='#SkBitmap_tryAllocN32Pixels_width'>width</a>, <a href='#SkBitmap_tryAllocN32Pixels_height'>height</a>, and native  <a href='SkImageInfo_Reference#Color_Type'>color type</a>; and allocates
+<a href='undocumented#Pixel'>pixel</a> memory. If <a href='#SkBitmap_tryAllocN32Pixels_isOpaque'>isOpaque</a> is true, sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>;
+otherwise, sets to <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>.
+
+Calls <a href='#SkBitmap_reset'>reset()</a> and returns false if <a href='#SkBitmap_tryAllocN32Pixels_width'>width</a> exceeds 29 bits or is negative,
+or <a href='#SkBitmap_tryAllocN32Pixels_height'>height</a> is negative.
+
+Returns false if allocation fails.
+
+Use to create <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> that matches <a href='SkColor_Reference#SkPMColor'>SkPMColor</a>, the native <a href='undocumented#Pixel'>pixel</a> arrangement on
+the platform. <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> drawn to output <a href='undocumented#Device'>device</a> skips converting its <a href='undocumented#Pixel'>pixel</a> format.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_tryAllocN32Pixels_width'><code><strong>width</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> column count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_tryAllocN32Pixels_height'><code><strong>height</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> row count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_tryAllocN32Pixels_isOpaque'><code><strong>isOpaque</strong></code></a></td>
+    <td>true if pixels do not have transparency</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if  <a href='undocumented#Pixel_Storage'>pixel storage</a> is allocated
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_tryAllocN32Pixels"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a> <a href='#SkBitmap_allocN32Pixels'>allocN32Pixels</a> <a href='undocumented#SkMallocPixelRef'>SkMallocPixelRef</a>::<a href='#SkMallocPixelRef_MakeAllocate'>MakeAllocate</a>
+
+<a name='SkBitmap_allocN32Pixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_allocN32Pixels'>allocN32Pixels</a>(int width, int height, bool <a href='#SkBitmap_isOpaque'>isOpaque</a> = false)
+</pre>
+
+Sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='#SkBitmap_allocN32Pixels_width'>width</a>, <a href='#SkBitmap_allocN32Pixels_height'>height</a>, and the native  <a href='SkImageInfo_Reference#Color_Type'>color type</a>; and allocates
+<a href='undocumented#Pixel'>pixel</a> memory. If <a href='#SkBitmap_allocN32Pixels_isOpaque'>isOpaque</a> is true, sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>;
+otherwise, sets to <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>.
+
+Aborts if <a href='#SkBitmap_allocN32Pixels_width'>width</a> exceeds 29 bits or is negative, or <a href='#SkBitmap_allocN32Pixels_height'>height</a> is negative, or
+allocation fails. Abort steps may be provided by the user at compile time by
+defining SK_ABORT.
+
+Use to create <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> that matches <a href='SkColor_Reference#SkPMColor'>SkPMColor</a>, the native <a href='undocumented#Pixel'>pixel</a> arrangement on
+the platform. <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> drawn to output <a href='undocumented#Device'>device</a> skips converting its <a href='undocumented#Pixel'>pixel</a> format.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_allocN32Pixels_width'><code><strong>width</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> column count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_allocN32Pixels_height'><code><strong>height</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> row count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_allocN32Pixels_isOpaque'><code><strong>isOpaque</strong></code></a></td>
+    <td>true if pixels do not have transparency</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_allocN32Pixels"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_allocPixels'>allocPixels</a> <a href='#SkBitmap_tryAllocN32Pixels'>tryAllocN32Pixels</a> <a href='undocumented#SkMallocPixelRef'>SkMallocPixelRef</a>::<a href='#SkMallocPixelRef_MakeAllocate'>MakeAllocate</a>
+
+<a name='SkBitmap_installPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_installPixels'>installPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, void* pixels, size_t <a href='#SkBitmap_rowBytes'>rowBytes</a>, void (*releaseProc)
+                   (void* addr, void* context) , void* context)
+</pre>
+
+Sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='#SkBitmap_installPixels_info'>info</a> following the rules in <a href='#SkBitmap_setInfo'>setInfo</a>(), and creates <a href='undocumented#SkPixelRef'>SkPixelRef</a>
+containing <a href='#SkBitmap_installPixels_pixels'>pixels</a> and <a href='#SkBitmap_installPixels_rowBytes'>rowBytes</a>. <a href='#SkBitmap_installPixels_releaseProc'>releaseProc</a>, if not nullptr, is called
+immediately on failure or when <a href='#SkBitmap_installPixels_pixels'>pixels</a> are no longer referenced. <a href='#SkBitmap_installPixels_context'>context</a> may be
+nullptr.
+
+If <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> could not be set, or <a href='#SkBitmap_installPixels_rowBytes'>rowBytes</a> is less than <a href='#SkBitmap_installPixels_info'>info</a>.<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>():
+calls <a href='#SkBitmap_installPixels_releaseProc'>releaseProc</a> if present, calls <a href='#SkBitmap_reset'>reset()</a>, and returns false.
+
+Otherwise, if <a href='#SkBitmap_installPixels_pixels'>pixels</a> equals nullptr: sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, calls <a href='#SkBitmap_installPixels_releaseProc'>releaseProc</a> if
+present, returns true.
+
+If <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> is set, <a href='#SkBitmap_installPixels_pixels'>pixels</a> is not nullptr, and <a href='#SkBitmap_installPixels_releaseProc'>releaseProc</a> is not nullptr:
+when <a href='#SkBitmap_installPixels_pixels'>pixels</a> are no longer referenced, calls <a href='#SkBitmap_installPixels_releaseProc'>releaseProc</a> with <a href='#SkBitmap_installPixels_pixels'>pixels</a> and <a href='#SkBitmap_installPixels_context'>context</a>
+as parameters.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_installPixels_info'><code><strong>info</strong></code></a></td>
+    <td>contains width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_installPixels_pixels'><code><strong>pixels</strong></code></a></td>
+    <td>address or  <a href='undocumented#Pixel_Storage'>pixel storage</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_installPixels_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of <a href='undocumented#Pixel'>pixel</a> row or larger</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_installPixels_releaseProc'><code><strong>releaseProc</strong></code></a></td>
+    <td>function called when <a href='#SkBitmap_installPixels_pixels'>pixels</a> can be deleted; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_installPixels_context'><code><strong>context</strong></code></a></td>
+    <td>caller state passed to <a href='#SkBitmap_installPixels_releaseProc'>releaseProc</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> is set to <a href='#SkBitmap_installPixels_info'>info</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_installPixels"><div><a href='#SkBitmap_installPixels_releaseProc'>releaseProc</a> is called immediately because <a href='#SkBitmap_installPixels_rowBytes'>rowBytes</a> is too small for <a href='#Pixel_Ref'>Pixel_Ref</a>.
+</div>
+
+#### Example Output
+
+~~~~
+before installPixels
+releaseProc called
+install not successful
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_allocPixels'>allocPixels</a>
+
+<a name='SkBitmap_installPixels_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_installPixels'>installPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, void* pixels, size_t <a href='#SkBitmap_rowBytes'>rowBytes</a>)
+</pre>
+
+Sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='#SkBitmap_installPixels_2_info'>info</a> following the rules in <a href='#SkBitmap_setInfo'>setInfo</a>(), and creates <a href='undocumented#SkPixelRef'>SkPixelRef</a>
+containing <a href='#SkBitmap_installPixels_2_pixels'>pixels</a> and <a href='#SkBitmap_installPixels_2_rowBytes'>rowBytes</a>.
+
+If <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> could not be set, or <a href='#SkBitmap_installPixels_2_rowBytes'>rowBytes</a> is less than <a href='#SkBitmap_installPixels_2_info'>info</a>.<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>():
+calls <a href='#SkBitmap_reset'>reset()</a>, and returns false.
+
+Otherwise, if <a href='#SkBitmap_installPixels_2_pixels'>pixels</a> equals nullptr: sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, returns true.
+
+Caller must ensure that <a href='#SkBitmap_installPixels_2_pixels'>pixels</a> are valid for the lifetime of <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> and <a href='undocumented#SkPixelRef'>SkPixelRef</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_installPixels_2_info'><code><strong>info</strong></code></a></td>
+    <td>contains width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_installPixels_2_pixels'><code><strong>pixels</strong></code></a></td>
+    <td>address or  <a href='undocumented#Pixel_Storage'>pixel storage</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_installPixels_2_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of <a href='undocumented#Pixel'>pixel</a> row or larger</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> is set to <a href='#SkBitmap_installPixels_2_info'>info</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_installPixels_2"><div>GPU does not support <a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>, does not assert that it does not.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_allocPixels'>allocPixels</a>
+
+<a name='SkBitmap_installPixels_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_installPixels'>installPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& <a href='SkPixmap_Reference#Pixmap'>pixmap</a>)
+</pre>
+
+Sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='#SkBitmap_installPixels_3_pixmap'>pixmap</a>.<a href='#SkPixmap_info'>info()</a> following the rules in <a href='#SkBitmap_setInfo'>setInfo</a>(), and creates
+<a href='undocumented#SkPixelRef'>SkPixelRef</a> containing <a href='#SkBitmap_installPixels_3_pixmap'>pixmap</a>.<a href='#SkPixmap_addr'>addr()</a> and <a href='#SkBitmap_installPixels_3_pixmap'>pixmap</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>().
+
+If <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> could not be set, or <a href='#SkBitmap_installPixels_3_pixmap'>pixmap</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() is less than
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>(): calls <a href='#SkBitmap_reset'>reset()</a>, and returns false.
+
+Otherwise, if <a href='#SkBitmap_installPixels_3_pixmap'>pixmap</a>.<a href='#SkPixmap_addr'>addr()</a> equals nullptr: sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, returns true.
+
+Caller must ensure that <a href='#SkBitmap_installPixels_3_pixmap'>pixmap</a> is valid for the lifetime of <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> and <a href='undocumented#SkPixelRef'>SkPixelRef</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_installPixels_3_pixmap'><code><strong>pixmap</strong></code></a></td>
+    <td><a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, <a href='undocumented#Pixel'>pixel</a> address, and <a href='#SkBitmap_rowBytes'>rowBytes</a>()</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> was set to <a href='#SkBitmap_installPixels_3_pixmap'>pixmap</a>.<a href='#SkPixmap_info'>info()</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_installPixels_3"><div>Draw a five by five <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, and draw it again with a center white <a href='undocumented#Pixel'>pixel</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_allocPixels'>allocPixels</a>
+
+<a name='Pixels'></a>
+
+<a name='SkBitmap_setPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_setPixels'>setPixels</a>(void* pixels)
+</pre>
+
+Replaces <a href='undocumented#SkPixelRef'>SkPixelRef</a> with <a href='#SkBitmap_setPixels_pixels'>pixels</a>, preserving <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> and <a href='#SkBitmap_rowBytes'>rowBytes</a>().
+Sets <a href='undocumented#SkPixelRef'>SkPixelRef</a> origin to (0, 0).
+
+If <a href='#SkBitmap_setPixels_pixels'>pixels</a> is nullptr, or if <a href='#SkBitmap_info'>info()</a>.<a href='#SkImageInfo_colorType'>colorType</a>() equals <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>;
+release reference to <a href='undocumented#SkPixelRef'>SkPixelRef</a>, and set <a href='undocumented#SkPixelRef'>SkPixelRef</a> to nullptr.
+
+Caller is responsible for handling ownership <a href='undocumented#Pixel'>pixel</a> memory for the lifetime
+of <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> and <a href='undocumented#SkPixelRef'>SkPixelRef</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_setPixels_pixels'><code><strong>pixels</strong></code></a></td>
+    <td>address of  <a href='undocumented#Pixel_Storage'>pixel storage</a>, managed by caller</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_setPixels"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_installPixels'>installPixels</a> <a href='#SkBitmap_allocPixels'>allocPixels</a>
+
+<a name='SkBitmap_tryAllocPixels_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a>()
+</pre>
+
+Allocates <a href='undocumented#Pixel'>pixel</a> memory with <a href='#SkBitmap_HeapAllocator'>HeapAllocator</a>, and replaces existing <a href='undocumented#SkPixelRef'>SkPixelRef</a>.
+The allocation <a href='undocumented#Size'>size</a> is determined by <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> width, height, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>.
+
+Returns false if <a href='#SkBitmap_info'>info()</a>.<a href='#SkImageInfo_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, or allocation fails.
+
+### Return Value
+
+true if the allocation succeeds
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_tryAllocPixels_3"><div><a href='SkBitmap_Reference#Bitmap'>Bitmap</a> hosts and draws gray values in set1. <a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a> replaces <a href='#Pixel_Ref'>Pixel_Ref</a>
+and erases it to black, but does not alter set1. <a href='#SkBitmap_setPixels'>setPixels</a> replaces black
+<a href='#Pixel_Ref'>Pixel_Ref</a> with set1.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_allocPixels'>allocPixels</a> <a href='#SkBitmap_installPixels'>installPixels</a> <a href='#SkBitmap_setPixels'>setPixels</a>
+
+<a name='SkBitmap_allocPixels_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_allocPixels'>allocPixels</a>()
+</pre>
+
+Allocates <a href='undocumented#Pixel'>pixel</a> memory with <a href='#SkBitmap_HeapAllocator'>HeapAllocator</a>, and replaces existing <a href='undocumented#SkPixelRef'>SkPixelRef</a>.
+The allocation <a href='undocumented#Size'>size</a> is determined by <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> width, height, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>.
+
+Aborts if <a href='#SkBitmap_info'>info()</a>.<a href='#SkImageInfo_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, or allocation fails.
+Abort steps may be provided by the user at compile
+time by defining SK_ABORT.
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_allocPixels_3"><div><a href='SkBitmap_Reference#Bitmap'>Bitmap</a> hosts and draws gray values in set1. <a href='#SkBitmap_allocPixels'>allocPixels</a> replaces <a href='#Pixel_Ref'>Pixel_Ref</a>
+and erases it to black, but does not alter set1. <a href='#SkBitmap_setPixels'>setPixels</a> replaces black
+<a href='#Pixel_Ref'>Pixel_Ref</a> with set2.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a> <a href='#SkBitmap_installPixels'>installPixels</a> <a href='#SkBitmap_setPixels'>setPixels</a>
+
+<a name='SkBitmap_tryAllocPixels_4'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a>(<a href='#SkBitmap_Allocator'>Allocator</a>* allocator)
+</pre>
+
+Allocates <a href='undocumented#Pixel'>pixel</a> memory with <a href='#SkBitmap_tryAllocPixels_4_allocator'>allocator</a>, and replaces existing <a href='undocumented#SkPixelRef'>SkPixelRef</a>.
+The allocation <a href='undocumented#Size'>size</a> is determined by <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> width, height, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>.
+If <a href='#SkBitmap_tryAllocPixels_4_allocator'>allocator</a> is nullptr, use <a href='#SkBitmap_HeapAllocator'>HeapAllocator</a> instead.
+
+Returns false if <a href='#SkBitmap_Allocator'>Allocator</a>::<a href='#SkBitmap_Allocator_allocPixelRef'>allocPixelRef</a> return false.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_tryAllocPixels_4_allocator'><code><strong>allocator</strong></code></a></td>
+    <td>instance of <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_Allocator'>Allocator</a> instantiation</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if custom <a href='#SkBitmap_tryAllocPixels_4_allocator'>allocator</a> reports success
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_tryAllocPixels_4"><div><a href='#SkBitmap_HeapAllocator'>HeapAllocator</a> limits the maximum <a href='undocumented#Size'>size</a> of <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> to two gigabytes. Using
+a custom <a href='#SkBitmap_tryAllocPixels_4_allocator'>allocator</a>, this limitation may be relaxed. This example can be
+modified to allocate an eight gigabyte <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> on a 64-bit platform with
+sufficient memory.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_allocPixels'>allocPixels</a> <a href='#SkBitmap_Allocator'>Allocator</a> <a href='#Pixel_Ref'>Pixel_Ref</a>
+
+<a name='SkBitmap_allocPixels_4'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_allocPixels'>allocPixels</a>(<a href='#SkBitmap_Allocator'>Allocator</a>* allocator)
+</pre>
+
+Allocates <a href='undocumented#Pixel'>pixel</a> memory with <a href='#SkBitmap_allocPixels_4_allocator'>allocator</a>, and replaces existing <a href='undocumented#SkPixelRef'>SkPixelRef</a>.
+The allocation <a href='undocumented#Size'>size</a> is determined by <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> width, height, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>.
+If <a href='#SkBitmap_allocPixels_4_allocator'>allocator</a> is nullptr, use <a href='#SkBitmap_HeapAllocator'>HeapAllocator</a> instead.
+
+Aborts if <a href='#SkBitmap_Allocator'>Allocator</a>::<a href='#SkBitmap_Allocator_allocPixelRef'>allocPixelRef</a> return false. Abort steps may be provided by
+the user at compile time by defining SK_ABORT.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_allocPixels_4_allocator'><code><strong>allocator</strong></code></a></td>
+    <td>instance of <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_Allocator'>Allocator</a> instantiation</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_allocPixels_4"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_allocPixels'>allocPixels</a> <a href='#SkBitmap_Allocator'>Allocator</a> <a href='#Pixel_Ref'>Pixel_Ref</a>
+
+<a name='SkBitmap_pixelRef'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkPixelRef'>SkPixelRef</a>* <a href='#SkBitmap_pixelRef'>pixelRef</a>()const
+</pre>
+
+Returns <a href='undocumented#SkPixelRef'>SkPixelRef</a>, which contains: <a href='undocumented#Pixel'>pixel</a> base address; its dimensions; and
+<a href='#SkBitmap_rowBytes'>rowBytes</a>(), the interval from one row to the next. Does not change <a href='undocumented#SkPixelRef'>SkPixelRef</a>
+reference count. <a href='undocumented#SkPixelRef'>SkPixelRef</a> may be shared by multiple <a href='SkBitmap_Reference#Bitmap'>bitmaps</a>.
+If <a href='undocumented#SkPixelRef'>SkPixelRef</a> has not been set, returns nullptr.
+
+### Return Value
+
+<a href='undocumented#SkPixelRef'>SkPixelRef</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_pixelRef"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_getPixels'>getPixels</a> <a href='#SkBitmap_getAddr'>getAddr</a>
+
+<a name='SkBitmap_pixelRefOrigin'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> <a href='#SkBitmap_pixelRefOrigin'>pixelRefOrigin</a>()const
+</pre>
+
+Returns origin of pixels within <a href='undocumented#SkPixelRef'>SkPixelRef</a>. <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> bounds is always contained
+by <a href='undocumented#SkPixelRef'>SkPixelRef</a> bounds, which may be the same <a href='undocumented#Size'>size</a> or larger. Multiple <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>
+can share the same <a href='undocumented#SkPixelRef'>SkPixelRef</a>, where each <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> has different bounds.
+
+The returned origin added to <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> dimensions equals or is smaller than the
+<a href='undocumented#SkPixelRef'>SkPixelRef</a> dimensions.
+
+Returns (0, 0) if <a href='undocumented#SkPixelRef'>SkPixelRef</a> is nullptr.
+
+### Return Value
+
+<a href='undocumented#Pixel'>pixel</a> origin within <a href='undocumented#SkPixelRef'>SkPixelRef</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_pixelRefOrigin">
+
+#### Example Output
+
+~~~~
+source origin: 0, 0
+subset origin: 32, 64
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#SkPixelRef'>SkPixelRef</a> <a href='#SkBitmap_getSubset'>getSubset</a> <a href='#SkBitmap_setPixelRef'>setPixelRef</a>
+
+<a name='Set'></a>
+
+<a name='SkBitmap_setPixelRef'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_setPixelRef'>setPixelRef</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkPixelRef'>SkPixelRef</a>&gt; <a href='#SkBitmap_pixelRef'>pixelRef</a>, int dx, int dy)
+</pre>
+
+Replaces <a href='#SkBitmap_setPixelRef_pixelRef'>pixelRef</a> and origin in <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>.  <a href='#SkBitmap_setPixelRef_dx'>dx</a> and <a href='#SkBitmap_setPixelRef_dy'>dy</a> specify the offset
+within the <a href='undocumented#SkPixelRef'>SkPixelRef</a> pixels for the top-left corner of the <a href='SkBitmap_Reference#Bitmap'>bitmap</a>.
+
+Asserts in debug builds if <a href='#SkBitmap_setPixelRef_dx'>dx</a> or <a href='#SkBitmap_setPixelRef_dy'>dy</a> are out of range. Pins <a href='#SkBitmap_setPixelRef_dx'>dx</a> and <a href='#SkBitmap_setPixelRef_dy'>dy</a>
+to legal range in release builds.
+
+The caller is responsible for ensuring that the pixels match the
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> in <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_setPixelRef_pixelRef'><code><strong>pixelRef</strong></code></a></td>
+    <td><a href='undocumented#SkPixelRef'>SkPixelRef</a> describing <a href='undocumented#Pixel'>pixel</a> address and <a href='#SkBitmap_rowBytes'>rowBytes</a>()</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_setPixelRef_dx'><code><strong>dx</strong></code></a></td>
+    <td>column offset in <a href='undocumented#SkPixelRef'>SkPixelRef</a> for <a href='SkBitmap_Reference#Bitmap'>bitmap</a> origin</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_setPixelRef_dy'><code><strong>dy</strong></code></a></td>
+    <td>row offset in <a href='undocumented#SkPixelRef'>SkPixelRef</a> for <a href='SkBitmap_Reference#Bitmap'>bitmap</a> origin</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_setPixelRef"><div>Treating 32-bit <a href='undocumented#Data'>data</a> as 8-bit <a href='undocumented#Data'>data</a> is unlikely to produce useful results.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_setInfo'>setInfo</a>
+
+<a name='SkBitmap_readyToDraw'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_readyToDraw'>readyToDraw</a>()const
+</pre>
+
+Returns true if <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> is can be drawn.
+
+### Return Value
+
+true if <a href='#SkBitmap_getPixels'>getPixels</a>() is not nullptr
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_readyToDraw"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_getPixels'>getPixels</a> <a href='#SkBitmap_drawsNothing'>drawsNothing</a>
+
+<a name='SkBitmap_getGenerationID'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint32_t <a href='#SkBitmap_getGenerationID'>getGenerationID</a>()const
+</pre>
+
+Returns a unique value corresponding to the pixels in <a href='undocumented#SkPixelRef'>SkPixelRef</a>.
+Returns a different value after <a href='#SkBitmap_notifyPixelsChanged'>notifyPixelsChanged</a>() has been called.
+Returns zero if <a href='undocumented#SkPixelRef'>SkPixelRef</a> is nullptr.
+
+Determines if pixels have changed since last examined.
+
+### Return Value
+
+unique value for pixels in <a href='undocumented#SkPixelRef'>SkPixelRef</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_getGenerationID">
+
+#### Example Output
+
+~~~~
+#Volatile
+empty id 0
+alloc id 4
+erase id 6
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_notifyPixelsChanged'>notifyPixelsChanged</a> <a href='#Pixel_Ref'>Pixel_Ref</a>
+
+<a name='SkBitmap_notifyPixelsChanged'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_notifyPixelsChanged'>notifyPixelsChanged</a>()const
+</pre>
+
+Marks that pixels in <a href='undocumented#SkPixelRef'>SkPixelRef</a> have changed. Subsequent calls to
+<a href='#SkBitmap_getGenerationID'>getGenerationID</a>() return a different value.
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_notifyPixelsChanged"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_getGenerationID'>getGenerationID</a> <a href='#SkBitmap_isVolatile'>isVolatile</a> <a href='#Pixel_Ref'>Pixel_Ref</a>
+
+<a name='Draw'></a>
+
+<a name='SkBitmap_eraseColor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_eraseColor'>eraseColor</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> c)const
+</pre>
+
+Replaces <a href='undocumented#Pixel'>pixel</a> values with <a href='#SkBitmap_eraseColor_c'>c</a>. All pixels contained by <a href='#SkBitmap_bounds'>bounds()</a> are affected.
+If the <a href='#SkBitmap_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a> or <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>, then <a href='SkColor_Reference#Alpha'>alpha</a>
+is ignored; RGB is treated as opaque. If <a href='#SkBitmap_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>,
+then RGB is ignored.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_eraseColor_c'><code><strong>c</strong></code></a></td>
+    <td><a href='undocumented#Unpremultiply'>unpremultiplied</a> <a href='SkColor_Reference#Color'>color</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_eraseColor"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_eraseARGB'>eraseARGB</a> <a href='#SkBitmap_erase'>erase</a>
+
+<a name='SkBitmap_eraseARGB'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_eraseARGB'>eraseARGB</a>(<a href='undocumented#U8CPU'>U8CPU</a> a, <a href='undocumented#U8CPU'>U8CPU</a> r, <a href='undocumented#U8CPU'>U8CPU</a> g, <a href='undocumented#U8CPU'>U8CPU</a> b)const
+</pre>
+
+Replaces <a href='undocumented#Pixel'>pixel</a> values with <a href='undocumented#Unpremultiply'>unpremultiplied</a> <a href='SkColor_Reference#Color'>color</a> built from <a href='#SkBitmap_eraseARGB_a'>a</a>, <a href='#SkBitmap_eraseARGB_r'>r</a>, <a href='#SkBitmap_eraseARGB_g'>g</a>, and <a href='#SkBitmap_eraseARGB_b'>b</a>.
+All pixels contained by <a href='#SkBitmap_bounds'>bounds()</a> are affected.
+If the <a href='#SkBitmap_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a> or <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>, then <a href='#SkBitmap_eraseARGB_a'>a</a>
+is ignored; <a href='#SkBitmap_eraseARGB_r'>r</a>, <a href='#SkBitmap_eraseARGB_g'>g</a>, and <a href='#SkBitmap_eraseARGB_b'>b</a> are treated as opaque. If <a href='#SkBitmap_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>,
+then <a href='#SkBitmap_eraseARGB_r'>r</a>, <a href='#SkBitmap_eraseARGB_g'>g</a>, and <a href='#SkBitmap_eraseARGB_b'>b</a> are ignored.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_eraseARGB_a'><code><strong>a</strong></code></a></td>
+    <td>amount of <a href='SkColor_Reference#Alpha'>alpha</a>, from fully transparent (0) to fully opaque (255)</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_eraseARGB_r'><code><strong>r</strong></code></a></td>
+    <td>amount of red, from no red (0) to full red (255)</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_eraseARGB_g'><code><strong>g</strong></code></a></td>
+    <td>amount of green, from no green (0) to full green (255)</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_eraseARGB_b'><code><strong>b</strong></code></a></td>
+    <td>amount of blue, from no blue (0) to full blue (255)</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_eraseARGB"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_eraseColor'>eraseColor</a> <a href='#SkBitmap_erase'>erase</a>
+
+<a name='SkBitmap_erase'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_erase'>erase</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> c, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& area)const
+</pre>
+
+Replaces <a href='undocumented#Pixel'>pixel</a> values inside <a href='#SkBitmap_erase_area'>area</a> with <a href='#SkBitmap_erase_c'>c</a>. If <a href='#SkBitmap_erase_area'>area</a> does not intersect <a href='#SkBitmap_bounds'>bounds()</a>,
+call has no effect.
+
+If the <a href='#SkBitmap_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a> or <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>, then <a href='SkColor_Reference#Alpha'>alpha</a>
+is ignored; RGB is treated as opaque. If <a href='#SkBitmap_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>,
+then RGB is ignored.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_erase_c'><code><strong>c</strong></code></a></td>
+    <td><a href='undocumented#Unpremultiply'>unpremultiplied</a> <a href='SkColor_Reference#Color'>color</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_erase_area'><code><strong>area</strong></code></a></td>
+    <td>rectangle to fill</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_erase"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_eraseColor'>eraseColor</a> <a href='#SkBitmap_eraseARGB'>eraseARGB</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawRect'>drawRect</a>
+
+<a name='SkBitmap_getColor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='#SkBitmap_getColor'>getColor</a>(int x, int y)const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> at (<a href='#SkBitmap_getColor_x'>x</a>, <a href='#SkBitmap_getColor_y'>y</a>) as <a href='undocumented#Unpremultiply'>unpremultiplied</a> <a href='SkColor_Reference#Color'>color</a>.
+Returns black with <a href='SkColor_Reference#Alpha'>alpha</a> if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>.
+
+Input is not validated: out of bounds values of <a href='#SkBitmap_getColor_x'>x</a> or <a href='#SkBitmap_getColor_y'>y</a> trigger an assert() if
+built with SK_DEBUG defined; and returns undefined values or may crash if
+SK_RELEASE is defined. Fails if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a> or
+<a href='undocumented#Pixel'>pixel</a> address is nullptr.
+
+<a href='undocumented#SkColorSpace'>SkColorSpace</a> in <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> is ignored. Some <a href='SkColor_Reference#Color'>color</a> precision may be lost in the
+conversion to <a href='undocumented#Unpremultiply'>unpremultiplied</a> <a href='SkColor_Reference#Color'>color</a>; original <a href='undocumented#Pixel'>pixel</a> <a href='undocumented#Data'>data</a> may have additional
+precision.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_getColor_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkBitmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_getColor_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkBitmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='undocumented#Pixel'>pixel</a> converted to <a href='undocumented#Unpremultiply'>unpremultiplied</a> <a href='SkColor_Reference#Color'>color</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_getColor">
+
+#### Example Output
+
+~~~~
+Premultiplied:
+(0, 0) 0x00000000 0x2a0e002a 0x55380055 0x7f7f007f
+(0, 1) 0x2a000e2a 0x551c1c55 0x7f542a7f 0xaaaa38aa
+(0, 2) 0x55003855 0x7f2a547f 0xaa7171aa 0xd4d48dd4
+(0, 3) 0x7f007f7f 0xaa38aaaa 0xd48dd4d4 0xffffffff
+Unpremultiplied:
+(0, 0) 0x00000000 0x2a5500ff 0x55a800ff 0x7fff00ff
+(0, 1) 0x2a0055ff 0x555454ff 0x7fa954ff 0xaaff54ff
+(0, 2) 0x5500a8ff 0x7f54a9ff 0xaaaaaaff 0xd4ffaaff
+(0, 3) 0x7f00ffff 0xaa54ffff 0xd4aaffff 0xffffffff
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_getAlphaf'>getAlphaf</a> <a href='#SkBitmap_getAddr'>getAddr</a> <a href='#SkBitmap_readPixels'>readPixels</a>
+
+<a name='SkBitmap_getAlphaf'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+float <a href='#SkBitmap_getAlphaf'>getAlphaf</a>(int x, int y)const
+</pre>
+
+Looks up the <a href='undocumented#Pixel'>pixel</a> at (<a href='#SkBitmap_getAlphaf_x'>x</a>,<a href='#SkBitmap_getAlphaf_y'>y</a>) and return its <a href='SkColor_Reference#Alpha'>alpha</a> component, normalized to [0..1].
+This is roughly equivalent to <code>SkGetColorA(<a href='#SkBitmap_getColor'>getColor</a>())</code>, but can be more efficient
+(and more precise if the pixels store more than 8 bits per component).
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_getAlphaf_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkBitmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_getAlphaf_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkBitmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkColor_Reference#Alpha'>alpha</a> converted to normalized float
+
+### See Also
+
+<a href='#SkBitmap_getColor'>getColor</a>
+
+<a name='SkBitmap_getAddr'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void* <a href='#SkBitmap_getAddr'>getAddr</a>(int x, int y)const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> address at (<a href='#SkBitmap_getAddr_x'>x</a>, <a href='#SkBitmap_getAddr_y'>y</a>).
+
+Input is not validated: out of bounds values of <a href='#SkBitmap_getAddr_x'>x</a> or <a href='#SkBitmap_getAddr_y'>y</a>, or <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>,
+trigger an assert() if built with SK_DEBUG defined. Returns nullptr if
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, or <a href='undocumented#SkPixelRef'>SkPixelRef</a> is nullptr.
+
+Performs a lookup of <a href='undocumented#Pixel'>pixel</a> <a href='undocumented#Size'>size</a>; for better performance, call
+one of: <a href='#SkBitmap_getAddr8'>getAddr8</a>(), <a href='#SkBitmap_getAddr16'>getAddr16</a>(), or <a href='#SkBitmap_getAddr32'>getAddr32</a>().
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_getAddr_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkBitmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_getAddr_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkBitmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+generic pointer to <a href='undocumented#Pixel'>pixel</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_getAddr">
+
+#### Example Output
+
+~~~~
+addr interval == rowBytes
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_getAddr8'>getAddr8</a> <a href='#SkBitmap_getAddr16'>getAddr16</a> <a href='#SkBitmap_getAddr32'>getAddr32</a> <a href='#SkBitmap_readPixels'>readPixels</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_addr'>addr</a>
+
+<a name='SkBitmap_getAddr32'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint32_t* <a href='#SkBitmap_getAddr32'>getAddr32</a>(int x, int y)const
+</pre>
+
+Returns address at (<a href='#SkBitmap_getAddr32_x'>x</a>, <a href='#SkBitmap_getAddr32_y'>y</a>).
+
+Input is not validated. Triggers an assert() if built with SK_DEBUG defined and:
+
+<table>  <tr>
+    <td><a href='#Pixel_Ref'>Pixel_Ref</a> is nullptr</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_bytesPerPixel'>bytesPerPixel</a>() is not four</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_getAddr32_x'>x</a> is negative, or not less than <a href='#SkBitmap_width'>width()</a></td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_getAddr32_y'>y</a> is negative, or not less than <a href='#SkBitmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_getAddr32_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkBitmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_getAddr32_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkBitmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+unsigned 32-bit pointer to <a href='undocumented#Pixel'>pixel</a> at (<a href='#SkBitmap_getAddr32_x'>x</a>, <a href='#SkBitmap_getAddr32_y'>y</a>)
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_getAddr32">
+
+#### Example Output
+
+~~~~
+addr interval == rowBytes
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_getAddr8'>getAddr8</a> <a href='#SkBitmap_getAddr16'>getAddr16</a> <a href='#SkBitmap_getAddr'>getAddr</a> <a href='#SkBitmap_readPixels'>readPixels</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_addr32'>addr32</a>
+
+<a name='SkBitmap_getAddr16'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint16_t* <a href='#SkBitmap_getAddr16'>getAddr16</a>(int x, int y)const
+</pre>
+
+Returns address at (<a href='#SkBitmap_getAddr16_x'>x</a>, <a href='#SkBitmap_getAddr16_y'>y</a>).
+
+Input is not validated. Triggers an assert() if built with SK_DEBUG defined and:
+
+<table>  <tr>
+    <td><a href='#Pixel_Ref'>Pixel_Ref</a> is nullptr</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_bytesPerPixel'>bytesPerPixel</a>() is not two</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_getAddr16_x'>x</a> is negative, or not less than <a href='#SkBitmap_width'>width()</a></td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_getAddr16_y'>y</a> is negative, or not less than <a href='#SkBitmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_getAddr16_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkBitmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_getAddr16_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkBitmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+unsigned 16-bit pointer to <a href='undocumented#Pixel'>pixel</a> at (<a href='#SkBitmap_getAddr16_x'>x</a>, <a href='#SkBitmap_getAddr16_y'>y</a>)
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_getAddr16">
+
+#### Example Output
+
+~~~~
+addr interval == rowBytes
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_getAddr8'>getAddr8</a> <a href='#SkBitmap_getAddr'>getAddr</a> <a href='#SkBitmap_getAddr32'>getAddr32</a> <a href='#SkBitmap_readPixels'>readPixels</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_addr16'>addr16</a>
+
+<a name='SkBitmap_getAddr8'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint8_t* <a href='#SkBitmap_getAddr8'>getAddr8</a>(int x, int y)const
+</pre>
+
+Returns address at (<a href='#SkBitmap_getAddr8_x'>x</a>, <a href='#SkBitmap_getAddr8_y'>y</a>).
+
+Input is not validated. Triggers an assert() if built with SK_DEBUG defined and:
+
+<table>  <tr>
+    <td><a href='#Pixel_Ref'>Pixel_Ref</a> is nullptr</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_bytesPerPixel'>bytesPerPixel</a>() is not one</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_getAddr8_x'>x</a> is negative, or not less than <a href='#SkBitmap_width'>width()</a></td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_getAddr8_y'>y</a> is negative, or not less than <a href='#SkBitmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_getAddr8_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkBitmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_getAddr8_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkBitmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+unsigned 8-bit pointer to <a href='undocumented#Pixel'>pixel</a> at (<a href='#SkBitmap_getAddr8_x'>x</a>, <a href='#SkBitmap_getAddr8_y'>y</a>)
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_getAddr8">
+
+#### Example Output
+
+~~~~
+&pixels[4][2] == bitmap.getAddr8(2, 4)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_getAddr'>getAddr</a> <a href='#SkBitmap_getAddr16'>getAddr16</a> <a href='#SkBitmap_getAddr32'>getAddr32</a> <a href='#SkBitmap_readPixels'>readPixels</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_addr8'>addr8</a>
+
+<a name='SkBitmap_extractSubset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_extractSubset'>extractSubset</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>* dst, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& subset)const
+</pre>
+
+Shares <a href='#Pixel_Ref'>Pixel_Ref</a> with <a href='#SkBitmap_extractSubset_dst'>dst</a>. Pixels are not copied; <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> and <a href='#SkBitmap_extractSubset_dst'>dst</a> <a href='SkPoint_Reference#Point'>point</a>
+to the same pixels; <a href='#SkBitmap_extractSubset_dst'>dst</a> <a href='#SkBitmap_bounds'>bounds()</a> are set to the intersection of <a href='#SkBitmap_extractSubset_subset'>subset</a>
+and the original <a href='#SkBitmap_bounds'>bounds()</a>.
+
+<a href='#SkBitmap_extractSubset_subset'>subset</a> may be larger than <a href='#SkBitmap_bounds'>bounds()</a>. Any area outside of <a href='#SkBitmap_bounds'>bounds()</a> is ignored.
+
+Any contents of <a href='#SkBitmap_extractSubset_dst'>dst</a> are discarded. <a href='#SkBitmap_isVolatile'>isVolatile</a> setting is copied to <a href='#SkBitmap_extractSubset_dst'>dst</a>.
+<a href='#SkBitmap_extractSubset_dst'>dst</a> is set to <a href='#SkBitmap_colorType'>colorType</a>, <a href='#SkBitmap_alphaType'>alphaType</a>, and <a href='#SkBitmap_colorSpace'>colorSpace</a>.
+
+Return false if:
+
+<table>  <tr>
+    <td><a href='#SkBitmap_extractSubset_dst'>dst</a> is nullptr</td>
+  </tr>  <tr>
+    <td><a href='#Pixel_Ref'>Pixel_Ref</a> is nullptr</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_extractSubset_subset'>subset</a> does not intersect <a href='#SkBitmap_bounds'>bounds()</a></td>
+  </tr>
+</table>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_extractSubset_dst'><code><strong>dst</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#Bitmap'>Bitmap</a> set to <a href='#SkBitmap_extractSubset_subset'>subset</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_extractSubset_subset'><code><strong>subset</strong></code></a></td>
+    <td>rectangle of pixels to reference</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkBitmap_extractSubset_dst'>dst</a> is replaced by <a href='#SkBitmap_extractSubset_subset'>subset</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_extractSubset">
+
+#### Example Output
+
+~~~~
+bounds: 0, 0, 512, 512
+subset: -100,  100,    0,  200  success; false
+subset: -100,  100,  100,  200  success; true  subset: 0, 0, 100, 100
+subset: -100,  100, 1000,  200  success; true  subset: 0, 0, 512, 100
+subset:    0,  100,    0,  200  success; false
+subset:    0,  100,  100,  200  success; true  subset: 0, 0, 100, 100
+subset:    0,  100, 1000,  200  success; true  subset: 0, 0, 512, 100
+subset:  100,  100,    0,  200  success; false
+subset:  100,  100,  100,  200  success; false
+subset:  100,  100, 1000,  200  success; true  subset: 0, 0, 412, 100
+subset: 1000,  100,    0,  200  success; false
+subset: 1000,  100,  100,  200  success; false
+subset: 1000,  100, 1000,  200  success; false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_readPixels'>readPixels</a> <a href='#SkBitmap_writePixels'>writePixels</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawBitmap'>drawBitmap</a>
+
+<a name='SkBitmap_readPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_readPixels'>readPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& dstInfo, void* dstPixels, size_t dstRowBytes, int srcX, int srcY)const
+</pre>
+
+Copies a <a href='SkRect_Reference#Rect'>Rect</a> of pixels from <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> to <a href='#SkBitmap_readPixels_dstPixels'>dstPixels</a>. Copy starts at (<a href='#SkBitmap_readPixels_srcX'>srcX</a>, <a href='#SkBitmap_readPixels_srcY'>srcY</a>),
+and does not exceed <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> (<a href='#SkBitmap_width'>width()</a>, <a href='#SkBitmap_height'>height()</a>).
+
+<a href='#SkBitmap_readPixels_dstInfo'>dstInfo</a> specifies width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>, <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, and <a href='#Color_Space'>Color_Space</a> of
+destination. <a href='#SkBitmap_readPixels_dstRowBytes'>dstRowBytes</a> specifics the gap from one destination row to the next.
+Returns true if pixels are copied. Returns false if:
+
+<table>  <tr>
+    <td><a href='#SkBitmap_readPixels_dstInfo'>dstInfo</a> has no address</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_readPixels_dstRowBytes'>dstRowBytes</a> is less than <a href='#SkBitmap_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>()</td>
+  </tr>  <tr>
+    <td><a href='#Pixel_Ref'>Pixel_Ref</a> is nullptr</td>
+  </tr>
+</table>
+
+Pixels are copied only if <a href='undocumented#Pixel'>pixel</a> conversion is possible. If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorType'>colorType</a> is
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, or <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>; <a href='#SkBitmap_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorType'>colorType</a>() must match.
+If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorType'>colorType</a> is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='#SkBitmap_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorSpace'>colorSpace</a>() must match.
+If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_alphaType'>alphaType</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='#SkBitmap_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>() must
+match. If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorSpace'>colorSpace</a> is nullptr, <a href='#SkBitmap_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorSpace'>colorSpace</a>() must match. Returns
+false if <a href='undocumented#Pixel'>pixel</a> conversion is not possible.
+
+<a href='#SkBitmap_readPixels_srcX'>srcX</a> and <a href='#SkBitmap_readPixels_srcY'>srcY</a> may be negative to copy only top or left of source. Returns
+false if <a href='#SkBitmap_width'>width()</a> or <a href='#SkBitmap_height'>height()</a> is zero or negative.
+Returns false if <code><a href='undocumented#abs()'>abs</a>(<a href='#SkBitmap_readPixels_srcX'>srcX</a>) >= <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_width'>width()</a></code>, or if <code><a href='undocumented#abs()'>abs</a>(<a href='#SkBitmap_readPixels_srcY'>srcY</a>) >= <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_height'>height()</a></code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_readPixels_dstInfo'><code><strong>dstInfo</strong></code></a></td>
+    <td>destination width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>, <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, <a href='#Color_Space'>Color_Space</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_readPixels_dstPixels'><code><strong>dstPixels</strong></code></a></td>
+    <td>destination  <a href='undocumented#Pixel_Storage'>pixel storage</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_readPixels_dstRowBytes'><code><strong>dstRowBytes</strong></code></a></td>
+    <td>destination row length</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_readPixels_srcX'><code><strong>srcX</strong></code></a></td>
+    <td>column index whose absolute value is less than <a href='#SkBitmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_readPixels_srcY'><code><strong>srcY</strong></code></a></td>
+    <td>row index whose absolute value is less than <a href='#SkBitmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels are copied to <a href='#SkBitmap_readPixels_dstPixels'>dstPixels</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_readPixels"><div>Transferring the gradient from 8 bits per component to 4 bits per component
+creates visible banding.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_writePixels'>writePixels</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_readPixels'>readPixels</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_readPixels'>readPixels</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_readPixels'>readPixels</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_readPixels'>readPixels</a>
+
+<a name='SkBitmap_readPixels_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_readPixels'>readPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst, int srcX, int srcY)const
+</pre>
+
+Copies a <a href='SkRect_Reference#Rect'>Rect</a> of pixels from <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> to <a href='#SkBitmap_readPixels_2_dst'>dst</a>. Copy starts at (<a href='#SkBitmap_readPixels_2_srcX'>srcX</a>, <a href='#SkBitmap_readPixels_2_srcY'>srcY</a>), and
+does not exceed <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> (<a href='#SkBitmap_width'>width()</a>, <a href='#SkBitmap_height'>height()</a>).
+
+<a href='#SkBitmap_readPixels_2_dst'>dst</a> specifies width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>, <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, <a href='#Color_Space'>Color_Space</a>,  <a href='undocumented#Pixel_Storage'>pixel storage</a>,
+and  <a href='#Row_Bytes'>row bytes</a> of destination. <a href='#SkBitmap_readPixels_2_dst'>dst</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() specifics the gap from one destination
+row to the next. Returns true if pixels are copied. Returns false if:
+
+<table>  <tr>
+    <td><a href='#SkBitmap_readPixels_2_dst'>dst</a>  <a href='undocumented#Pixel_Storage'>pixel storage</a> equals nullptr</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_readPixels_2_dst'>dst</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() is less than <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>()</td>
+  </tr>  <tr>
+    <td><a href='#Pixel_Ref'>Pixel_Ref</a> is nullptr</td>
+  </tr>
+</table>
+
+Pixels are copied only if <a href='undocumented#Pixel'>pixel</a> conversion is possible. If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorType'>colorType</a> is
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, or <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>; <a href='#SkBitmap_readPixels_2_dst'>dst</a> <a href='#Image_Info_Color_Type'>Color_Type</a> must match.
+If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorType'>colorType</a> is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='#SkBitmap_readPixels_2_dst'>dst</a> <a href='#Color_Space'>Color_Space</a> must match.
+If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_alphaType'>alphaType</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='#SkBitmap_readPixels_2_dst'>dst</a> <a href='#Image_Info_Alpha_Type'>Alpha_Type</a> must
+match. If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorSpace'>colorSpace</a> is nullptr, <a href='#SkBitmap_readPixels_2_dst'>dst</a> <a href='#Color_Space'>Color_Space</a> must match. Returns
+false if <a href='undocumented#Pixel'>pixel</a> conversion is not possible.
+
+<a href='#SkBitmap_readPixels_2_srcX'>srcX</a> and <a href='#SkBitmap_readPixels_2_srcY'>srcY</a> may be negative to copy only top or left of source. Returns
+false if <a href='#SkBitmap_width'>width()</a> or <a href='#SkBitmap_height'>height()</a> is zero or negative.
+Returns false if <code><a href='undocumented#abs()'>abs</a>(<a href='#SkBitmap_readPixels_2_srcX'>srcX</a>) >= <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_width'>width()</a></code>, or if <code><a href='undocumented#abs()'>abs</a>(<a href='#SkBitmap_readPixels_2_srcY'>srcY</a>) >= <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_height'>height()</a></code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_readPixels_2_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkPixmap_Reference#Pixmap'>Pixmap</a>: <a href='#Image_Info'>Image_Info</a>, pixels,  <a href='#Row_Bytes'>row bytes</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_readPixels_2_srcX'><code><strong>srcX</strong></code></a></td>
+    <td>column index whose absolute value is less than <a href='#SkBitmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_readPixels_2_srcY'><code><strong>srcY</strong></code></a></td>
+    <td>row index whose absolute value is less than <a href='#SkBitmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels are copied to <a href='#SkBitmap_readPixels_2_dst'>dst</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_readPixels_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_writePixels'>writePixels</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_readPixels'>readPixels</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_readPixels'>readPixels</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_readPixels'>readPixels</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_readPixels'>readPixels</a>
+
+<a name='SkBitmap_readPixels_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_readPixels'>readPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst)const
+</pre>
+
+Copies a <a href='SkRect_Reference#Rect'>Rect</a> of pixels from <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> to <a href='#SkBitmap_readPixels_3_dst'>dst</a>. Copy starts at (0, 0), and
+does not exceed <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> (<a href='#SkBitmap_width'>width()</a>, <a href='#SkBitmap_height'>height()</a>).
+
+<a href='#SkBitmap_readPixels_3_dst'>dst</a> specifies width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>, <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, <a href='#Color_Space'>Color_Space</a>,  <a href='undocumented#Pixel_Storage'>pixel storage</a>,
+and  <a href='#Row_Bytes'>row bytes</a> of destination. <a href='#SkBitmap_readPixels_3_dst'>dst</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() specifics the gap from one destination
+row to the next. Returns true if pixels are copied. Returns false if:
+
+<table>  <tr>
+    <td><a href='#SkBitmap_readPixels_3_dst'>dst</a>  <a href='undocumented#Pixel_Storage'>pixel storage</a> equals nullptr</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_readPixels_3_dst'>dst</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() is less than <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>()</td>
+  </tr>  <tr>
+    <td><a href='#Pixel_Ref'>Pixel_Ref</a> is nullptr</td>
+  </tr>
+</table>
+
+Pixels are copied only if <a href='undocumented#Pixel'>pixel</a> conversion is possible. If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorType'>colorType</a> is
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, or <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>; <a href='#SkBitmap_readPixels_3_dst'>dst</a> <a href='#Image_Info_Color_Type'>Color_Type</a> must match.
+If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorType'>colorType</a> is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='#SkBitmap_readPixels_3_dst'>dst</a> <a href='#Color_Space'>Color_Space</a> must match.
+If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_alphaType'>alphaType</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='#SkBitmap_readPixels_3_dst'>dst</a> <a href='#Image_Info_Alpha_Type'>Alpha_Type</a> must
+match. If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorSpace'>colorSpace</a> is nullptr, <a href='#SkBitmap_readPixels_3_dst'>dst</a> <a href='#Color_Space'>Color_Space</a> must match. Returns
+false if <a href='undocumented#Pixel'>pixel</a> conversion is not possible.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_readPixels_3_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkPixmap_Reference#Pixmap'>Pixmap</a>: <a href='#Image_Info'>Image_Info</a>, pixels,  <a href='#Row_Bytes'>row bytes</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels are copied to <a href='#SkBitmap_readPixels_3_dst'>dst</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_readPixels_3"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_writePixels'>writePixels</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_readPixels'>readPixels</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_readPixels'>readPixels</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_readPixels'>readPixels</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_readPixels'>readPixels</a>
+
+<a name='SkBitmap_writePixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_writePixels'>writePixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& src, int dstX, int dstY)
+</pre>
+
+Copies a <a href='SkRect_Reference#Rect'>Rect</a> of pixels from <a href='#SkBitmap_writePixels_src'>src</a>. Copy starts at (<a href='#SkBitmap_writePixels_dstX'>dstX</a>, <a href='#SkBitmap_writePixels_dstY'>dstY</a>), and does not exceed
+(<a href='#SkBitmap_writePixels_src'>src</a>.<a href='#SkPixmap_width'>width()</a>, <a href='#SkBitmap_writePixels_src'>src</a>.<a href='#SkPixmap_height'>height()</a>).
+
+<a href='#SkBitmap_writePixels_src'>src</a> specifies width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>, <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, <a href='#Color_Space'>Color_Space</a>,  <a href='undocumented#Pixel_Storage'>pixel storage</a>,
+and  <a href='#Row_Bytes'>row bytes</a> of source. <a href='#SkBitmap_writePixels_src'>src</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() specifics the gap from one source
+row to the next. Returns true if pixels are copied. Returns false if:
+
+<table>  <tr>
+    <td><a href='#SkBitmap_writePixels_src'>src</a>  <a href='undocumented#Pixel_Storage'>pixel storage</a> equals nullptr</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_writePixels_src'>src</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() is less than <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>()</td>
+  </tr>  <tr>
+    <td><a href='#Pixel_Ref'>Pixel_Ref</a> is nullptr</td>
+  </tr>
+</table>
+
+Pixels are copied only if <a href='undocumented#Pixel'>pixel</a> conversion is possible. If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorType'>colorType</a> is
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, or <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>; <a href='#SkBitmap_writePixels_src'>src</a> <a href='#Image_Info_Color_Type'>Color_Type</a> must match.
+If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorType'>colorType</a> is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='#SkBitmap_writePixels_src'>src</a> <a href='#Color_Space'>Color_Space</a> must match.
+If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_alphaType'>alphaType</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='#SkBitmap_writePixels_src'>src</a> <a href='#Image_Info_Alpha_Type'>Alpha_Type</a> must
+match. If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorSpace'>colorSpace</a> is nullptr, <a href='#SkBitmap_writePixels_src'>src</a> <a href='#Color_Space'>Color_Space</a> must match. Returns
+false if <a href='undocumented#Pixel'>pixel</a> conversion is not possible.
+
+<a href='#SkBitmap_writePixels_dstX'>dstX</a> and <a href='#SkBitmap_writePixels_dstY'>dstY</a> may be negative to copy only top or left of source. Returns
+false if <a href='#SkBitmap_width'>width()</a> or <a href='#SkBitmap_height'>height()</a> is zero or negative.
+Returns false if <code><a href='undocumented#abs()'>abs</a>(<a href='#SkBitmap_writePixels_dstX'>dstX</a>) >= <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_width'>width()</a></code>, or if <code><a href='undocumented#abs()'>abs</a>(<a href='#SkBitmap_writePixels_dstY'>dstY</a>) >= <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_height'>height()</a></code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_writePixels_src'><code><strong>src</strong></code></a></td>
+    <td>source <a href='SkPixmap_Reference#Pixmap'>Pixmap</a>: <a href='#Image_Info'>Image_Info</a>, pixels,  <a href='#Row_Bytes'>row bytes</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_writePixels_dstX'><code><strong>dstX</strong></code></a></td>
+    <td>column index whose absolute value is less than <a href='#SkBitmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_writePixels_dstY'><code><strong>dstY</strong></code></a></td>
+    <td>row index whose absolute value is less than <a href='#SkBitmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkBitmap_writePixels_src'>src</a> pixels are copied to <a href='SkBitmap_Reference#Bitmap'>Bitmap</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_writePixels"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_readPixels'>readPixels</a>
+
+<a name='SkBitmap_writePixels_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_writePixels'>writePixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& src)
+</pre>
+
+Copies a <a href='SkRect_Reference#Rect'>Rect</a> of pixels from <a href='#SkBitmap_writePixels_2_src'>src</a>. Copy starts at (0, 0), and does not exceed
+(<a href='#SkBitmap_writePixels_2_src'>src</a>.<a href='#SkPixmap_width'>width()</a>, <a href='#SkBitmap_writePixels_2_src'>src</a>.<a href='#SkPixmap_height'>height()</a>).
+
+<a href='#SkBitmap_writePixels_2_src'>src</a> specifies width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>, <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, <a href='#Color_Space'>Color_Space</a>,  <a href='undocumented#Pixel_Storage'>pixel storage</a>,
+and  <a href='#Row_Bytes'>row bytes</a> of source. <a href='#SkBitmap_writePixels_2_src'>src</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() specifics the gap from one source
+row to the next. Returns true if pixels are copied. Returns false if:
+
+<table>  <tr>
+    <td><a href='#SkBitmap_writePixels_2_src'>src</a>  <a href='undocumented#Pixel_Storage'>pixel storage</a> equals nullptr</td>
+  </tr>  <tr>
+    <td><a href='#SkBitmap_writePixels_2_src'>src</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() is less than <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>()</td>
+  </tr>  <tr>
+    <td><a href='#Pixel_Ref'>Pixel_Ref</a> is nullptr</td>
+  </tr>
+</table>
+
+Pixels are copied only if <a href='undocumented#Pixel'>pixel</a> conversion is possible. If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorType'>colorType</a> is
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, or <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>; <a href='#SkBitmap_writePixels_2_src'>src</a> <a href='#Image_Info_Color_Type'>Color_Type</a> must match.
+If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorType'>colorType</a> is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='#SkBitmap_writePixels_2_src'>src</a> <a href='#Color_Space'>Color_Space</a> must match.
+If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_alphaType'>alphaType</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='#SkBitmap_writePixels_2_src'>src</a> <a href='#Image_Info_Alpha_Type'>Alpha_Type</a> must
+match. If <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkBitmap_colorSpace'>colorSpace</a> is nullptr, <a href='#SkBitmap_writePixels_2_src'>src</a> <a href='#Color_Space'>Color_Space</a> must match. Returns
+false if <a href='undocumented#Pixel'>pixel</a> conversion is not possible.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_writePixels_2_src'><code><strong>src</strong></code></a></td>
+    <td>source <a href='SkPixmap_Reference#Pixmap'>Pixmap</a>: <a href='#Image_Info'>Image_Info</a>, pixels,  <a href='#Row_Bytes'>row bytes</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkBitmap_writePixels_2_src'>src</a> pixels are copied to <a href='SkBitmap_Reference#Bitmap'>Bitmap</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_writePixels_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_readPixels'>readPixels</a>
+
+<a name='SkBitmap_extractAlpha'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_extractAlpha'>extractAlpha</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>* dst)const
+</pre>
+
+Sets <a href='#SkBitmap_extractAlpha_dst'>dst</a> to <a href='SkColor_Reference#Alpha'>alpha</a> described by pixels. Returns false if <a href='#SkBitmap_extractAlpha_dst'>dst</a> cannot be written to
+or <a href='#SkBitmap_extractAlpha_dst'>dst</a> pixels cannot be allocated.
+
+Uses <a href='#SkBitmap_HeapAllocator'>HeapAllocator</a> to reserve memory for <a href='#SkBitmap_extractAlpha_dst'>dst</a> <a href='undocumented#SkPixelRef'>SkPixelRef</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_extractAlpha_dst'><code><strong>dst</strong></code></a></td>
+    <td>holds <a href='undocumented#SkPixelRef'>SkPixelRef</a> to fill with <a href='SkColor_Reference#Alpha'>alpha</a> <a href='SkCanvas_Reference#Layer'>layer</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkColor_Reference#Alpha'>alpha</a> <a href='SkCanvas_Reference#Layer'>layer</a> was constructed in <a href='#SkBitmap_extractAlpha_dst'>dst</a> <a href='undocumented#SkPixelRef'>SkPixelRef</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_extractAlpha"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_extractSubset'>extractSubset</a>
+
+<a name='SkBitmap_extractAlpha_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_extractAlpha'>extractAlpha</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>* dst, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>, <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>* offset)const
+</pre>
+
+Sets <a href='#SkBitmap_extractAlpha_2_dst'>dst</a> to <a href='SkColor_Reference#Alpha'>alpha</a> described by pixels. Returns false if <a href='#SkBitmap_extractAlpha_2_dst'>dst</a> cannot be written to
+or <a href='#SkBitmap_extractAlpha_2_dst'>dst</a> pixels cannot be allocated.
+
+If <a href='#SkBitmap_extractAlpha_2_paint'>paint</a> is not nullptr and contains <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>
+generates  <a href='undocumented#Mask_Alpha'>mask alpha</a> from <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>. Uses <a href='#SkBitmap_HeapAllocator'>HeapAllocator</a> to reserve memory for <a href='#SkBitmap_extractAlpha_2_dst'>dst</a>
+<a href='undocumented#SkPixelRef'>SkPixelRef</a>. Sets <a href='#SkBitmap_extractAlpha_2_offset'>offset</a> to top-left position for <a href='#SkBitmap_extractAlpha_2_dst'>dst</a> for alignment with <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>;
+(0, 0) unless <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> generates mask.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_extractAlpha_2_dst'><code><strong>dst</strong></code></a></td>
+    <td>holds <a href='undocumented#SkPixelRef'>SkPixelRef</a> to fill with <a href='SkColor_Reference#Alpha'>alpha</a> <a href='SkCanvas_Reference#Layer'>layer</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_extractAlpha_2_paint'><code><strong>paint</strong></code></a></td>
+    <td>holds optional <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_extractAlpha_2_offset'><code><strong>offset</strong></code></a></td>
+    <td>top-left position for <a href='#SkBitmap_extractAlpha_2_dst'>dst</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkColor_Reference#Alpha'>alpha</a> <a href='SkCanvas_Reference#Layer'>layer</a> was constructed in <a href='#SkBitmap_extractAlpha_2_dst'>dst</a> <a href='undocumented#SkPixelRef'>SkPixelRef</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_extractAlpha_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_extractSubset'>extractSubset</a>
+
+<a name='SkBitmap_extractAlpha_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_extractAlpha'>extractAlpha</a>(<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>* dst, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>, <a href='#SkBitmap_Allocator'>Allocator</a>* allocator, <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>* offset)const
+</pre>
+
+Sets <a href='#SkBitmap_extractAlpha_3_dst'>dst</a> to <a href='SkColor_Reference#Alpha'>alpha</a> described by pixels. Returns false if <a href='#SkBitmap_extractAlpha_3_dst'>dst</a> cannot be written to
+or <a href='#SkBitmap_extractAlpha_3_dst'>dst</a> pixels cannot be allocated.
+
+If <a href='#SkBitmap_extractAlpha_3_paint'>paint</a> is not nullptr and contains <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>
+generates  <a href='undocumented#Mask_Alpha'>mask alpha</a> from <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>. <a href='#SkBitmap_extractAlpha_3_allocator'>allocator</a> may reference a custom allocation
+class or be set to nullptr to use <a href='#SkBitmap_HeapAllocator'>HeapAllocator</a>. Sets <a href='#SkBitmap_extractAlpha_3_offset'>offset</a> to top-left
+position for <a href='#SkBitmap_extractAlpha_3_dst'>dst</a> for alignment with <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>; (0, 0) unless <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> generates
+mask.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_extractAlpha_3_dst'><code><strong>dst</strong></code></a></td>
+    <td>holds <a href='undocumented#SkPixelRef'>SkPixelRef</a> to fill with <a href='SkColor_Reference#Alpha'>alpha</a> <a href='SkCanvas_Reference#Layer'>layer</a></td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_extractAlpha_3_paint'><code><strong>paint</strong></code></a></td>
+    <td>holds optional <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_extractAlpha_3_allocator'><code><strong>allocator</strong></code></a></td>
+    <td>function to reserve memory for <a href='undocumented#SkPixelRef'>SkPixelRef</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkBitmap_extractAlpha_3_offset'><code><strong>offset</strong></code></a></td>
+    <td>top-left position for <a href='#SkBitmap_extractAlpha_3_dst'>dst</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkColor_Reference#Alpha'>alpha</a> <a href='SkCanvas_Reference#Layer'>layer</a> was constructed in <a href='#SkBitmap_extractAlpha_3_dst'>dst</a> <a href='undocumented#SkPixelRef'>SkPixelRef</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_extractAlpha_3"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_extractSubset'>extractSubset</a>
+
+<a name='SkBitmap_peekPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkBitmap_peekPixels'>peekPixels</a>(<a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>* <a href='SkPixmap_Reference#Pixmap'>pixmap</a>)const
+</pre>
+
+Copies <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> <a href='undocumented#Pixel'>pixel</a> address,  <a href='#Row_Bytes'>row bytes</a>, and <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='#SkBitmap_peekPixels_pixmap'>pixmap</a>, if address
+is available, and returns true. If <a href='undocumented#Pixel'>pixel</a> address is not available, return
+false and leave <a href='#SkBitmap_peekPixels_pixmap'>pixmap</a> unchanged.
+
+<a href='#SkBitmap_peekPixels_pixmap'>pixmap</a> contents become invalid on any future change to <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBitmap_peekPixels_pixmap'><code><strong>pixmap</strong></code></a></td>
+    <td>storage for <a href='undocumented#Pixel'>pixel</a> state if pixels are readable; otherwise, ignored</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> has direct access to pixels
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_peekPixels">
+
+#### Example Output
+
+~~~~
+------
+-xxx--
+x---x-
+----x-
+---x--
+--x---
+--x---
+------
+--x---
+--x---
+------
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkBitmap_peekPixels_pixmap'>pixmap</a> <a href='#SkBitmap_installPixels'>installPixels</a> <a href='#SkBitmap_readPixels'>readPixels</a> <a href='#SkBitmap_writePixels'>writePixels</a>
+
+<a name='Utility'></a>
+
+<a name='SkBitmap_validate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkBitmap_validate'>validate()</a> const;
+</pre>
+
+### See Also
+
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_validate'>validate</a>
+
diff --git a/src/third_party/skia/site/user/api/SkBlendMode_Overview.md b/src/third_party/skia/site/user/api/SkBlendMode_Overview.md
new file mode 100644
index 0000000..3c57182
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkBlendMode_Overview.md
@@ -0,0 +1,70 @@
+SkBlendMode Overview
+===
+Describes how destination <a href='undocumented#Pixel'>pixel</a> is replaced with a combination of itself and
+source <a href='undocumented#Pixel'>pixel</a>. <a href='#Blend_Mode'>Blend_Mode</a> may use source, destination, or both. <a href='#Blend_Mode'>Blend_Mode</a> may
+operate on each <a href='SkColor_Reference#Color'>Color</a> component independently, or may allow all source <a href='undocumented#Pixel'>pixel</a>
+components to contribute to one destination <a href='undocumented#Pixel'>pixel</a> component.
+
+<a href='#Blend_Mode'>Blend_Mode</a> does not use adjacent pixels to determine the outcome.
+
+<a href='#Blend_Mode'>Blend_Mode</a> uses source and read destination <a href='SkColor_Reference#Alpha'>Alpha</a> to determine written
+destination <a href='SkColor_Reference#Alpha'>Alpha</a>; both source and destination <a href='SkColor_Reference#Alpha'>Alpha</a> may also affect written
+destination <a href='SkColor_Reference#Color'>Color</a> components.
+
+Regardless of how <a href='SkColor_Reference#Alpha'>Alpha</a> is encoded in source and destination <a href='undocumented#Pixel'>pixel</a>, nearly all
+<a href='#Image_Info_Color_Type'>Color_Types</a> treat it as ranging from zero to one. And, nearly all <a href='#Blend_Mode'>Blend_Mode</a>
+algorithms limit the output so that all results are also zero to one.
+
+Two exceptions are <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kPlus'>kPlus</a> and <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>.
+
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kPlus'>kPlus</a> permits computing <a href='SkColor_Reference#Alpha'>Alpha</a> and <a href='SkColor_Reference#Color'>Color</a> component values larger
+than one. For <a href='#Image_Info_Color_Type'>Color_Types</a> other than <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>, resulting <a href='SkColor_Reference#Alpha'>Alpha</a>
+and component values are clamped to one.
+
+<a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a> permits values outside the zero to one range. It is up
+to the client to ensure that the result is within the range of zero to one,
+and therefore well-defined.
+
+<a name='Porter_Duff'></a>
+
+<a href='https://graphics.pixar.com/library/Compositing/paper.pdf'>Compositing Digital Images</a></a> describes <a href='#Blend_Mode_Overview_Porter_Duff'>Porter_Duff</a> modes <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kClear'>kClear</a> through <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kXor'>kXor</a>.
+
+Drawing a <a href='SkBitmap_Reference#Bitmap'>bitmap</a> with transparency using <a href='#Blend_Mode_Overview_Porter_Duff'>Porter_Duff</a> compositing is free to clear
+the destination.
+
+![Porter_Duff](https://fiddle.skia.org/i/819903e0bb125385269948474b6c8a84_raster.png "")
+
+Draw geometry with transparency using <a href='#Blend_Mode_Overview_Porter_Duff'>Porter_Duff</a> compositing does not combine
+transparent source pixels, leaving the destination outside the geometry untouched.
+
+![Porter_Duff](https://fiddle.skia.org/i/8f320c1e94e77046e00f7e9e843caa27_raster.png "")
+
+<a name='Lighten_Darken'></a>
+
+Modes <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kPlus'>kPlus</a> and <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kScreen'>kScreen</a> use
+simple arithmetic to lighten or darken the destination. Modes
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kOverlay'>kOverlay</a> through <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kMultiply'>kMultiply</a> use more complicated
+algorithms to lighten or darken; sometimes one mode does both, as described by
+<a href='https://en.wikipedia.org/wiki/Blend_modes'>Blend Modes</a></a> .
+
+![Lighten_Darken](https://fiddle.skia.org/i/23a33fa04cdd0204b2490d05e340f87c_raster.png "")
+
+<a name='Modulate_Blend'></a>
+
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kModulate'>kModulate</a> is a mashup of <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcATop'>kSrcATop</a> and <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kMultiply'>kMultiply</a>.
+It multiplies all components, including <a href='SkColor_Reference#Alpha'>Alpha</a>; unlike <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kMultiply'>kMultiply</a>, if either
+source or destination is transparent, result is transparent. <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kModulate'>kModulate</a>
+uses <a href='undocumented#Premultiply'>Premultiplied</a> values to compute the product; <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kMultiply'>kMultiply</a> uses <a href='undocumented#Unpremultiply'>Unpremultiplied</a>
+values to compute the product.
+
+![Modulate_Blend](https://fiddle.skia.org/i/877f96610ab7638a310432674b04f837_raster.png "")
+
+<a name='Color_Blends'></a>
+
+Modes <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kHue'>kHue</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSaturation'>kSaturation</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kColor'>kColor</a>, and
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kLuminosity'>kLuminosity</a> convert source and destination pixels using all
+components <a href='SkColor_Reference#Color'>color</a> information, using
+<a href='https://www.w3.org/TR/compositing-1/#blendingnonseparable'>non-separable blend modes</a></a> .
+
+![Color_Blends](https://fiddle.skia.org/i/630fe21aea8369b307231f5bcf8b2d50_raster.png "")
+
diff --git a/src/third_party/skia/site/user/api/SkBlendMode_Reference.md b/src/third_party/skia/site/user/api/SkBlendMode_Reference.md
new file mode 100644
index 0000000..d1de4ff
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkBlendMode_Reference.md
@@ -0,0 +1,804 @@
+SkBlendMode Reference
+===
+
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+enum class <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> {
+    kClear,
+    kSrc,
+    kDst,
+    kSrcOver,
+    kDstOver,
+    kSrcIn,
+    kDstIn,
+    kSrcOut,
+    kDstOut,
+    kSrcATop,
+    kDstATop,
+    kXor,
+    kPlus,
+    kModulate,
+    kScreen,
+    kLastCoeffMode = kScreen,
+    kOverlay,
+    kDarken,
+    kLighten,
+    kColorDodge,
+    kColorBurn,
+    kHardLight,
+    kSoftLight,
+    kDifference,
+    kExclusion,
+    kMultiply,
+    kLastSeparableMode = kMultiply,
+    kHue,
+    kSaturation,
+    kColor,
+    kLuminosity,
+    kLastMode = kLuminosity,
+};
+
+const char* <a href='SkBlendMode_Reference#SkBlendMode_Name'>SkBlendMode_Name</a>(<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> blendMode);
+</pre>
+
+<a name='SkBlendMode'></a>
+
+---
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Details</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kClear'><code>SkBlendMode::kClear</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Clear'>Clear</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces destination with <a href='SkColor_Reference#Alpha'>Alpha</a> and <a href='SkColor_Reference#Color'>Color</a> components set to zero;
+a fully transparent <a href='undocumented#Pixel'>pixel</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kSrc'><code>SkBlendMode::kSrc</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Src'>Src</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces destination with source. Destination <a href='SkColor_Reference#Alpha'>alpha</a> and <a href='SkColor_Reference#Color'>color</a> component values
+are ignored.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kDst'><code>SkBlendMode::kDst</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Dst'>Dst</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Preserves destination, ignoring source. Drawing with <a href='SkPaint_Reference#Paint'>Paint</a> set to <a href='#SkBlendMode_kDst'>kDst</a> has
+no effect.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kSrcOver'><code>SkBlendMode::kSrcOver</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Src_Over'>Src&nbsp;Over</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces destination with source blended with destination. If source is opaque,
+replaces destination with source. Used as the default <a href='#Blend_Mode'>Blend_Mode</a> for <a href='SkPaint_Reference#SkPaint'>SkPaint</a>.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kDstOver'><code>SkBlendMode::kDstOver</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>4</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Dst_Over'>Dst&nbsp;Over</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces destination with destination blended with source. If destination is opaque,
+has no effect.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kSrcIn'><code>SkBlendMode::kSrcIn</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>5</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Src_In'>Src&nbsp;In</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces destination with source using destination opacity.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kDstIn'><code>SkBlendMode::kDstIn</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>6</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Dst_In'>Dst&nbsp;In</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Scales destination opacity by source opacity.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kSrcOut'><code>SkBlendMode::kSrcOut</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>7</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Src_Out'>Src&nbsp;Out</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces destination with source using the inverse of destination opacity,
+drawing source fully where destination opacity is zero.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kDstOut'><code>SkBlendMode::kDstOut</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>8</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Dst_Out'>Dst&nbsp;Out</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces destination opacity with inverse of source opacity. If source is
+transparent, has no effect.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kSrcATop'><code>SkBlendMode::kSrcATop</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>9</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Src_Atop'>Src&nbsp;Atop</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Blends destination with source using read destination opacity.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kDstATop'><code>SkBlendMode::kDstATop</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>10</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Dst_Atop'>Dst&nbsp;Atop</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Blends destination with source using source opacity.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kXor'><code>SkBlendMode::kXor</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>11</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Xor'>Xor</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Blends destination by exchanging transparency of the source and destination.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kPlus'><code>SkBlendMode::kPlus</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>12</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Plus'>Plus</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces destination with source and destination added together.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kModulate'><code>SkBlendMode::kModulate</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>13</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Modulate'>Modulate</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces destination with source and destination multiplied together.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kScreen'><code>SkBlendMode::kScreen</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>14</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Screen'>Screen</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces destination with inverted source and destination multiplied together.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kLastCoeffMode'><code>SkBlendMode::kLastCoeffMode</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>14</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+last Porter_Duff blend mode</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kOverlay'><code>SkBlendMode::kOverlay</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>15</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Overlay'>Overlay</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces destination with multiply or screen, depending on destination.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kDarken'><code>SkBlendMode::kDarken</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>16</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Darken'>Darken</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces destination with darker of source and destination.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kLighten'><code>SkBlendMode::kLighten</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>17</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Lighten'>Lighten</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces destination with lighter of source and destination.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kColorDodge'><code>SkBlendMode::kColorDodge</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>18</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Color_Dodge'>Color&nbsp;Dodge</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Makes destination brighter to reflect source.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kColorBurn'><code>SkBlendMode::kColorBurn</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>19</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Color_Burn'>Color&nbsp;Burn</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Makes destination darker to reflect source.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kHardLight'><code>SkBlendMode::kHardLight</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>20</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Hard_Light'>Hard&nbsp;Light</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Makes destination lighter or darker, depending on source.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kSoftLight'><code>SkBlendMode::kSoftLight</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>21</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Soft_Light'>Soft&nbsp;Light</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Makes destination lighter or darker, depending on source.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kDifference'><code>SkBlendMode::kDifference</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>22</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Difference'>Difference</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Subtracts darker from lighter with higher contrast.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kExclusion'><code>SkBlendMode::kExclusion</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>23</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Exclusion'>Exclusion</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Subtracts darker from lighter with lower contrast.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kMultiply'><code>SkBlendMode::kMultiply</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>24</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Multiply'>Multiply</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Multiplies source with destination, darkening <a href='SkImage_Reference#Image'>image</a>.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kLastSeparableMode'><code>SkBlendMode::kLastSeparableMode</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>24</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Last  blend mode operating separately on components.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kHue'><code>SkBlendMode::kHue</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>25</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Hue'>Hue</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces hue of destination with hue of source, leaving saturation and luminosity
+unchanged.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kSaturation'><code>SkBlendMode::kSaturation</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>26</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Saturation'>Saturation</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces saturation of destination saturation hue of source, leaving hue and
+luminosity unchanged.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kColor'><code>SkBlendMode::kColor</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>27</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Color'>Color</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces hue and saturation of destination with hue and saturation of source,
+leaving luminosity unchanged.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kLuminosity'><code>SkBlendMode::kLuminosity</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>28</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Luminosity'>Luminosity</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces luminosity of destination with luminosity of source, leaving hue and
+saturation unchanged.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkBlendMode_kLastMode'><code>SkBlendMode::kLastMode</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>28</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Used by tests to iterate through all valid values.
+</td>
+  </tr>
+</table>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawColor'>drawColor</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawVertices'>drawVertices</a> <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_MakeCompose'>MakeCompose</a> <a href='undocumented#SkXfermodeImageFilter'>SkXfermodeImageFilter</a>
+
+<a name='Clear'></a>
+
+---
+
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kClear'>kClear</a> sets destination to: <code>[0, 0]</code>.
+Use <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kClear'>kClear</a> to initialize a buffer to fully transparent pixels when
+creating a mask with irregular edges.
+
+### Example
+
+<div><fiddle-embed name="@Clear"><div><a href='SkColor_Reference#SK_ColorYELLOW'>SK_ColorYELLOW</a> is ignored because <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kClear'>kClear</a> ignores the source <a href='undocumented#Pixel'>pixel</a>
+value and the destination <a href='undocumented#Pixel'>pixel</a> value, always setting the destination to zero.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_clear'>clear</a>
+
+<a name='Src'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrc'>kSrc</a> sets destination to: <code>[Sa, Sc]</code>.
+Use <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrc'>kSrc</a> to copy one buffer to another. All pixels are copied,
+regardless of source and destination <a href='SkColor_Reference#Alpha'>Alpha</a> values. As a parameter to
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawAtlas'>drawAtlas</a>, selects <a href='undocumented#Sprite'>sprites</a> and ignores colors.
+
+### Example
+
+<div><fiddle-embed name="@Src"><div><a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrc'>kSrc</a> does not blend transparent pixels with existing background;
+it punches a transparent hole in the existing <a href='SkImage_Reference#Image'>image</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_draw'>draw</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_readPixels'>readPixels</a>
+
+<a name='Dst'></a>
+
+---
+
+Given: <code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDst'>kDst</a> preserves destination set to: <code>[Da, Dc]</code>.
+Setting <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#Blend_Mode'>Blend_Mode</a> to <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDst'>kDst</a> causes drawing with
+<a href='SkPaint_Reference#Paint'>Paint</a> to have no effect. As a parameter to <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawAtlas'>drawAtlas</a>,
+selects colors and ignores <a href='undocumented#Sprite'>sprites</a>.
+
+### Example
+
+<div><fiddle-embed name="@Dst"></fiddle-embed></div>
+
+<a name='Src_Over'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOver'>kSrcOver</a> replaces destination with: <code>[Sa + Da * (1 - Sa), Sc + Dc * (1 - Sa)]</code>,
+drawing source over destination. <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOver'>kSrcOver</a> is the default for <a href='SkPaint_Reference#Paint'>Paint</a>.
+
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOver'>kSrcOver</a> cannot make destination more transparent; the result will
+be at least as opaque as the less transparent of source and original destination.
+
+### Example
+
+<div><fiddle-embed name="@Src_Over"></fiddle-embed></div>
+
+<a name='Dst_Over'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDstOver'>kDstOver</a> replaces destination with: <code>[Da + Sa * (1 - Da), Dc + Sc * (1 - Da)]</code>,
+drawing destination over source. Has no effect destination if is opaque.
+
+### Example
+
+<div><fiddle-embed name="@Dst_Over"></fiddle-embed></div>
+
+<a name='Src_In'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcIn'>kSrcIn</a> replaces destination with: <code>[Sa * Da, Sc * Da]</code>,
+drawing source with destination opacity.
+
+### Example
+
+<div><fiddle-embed name="@Src_In"></fiddle-embed></div>
+
+<a name='Dst_In'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDstIn'>kDstIn</a> replaces destination with: <code>[Da * Sa, Dc * Sa]</code>,
+scaling destination <a href='SkColor_Reference#Alpha'>Alpha</a> by source <a href='SkColor_Reference#Alpha'>Alpha</a>. Resulting
+destination is visible where source is visible.
+
+### Example
+
+<div><fiddle-embed name="@Dst_In"></fiddle-embed></div>
+
+<a name='Src_Out'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOut'>kSrcOut</a> replaces destination with: <code>[Sa * (1 - Da), Sc * (1 - Da)]</code>,
+drawing source fully where destination <a href='SkColor_Reference#Alpha'>Alpha</a> is zero. Is destination
+is opaque, has no effect.
+
+### Example
+
+<div><fiddle-embed name="@Src_Out"></fiddle-embed></div>
+
+<a name='Dst_Out'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDstOut'>kDstOut</a> replaces destination with: <code>[Da * (1 - Sa), Dc * (1 - Sa)]</code>,
+scaling destination <a href='SkColor_Reference#Alpha'>Alpha</a> by source transparency. Resulting
+destination is visible where source is transparent. If source is transparent,
+has no effect.
+
+### Example
+
+<div><fiddle-embed name="@Dst_Out"></fiddle-embed></div>
+
+<a name='Src_Atop'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcATop'>kSrcATop</a> replaces destination with: <code>[Da, Sc * Da + Dc * (1 - Sa)]</code>,
+replacing opaque destination with opaque source. If source or destination
+is transparent, has no effect.
+
+### Example
+
+<div><fiddle-embed name="@Src_Atop"></fiddle-embed></div>
+
+<a name='Dst_Atop'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDstATop'>kDstATop</a> replaces destination with: <code>[Sa, Dc * Sa + Sc * (1 - Da)]</code>,
+making destination transparent where source is transparent.
+
+### Example
+
+<div><fiddle-embed name="@Dst_Atop"></fiddle-embed></div>
+
+<a name='Xor'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kXor'>kXor</a> replaces destination with:
+<code>[Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + Dc * (1 - Sa)]</code>,
+exchanging the transparency of the source and destination.
+
+### Example
+
+<div><fiddle-embed name="@Xor"></fiddle-embed></div>
+
+<a name='Plus'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kPlus'>kPlus</a> replaces destination with: <code>[Sa + Da, Sc + Dc]</code>,
+summing the <a href='SkColor_Reference#Alpha'>Alpha</a> and <a href='SkColor_Reference#Color'>Color</a> components.
+
+### Example
+
+<div><fiddle-embed name="@Plus"></fiddle-embed></div>
+
+<a name='Modulate'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kModulate'>kModulate</a> replaces destination with: <code>[Sa * Da, Sc * Dc]</code>,
+scaling <a href='SkColor_Reference#Alpha'>Alpha</a> and <a href='SkColor_Reference#Color'>Color</a> components by the lesser of the values.
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kModulate'>kModulate</a> differs from <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kMultiply'>kMultiply</a> in two ways.
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kModulate'>kModulate</a> like <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcATop'>kSrcATop</a> alters the destination inside
+the destination area, as if the destination <a href='SkColor_Reference#Alpha'>Alpha</a> defined the boundaries of a
+soft clip. <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kMultiply'>kMultiply</a> like <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOver'>kSrcOver</a> can alter the
+destination where the destination is transparent.
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kModulate'>kModulate</a> computes the product of the source and destination using
+<a href='undocumented#Premultiply'>Premultiplied</a> component values. <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kMultiply'>kMultiply</a> the product of the source
+and destination using <a href='undocumented#Unpremultiply'>Unpremultiplied</a> component values.
+
+### Example
+
+<div><fiddle-embed name="@Modulate"><div>If source and destination are opaque, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kModulate'>kModulate</a> and
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kMultiply'>kMultiply</a> produce the same results.
+</div></fiddle-embed></div>
+
+<a name='Screen'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kScreen'>kScreen</a> replaces destination with: <code>[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]</code>.
+
+### Example
+
+<div><fiddle-embed name="@Screen"></fiddle-embed></div>
+
+<a name='Overlay'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kOverlay'>kOverlay</a> replaces destination with:
+<code>[Sa + Da - Sa * Da, Sc * (1 - Da) + Dc * (1 - Sa) +
+(2 * Dc <= Da ? 2 * Sc * Dc : Sa * Da - 2 * (Da - Dc) * (Sa - Sc))]</code>.
+
+### Example
+
+<div><fiddle-embed name="@Overlay"></fiddle-embed></div>
+
+<a name='Darken'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDarken'>kDarken</a> replaces destination with:
+<code>[Sa + Da - Sa * Da,  Sc + Dc - <a href='undocumented#max()'>max</a>(Sc * Da, Dc * Sa)]</code>.
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDarken'>kDarken</a> does not make an <a href='SkImage_Reference#Image'>image</a> darker; it replaces the destination
+component with source if source is darker.
+
+### Example
+
+<div><fiddle-embed name="@Darken"></fiddle-embed></div>
+
+<a name='Lighten'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kLighten'>kLighten</a> replaces destination with:
+<code>[Sa + Da - Sa * Da,  Sc + Dc - <a href='undocumented#min()'>min</a>(Sc * Da, Dc * Sa)]</code>.
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDarken'>kDarken</a> does not make an <a href='SkImage_Reference#Image'>image</a> lighter; it replaces the destination
+component with source if source is lighter.
+
+### Example
+
+<div><fiddle-embed name="@Lighten"></fiddle-embed></div>
+
+<a name='Color_Dodge'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kColorDodge'>kColorDodge</a> replaces destination with:
+<code>[Sa + Da - Sa * Da, Dc == 0 ? Sc * (1 - Da) : Sc == Sa ? Sc + Da * (1 - Sa) :
+Sa * <a href='undocumented#min()'>min</a>(Da, Dc * Sa / (Sa - Sc)) + Sc * (1 - Da) + Da * (1 - Sa)]</code>,
+making destination brighter to reflect source.
+
+### Example
+
+<div><fiddle-embed name="@Color_Dodge"></fiddle-embed></div>
+
+<a name='Color_Burn'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kColorBurn'>kColorBurn</a> replaces destination with:
+<code>[Sa + Da - Sa * Da, Dc == Da ? Dc + Sc * (1 - Da) : Sc == 0 ? Da * (1 - Sa) :
+Sa * (Da - <a href='undocumented#min()'>min</a>(Da, (Da - Dc) * Sa / Sc)) + Sc * (1 - Da) + Da * (1 - Sa)]</code>,
+making destination darker to reflect source.
+
+### Example
+
+<div><fiddle-embed name="@Color_Burn"></fiddle-embed></div>
+
+<a name='Hard_Light'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kHardLight'>kHardLight</a> replaces destination with:
+<code>[Sa + Da - Sa * Da, Sc * (1 - Da) + Dc * (1 - Sa) +
+2 * Sc <= Sa ? 2 * Sc * Dc : Sa * Da - 2 * (Da - Dc) * (Sa - Sc)]</code>,
+making destination lighter or darker, depending on source.
+
+### Example
+
+<div><fiddle-embed name="@Hard_Light"></fiddle-embed></div>
+
+<a name='Soft_Light'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+where <code>m = Da > 0 ? Dc / Da : 0</code>;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSoftLight'>kSoftLight</a> replaces destination with: <code>[Sa + Da - Sa * Da, Sc / Da + Dc / Sa +
+(2 * Sc <= Sa ? Dc * (Sa + (2 * Sc - Sa) * (1 - m)) : Dc * Sa + Da * (2 * Sc - Sa) *
+(4 * Dc <= Da ? (16 * m * m  + 4 * m) * (m - 1) + 7 * m : <a href='undocumented#sqrt()'>sqrt</a>(m) - m))]</code>,
+making destination lighter or darker, depending on source.
+
+### Example
+
+<div><fiddle-embed name="@Soft_Light"></fiddle-embed></div>
+
+<a name='Difference'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDifference'>kDifference</a> replaces destination with:
+<code>[Sa + Da - Sa * Da, Sc + Dc - 2 * <a href='undocumented#min()'>min</a>(Sc * Da, Dc * Sa)]</code>,
+replacing destination with lighter less darker.
+
+### Example
+
+<div><fiddle-embed name="@Difference"></fiddle-embed></div>
+
+<a name='Exclusion'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kExclusion'>kExclusion</a> replaces destination with:
+<code>[Sa + Da - Sa * Da, Sc + Dc - 2 * Sc * Dc]</code>,
+replacing destination with lighter less darker, ignoring <a href='SkColor_Reference#Alpha'>Alpha</a>.
+
+### Example
+
+<div><fiddle-embed name="@Exclusion"></fiddle-embed></div>
+
+<a name='Multiply'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Sc</code> as source <a href='SkColor_Reference#Color'>Color</a> component,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>Dc</code> as destination <a href='SkColor_Reference#Color'>Color</a> component;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kMultiply'>kMultiply</a> replaces destination with:
+<code>[Sa + Da - Sa * Da, Sc * (1 - Da) + Dc * (1 - Sa) + Sc * Dc]</code>,
+the product of <a href='undocumented#Unpremultiply'>Unpremultiplied</a> source and destination.
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kMultiply'>kMultiply</a> makes the <a href='SkImage_Reference#Image'>image</a> darker.
+
+### Example
+
+<div><fiddle-embed name="@Multiply"></fiddle-embed></div>
+
+<a name='Hue'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>S</code> as source <a href='SkColor_Reference#Color'>Color</a>,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>D</code> as destination <a href='SkColor_Reference#Color'>Color</a>;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kHue'>kHue</a> replaces destination with:
+<code>[Sa + Da - Sa * Da, <a href='undocumented#SetLuminosity'>SetLuminosity</a>(<a href='undocumented#SetSaturation'>SetSaturation</a>(S, <a href='undocumented#Saturation'>Saturation</a>(D)), <a href='undocumented#Luminosity'>Luminosity</a>(D))]</code>,
+source hue, leaving destination luminosity and saturation unchanged.
+
+### Example
+
+<div><fiddle-embed name="@Hue"></fiddle-embed></div>
+
+<a name='Saturation'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>S</code> as source <a href='SkColor_Reference#Color'>Color</a>,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>D</code> as destination <a href='SkColor_Reference#Color'>Color</a>;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kHue'>kHue</a> replaces destination with:
+<code>[Sa + Da - Sa * Da, <a href='undocumented#SetLuminosity'>SetLuminosity</a>(<a href='undocumented#SetSaturation'>SetSaturation</a>(D, <a href='undocumented#Saturation'>Saturation</a>(S)), <a href='undocumented#Luminosity'>Luminosity</a>(D))]</code>,
+source hue, leaving destination luminosity and saturation unchanged.
+
+### Example
+
+<div><fiddle-embed name="@Saturation"></fiddle-embed></div>
+
+<a name='Color'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>S</code> as source <a href='SkColor_Reference#Color'>Color</a>,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>D</code> as destination <a href='SkColor_Reference#Color'>Color</a>;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kColor'>kColor</a> replaces destination with:
+<code>[Sa + Da - Sa * Da, <a href='undocumented#SetLuminosity'>SetLuminosity</a>(S, <a href='undocumented#Luminosity'>Luminosity</a>(D))]</code>,
+source hue and saturation, leaving destination luminosity unchanged.
+
+### Example
+
+<div><fiddle-embed name="@Color"></fiddle-embed></div>
+
+<a name='Luminosity'></a>
+
+---
+
+Given: <code>Sa</code> as source <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>S</code> as source <a href='SkColor_Reference#Color'>Color</a>,
+<code>Da</code> as destination <a href='SkColor_Reference#Alpha'>Alpha</a>, <code>D</code> as destination <a href='SkColor_Reference#Color'>Color</a>;
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kLuminosity'>kLuminosity</a> replaces destination with:
+<code>[Sa + Da - Sa * Da, <a href='undocumented#SetLuminosity'>SetLuminosity</a>(D, <a href='undocumented#Luminosity'>Luminosity</a>(S))]</code>,
+source luminosity, leaving destination hue and saturation unchanged.
+
+### Example
+
+<div><fiddle-embed name="@Luminosity"></fiddle-embed></div>
+
+<a name='SkBlendMode_Name'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const char* <a href='SkBlendMode_Reference#SkBlendMode_Name'>SkBlendMode_Name</a>(<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> blendMode)
+</pre>
+
+Returns name of <a href='#SkBlendMode_Name_blendMode'>blendMode</a> as null-terminated C <a href='undocumented#String'>string</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkBlendMode_Name_blendMode'><code><strong>blendMode</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kClear'>kClear</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrc'>kSrc</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDst'>kDst</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOver'>kSrcOver</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDstOver'>kDstOver</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcIn'>kSrcIn</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDstIn'>kDstIn</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOut'>kSrcOut</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDstOut'>kDstOut</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcATop'>kSrcATop</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDstATop'>kDstATop</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kXor'>kXor</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kPlus'>kPlus</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kModulate'>kModulate</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kScreen'>kScreen</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kOverlay'>kOverlay</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDarken'>kDarken</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kLighten'>kLighten</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kColorDodge'>kColorDodge</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kColorBurn'>kColorBurn</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kHardLight'>kHardLight</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSoftLight'>kSoftLight</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kDifference'>kDifference</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kExclusion'>kExclusion</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kMultiply'>kMultiply</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kHue'>kHue</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSaturation'>kSaturation</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kColor'>kColor</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kLuminosity'>kLuminosity</a>
+
+### Return Value
+
+C <a href='undocumented#String'>string</a>
+
+### Example
+
+<div><fiddle-embed name="@BlendMode_Name">
+
+#### Example Output
+
+~~~~
+default blend: SkBlendMode::kSrcOver
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>
+
diff --git a/src/third_party/skia/site/user/api/SkCanvas_Reference.md b/src/third_party/skia/site/user/api/SkCanvas_Reference.md
new file mode 100644
index 0000000..f184e9d
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkCanvas_Reference.md
@@ -0,0 +1,6120 @@
+SkCanvas Reference
+===
+
+
+<a name='SkCanvas'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> {
+
+    static std::unique_ptr<<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>> <a href='#SkCanvas_MakeRasterDirect'>MakeRasterDirect</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, void* pixels,
+                                                      size_t rowBytes,
+                                                      const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* props = nullptr);
+    static std::unique_ptr<<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>> <a href='#SkCanvas_MakeRasterDirectN32'>MakeRasterDirectN32</a>(int width, int height, <a href='SkColor_Reference#SkPMColor'>SkPMColor</a>* pixels,
+                                                         size_t rowBytes);
+    <a href='#SkCanvas_empty_constructor'>SkCanvas()</a>;
+    <a href='#SkCanvas_int_int_const_SkSurfaceProps_star'>SkCanvas</a>(int width, int height, const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* props = nullptr);
+    explicit <a href='#SkCanvas_copy_const_SkBitmap'>SkCanvas</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>);
+    <a href='#SkCanvas_const_SkBitmap_const_SkSurfaceProps'>SkCanvas</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>& props);
+    virtual <a href='#SkCanvas_destructor'>~SkCanvas()</a>;
+    <a href='undocumented#SkMetaData'>SkMetaData</a>& <a href='#SkCanvas_getMetaData'>getMetaData</a>();
+    <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkCanvas_imageInfo'>imageInfo</a>() const;
+    bool <a href='#SkCanvas_getProps'>getProps</a>(<a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* props) const;
+    void <a href='#SkCanvas_flush'>flush()</a>;
+    virtual <a href='undocumented#SkISize'>SkISize</a> <a href='#SkCanvas_getBaseLayerSize'>getBaseLayerSize</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkCanvas_makeSurface'>makeSurface</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* props = nullptr);
+    virtual <a href='undocumented#GrContext'>GrContext</a>* <a href='#SkCanvas_getGrContext'>getGrContext</a>();
+    void* <a href='#SkCanvas_accessTopLayerPixels'>accessTopLayerPixels</a>(<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>* info, size_t* rowBytes, <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>* origin = nullptr);
+    <a href='undocumented#SkRasterHandleAllocator'>SkRasterHandleAllocator</a>::<a href='#SkRasterHandleAllocator_Handle'>Handle</a> <a href='#SkCanvas_accessTopRasterHandle'>accessTopRasterHandle</a>() const;
+    bool <a href='#SkCanvas_peekPixels'>peekPixels</a>(<a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>* <a href='SkPixmap_Reference#Pixmap'>pixmap</a>);
+    bool <a href='#SkCanvas_readPixels'>readPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& dstInfo, void* dstPixels, size_t dstRowBytes,
+                    int srcX, int srcY);
+    bool <a href='#SkCanvas_readPixels'>readPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& <a href='SkPixmap_Reference#Pixmap'>pixmap</a>, int srcX, int srcY);
+    bool <a href='#SkCanvas_readPixels'>readPixels</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, int srcX, int srcY);
+    bool <a href='#SkCanvas_writePixels'>writePixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, const void* pixels, size_t rowBytes, int x, int y);
+    bool <a href='#SkCanvas_writePixels'>writePixels</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, int x, int y);
+    int <a href='#SkCanvas_save'>save()</a>;
+    int <a href='#SkCanvas_saveLayer'>saveLayer</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>);
+    int <a href='#SkCanvas_saveLayer'>saveLayer</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& bounds, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>);
+    int <a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>);
+    int <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds, <a href='undocumented#U8CPU'>U8CPU</a> <a href='SkColor_Reference#Alpha'>alpha</a>);
+
+    enum <a href='#SkCanvas_SaveLayerFlagsSet'>SaveLayerFlagsSet</a> {
+        <a href='#SkCanvas_kPreserveLCDText_SaveLayerFlag'>kPreserveLCDText_SaveLayerFlag</a> = 1 << 1,
+        <a href='#SkCanvas_kInitWithPrevious_SaveLayerFlag'>kInitWithPrevious_SaveLayerFlag</a> = 1 << 2,
+    };
+
+    typedef uint32_t <a href='#SkCanvas_SaveLayerFlags'>SaveLayerFlags</a>;
+
+    int <a href='#SkCanvas_saveLayer'>saveLayer</a>(const <a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a>& layerRec);
+    void <a href='#SkCanvas_restore'>restore()</a>;
+    int <a href='#SkCanvas_getSaveCount'>getSaveCount</a>() const;
+    void <a href='#SkCanvas_restoreToCount'>restoreToCount</a>(int saveCount);
+    void <a href='#SkCanvas_translate'>translate</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    void <a href='#SkCanvas_scale'>scale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy);
+    void <a href='#SkCanvas_rotate'>rotate</a>(<a href='undocumented#SkScalar'>SkScalar</a> degrees);
+    void <a href='#SkCanvas_rotate'>rotate</a>(<a href='undocumented#SkScalar'>SkScalar</a> degrees, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py);
+    void <a href='#SkCanvas_skew'>skew</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy);
+    void <a href='#SkCanvas_concat'>concat</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='SkMatrix_Reference#Matrix'>matrix</a>);
+    void <a href='#SkCanvas_setMatrix'>setMatrix</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='SkMatrix_Reference#Matrix'>matrix</a>);
+    void <a href='#SkCanvas_resetMatrix'>resetMatrix</a>();
+    void <a href='#SkCanvas_clipRect'>clipRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='undocumented#SkClipOp'>SkClipOp</a> op, bool doAntiAlias);
+    void <a href='#SkCanvas_clipRect'>clipRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='undocumented#SkClipOp'>SkClipOp</a> op);
+    void <a href='#SkCanvas_clipRect'>clipRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, bool doAntiAlias = false);
+    void <a href='#SkCanvas_clipRRect'>clipRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect, <a href='undocumented#SkClipOp'>SkClipOp</a> op, bool doAntiAlias);
+    void <a href='#SkCanvas_clipRRect'>clipRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect, <a href='undocumented#SkClipOp'>SkClipOp</a> op);
+    void <a href='#SkCanvas_clipRRect'>clipRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect, bool doAntiAlias = false);
+    void <a href='#SkCanvas_clipPath'>clipPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>, <a href='undocumented#SkClipOp'>SkClipOp</a> op, bool doAntiAlias);
+    void <a href='#SkCanvas_clipPath'>clipPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>, <a href='undocumented#SkClipOp'>SkClipOp</a> op);
+    void <a href='#SkCanvas_clipPath'>clipPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>, bool doAntiAlias = false);
+    void <a href='#SkCanvas_clipRegion'>clipRegion</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& deviceRgn, <a href='undocumented#SkClipOp'>SkClipOp</a> op = <a href='undocumented#SkClipOp'>SkClipOp</a>::<a href='#SkClipOp_kIntersect'>kIntersect</a>);
+    bool <a href='#SkCanvas_quickReject'>quickReject</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>) const;
+    bool <a href='#SkCanvas_quickReject'>quickReject</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>) const;
+    <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_getLocalClipBounds'>getLocalClipBounds</a>() const;
+    bool <a href='#SkCanvas_getLocalClipBounds'>getLocalClipBounds</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* bounds) const;
+    <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkCanvas_getDeviceClipBounds'>getDeviceClipBounds</a>() const;
+    bool <a href='#SkCanvas_getDeviceClipBounds'>getDeviceClipBounds</a>(<a href='SkIRect_Reference#SkIRect'>SkIRect</a>* bounds) const;
+    void <a href='#SkCanvas_drawColor'>drawColor</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#Color'>color</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode = <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOver'>kSrcOver</a>);
+    void <a href='#SkCanvas_clear'>clear</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#Color'>color</a>);
+    void <a href='#SkCanvas_discard'>discard()</a>;
+    void <a href='#SkCanvas_drawPaint'>drawPaint</a>(const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+
+    enum <a href='#SkCanvas_PointMode'>PointMode</a> {
+        <a href='#SkCanvas_kPoints_PointMode'>kPoints_PointMode</a>,
+        <a href='#SkCanvas_kLines_PointMode'>kLines_PointMode</a>,
+        <a href='#SkCanvas_kPolygon_PointMode'>kPolygon_PointMode</a>,
+    };
+
+    void <a href='#SkCanvas_drawPoints'>drawPoints</a>(<a href='#SkCanvas_PointMode'>PointMode</a> mode, size_t count, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawPoint'>drawPoint</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawPoint'>drawPoint</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> p, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawLine'>drawLine</a>(<a href='undocumented#SkScalar'>SkScalar</a> x0, <a href='undocumented#SkScalar'>SkScalar</a> y0, <a href='undocumented#SkScalar'>SkScalar</a> x1, <a href='undocumented#SkScalar'>SkScalar</a> y1, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawLine'>drawLine</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> p0, <a href='SkPoint_Reference#SkPoint'>SkPoint</a> p1, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawRect'>drawRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawIRect'>drawIRect</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawRegion'>drawRegion</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawOval'>drawOval</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawRRect'>drawRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawDRRect'>drawDRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& outer, const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& inner, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawCircle'>drawCircle</a>(<a href='undocumented#SkScalar'>SkScalar</a> cx, <a href='undocumented#SkScalar'>SkScalar</a> cy, <a href='undocumented#SkScalar'>SkScalar</a> radius, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawCircle'>drawCircle</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> center, <a href='undocumented#SkScalar'>SkScalar</a> radius, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawArc'>drawArc</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>, <a href='undocumented#SkScalar'>SkScalar</a> startAngle, <a href='undocumented#SkScalar'>SkScalar</a> sweepAngle,
+                 bool useCenter, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawRoundRect'>drawRoundRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='undocumented#SkScalar'>SkScalar</a> rx, <a href='undocumented#SkScalar'>SkScalar</a> ry, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawPath'>drawPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawImage'>drawImage</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* <a href='SkImage_Reference#Image'>image</a>, <a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top,
+                   const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr);
+    void <a href='#SkCanvas_drawImage'>drawImage</a>(const <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>>& <a href='SkImage_Reference#Image'>image</a>, <a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top,
+                   const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr);
+
+    enum <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> {
+        <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>,
+        <a href='#SkCanvas_kFast_SrcRectConstraint'>kFast_SrcRectConstraint</a>,
+    };
+
+    void <a href='#SkCanvas_drawImageRect'>drawImageRect</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* <a href='SkImage_Reference#Image'>image</a>, const <a href='SkRect_Reference#SkRect'>SkRect</a>& src, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                       const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>,
+                       <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> constraint = <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>);
+    void <a href='#SkCanvas_drawImageRect'>drawImageRect</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* <a href='SkImage_Reference#Image'>image</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& isrc, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                       const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>,
+                       <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> constraint = <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>);
+    void <a href='#SkCanvas_drawImageRect'>drawImageRect</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* <a href='SkImage_Reference#Image'>image</a>, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawImageRect'>drawImageRect</a>(const <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>>& <a href='SkImage_Reference#Image'>image</a>, const <a href='SkRect_Reference#SkRect'>SkRect</a>& src, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                       const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>,
+                       <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> constraint = <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>);
+    void <a href='#SkCanvas_drawImageRect'>drawImageRect</a>(const <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>>& <a href='SkImage_Reference#Image'>image</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& isrc, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                       const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>,
+                       <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> constraint = <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>);
+    void <a href='#SkCanvas_drawImageRect'>drawImageRect</a>(const <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>>& <a href='SkImage_Reference#Image'>image</a>, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawImageNine'>drawImageNine</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* <a href='SkImage_Reference#Image'>image</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& center, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                       const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr);
+    void <a href='#SkCanvas_drawImageNine'>drawImageNine</a>(const <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>>& <a href='SkImage_Reference#Image'>image</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& center, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                       const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr);
+    void <a href='#SkCanvas_drawBitmap'>drawBitmap</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, <a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top,
+                    const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr);
+    void <a href='#SkCanvas_drawBitmapRect'>drawBitmapRect</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, const <a href='SkRect_Reference#SkRect'>SkRect</a>& src, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                        const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>,
+                        <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> constraint = <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>);
+    void <a href='#SkCanvas_drawBitmapRect'>drawBitmapRect</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& isrc, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                        const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>,
+                        <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> constraint = <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>);
+    void <a href='#SkCanvas_drawBitmapRect'>drawBitmapRect</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>,
+                        <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> constraint = <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>);
+    void <a href='#SkCanvas_drawBitmapNine'>drawBitmapNine</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& center, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                        const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr);
+    void <a href='#SkCanvas_drawBitmapLattice'>drawBitmapLattice</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, const <a href='#SkCanvas_Lattice'>Lattice</a>& lattice, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                           const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr);
+    void <a href='#SkCanvas_drawImageLattice'>drawImageLattice</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* <a href='SkImage_Reference#Image'>image</a>, const <a href='#SkCanvas_Lattice'>Lattice</a>& lattice, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                          const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr);
+    void <a href='#SkCanvas_drawText'>drawText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y,
+                  const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawString'>drawString</a>(const char* <a href='undocumented#String'>string</a>, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawString'>drawString</a>(const <a href='undocumented#SkString'>SkString</a>& <a href='undocumented#String'>string</a>, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawPosText'>drawPosText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pos[],
+                     const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawPosTextH'>drawPosTextH</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, const <a href='undocumented#SkScalar'>SkScalar</a> xpos[], <a href='undocumented#SkScalar'>SkScalar</a> constY,
+                      const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawTextRSXform'>drawTextRSXform</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, const <a href='undocumented#SkRSXform'>SkRSXform</a> xform[],
+                         const <a href='SkRect_Reference#SkRect'>SkRect</a>* cullRect, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawTextBlob'>drawTextBlob</a>(const <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>* blob, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawTextBlob'>drawTextBlob</a>(const <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>>& blob, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawPicture'>drawPicture</a>(const <a href='SkPicture_Reference#SkPicture'>SkPicture</a>* <a href='SkPicture_Reference#Picture'>picture</a>);
+    void <a href='#SkCanvas_drawPicture'>drawPicture</a>(const <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkPicture_Reference#SkPicture'>SkPicture</a>>& <a href='SkPicture_Reference#Picture'>picture</a>);
+    void <a href='#SkCanvas_drawPicture'>drawPicture</a>(const <a href='SkPicture_Reference#SkPicture'>SkPicture</a>* <a href='SkPicture_Reference#Picture'>picture</a>, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* <a href='SkMatrix_Reference#Matrix'>matrix</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawPicture'>drawPicture</a>(const <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkPicture_Reference#SkPicture'>SkPicture</a>>& <a href='SkPicture_Reference#Picture'>picture</a>, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* <a href='SkMatrix_Reference#Matrix'>matrix</a>,
+                     const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawVertices'>drawVertices</a>(const <a href='undocumented#SkVertices'>SkVertices</a>* <a href='undocumented#Vertices'>vertices</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawVertices'>drawVertices</a>(const <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkVertices'>SkVertices</a>>& <a href='undocumented#Vertices'>vertices</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawVertices'>drawVertices</a>(const <a href='undocumented#SkVertices'>SkVertices</a>* <a href='undocumented#Vertices'>vertices</a>, const <a href='undocumented#SkVertices'>SkVertices</a>::<a href='#SkVertices_Bone'>Bone</a> bones[], int boneCount,
+                      <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawVertices'>drawVertices</a>(const <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkVertices'>SkVertices</a>>& <a href='undocumented#Vertices'>vertices</a>, const <a href='undocumented#SkVertices'>SkVertices</a>::<a href='#SkVertices_Bone'>Bone</a> bones[],
+                      int boneCount, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawPatch'>drawPatch</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='SkPath_Reference#Cubic'>cubics</a>[12], const <a href='SkColor_Reference#SkColor'>SkColor</a> colors[4],
+                   const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> texCoords[4], <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawPatch'>drawPatch</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='SkPath_Reference#Cubic'>cubics</a>[12], const <a href='SkColor_Reference#SkColor'>SkColor</a> colors[4],
+                   const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> texCoords[4], const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawAtlas'>drawAtlas</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* atlas, const <a href='undocumented#SkRSXform'>SkRSXform</a> xform[], const <a href='SkRect_Reference#SkRect'>SkRect</a> tex[],
+                   const <a href='SkColor_Reference#SkColor'>SkColor</a> colors[], int count, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode, const <a href='SkRect_Reference#SkRect'>SkRect</a>* cullRect,
+                   const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawAtlas'>drawAtlas</a>(const <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>>& atlas, const <a href='undocumented#SkRSXform'>SkRSXform</a> xform[], const <a href='SkRect_Reference#SkRect'>SkRect</a> tex[],
+                   const <a href='SkColor_Reference#SkColor'>SkColor</a> colors[], int count, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode, const <a href='SkRect_Reference#SkRect'>SkRect</a>* cullRect,
+                   const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawAtlas'>drawAtlas</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* atlas, const <a href='undocumented#SkRSXform'>SkRSXform</a> xform[], const <a href='SkRect_Reference#SkRect'>SkRect</a> tex[], int count,
+                   const <a href='SkRect_Reference#SkRect'>SkRect</a>* cullRect, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawAtlas'>drawAtlas</a>(const <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>>& atlas, const <a href='undocumented#SkRSXform'>SkRSXform</a> xform[], const <a href='SkRect_Reference#SkRect'>SkRect</a> tex[],
+                   int count, const <a href='SkRect_Reference#SkRect'>SkRect</a>* cullRect, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>);
+    void <a href='#SkCanvas_drawDrawable'>drawDrawable</a>(<a href='undocumented#SkDrawable'>SkDrawable</a>* <a href='undocumented#Drawable'>drawable</a>, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* <a href='SkMatrix_Reference#Matrix'>matrix</a> = nullptr);
+    void <a href='#SkCanvas_drawDrawable'>drawDrawable</a>(<a href='undocumented#SkDrawable'>SkDrawable</a>* <a href='undocumented#Drawable'>drawable</a>, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y);
+    void <a href='#SkCanvas_drawAnnotation'>drawAnnotation</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, const char key[], <a href='undocumented#SkData'>SkData</a>* value);
+    void <a href='#SkCanvas_drawAnnotation'>drawAnnotation</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, const char key[], const <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkData'>SkData</a>>& value);
+    virtual bool <a href='#SkCanvas_isClipEmpty'>isClipEmpty</a>() const;
+    virtual bool <a href='#SkCanvas_isClipRect'>isClipRect</a>() const;
+    const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='#SkCanvas_getTotalMatrix'>getTotalMatrix</a>() const;
+};
+
+</pre>
+
+<a href='SkCanvas_Reference#Canvas'>Canvas</a> provides an interface for drawing, and how the drawing is clipped and transformed.
+<a href='SkCanvas_Reference#Canvas'>Canvas</a> contains a stack of <a href='SkMatrix_Reference#Matrix'>Matrix</a> and Clip values.
+
+<a href='SkCanvas_Reference#Canvas'>Canvas</a> and <a href='SkPaint_Reference#Paint'>Paint</a> together provide the state to draw into <a href='SkSurface_Reference#Surface'>Surface</a> or <a href='undocumented#Device'>Device</a>.
+Each <a href='SkCanvas_Reference#Canvas'>Canvas</a> draw call transforms the geometry of the object by the concatenation of all
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> values in the stack. The transformed geometry is clipped by the intersection
+of all of Clip values in the stack. The <a href='SkCanvas_Reference#Canvas'>Canvas</a> draw calls use <a href='SkPaint_Reference#Paint'>Paint</a> to supply drawing
+state such as <a href='SkColor_Reference#Color'>Color</a>, <a href='undocumented#Typeface'>Typeface</a>, <a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a>, stroke width, <a href='undocumented#Shader'>Shader</a> and so on.
+
+To draw to a pixel-based destination, create <a href='#Raster_Surface'>Raster_Surface</a> or <a href='#GPU_Surface'>GPU_Surface</a>.
+Request <a href='SkCanvas_Reference#Canvas'>Canvas</a> from <a href='SkSurface_Reference#Surface'>Surface</a> to obtain the interface to draw.
+<a href='SkCanvas_Reference#Canvas'>Canvas</a> generated by <a href='#Raster_Surface'>Raster_Surface</a> draws to memory visible to the CPU.
+<a href='SkCanvas_Reference#Canvas'>Canvas</a> generated by <a href='#GPU_Surface'>GPU_Surface</a> uses Vulkan or OpenGL to draw to the GPU.
+
+To draw to a <a href='undocumented#Document'>document</a>, obtain <a href='SkCanvas_Reference#Canvas'>Canvas</a> from <a href='#SVG_Canvas'>SVG_Canvas</a>, <a href='#Document_PDF'>Document_PDF</a>, or <a href='#Picture_Recorder'>Picture_Recorder</a>.
+<a href='undocumented#Document'>Document</a> based <a href='SkCanvas_Reference#Canvas'>Canvas</a> and other <a href='SkCanvas_Reference#Canvas'>Canvas</a> subclasses reference <a href='undocumented#Device'>Device</a> describing the
+destination.
+
+<a href='SkCanvas_Reference#Canvas'>Canvas</a> can be constructed to draw to <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> without first creating <a href='#Raster_Surface'>Raster_Surface</a>.
+This approach may be deprecated in the future.
+
+<a href='SkCanvas_Reference#Canvas'>Canvas</a> may be created directly when no <a href='SkSurface_Reference#Surface'>Surface</a> is required; some <a href='SkCanvas_Reference#Canvas'>Canvas</a> methods
+implicitly create <a href='#Raster_Surface'>Raster_Surface</a>.
+
+<a name='SkCanvas_MakeRasterDirect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static std::unique_ptr&lt;<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>&gt; <a href='#SkCanvas_MakeRasterDirect'>MakeRasterDirect</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, void* pixels,
+                                                  size_t rowBytes,
+                                                  const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* props = nullptr)
+</pre>
+
+Allocates raster <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> that will draw directly into <a href='#SkCanvas_MakeRasterDirect_pixels'>pixels</a>.
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is returned if all parameters are valid.
+Valid parameters include:
+<a href='#SkCanvas_MakeRasterDirect_info'>info</a> dimensions are zero or positive;
+<a href='#SkCanvas_MakeRasterDirect_info'>info</a> contains <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> supported by  <a href='undocumented#Raster_Surface'>raster surface</a>;
+<a href='#SkCanvas_MakeRasterDirect_pixels'>pixels</a> is not nullptr;
+<a href='#SkCanvas_MakeRasterDirect_rowBytes'>rowBytes</a> is zero or large enough to contain <a href='#SkCanvas_MakeRasterDirect_info'>info</a> width <a href='#SkCanvas_MakeRasterDirect_pixels'>pixels</a> of <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>.
+
+Pass zero for <a href='#SkCanvas_MakeRasterDirect_rowBytes'>rowBytes</a> to compute <a href='#SkCanvas_MakeRasterDirect_rowBytes'>rowBytes</a> from <a href='#SkCanvas_MakeRasterDirect_info'>info</a> width and <a href='undocumented#Size'>size</a> of <a href='undocumented#Pixel'>pixel</a>.
+If <a href='#SkCanvas_MakeRasterDirect_rowBytes'>rowBytes</a> is greater than zero, it must be equal to or greater than
+<a href='#SkCanvas_MakeRasterDirect_info'>info</a> width times bytes required for <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>.
+
+<a href='undocumented#Pixel'>Pixel</a> buffer <a href='undocumented#Size'>size</a> should be <a href='#SkCanvas_MakeRasterDirect_info'>info</a> height times computed <a href='#SkCanvas_MakeRasterDirect_rowBytes'>rowBytes</a>.
+Pixels are not initialized.
+To access <a href='#SkCanvas_MakeRasterDirect_pixels'>pixels</a> after drawing, call <a href='#SkCanvas_flush'>flush()</a> or <a href='#SkCanvas_peekPixels'>peekPixels</a>().
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_MakeRasterDirect_info'><code><strong>info</strong></code></a></td>
+    <td>width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a>, of  <a href='undocumented#Raster_Surface'>raster surface</a>;</td>
+  </tr>
+</table>
+
+width, or height, or both, may be zero
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_MakeRasterDirect_pixels'><code><strong>pixels</strong></code></a></td>
+    <td>pointer to destination <a href='#SkCanvas_MakeRasterDirect_pixels'>pixels</a> buffer</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_MakeRasterDirect_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td>interval from one <a href='SkSurface_Reference#SkSurface'>SkSurface</a> row to the next, or zero</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_MakeRasterDirect_props'><code><strong>props</strong></code></a></td>
+    <td>LCD striping orientation and setting for <a href='undocumented#Device'>device</a> independent fonts;</td>
+  </tr>
+</table>
+
+may be nullptr
+
+### Return Value
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> if all parameters are valid; otherwise, nullptr
+
+### Example
+
+<div><fiddle-embed name="@Canvas_MakeRasterDirect"><div>Allocates a three by three <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, clears it to white, and draws a black <a href='undocumented#Pixel'>pixel</a>
+in the center.
+</div>
+
+#### Example Output
+
+~~~~
+---
+-x-
+---
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_MakeRasterDirectN32'>MakeRasterDirectN32</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_MakeRasterDirect'>MakeRasterDirect</a>
+
+<a name='SkCanvas_MakeRasterDirectN32'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static std::unique_ptr&lt;<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>&gt; <a href='#SkCanvas_MakeRasterDirectN32'>MakeRasterDirectN32</a>(int width, int height, <a href='SkColor_Reference#SkPMColor'>SkPMColor</a>* pixels,
+                                                     size_t rowBytes)
+</pre>
+
+Allocates raster <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> specified by inline <a href='SkImage_Reference#Image'>image</a> specification. Subsequent <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>
+calls draw into <a href='#SkCanvas_MakeRasterDirectN32_pixels'>pixels</a>.
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is set to <a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a>.
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is set to <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>.
+To access <a href='#SkCanvas_MakeRasterDirectN32_pixels'>pixels</a> after drawing, call <a href='#SkCanvas_flush'>flush()</a> or <a href='#SkCanvas_peekPixels'>peekPixels</a>().
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is returned if all parameters are valid.
+Valid parameters include:
+<a href='#SkCanvas_MakeRasterDirectN32_width'>width</a> and <a href='#SkCanvas_MakeRasterDirectN32_height'>height</a> are zero or positive;
+<a href='#SkCanvas_MakeRasterDirectN32_pixels'>pixels</a> is not nullptr;
+<a href='#SkCanvas_MakeRasterDirectN32_rowBytes'>rowBytes</a> is zero or large enough to contain <a href='#SkCanvas_MakeRasterDirectN32_width'>width</a> <a href='#SkCanvas_MakeRasterDirectN32_pixels'>pixels</a> of <a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a>.
+
+Pass zero for <a href='#SkCanvas_MakeRasterDirectN32_rowBytes'>rowBytes</a> to compute <a href='#SkCanvas_MakeRasterDirectN32_rowBytes'>rowBytes</a> from <a href='#SkCanvas_MakeRasterDirectN32_width'>width</a> and <a href='undocumented#Size'>size</a> of <a href='undocumented#Pixel'>pixel</a>.
+If <a href='#SkCanvas_MakeRasterDirectN32_rowBytes'>rowBytes</a> is greater than zero, it must be equal to or greater than
+<a href='#SkCanvas_MakeRasterDirectN32_width'>width</a> times bytes required for <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>.
+
+<a href='undocumented#Pixel'>Pixel</a> buffer <a href='undocumented#Size'>size</a> should be <a href='#SkCanvas_MakeRasterDirectN32_height'>height</a> times <a href='#SkCanvas_MakeRasterDirectN32_rowBytes'>rowBytes</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_MakeRasterDirectN32_width'><code><strong>width</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> column count on  <a href='undocumented#Raster_Surface'>raster surface</a> created; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_MakeRasterDirectN32_height'><code><strong>height</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> row count on  <a href='undocumented#Raster_Surface'>raster surface</a> created; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_MakeRasterDirectN32_pixels'><code><strong>pixels</strong></code></a></td>
+    <td>pointer to destination <a href='#SkCanvas_MakeRasterDirectN32_pixels'>pixels</a> buffer; buffer <a href='undocumented#Size'>size</a> should be <a href='#SkCanvas_MakeRasterDirectN32_height'>height</a></td>
+  </tr>
+</table>
+
+times <a href='#SkCanvas_MakeRasterDirectN32_rowBytes'>rowBytes</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_MakeRasterDirectN32_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td>interval from one <a href='SkSurface_Reference#SkSurface'>SkSurface</a> row to the next, or zero</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> if all parameters are valid; otherwise, nullptr
+
+### Example
+
+<div><fiddle-embed name="@Canvas_MakeRasterDirectN32"><div>Allocates a three by three <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, clears it to white, and draws a black <a href='undocumented#Pixel'>pixel</a>
+in the center.
+</div>
+
+#### Example Output
+
+~~~~
+---
+-x-
+---
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_MakeRasterDirect'>MakeRasterDirect</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_MakeRasterDirect'>MakeRasterDirect</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_MakeN32Premul'>MakeN32Premul</a>
+
+<a name='SkCanvas_empty_constructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkCanvas_empty_constructor'>SkCanvas()</a>
+</pre>
+
+Creates an empty <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> with no backing <a href='undocumented#Device'>device</a> or pixels, with
+a width and height of zero.
+
+### Return Value
+
+empty <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_empty_constructor"><div>Passes a placeholder to a function that requires one.
+</div>
+
+#### Example Output
+
+~~~~
+rect stays rect is true
+rect stays rect is false
+rect stays rect is true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_MakeRasterDirect'>MakeRasterDirect</a> <a href='undocumented#SkRasterHandleAllocator'>SkRasterHandleAllocator</a>::<a href='#SkRasterHandleAllocator_MakeCanvas'>MakeCanvas</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_getCanvas'>getCanvas</a> <a href='undocumented#SkCreateColorSpaceXformCanvas'>SkCreateColorSpaceXformCanvas</a>
+
+<a name='SkCanvas_int_int_const_SkSurfaceProps_star'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkCanvas_int_int_const_SkSurfaceProps_star'>SkCanvas</a>(int width, int height, const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* props = nullptr)
+</pre>
+
+Creates <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> of the specified dimensions without a <a href='SkSurface_Reference#SkSurface'>SkSurface</a>.
+Used by subclasses with custom implementations for draw member functions.
+
+If <a href='#SkCanvas_int_int_const_SkSurfaceProps_star_props'>props</a> equals nullptr, <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a> are created with
+<a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>::<a href='#SkSurfaceProps_InitType'>InitType</a> settings, which choose the <a href='undocumented#Pixel'>pixel</a> striping
+direction and order. Since a platform may dynamically change its direction when
+the <a href='undocumented#Device'>device</a> is rotated, and since a platform may have multiple monitors with
+different characteristics, it is best not to rely on this legacy behavior.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_int_int_const_SkSurfaceProps_star_width'><code><strong>width</strong></code></a></td>
+    <td>zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_int_int_const_SkSurfaceProps_star_height'><code><strong>height</strong></code></a></td>
+    <td>zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_int_int_const_SkSurfaceProps_star_props'><code><strong>props</strong></code></a></td>
+    <td>LCD striping orientation and setting for <a href='undocumented#Device'>device</a> independent fonts;</td>
+  </tr>
+</table>
+
+may be nullptr
+
+### Return Value
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> placeholder with dimensions
+
+### Example
+
+<div><fiddle-embed name="@Canvas_int_int_const_SkSurfaceProps_star">
+
+#### Example Output
+
+~~~~
+canvas is empty
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_MakeRasterDirect'>MakeRasterDirect</a> <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a> <a href='undocumented#SkPixelGeometry'>SkPixelGeometry</a> <a href='undocumented#SkCreateColorSpaceXformCanvas'>SkCreateColorSpaceXformCanvas</a>
+
+<a name='SkCanvas_copy_const_SkBitmap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+explicit <a href='#SkCanvas_copy_const_SkBitmap'>SkCanvas</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>)
+</pre>
+
+Constructs a <a href='SkCanvas_Reference#Canvas'>canvas</a> that draws into <a href='#SkCanvas_copy_const_SkBitmap_bitmap'>bitmap</a>.
+Sets <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>::<a href='#SkSurfaceProps_kLegacyFontHost_InitType'>kLegacyFontHost_InitType</a> in constructed <a href='SkSurface_Reference#SkSurface'>SkSurface</a>.
+
+<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> is copied so that subsequently editing <a href='#SkCanvas_copy_const_SkBitmap_bitmap'>bitmap</a> will not affect
+constructed <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>.
+
+May be deprecated in the future.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_copy_const_SkBitmap_bitmap'><code><strong>bitmap</strong></code></a></td>
+    <td>width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, and <a href='undocumented#Pixel'>pixel</a></td>
+  </tr>
+</table>
+
+storage of  <a href='undocumented#Raster_Surface'>raster surface</a>
+
+### Return Value
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> that can be used to draw into <a href='#SkCanvas_copy_const_SkBitmap_bitmap'>bitmap</a>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_copy_const_SkBitmap"><div>The actual output depends on the installed fonts.
+</div>
+
+#### Example Output
+
+~~~~
+-----
+---x-
+---x-
+---x-
+---x-
+---x-
+---x-
+-----
+---x-
+---x-
+-----
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_MakeRasterDirect'>MakeRasterDirect</a> <a href='undocumented#SkRasterHandleAllocator'>SkRasterHandleAllocator</a>::<a href='#SkRasterHandleAllocator_MakeCanvas'>MakeCanvas</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_getCanvas'>getCanvas</a> <a href='undocumented#SkCreateColorSpaceXformCanvas'>SkCreateColorSpaceXformCanvas</a>
+
+<a name='SkCanvas_const_SkBitmap_const_SkSurfaceProps'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkCanvas_const_SkBitmap_const_SkSurfaceProps'>SkCanvas</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>& props)
+</pre>
+
+Constructs a <a href='SkCanvas_Reference#Canvas'>canvas</a> that draws into <a href='#SkCanvas_const_SkBitmap_const_SkSurfaceProps_bitmap'>bitmap</a>.
+Use <a href='#SkCanvas_const_SkBitmap_const_SkSurfaceProps_props'>props</a> to match the <a href='undocumented#Device'>device</a> characteristics, like LCD striping.
+
+<a href='#SkCanvas_const_SkBitmap_const_SkSurfaceProps_bitmap'>bitmap</a> is copied so that subsequently editing <a href='#SkCanvas_const_SkBitmap_const_SkSurfaceProps_bitmap'>bitmap</a> will not affect
+constructed <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_const_SkBitmap_const_SkSurfaceProps_bitmap'><code><strong>bitmap</strong></code></a></td>
+    <td>width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>,</td>
+  </tr>
+</table>
+
+and  <a href='undocumented#Pixel_Storage'>pixel storage</a> of  <a href='undocumented#Raster_Surface'>raster surface</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_const_SkBitmap_const_SkSurfaceProps_props'><code><strong>props</strong></code></a></td>
+    <td>order and orientation of RGB striping; and whether to use</td>
+  </tr>
+</table>
+
+<a href='undocumented#Device'>device</a> independent fonts
+
+### Return Value
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> that can be used to draw into <a href='#SkCanvas_const_SkBitmap_const_SkSurfaceProps_bitmap'>bitmap</a>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_const_SkBitmap_const_SkSurfaceProps"><div>The actual output depends on the installed fonts.
+</div>
+
+#### Example Output
+
+~~~~
+-----
+---x-
+---x-
+---x-
+---x-
+---x-
+---x-
+-----
+---x-
+---x-
+-----
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_MakeRasterDirect'>MakeRasterDirect</a> <a href='undocumented#SkRasterHandleAllocator'>SkRasterHandleAllocator</a>::<a href='#SkRasterHandleAllocator_MakeCanvas'>MakeCanvas</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_getCanvas'>getCanvas</a> <a href='undocumented#SkCreateColorSpaceXformCanvas'>SkCreateColorSpaceXformCanvas</a>
+
+<a name='SkCanvas_destructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+virtual <a href='#SkCanvas_destructor'>~SkCanvas()</a>
+</pre>
+
+Draws saved <a href='SkCanvas_Reference#Layer'>layers</a>, if any.
+Frees up resources used by <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>.
+
+### Example
+
+<div><fiddle-embed name="@Canvas_destructor"><div><a href='SkCanvas_Reference#Canvas'>Canvas</a> <a href='SkCanvas_Reference#Layer'>Layer</a> draws into <a href='SkBitmap_Reference#Bitmap'>bitmap</a>. <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a> sets up an additional
+drawing <a href='SkSurface_Reference#Surface'>surface</a> that blends with the <a href='SkBitmap_Reference#Bitmap'>bitmap</a>. When <a href='SkCanvas_Reference#Layer'>Layer</a> goes out of
+scope, <a href='SkCanvas_Reference#Layer'>Layer</a> destructor is called. The saved <a href='SkCanvas_Reference#Layer'>Layer</a> is restored, drawing
+transparent letters.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#Canvas_State_Stack'>State_Stack</a>
+
+<a name='Property'></a>
+
+<a name='SkCanvas_getMetaData'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkMetaData'>SkMetaData</a>& <a href='#SkCanvas_getMetaData'>getMetaData</a>()
+</pre>
+
+Returns storage to associate additional <a href='undocumented#Data'>data</a> with the <a href='SkCanvas_Reference#Canvas'>canvas</a>.
+The storage is freed when <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is deleted.
+
+### Return Value
+
+storage that can be read from and written to
+
+### Example
+
+<div><fiddle-embed name="1598396056045e8d0c583b748293d652">
+
+#### Example Output
+
+~~~~
+before: (null)
+during: Hello!
+after: (null)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#SkMetaData'>SkMetaData</a>
+
+<a name='SkCanvas_imageInfo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkCanvas_imageInfo'>imageInfo</a>()const
+</pre>
+
+Returns <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> for <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>. If <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is not associated with raster <a href='SkSurface_Reference#Surface'>surface</a> or
+GPU <a href='SkSurface_Reference#Surface'>surface</a>, returned <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is set to <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
+
+### Return Value
+
+dimensions and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> of <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_imageInfo">
+
+#### Example Output
+
+~~~~
+emptyInfo == canvasInfo
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkCanvas_MakeRasterDirect'>MakeRasterDirect</a> <a href='#SkCanvas_makeSurface'>makeSurface</a>
+
+<a name='SkCanvas_getProps'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkCanvas_getProps'>getProps</a>(<a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* props)const
+</pre>
+
+Copies <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>, if <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is associated with  <a href='undocumented#Raster_Surface'>raster surface</a> or
+<a href='undocumented#GPU_Surface'>GPU surface</a>, and returns true. Otherwise, returns false and leave <a href='#SkCanvas_getProps_props'>props</a> unchanged.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_getProps_props'><code><strong>props</strong></code></a></td>
+    <td>storage for writable <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a> was copied
+
+### Example
+
+<div><fiddle-embed name="@Canvas_getProps">
+
+#### Example Output
+
+~~~~
+isRGB:0
+isRGB:1
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a> <a href='#SkCanvas_makeSurface'>makeSurface</a>
+
+<a name='Utility'></a>
+
+<a name='SkCanvas_flush'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_flush'>flush()</a>
+</pre>
+
+Triggers the immediate execution of all pending draw operations.
+If <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is associated with GPU <a href='SkSurface_Reference#Surface'>surface</a>, resolves all pending GPU operations.
+If <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is associated with raster <a href='SkSurface_Reference#Surface'>surface</a>, has no effect; raster draw
+operations are never deferred.
+
+### See Also
+
+<a href='#SkCanvas_peekPixels'>peekPixels</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_flush'>flush</a> <a href='undocumented#GrContext'>GrContext</a>::<a href='#GrContext_flush'>flush</a> <a href='undocumented#GrContext'>GrContext</a>::<a href='#GrContext_abandonContext'>abandonContext</a>
+
+<a name='SkCanvas_getBaseLayerSize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+virtual <a href='undocumented#SkISize'>SkISize</a> <a href='#SkCanvas_getBaseLayerSize'>getBaseLayerSize</a>()const
+</pre>
+
+Gets the <a href='undocumented#Size'>size</a> of the base or root <a href='SkCanvas_Reference#Layer'>layer</a> in global <a href='SkCanvas_Reference#Canvas'>canvas</a> coordinates. The
+origin of the base <a href='SkCanvas_Reference#Layer'>layer</a> is always (0,0). The area available for drawing may be
+smaller (due to clipping or <a href='#SkCanvas_saveLayer'>saveLayer</a>).
+
+### Return Value
+
+integral width and height of base <a href='SkCanvas_Reference#Layer'>layer</a>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_getBaseLayerSize">
+
+#### Example Output
+
+~~~~
+clip=10,30
+size=20,30
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_getDeviceClipBounds'>getDeviceClipBounds</a>
+
+<a name='SkCanvas_makeSurface'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkCanvas_makeSurface'>makeSurface</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* props = nullptr)
+</pre>
+
+Creates <a href='SkSurface_Reference#SkSurface'>SkSurface</a> matching <a href='#SkCanvas_makeSurface_info'>info</a> and <a href='#SkCanvas_makeSurface_props'>props</a>, and associates it with <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>.
+Returns nullptr if no match found.
+
+If <a href='#SkCanvas_makeSurface_props'>props</a> is nullptr, matches <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a> in <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>. If <a href='#SkCanvas_makeSurface_props'>props</a> is nullptr and <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>
+does not have <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>, creates <a href='SkSurface_Reference#SkSurface'>SkSurface</a> with default <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_makeSurface_info'><code><strong>info</strong></code></a></td>
+    <td>width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, and <a href='undocumented#SkColorSpace'>SkColorSpace</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_makeSurface_props'><code><strong>props</strong></code></a></td>
+    <td><a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a> to match; may be nullptr to match <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> matching <a href='#SkCanvas_makeSurface_info'>info</a> and <a href='#SkCanvas_makeSurface_props'>props</a>, or nullptr if no match is available
+
+### Example
+
+<div><fiddle-embed name="@Canvas_makeSurface">
+
+#### Example Output
+
+~~~~
+compatible != nullptr
+size = 3, 4
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_makeSurface'>makeSurface</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>
+
+<a name='SkCanvas_getGrContext'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+virtual <a href='undocumented#GrContext'>GrContext</a>* <a href='#SkCanvas_getGrContext'>getGrContext</a>()
+</pre>
+
+Returns GPU context of the GPU <a href='SkSurface_Reference#Surface'>surface</a> associated with <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>.
+
+### Return Value
+
+GPU context, if available; nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="@Canvas_getGrContext"></fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#GrContext'>GrContext</a>
+
+<a name='SkCanvas_accessTopLayerPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void* <a href='#SkCanvas_accessTopLayerPixels'>accessTopLayerPixels</a>(<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>* info, size_t* rowBytes, <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>* origin = nullptr)
+</pre>
+
+Returns the <a href='undocumented#Pixel'>pixel</a> base address, <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, <a href='#SkCanvas_accessTopLayerPixels_rowBytes'>rowBytes</a>, and <a href='#SkCanvas_accessTopLayerPixels_origin'>origin</a> if the pixels
+can be read directly. The returned address is only valid
+while <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is in scope and unchanged. Any <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> call or <a href='SkSurface_Reference#SkSurface'>SkSurface</a> call
+may invalidate the returned address and other returned values.
+
+If pixels are inaccessible, <a href='#SkCanvas_accessTopLayerPixels_info'>info</a>, <a href='#SkCanvas_accessTopLayerPixels_rowBytes'>rowBytes</a>, and <a href='#SkCanvas_accessTopLayerPixels_origin'>origin</a> are unchanged.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_accessTopLayerPixels_info'><code><strong>info</strong></code></a></td>
+    <td>storage for writable pixels' <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_accessTopLayerPixels_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td>storage for writable pixels' row bytes; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_accessTopLayerPixels_origin'><code><strong>origin</strong></code></a></td>
+    <td>storage for <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> top <a href='SkCanvas_Reference#Layer'>layer</a> <a href='#SkCanvas_accessTopLayerPixels_origin'>origin</a>, its top-left corner;</td>
+  </tr>
+</table>
+
+may be nullptr
+
+### Return Value
+
+address of pixels, or nullptr if inaccessible
+
+### Example
+
+<div><fiddle-embed name="@Canvas_accessTopLayerPixels_a"></fiddle-embed></div>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_accessTopLayerPixels_b"><div>Draws "ABC" on the <a href='undocumented#Device'>device</a>. Then draws "DEF" in <a href='SkCanvas_Reference#Layer'>Layer</a>, and reads
+<a href='SkCanvas_Reference#Layer'>Layer</a> to add a large dotted "DEF". Finally blends <a href='SkCanvas_Reference#Layer'>Layer</a> with the
+<a href='undocumented#Device'>device</a>.
+
+The <a href='SkCanvas_Reference#Layer'>Layer</a> and blended result appear on the CPU and GPU but the large dotted
+"DEF" appear only on the CPU.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>
+
+<a name='SkCanvas_accessTopRasterHandle'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkRasterHandleAllocator'>SkRasterHandleAllocator</a>::<a href='#SkRasterHandleAllocator_Handle'>Handle</a> <a href='#SkCanvas_accessTopRasterHandle'>accessTopRasterHandle</a>()const
+</pre>
+
+Returns custom context that tracks the <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip.
+
+Use <a href='undocumented#SkRasterHandleAllocator'>SkRasterHandleAllocator</a> to blend Skia drawing with custom drawing, typically performed
+by the host platform user interface. The custom context returned is generated by
+<a href='undocumented#SkRasterHandleAllocator'>SkRasterHandleAllocator</a>::<a href='#SkRasterHandleAllocator_MakeCanvas'>MakeCanvas</a>, which creates a custom <a href='SkCanvas_Reference#Canvas'>canvas</a> with raster storage for
+the drawing destination.
+
+### Return Value
+
+context of custom allocation
+
+### Example
+
+<div><fiddle-embed name="@Canvas_accessTopRasterHandle"><div></div>
+
+#### Example Output
+
+~~~~
+context = skia
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#SkRasterHandleAllocator'>SkRasterHandleAllocator</a>
+
+<a name='Pixels'></a>
+
+<a name='SkCanvas_peekPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkCanvas_peekPixels'>peekPixels</a>(<a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>* <a href='SkPixmap_Reference#Pixmap'>pixmap</a>)
+</pre>
+
+Returns true if <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> has direct access to its pixels.
+
+Pixels are readable when <a href='undocumented#SkBaseDevice'>SkBaseDevice</a> is raster. Pixels are not readable when <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>
+is returned from  <a href='undocumented#GPU_Surface'>GPU surface</a>, returned by <a href='undocumented#SkDocument'>SkDocument</a>::<a href='#SkDocument_beginPage'>beginPage</a>, returned by
+<a href='undocumented#SkPictureRecorder'>SkPictureRecorder</a>::<a href='#SkPictureRecorder_beginRecording'>beginRecording</a>, or <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is the base of a utility class
+like <a href='undocumented#DebugCanvas'>DebugCanvas</a>.
+
+<a href='#SkCanvas_peekPixels_pixmap'>pixmap</a> is valid only while <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is in scope and unchanged. Any
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> or <a href='SkSurface_Reference#SkSurface'>SkSurface</a> call may invalidate the <a href='#SkCanvas_peekPixels_pixmap'>pixmap</a> values.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_peekPixels_pixmap'><code><strong>pixmap</strong></code></a></td>
+    <td>storage for <a href='undocumented#Pixel'>pixel</a> state if pixels are readable; otherwise, ignored</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> has direct access to pixels
+
+### Example
+
+<div><fiddle-embed name="@Canvas_peekPixels">
+
+#### Example Output
+
+~~~~
+width=256 height=256
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_readPixels'>readPixels</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_peekPixels'>peekPixels</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_peekPixels'>peekPixels</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_peekPixels'>peekPixels</a>
+
+<a name='SkCanvas_readPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkCanvas_readPixels'>readPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& dstInfo, void* dstPixels, size_t dstRowBytes, int srcX, int srcY)
+</pre>
+
+Copies <a href='SkRect_Reference#Rect'>Rect</a> of pixels from <a href='SkCanvas_Reference#Canvas'>Canvas</a> into <a href='#SkCanvas_readPixels_dstPixels'>dstPixels</a>. <a href='SkMatrix_Reference#Matrix'>Matrix</a> and Clip are
+ignored.
+
+Source <a href='SkRect_Reference#Rect'>Rect</a> corners are (<a href='#SkCanvas_readPixels_srcX'>srcX</a>, <a href='#SkCanvas_readPixels_srcY'>srcY</a>) and (<a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_width'>width()</a>, <a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_height'>height()</a>).
+Destination <a href='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<a href='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_width'>width()</a>, <a href='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_height'>height()</a>).
+Copies each readable <a href='undocumented#Pixel'>pixel</a> intersecting both rectangles, without scaling,
+converting to <a href='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorType'>colorType</a>() and <a href='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>() if required.
+
+Pixels are readable when <a href='undocumented#Device'>Device</a> is raster, or backed by a GPU.
+Pixels are not readable when <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is returned by <a href='undocumented#SkDocument'>SkDocument</a>::<a href='#SkDocument_beginPage'>beginPage</a>,
+returned by <a href='undocumented#SkPictureRecorder'>SkPictureRecorder</a>::<a href='#SkPictureRecorder_beginRecording'>beginRecording</a>, or <a href='SkCanvas_Reference#Canvas'>Canvas</a> is the base of a utility
+class like <a href='undocumented#DebugCanvas'>DebugCanvas</a>.
+
+The destination  <a href='undocumented#Pixel_Storage'>pixel storage</a> must be allocated by the caller.
+
+<a href='undocumented#Pixel'>Pixel</a> values are converted only if <a href='#Image_Info_Color_Type'>Color_Type</a> and <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>
+do not match. Only pixels within both source and destination rectangles
+are copied. <a href='#SkCanvas_readPixels_dstPixels'>dstPixels</a> contents outside <a href='SkRect_Reference#Rect'>Rect</a> intersection are unchanged.
+
+Pass negative values for <a href='#SkCanvas_readPixels_srcX'>srcX</a> or <a href='#SkCanvas_readPixels_srcY'>srcY</a> to offset pixels across or down destination.
+
+Does not copy, and returns false if:
+
+<table>  <tr>
+    <td>Source and destination rectangles do not intersect.</td>
+  </tr>  <tr>
+    <td><a href='SkCanvas_Reference#Canvas'>Canvas</a> pixels could not be converted to <a href='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorType'>colorType</a>() or <a href='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>().</td>
+  </tr>  <tr>
+    <td><a href='SkCanvas_Reference#Canvas'>Canvas</a> pixels are not readable; for instance, <a href='SkCanvas_Reference#Canvas'>Canvas</a> is document-based.</td>
+  </tr>  <tr>
+    <td><a href='#SkCanvas_readPixels_dstRowBytes'>dstRowBytes</a> is too small to contain one row of pixels.</td>
+  </tr>
+</table>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_readPixels_dstInfo'><code><strong>dstInfo</strong></code></a></td>
+    <td>width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>, and <a href='#Image_Info_Alpha_Type'>Alpha_Type</a> of <a href='#SkCanvas_readPixels_dstPixels'>dstPixels</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_readPixels_dstPixels'><code><strong>dstPixels</strong></code></a></td>
+    <td>storage for pixels; <a href='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_height'>height()</a> times <a href='#SkCanvas_readPixels_dstRowBytes'>dstRowBytes</a>, or larger</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_readPixels_dstRowBytes'><code><strong>dstRowBytes</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of one destination row; <a href='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_width'>width()</a> times <a href='undocumented#Pixel'>pixel</a> <a href='undocumented#Size'>size</a>, or larger</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_readPixels_srcX'><code><strong>srcX</strong></code></a></td>
+    <td>offset into readable pixels on x-axis; may be negative</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_readPixels_srcY'><code><strong>srcY</strong></code></a></td>
+    <td>offset into readable pixels on y-axis; may be negative</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels were copied
+
+### Example
+
+<div><fiddle-embed name="@Canvas_readPixels_a"><div>A black <a href='undocumented#Circle'>circle</a> drawn on a blue background provides an <a href='SkImage_Reference#Image'>image</a> to copy.
+<a href='#SkCanvas_readPixels'>readPixels</a> copies one quarter of the <a href='SkCanvas_Reference#Canvas'>canvas</a> into each of the four corners.
+The copied quarter <a href='undocumented#Circle'>circles</a> overdraw the original <a href='undocumented#Circle'>circle</a>.
+</div></fiddle-embed></div>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_readPixels_b"><div><a href='SkCanvas_Reference#Canvas'>Canvas</a> returned by <a href='#Raster_Surface'>Raster_Surface</a> has <a href='undocumented#Premultiply'>Premultiplied</a> <a href='undocumented#Pixel'>pixel</a> values.
+<a href='#SkCanvas_clear'>clear()</a> takes <a href='undocumented#Unpremultiply'>Unpremultiplied</a> input with <a href='#Color_Alpha'>Color_Alpha</a> equal 0x80
+and RGB equal 0x55, 0xAA, 0xFF. RGB is multiplied by <a href='#Color_Alpha'>Color_Alpha</a>
+to generate <a href='undocumented#Premultiply'>Premultiplied</a> value 0x802B5580. <a href='#SkCanvas_readPixels'>readPixels</a> converts <a href='undocumented#Pixel'>pixel</a> back
+to <a href='undocumented#Unpremultiply'>Unpremultiplied</a> value 0x8056A9FF, introducing error.
+</div>
+
+#### Example Output
+
+~~~~
+pixel = 802b5580
+pixel = 8056a9ff
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_peekPixels'>peekPixels</a> <a href='#SkCanvas_writePixels'>writePixels</a> <a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawImage'>drawImage</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_readPixels'>readPixels</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_readPixels'>readPixels</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_readPixels'>readPixels</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_readPixels'>readPixels</a>
+
+<a name='SkCanvas_readPixels_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkCanvas_readPixels'>readPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& <a href='SkPixmap_Reference#Pixmap'>pixmap</a>, int srcX, int srcY)
+</pre>
+
+Copies <a href='SkRect_Reference#Rect'>Rect</a> of pixels from <a href='SkCanvas_Reference#Canvas'>Canvas</a> into <a href='#SkCanvas_readPixels_2_pixmap'>pixmap</a>. <a href='SkMatrix_Reference#Matrix'>Matrix</a> and Clip are
+ignored.
+
+Source <a href='SkRect_Reference#Rect'>Rect</a> corners are (<a href='#SkCanvas_readPixels_2_srcX'>srcX</a>, <a href='#SkCanvas_readPixels_2_srcY'>srcY</a>) and (<a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_width'>width()</a>, <a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_height'>height()</a>).
+Destination <a href='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<a href='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.<a href='#SkPixmap_width'>width()</a>, <a href='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.<a href='#SkPixmap_height'>height()</a>).
+Copies each readable <a href='undocumented#Pixel'>pixel</a> intersecting both rectangles, without scaling,
+converting to <a href='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.<a href='#SkPixmap_colorType'>colorType</a>() and <a href='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.<a href='#SkPixmap_alphaType'>alphaType</a>() if required.
+
+Pixels are readable when <a href='undocumented#Device'>Device</a> is raster, or backed by a GPU.
+Pixels are not readable when <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is returned by <a href='undocumented#SkDocument'>SkDocument</a>::<a href='#SkDocument_beginPage'>beginPage</a>,
+returned by <a href='undocumented#SkPictureRecorder'>SkPictureRecorder</a>::<a href='#SkPictureRecorder_beginRecording'>beginRecording</a>, or <a href='SkCanvas_Reference#Canvas'>Canvas</a> is the base of a utility
+class like <a href='undocumented#DebugCanvas'>DebugCanvas</a>.
+
+Caller must allocate  <a href='undocumented#Pixel_Storage'>pixel storage</a> in <a href='#SkCanvas_readPixels_2_pixmap'>pixmap</a> if needed.
+
+<a href='undocumented#Pixel'>Pixel</a> values are converted only if <a href='#Image_Info_Color_Type'>Color_Type</a> and <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>
+do not match. Only pixels within both source and destination <a href='SkRect_Reference#Rect'>Rects</a>
+are copied.  <a href='SkPixmap_Reference#Pixmap_Pixels'>pixmap pixels</a> contents outside <a href='SkRect_Reference#Rect'>Rect</a> intersection are unchanged.
+
+Pass negative values for <a href='#SkCanvas_readPixels_2_srcX'>srcX</a> or <a href='#SkCanvas_readPixels_2_srcY'>srcY</a> to offset pixels across or down <a href='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.
+
+Does not copy, and returns false if:
+
+<table>  <tr>
+    <td>Source and destination rectangles do not intersect.</td>
+  </tr>  <tr>
+    <td><a href='SkCanvas_Reference#Canvas'>Canvas</a> pixels could not be converted to <a href='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.<a href='#SkPixmap_colorType'>colorType</a>() or <a href='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.<a href='#SkPixmap_alphaType'>alphaType</a>().</td>
+  </tr>  <tr>
+    <td><a href='SkCanvas_Reference#Canvas'>Canvas</a> pixels are not readable; for instance, <a href='SkCanvas_Reference#Canvas'>Canvas</a> is document-based.</td>
+  </tr>  <tr>
+    <td><a href='SkPixmap_Reference#Pixmap'>Pixmap</a> pixels could not be allocated.</td>
+  </tr>  <tr>
+    <td><a href='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() is too small to contain one row of pixels.</td>
+  </tr>
+</table>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_readPixels_2_pixmap'><code><strong>pixmap</strong></code></a></td>
+    <td>storage for pixels copied from <a href='SkCanvas_Reference#Canvas'>Canvas</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_readPixels_2_srcX'><code><strong>srcX</strong></code></a></td>
+    <td>offset into readable pixels on x-axis; may be negative</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_readPixels_2_srcY'><code><strong>srcY</strong></code></a></td>
+    <td>offset into readable pixels on y-axis; may be negative</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels were copied
+
+### Example
+
+<div><fiddle-embed name="@Canvas_readPixels_2"><div><a href='#SkCanvas_clear'>clear()</a> takes <a href='undocumented#Unpremultiply'>Unpremultiplied</a> input with <a href='#Color_Alpha'>Color_Alpha</a> equal 0x80
+and RGB equal 0x55, 0xAA, 0xFF. RGB is multiplied by <a href='#Color_Alpha'>Color_Alpha</a>
+to generate <a href='undocumented#Premultiply'>Premultiplied</a> value 0x802B5580.
+</div>
+
+#### Example Output
+
+~~~~
+pixel = 802b5580
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_peekPixels'>peekPixels</a> <a href='#SkCanvas_writePixels'>writePixels</a> <a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawImage'>drawImage</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_readPixels'>readPixels</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_readPixels'>readPixels</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_readPixels'>readPixels</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_readPixels'>readPixels</a>
+
+<a name='SkCanvas_readPixels_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkCanvas_readPixels'>readPixels</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, int srcX, int srcY)
+</pre>
+
+Copies <a href='SkRect_Reference#Rect'>Rect</a> of pixels from <a href='SkCanvas_Reference#Canvas'>Canvas</a> into <a href='#SkCanvas_readPixels_3_bitmap'>bitmap</a>. <a href='SkMatrix_Reference#Matrix'>Matrix</a> and Clip are
+ignored.
+
+Source <a href='SkRect_Reference#Rect'>Rect</a> corners are (<a href='#SkCanvas_readPixels_3_srcX'>srcX</a>, <a href='#SkCanvas_readPixels_3_srcY'>srcY</a>) and (<a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_width'>width()</a>, <a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_height'>height()</a>).
+Destination <a href='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<a href='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.<a href='#SkBitmap_width'>width()</a>, <a href='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.<a href='#SkBitmap_height'>height()</a>).
+Copies each readable <a href='undocumented#Pixel'>pixel</a> intersecting both rectangles, without scaling,
+converting to <a href='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.<a href='#SkBitmap_colorType'>colorType</a>() and <a href='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.<a href='#SkBitmap_alphaType'>alphaType</a>() if required.
+
+Pixels are readable when <a href='undocumented#Device'>Device</a> is raster, or backed by a GPU.
+Pixels are not readable when <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is returned by <a href='undocumented#SkDocument'>SkDocument</a>::<a href='#SkDocument_beginPage'>beginPage</a>,
+returned by <a href='undocumented#SkPictureRecorder'>SkPictureRecorder</a>::<a href='#SkPictureRecorder_beginRecording'>beginRecording</a>, or <a href='SkCanvas_Reference#Canvas'>Canvas</a> is the base of a utility
+class like <a href='undocumented#DebugCanvas'>DebugCanvas</a>.
+
+Caller must allocate  <a href='undocumented#Pixel_Storage'>pixel storage</a> in <a href='#SkCanvas_readPixels_3_bitmap'>bitmap</a> if needed.
+
+<a href='SkBitmap_Reference#Bitmap'>Bitmap</a> values are converted only if <a href='#Image_Info_Color_Type'>Color_Type</a> and <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>
+do not match. Only pixels within both source and destination rectangles
+are copied. <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> pixels outside <a href='SkRect_Reference#Rect'>Rect</a> intersection are unchanged.
+
+Pass negative values for <a href='#SkCanvas_readPixels_3_srcX'>srcX</a> or <a href='#SkCanvas_readPixels_3_srcY'>srcY</a> to offset pixels across or down <a href='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.
+
+Does not copy, and returns false if:
+
+<table>  <tr>
+    <td>Source and destination rectangles do not intersect.</td>
+  </tr>  <tr>
+    <td><a href='SkCanvas_Reference#Canvas'>Canvas</a> pixels could not be converted to <a href='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.<a href='#SkBitmap_colorType'>colorType</a>() or <a href='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.<a href='#SkBitmap_alphaType'>alphaType</a>().</td>
+  </tr>  <tr>
+    <td><a href='SkCanvas_Reference#Canvas'>Canvas</a> pixels are not readable; for instance, <a href='SkCanvas_Reference#Canvas'>Canvas</a> is document-based.</td>
+  </tr>  <tr>
+    <td><a href='SkBitmap_Reference#Bitmap_Pixels'>bitmap pixels</a> could not be allocated.</td>
+  </tr>  <tr>
+    <td><a href='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.<a href='#SkBitmap_rowBytes'>rowBytes</a>() is too small to contain one row of pixels.</td>
+  </tr>
+</table>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_readPixels_3_bitmap'><code><strong>bitmap</strong></code></a></td>
+    <td>storage for pixels copied from <a href='SkCanvas_Reference#Canvas'>Canvas</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_readPixels_3_srcX'><code><strong>srcX</strong></code></a></td>
+    <td>offset into readable pixels on x-axis; may be negative</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_readPixels_3_srcY'><code><strong>srcY</strong></code></a></td>
+    <td>offset into readable pixels on y-axis; may be negative</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels were copied
+
+### Example
+
+<div><fiddle-embed name="@Canvas_readPixels_3"><div><a href='#SkCanvas_clear'>clear()</a> takes <a href='undocumented#Unpremultiply'>Unpremultiplied</a> input with <a href='#Color_Alpha'>Color_Alpha</a> equal 0x80
+and RGB equal 0x55, 0xAA, 0xFF. RGB is multiplied by <a href='#Color_Alpha'>Color_Alpha</a>
+to generate <a href='undocumented#Premultiply'>Premultiplied</a> value 0x802B5580.
+</div>
+
+#### Example Output
+
+~~~~
+pixel = 802b5580
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_peekPixels'>peekPixels</a> <a href='#SkCanvas_writePixels'>writePixels</a> <a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawImage'>drawImage</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_readPixels'>readPixels</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_readPixels'>readPixels</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_readPixels'>readPixels</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_readPixels'>readPixels</a>
+
+<a name='SkCanvas_writePixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkCanvas_writePixels'>writePixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, const void* pixels, size_t rowBytes, int x, int y)
+</pre>
+
+Copies <a href='SkRect_Reference#Rect'>Rect</a> from <a href='#SkCanvas_writePixels_pixels'>pixels</a> to <a href='SkCanvas_Reference#Canvas'>Canvas</a>. <a href='SkMatrix_Reference#Matrix'>Matrix</a> and Clip are ignored.
+Source <a href='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<a href='#SkCanvas_writePixels_info'>info</a>.<a href='#SkImageInfo_width'>width()</a>, <a href='#SkCanvas_writePixels_info'>info</a>.<a href='#SkImageInfo_height'>height()</a>).
+Destination <a href='SkRect_Reference#Rect'>Rect</a> corners are (<a href='#SkCanvas_writePixels_x'>x</a>, <a href='#SkCanvas_writePixels_y'>y</a>) and
+(<a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_width'>width()</a>, <a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_height'>height()</a>).
+
+Copies each readable <a href='undocumented#Pixel'>pixel</a> intersecting both rectangles, without scaling,
+converting to <a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_colorType'>colorType</a>() and <a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_alphaType'>alphaType</a>() if required.
+
+Pixels are writable when <a href='undocumented#Device'>Device</a> is raster, or backed by a GPU.
+Pixels are not writable when <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is returned by <a href='undocumented#SkDocument'>SkDocument</a>::<a href='#SkDocument_beginPage'>beginPage</a>,
+returned by <a href='undocumented#SkPictureRecorder'>SkPictureRecorder</a>::<a href='#SkPictureRecorder_beginRecording'>beginRecording</a>, or <a href='SkCanvas_Reference#Canvas'>Canvas</a> is the base of a utility
+class like <a href='undocumented#DebugCanvas'>DebugCanvas</a>.
+
+<a href='undocumented#Pixel'>Pixel</a> values are converted only if <a href='#Image_Info_Color_Type'>Color_Type</a> and <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>
+do not match. Only <a href='#SkCanvas_writePixels_pixels'>pixels</a> within both source and destination rectangles
+are copied. <a href='SkCanvas_Reference#Canvas'>Canvas</a> <a href='#SkCanvas_writePixels_pixels'>pixels</a> outside <a href='SkRect_Reference#Rect'>Rect</a> intersection are unchanged.
+
+Pass negative values for <a href='#SkCanvas_writePixels_x'>x</a> or <a href='#SkCanvas_writePixels_y'>y</a> to offset <a href='#SkCanvas_writePixels_pixels'>pixels</a> to the left or
+above <a href='SkCanvas_Reference#Canvas'>Canvas</a> <a href='#SkCanvas_writePixels_pixels'>pixels</a>.
+
+Does not copy, and returns false if:
+
+<table>  <tr>
+    <td>Source and destination rectangles do not intersect.</td>
+  </tr>  <tr>
+    <td><a href='#SkCanvas_writePixels_pixels'>pixels</a> could not be converted to <a href='SkCanvas_Reference#Canvas'>Canvas</a> <a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_colorType'>colorType</a>() or
+<a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_alphaType'>alphaType</a>().</td>
+  </tr>  <tr>
+    <td><a href='SkCanvas_Reference#Canvas'>Canvas</a> <a href='#SkCanvas_writePixels_pixels'>pixels</a> are not writable; for instance, <a href='SkCanvas_Reference#Canvas'>Canvas</a> is document-based.</td>
+  </tr>  <tr>
+    <td><a href='#SkCanvas_writePixels_rowBytes'>rowBytes</a> is too small to contain one row of <a href='#SkCanvas_writePixels_pixels'>pixels</a>.</td>
+  </tr>
+</table>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_writePixels_info'><code><strong>info</strong></code></a></td>
+    <td>width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>, and <a href='#Image_Info_Alpha_Type'>Alpha_Type</a> of <a href='#SkCanvas_writePixels_pixels'>pixels</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_writePixels_pixels'><code><strong>pixels</strong></code></a></td>
+    <td><a href='#SkCanvas_writePixels_pixels'>pixels</a> to copy, of <a href='undocumented#Size'>size</a> <a href='#SkCanvas_writePixels_info'>info</a>.<a href='#SkImageInfo_height'>height()</a> times <a href='#SkCanvas_writePixels_rowBytes'>rowBytes</a>, or larger</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_writePixels_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of one row of <a href='#SkCanvas_writePixels_pixels'>pixels</a>; <a href='#SkCanvas_writePixels_info'>info</a>.<a href='#SkImageInfo_width'>width()</a> times <a href='undocumented#Pixel'>pixel</a> <a href='undocumented#Size'>size</a>, or larger</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_writePixels_x'><code><strong>x</strong></code></a></td>
+    <td>offset into <a href='SkCanvas_Reference#Canvas'>Canvas</a> writable <a href='#SkCanvas_writePixels_pixels'>pixels</a> on x-axis; may be negative</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_writePixels_y'><code><strong>y</strong></code></a></td>
+    <td>offset into <a href='SkCanvas_Reference#Canvas'>Canvas</a> writable <a href='#SkCanvas_writePixels_pixels'>pixels</a> on y-axis; may be negative</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkCanvas_writePixels_pixels'>pixels</a> were written to <a href='SkCanvas_Reference#Canvas'>Canvas</a>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_writePixels"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_readPixels'>readPixels</a> <a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawImage'>drawImage</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_writePixels'>writePixels</a>
+
+<a name='SkCanvas_writePixels_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkCanvas_writePixels'>writePixels</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, int x, int y)
+</pre>
+
+Copies <a href='SkRect_Reference#Rect'>Rect</a> from pixels to <a href='SkCanvas_Reference#Canvas'>Canvas</a>. <a href='SkMatrix_Reference#Matrix'>Matrix</a> and Clip are ignored.
+Source <a href='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<a href='#SkCanvas_writePixels_2_bitmap'>bitmap</a>.<a href='#SkBitmap_width'>width()</a>, <a href='#SkCanvas_writePixels_2_bitmap'>bitmap</a>.<a href='#SkBitmap_height'>height()</a>).
+
+Destination <a href='SkRect_Reference#Rect'>Rect</a> corners are (<a href='#SkCanvas_writePixels_2_x'>x</a>, <a href='#SkCanvas_writePixels_2_y'>y</a>) and
+(<a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_width'>width()</a>, <a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_height'>height()</a>).
+
+Copies each readable <a href='undocumented#Pixel'>pixel</a> intersecting both rectangles, without scaling,
+converting to <a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_colorType'>colorType</a>() and <a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_alphaType'>alphaType</a>() if required.
+
+Pixels are writable when <a href='undocumented#Device'>Device</a> is raster, or backed by a GPU.
+Pixels are not writable when <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> is returned by <a href='undocumented#SkDocument'>SkDocument</a>::<a href='#SkDocument_beginPage'>beginPage</a>,
+returned by <a href='undocumented#SkPictureRecorder'>SkPictureRecorder</a>::<a href='#SkPictureRecorder_beginRecording'>beginRecording</a>, or <a href='SkCanvas_Reference#Canvas'>Canvas</a> is the base of a utility
+class like <a href='undocumented#DebugCanvas'>DebugCanvas</a>.
+
+<a href='undocumented#Pixel'>Pixel</a> values are converted only if <a href='#Image_Info_Color_Type'>Color_Type</a> and <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>
+do not match. Only pixels within both source and destination rectangles
+are copied. <a href='SkCanvas_Reference#Canvas'>Canvas</a> pixels outside <a href='SkRect_Reference#Rect'>Rect</a> intersection are unchanged.
+
+Pass negative values for <a href='#SkCanvas_writePixels_2_x'>x</a> or <a href='#SkCanvas_writePixels_2_y'>y</a> to offset pixels to the left or
+above <a href='SkCanvas_Reference#Canvas'>Canvas</a> pixels.
+
+Does not copy, and returns false if:
+
+<table>  <tr>
+    <td>Source and destination rectangles do not intersect.</td>
+  </tr>  <tr>
+    <td><a href='#SkCanvas_writePixels_2_bitmap'>bitmap</a> does not have allocated pixels.</td>
+  </tr>  <tr>
+    <td><a href='SkBitmap_Reference#Bitmap_Pixels'>bitmap pixels</a> could not be converted to <a href='SkCanvas_Reference#Canvas'>Canvas</a> <a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_colorType'>colorType</a>() or
+<a href='#SkCanvas_imageInfo'>imageInfo</a>().<a href='#SkImageInfo_alphaType'>alphaType</a>().</td>
+  </tr>  <tr>
+    <td><a href='SkCanvas_Reference#Canvas'>Canvas</a> pixels are not writable; for instance, <a href='SkCanvas_Reference#Canvas'>Canvas</a> is <a href='undocumented#Document'>document</a> based.</td>
+  </tr>  <tr>
+    <td><a href='SkBitmap_Reference#Bitmap_Pixels'>bitmap pixels</a> are inaccessible; for instance, <a href='#SkCanvas_writePixels_2_bitmap'>bitmap</a> wraps a <a href='undocumented#Texture'>texture</a>.</td>
+  </tr>
+</table>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_writePixels_2_bitmap'><code><strong>bitmap</strong></code></a></td>
+    <td>contains pixels copied to <a href='SkCanvas_Reference#Canvas'>Canvas</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_writePixels_2_x'><code><strong>x</strong></code></a></td>
+    <td>offset into <a href='SkCanvas_Reference#Canvas'>Canvas</a> writable pixels in <a href='#SkCanvas_writePixels_2_x'>x</a>; may be negative</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_writePixels_2_y'><code><strong>y</strong></code></a></td>
+    <td>offset into <a href='SkCanvas_Reference#Canvas'>Canvas</a> writable pixels in <a href='#SkCanvas_writePixels_2_y'>y</a>; may be negative</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels were written to <a href='SkCanvas_Reference#Canvas'>Canvas</a>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_writePixels_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_readPixels'>readPixels</a> <a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawImage'>drawImage</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_writePixels'>writePixels</a>
+
+<a name='State_Stack'></a>
+
+---
+
+<a href='SkCanvas_Reference#Canvas'>Canvas</a> maintains a stack of state that allows hierarchical drawing, commonly used
+to implement windows and views. The initial state has an identity <a href='SkMatrix_Reference#Matrix'>matrix</a> and and
+an infinite clip. Even with a wide-open clip, drawing is constrained by the
+bounds of the <a href='SkCanvas_Reference#Canvas'>Canvas</a> <a href='SkSurface_Reference#Surface'>Surface</a> or <a href='undocumented#Device'>Device</a>.
+
+<a href='SkCanvas_Reference#Canvas'>Canvas</a> savable state consists of Clip and <a href='SkMatrix_Reference#Matrix'>Matrix</a>.
+Clip describes the area that may be drawn to.
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> transforms the geometry.
+
+<a href='#SkCanvas_save'>save()</a>, <a href='#SkCanvas_saveLayer'>saveLayer</a>, <a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a>, and <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a>
+save state and return the depth of the stack.
+
+<a href='#SkCanvas_restore'>restore()</a>, <a href='#SkCanvas_restoreToCount'>restoreToCount</a>, and <a href='#SkCanvas_destructor'>~SkCanvas()</a> revert state to its value when saved.
+
+Each state on the stack intersects Clip with the previous Clip,
+and concatenates <a href='SkMatrix_Reference#Matrix'>Matrix</a> with the previous <a href='SkMatrix_Reference#Matrix'>Matrix</a>.
+The intersected Clip makes the drawing area the same or smaller;
+the concatenated <a href='SkMatrix_Reference#Matrix'>Matrix</a> may move the origin and potentially scale or rotate
+the coordinate space.
+
+<a href='SkCanvas_Reference#Canvas'>Canvas</a> does not require balancing the  <a href='#State_Stack'>state stack</a> but it is a good idea
+to do so. Calling <a href='#SkCanvas_save'>save()</a> without <a href='#SkCanvas_restore'>restore()</a> will eventually cause Skia to fail;
+mismatched <a href='#SkCanvas_save'>save()</a> and <a href='#SkCanvas_restore'>restore()</a> create hard to find bugs.
+
+It is not possible to use state to draw outside of the clip defined by the
+previous state.
+
+### Example
+
+<div><fiddle-embed name="@State_Stack_a"><div>Draw to ever smaller clips; then restore drawing to full <a href='SkCanvas_Reference#Canvas'>canvas</a>.
+Note that the second <a href='#SkCanvas_clipRect'>clipRect</a> is not permitted to enlarge Clip.
+</div></fiddle-embed></div>
+
+Each Clip uses the current <a href='SkMatrix_Reference#Matrix'>Matrix</a> for its coordinates.
+
+### Example
+
+<div><fiddle-embed name="@State_Stack_b"><div>While <a href='#SkCanvas_clipRect'>clipRect</a> is given the same rectangle twice, <a href='SkMatrix_Reference#Matrix'>Matrix</a> makes the second
+<a href='#SkCanvas_clipRect'>clipRect</a> draw at half the <a href='undocumented#Size'>size</a> of the first.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_save'>save</a> <a href='#SkCanvas_saveLayer'>saveLayer</a> <a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a> <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a> <a href='#SkCanvas_restore'>restore()</a> <a href='#SkCanvas_restoreToCount'>restoreToCount</a>
+
+<a name='SkCanvas_save'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkCanvas_save'>save()</a>
+</pre>
+
+Saves <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip.
+Calling <a href='#SkCanvas_restore'>restore()</a> discards changes to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip,
+restoring the <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip to their state when <a href='#SkCanvas_save'>save()</a> was called.
+
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> may be changed by <a href='#SkCanvas_translate'>translate()</a>, <a href='#SkCanvas_scale'>scale()</a>, <a href='#SkCanvas_rotate'>rotate()</a>, <a href='#SkCanvas_skew'>skew()</a>, <a href='#SkCanvas_concat'>concat()</a>, <a href='#SkCanvas_setMatrix'>setMatrix</a>(),
+and <a href='#SkCanvas_resetMatrix'>resetMatrix</a>(). Clip may be changed by <a href='#SkCanvas_clipRect'>clipRect</a>(), <a href='#SkCanvas_clipRRect'>clipRRect</a>(), <a href='#SkCanvas_clipPath'>clipPath</a>(), <a href='#SkCanvas_clipRegion'>clipRegion</a>().
+
+Saved <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> state is put on a stack; multiple calls to <a href='#SkCanvas_save'>save()</a> should be balance
+by an equal number of calls to <a href='#SkCanvas_restore'>restore()</a>.
+
+Call <a href='#SkCanvas_restoreToCount'>restoreToCount</a>() with result to restore this and subsequent saves.
+
+### Return Value
+
+depth of saved stack
+
+### Example
+
+<div><fiddle-embed name="@Canvas_save"><div>The black square is translated 50 pixels down and to the right.
+Restoring <a href='SkCanvas_Reference#Canvas'>Canvas</a> state removes <a href='#SkCanvas_translate'>translate()</a> from <a href='SkCanvas_Reference#Canvas'>Canvas</a> stack;
+the red square is not translated, and is drawn at the origin.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_saveLayer'>saveLayer</a> <a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a> <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a> <a href='#SkCanvas_restore'>restore</a> <a href='#SkCanvas_restoreToCount'>restoreToCount</a>
+
+<a name='SkCanvas_restore'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_restore'>restore()</a>
+</pre>
+
+Removes changes to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip since <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> state was
+last saved. The state is removed from the stack.
+
+Does nothing if the stack is empty.
+
+### Example
+
+<div><fiddle-embed name="@Canvas_restore"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_save'>save</a> <a href='#SkCanvas_saveLayer'>saveLayer</a> <a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a> <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a> <a href='#SkCanvas_restoreToCount'>restoreToCount</a>
+
+<a name='SkCanvas_getSaveCount'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkCanvas_getSaveCount'>getSaveCount</a>()const
+</pre>
+
+Returns the number of saved states, each containing: <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip.
+Equals the number of <a href='#SkCanvas_save'>save()</a> calls less the number of <a href='#SkCanvas_restore'>restore()</a> calls plus one.
+The save count of a new <a href='SkCanvas_Reference#Canvas'>canvas</a> is one.
+
+### Return Value
+
+depth of save state stack
+
+### Example
+
+<div><fiddle-embed name="@Canvas_getSaveCount">
+
+#### Example Output
+
+~~~~
+depth = 1
+depth = 2
+depth = 1
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_save'>save</a> <a href='#SkCanvas_restore'>restore</a> <a href='#SkCanvas_restoreToCount'>restoreToCount</a>
+
+<a name='SkCanvas_restoreToCount'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_restoreToCount'>restoreToCount</a>(int saveCount)
+</pre>
+
+Restores state to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip values when <a href='#SkCanvas_save'>save()</a>, <a href='#SkCanvas_saveLayer'>saveLayer</a>(),
+<a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a>(), or <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a>() returned <a href='#SkCanvas_restoreToCount_saveCount'>saveCount</a>.
+
+Does nothing if <a href='#SkCanvas_restoreToCount_saveCount'>saveCount</a> is greater than  <a href='#State_Stack'>state stack</a> count.
+Restores state to initial values if <a href='#SkCanvas_restoreToCount_saveCount'>saveCount</a> is less than or equal to one.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_restoreToCount_saveCount'><code><strong>saveCount</strong></code></a></td>
+    <td>depth of  <a href='#State_Stack'>state stack</a> to restore</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_restoreToCount">
+
+#### Example Output
+
+~~~~
+depth = 1
+depth = 3
+depth = 1
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_restore'>restore</a> <a href='#SkCanvas_getSaveCount'>getSaveCount</a> <a href='#SkCanvas_save'>save</a>
+
+<a name='Layer'></a>
+
+<a href='SkCanvas_Reference#Layer'>Layer</a> allocates a temporary <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> to draw into. When the drawing is
+complete, the <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> is drawn into the <a href='SkCanvas_Reference#Canvas'>Canvas</a>.
+
+<a href='SkCanvas_Reference#Layer'>Layer</a> is saved in a stack along with other saved state. When state with a <a href='SkCanvas_Reference#Layer'>Layer</a>
+is restored, the <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> is drawn into the previous <a href='SkCanvas_Reference#Layer'>Layer</a>.
+
+<a href='SkCanvas_Reference#Layer'>Layer</a> may be initialized with the contents of the previous <a href='SkCanvas_Reference#Layer'>Layer</a>. When <a href='SkCanvas_Reference#Layer'>Layer</a> is
+restored, its <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> can be modified by <a href='SkPaint_Reference#Paint'>Paint</a> passed to <a href='SkCanvas_Reference#Layer'>Layer</a> to apply
+<a href='#Color_Alpha'>Color_Alpha</a>, <a href='#Color_Filter'>Color_Filter</a>, <a href='#Image_Filter'>Image_Filter</a>, and <a href='#Blend_Mode'>Blend_Mode</a>.
+
+<a name='SkCanvas_saveLayer'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkCanvas_saveLayer'>saveLayer</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Saves <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip, and allocates a <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> for subsequent drawing.
+Calling <a href='#SkCanvas_restore'>restore()</a> discards changes to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip, and draws the <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>.
+
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> may be changed by <a href='#SkCanvas_translate'>translate()</a>, <a href='#SkCanvas_scale'>scale()</a>, <a href='#SkCanvas_rotate'>rotate()</a>, <a href='#SkCanvas_skew'>skew()</a>, <a href='#SkCanvas_concat'>concat()</a>,
+<a href='#SkCanvas_setMatrix'>setMatrix</a>(), and <a href='#SkCanvas_resetMatrix'>resetMatrix</a>(). Clip may be changed by <a href='#SkCanvas_clipRect'>clipRect</a>(), <a href='#SkCanvas_clipRRect'>clipRRect</a>(),
+<a href='#SkCanvas_clipPath'>clipPath</a>(), <a href='#SkCanvas_clipRegion'>clipRegion</a>().
+
+<a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_saveLayer_bounds'>bounds</a> suggests but does not define the <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> <a href='undocumented#Size'>size</a>. To clip drawing to
+a specific rectangle, use <a href='#SkCanvas_clipRect'>clipRect</a>().
+
+Optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_saveLayer_paint'>paint</a> applies <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> when <a href='#SkCanvas_restore'>restore()</a> is called.
+
+Call <a href='#SkCanvas_restoreToCount'>restoreToCount</a>() with returned value to restore this and subsequent saves.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_saveLayer_bounds'><code><strong>bounds</strong></code></a></td>
+    <td>hint to limit the <a href='undocumented#Size'>size</a> of the <a href='SkCanvas_Reference#Layer'>layer</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_saveLayer_paint'><code><strong>paint</strong></code></a></td>
+    <td>graphics state for <a href='SkCanvas_Reference#Layer'>layer</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+depth of saved stack
+
+### Example
+
+<div><fiddle-embed name="@Canvas_saveLayer"><div>Rectangles are blurred by <a href='#Image_Filter'>Image_Filter</a> when <a href='#SkCanvas_restore'>restore()</a> draws <a href='SkCanvas_Reference#Layer'>Layer</a> to main
+<a href='SkCanvas_Reference#Canvas'>Canvas</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_save'>save</a> <a href='#SkCanvas_restore'>restore</a> <a href='#SkCanvas_saveLayer'>saveLayer</a> <a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a> <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a> <a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a>
+
+<a name='SkCanvas_saveLayer_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkCanvas_saveLayer'>saveLayer</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& bounds, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Saves <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip, and allocates a <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> for subsequent drawing.
+Calling <a href='#SkCanvas_restore'>restore()</a> discards changes to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip, and draws the <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>.
+
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> may be changed by <a href='#SkCanvas_translate'>translate()</a>, <a href='#SkCanvas_scale'>scale()</a>, <a href='#SkCanvas_rotate'>rotate()</a>, <a href='#SkCanvas_skew'>skew()</a>, <a href='#SkCanvas_concat'>concat()</a>,
+<a href='#SkCanvas_setMatrix'>setMatrix</a>(), and <a href='#SkCanvas_resetMatrix'>resetMatrix</a>(). Clip may be changed by <a href='#SkCanvas_clipRect'>clipRect</a>(), <a href='#SkCanvas_clipRRect'>clipRRect</a>(),
+<a href='#SkCanvas_clipPath'>clipPath</a>(), <a href='#SkCanvas_clipRegion'>clipRegion</a>().
+
+<a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_saveLayer_2_bounds'>bounds</a> suggests but does not define the <a href='SkCanvas_Reference#Layer'>layer</a> <a href='undocumented#Size'>size</a>. To clip drawing to
+a specific rectangle, use <a href='#SkCanvas_clipRect'>clipRect</a>().
+
+Optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_saveLayer_2_paint'>paint</a> applies <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> when <a href='#SkCanvas_restore'>restore()</a> is called.
+
+Call <a href='#SkCanvas_restoreToCount'>restoreToCount</a>() with returned value to restore this and subsequent saves.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_saveLayer_2_bounds'><code><strong>bounds</strong></code></a></td>
+    <td>hint to limit the <a href='undocumented#Size'>size</a> of <a href='SkCanvas_Reference#Layer'>layer</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_saveLayer_2_paint'><code><strong>paint</strong></code></a></td>
+    <td>graphics state for <a href='SkCanvas_Reference#Layer'>layer</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+depth of saved stack
+
+### Example
+
+<div><fiddle-embed name="@Canvas_saveLayer_2"><div>Rectangles are blurred by <a href='#Image_Filter'>Image_Filter</a> when <a href='#SkCanvas_restore'>restore()</a> draws <a href='SkCanvas_Reference#Layer'>Layer</a> to main <a href='SkCanvas_Reference#Canvas'>Canvas</a>.
+The red rectangle is clipped; it does not fully fit on <a href='SkCanvas_Reference#Layer'>Layer</a>.
+<a href='#Image_Filter'>Image_Filter</a> blurs past edge of <a href='SkCanvas_Reference#Layer'>Layer</a> so red rectangle is blurred on all sides.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_save'>save</a> <a href='#SkCanvas_restore'>restore</a> <a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a> <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a> <a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a>
+
+<a name='SkCanvas_saveLayerPreserveLCDTextRequests'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Saves <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip, and allocates a <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> for subsequent drawing.
+LCD <a href='undocumented#Text'>text</a> is preserved when the <a href='SkCanvas_Reference#Layer'>layer</a> is drawn to the prior <a href='SkCanvas_Reference#Layer'>layer</a>.
+
+Calling <a href='#SkCanvas_restore'>restore()</a> discards changes to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip, and draws <a href='SkCanvas_Reference#Layer'>layer</a>.
+
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> may be changed by <a href='#SkCanvas_translate'>translate()</a>, <a href='#SkCanvas_scale'>scale()</a>, <a href='#SkCanvas_rotate'>rotate()</a>, <a href='#SkCanvas_skew'>skew()</a>, <a href='#SkCanvas_concat'>concat()</a>,
+<a href='#SkCanvas_setMatrix'>setMatrix</a>(), and <a href='#SkCanvas_resetMatrix'>resetMatrix</a>(). Clip may be changed by <a href='#SkCanvas_clipRect'>clipRect</a>(), <a href='#SkCanvas_clipRRect'>clipRRect</a>(),
+<a href='#SkCanvas_clipPath'>clipPath</a>(), <a href='#SkCanvas_clipRegion'>clipRegion</a>().
+
+<a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_saveLayerPreserveLCDTextRequests_bounds'>bounds</a> suggests but does not define the <a href='SkCanvas_Reference#Layer'>layer</a> <a href='undocumented#Size'>size</a>. To clip drawing to
+a specific rectangle, use <a href='#SkCanvas_clipRect'>clipRect</a>().
+
+Optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_saveLayerPreserveLCDTextRequests_paint'>paint</a> applies <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> when <a href='#SkCanvas_restore'>restore()</a> is called.
+
+Call <a href='#SkCanvas_restoreToCount'>restoreToCount</a>() with returned value to restore this and subsequent saves.
+
+Draw <a href='undocumented#Text'>text</a> on an opaque background so that LCD <a href='undocumented#Text'>text</a> blends correctly with the
+prior <a href='SkCanvas_Reference#Layer'>layer</a>. LCD <a href='undocumented#Text'>text</a> drawn on a background with transparency may result in
+incorrect blending.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_saveLayerPreserveLCDTextRequests_bounds'><code><strong>bounds</strong></code></a></td>
+    <td>hint to limit the <a href='undocumented#Size'>size</a> of <a href='SkCanvas_Reference#Layer'>layer</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_saveLayerPreserveLCDTextRequests_paint'><code><strong>paint</strong></code></a></td>
+    <td>graphics state for <a href='SkCanvas_Reference#Layer'>layer</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+depth of saved stack
+
+### Example
+
+<div><fiddle-embed name="8460bf8b013f46c67e0bd96e13451aff"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_save'>save</a> <a href='#SkCanvas_restore'>restore</a> <a href='#SkCanvas_saveLayer'>saveLayer</a> <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a> <a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a>
+
+<a name='SkCanvas_saveLayerAlpha'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds, <a href='undocumented#U8CPU'>U8CPU</a> <a href='SkColor_Reference#Alpha'>alpha</a>)
+</pre>
+
+Saves <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip, and allocates <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> for subsequent drawing.
+
+Calling <a href='#SkCanvas_restore'>restore()</a> discards changes to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip,
+and blends <a href='SkCanvas_Reference#Layer'>layer</a> with <a href='#SkCanvas_saveLayerAlpha_alpha'>alpha</a> opacity onto prior <a href='SkCanvas_Reference#Layer'>layer</a>.
+
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> may be changed by <a href='#SkCanvas_translate'>translate()</a>, <a href='#SkCanvas_scale'>scale()</a>, <a href='#SkCanvas_rotate'>rotate()</a>, <a href='#SkCanvas_skew'>skew()</a>, <a href='#SkCanvas_concat'>concat()</a>,
+<a href='#SkCanvas_setMatrix'>setMatrix</a>(), and <a href='#SkCanvas_resetMatrix'>resetMatrix</a>(). Clip may be changed by <a href='#SkCanvas_clipRect'>clipRect</a>(), <a href='#SkCanvas_clipRRect'>clipRRect</a>(),
+<a href='#SkCanvas_clipPath'>clipPath</a>(), <a href='#SkCanvas_clipRegion'>clipRegion</a>().
+
+<a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_saveLayerAlpha_bounds'>bounds</a> suggests but does not define <a href='SkCanvas_Reference#Layer'>layer</a> <a href='undocumented#Size'>size</a>. To clip drawing to
+a specific rectangle, use <a href='#SkCanvas_clipRect'>clipRect</a>().
+
+<a href='#SkCanvas_saveLayerAlpha_alpha'>alpha</a> of zero is fully transparent, 255 is fully opaque.
+
+Call <a href='#SkCanvas_restoreToCount'>restoreToCount</a>() with returned value to restore this and subsequent saves.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_saveLayerAlpha_bounds'><code><strong>bounds</strong></code></a></td>
+    <td>hint to limit the <a href='undocumented#Size'>size</a> of <a href='SkCanvas_Reference#Layer'>layer</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_saveLayerAlpha_alpha'><code><strong>alpha</strong></code></a></td>
+    <td>opacity of <a href='SkCanvas_Reference#Layer'>layer</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+depth of saved stack
+
+### Example
+
+<div><fiddle-embed name="@Canvas_saveLayerAlpha"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_save'>save</a> <a href='#SkCanvas_restore'>restore</a> <a href='#SkCanvas_saveLayer'>saveLayer</a> <a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a> <a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a>
+
+<a name='SkCanvas_SaveLayerFlagsSet'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkCanvas_SaveLayerFlagsSet'>SaveLayerFlagsSet</a> {
+        <a href='#SkCanvas_kPreserveLCDText_SaveLayerFlag'>kPreserveLCDText_SaveLayerFlag</a> = 1 << 1,
+        <a href='#SkCanvas_kInitWithPrevious_SaveLayerFlag'>kInitWithPrevious_SaveLayerFlag</a> = 1 << 2,
+    };
+
+</pre>
+
+<a name='SkCanvas_SaveLayerFlags'></a>
+
+---
+
+<a href='#SkCanvas_SaveLayerFlags'>SaveLayerFlags</a> provides options that may be used in any combination in <a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a>,
+defining how <a href='SkCanvas_Reference#Layer'>Layer</a> allocated by <a href='#SkCanvas_saveLayer'>saveLayer</a> operates. It may be set to zero,
+<a href='#SkCanvas_kPreserveLCDText_SaveLayerFlag'>kPreserveLCDText_SaveLayerFlag</a>, <a href='#SkCanvas_kInitWithPrevious_SaveLayerFlag'>kInitWithPrevious_SaveLayerFlag</a>, or both flags.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_kPreserveLCDText_SaveLayerFlag'><code>SkCanvas::kPreserveLCDText_SaveLayerFlag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Creates <a href='SkCanvas_Reference#Layer'>Layer</a> for LCD <a href='undocumented#Text'>text</a>. Flag is ignored if <a href='SkCanvas_Reference#Layer'>Layer</a> <a href='SkPaint_Reference#Paint'>Paint</a> contains
+<a href='#Image_Filter'>Image_Filter</a> or <a href='#Color_Filter'>Color_Filter</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_kInitWithPrevious_SaveLayerFlag'><code>SkCanvas::kInitWithPrevious_SaveLayerFlag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>4</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Initializes <a href='SkCanvas_Reference#Layer'>Layer</a> with the contents of the previous <a href='SkCanvas_Reference#Layer'>Layer</a>.
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_kInitWithPrevious_SaveLayerFlag"><div><a href='SkCanvas_Reference#Canvas'>Canvas</a> <a href='SkCanvas_Reference#Layer'>Layer</a> captures red and blue <a href='undocumented#Circle'>circles</a> scaled up by four.
+scalePaint blends <a href='SkCanvas_Reference#Layer'>Layer</a> back with transparency.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_save'>save</a> <a href='#SkCanvas_restore'>restore</a> <a href='#SkCanvas_saveLayer'>saveLayer</a> <a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a> <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a> <a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a>
+
+<a name='Layer_SaveLayerRec'></a>
+
+<a name='SkCanvas_SaveLayerRec'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    struct <a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a> {
+
+        <a href='#SkCanvas_SaveLayerRec_SaveLayerRec'>SaveLayerRec()</a>;
+        <a href='#SkCanvas_SaveLayerRec_SaveLayerRec'>SaveLayerRec</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>, <a href='#SkCanvas_SaveLayerFlags'>SaveLayerFlags</a> saveLayerFlags = 0);
+        <a href='#SkCanvas_SaveLayerRec_SaveLayerRec'>SaveLayerRec</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>, const <a href='undocumented#SkImageFilter'>SkImageFilter</a>* backdrop,
+                     <a href='#SkCanvas_SaveLayerFlags'>SaveLayerFlags</a> saveLayerFlags);
+
+        const <a href='SkRect_Reference#SkRect'>SkRect</a>* <a href='#SkCanvas_SaveLayerRec_fBounds'>fBounds</a> = nullptr;
+        const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='#SkCanvas_SaveLayerRec_fPaint'>fPaint</a> = nullptr;
+        const <a href='undocumented#SkImageFilter'>SkImageFilter</a>* <a href='#SkCanvas_SaveLayerRec_fBackdrop'>fBackdrop</a> = nullptr;
+        const <a href='SkImage_Reference#SkImage'>SkImage</a>* <a href='#SkCanvas_SaveLayerRec_fClipMask'>fClipMask</a> = nullptr;
+        const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* <a href='#SkCanvas_SaveLayerRec_fClipMatrix'>fClipMatrix</a> = nullptr;
+        <a href='#SkCanvas_SaveLayerFlags'>SaveLayerFlags</a> <a href='#SkCanvas_SaveLayerRec_fSaveLayerFlags'>fSaveLayerFlags</a> = 0;
+    };
+
+</pre>
+
+<a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a> contains the state used to create the <a href='SkCanvas_Reference#Layer'>Layer</a>.<table style='border-collapse: collapse; width: 62.5em'>
+
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Type</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Member</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>const&nbsp;SkRect*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_SaveLayerRec_fBounds'><code>fBounds</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#SkCanvas_SaveLayerRec_fBounds'>fBounds</a> is used as a hint to limit the <a href='undocumented#Size'>size</a> of <a href='SkCanvas_Reference#Layer'>Layer</a>; may be nullptr.
+<a href='#SkCanvas_SaveLayerRec_fBounds'>fBounds</a> suggests but does not define <a href='SkCanvas_Reference#Layer'>Layer</a> <a href='undocumented#Size'>size</a>. To clip drawing to
+a specific rectangle, use <a href='#SkCanvas_clipRect'>clipRect</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>const&nbsp;SkPaint*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_SaveLayerRec_fPaint'><code>fPaint</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#SkCanvas_SaveLayerRec_fPaint'>fPaint</a> modifies how <a href='SkCanvas_Reference#Layer'>Layer</a> overlays the prior <a href='SkCanvas_Reference#Layer'>Layer</a>; may be nullptr.
+<a href='#Color_Alpha'>Color_Alpha</a>, <a href='#Blend_Mode'>Blend_Mode</a>, <a href='#Color_Filter'>Color_Filter</a>, <a href='#Draw_Looper'>Draw_Looper</a>, <a href='#Image_Filter'>Image_Filter</a>, and
+<a href='#Mask_Filter'>Mask_Filter</a> affect <a href='SkCanvas_Reference#Layer'>Layer</a> draw.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>const&nbsp;SkImageFilter*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_SaveLayerRec_fBackdrop'><code>fBackdrop</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#SkCanvas_SaveLayerRec_fBackdrop'>fBackdrop</a> applies <a href='#Image_Filter'>Image_Filter</a> to the prior <a href='SkCanvas_Reference#Layer'>Layer</a> when copying to the <a href='SkCanvas_Reference#Layer'>Layer</a>;
+may be nullptr. Use <a href='#SkCanvas_kInitWithPrevious_SaveLayerFlag'>kInitWithPrevious_SaveLayerFlag</a> to copy the
+prior <a href='SkCanvas_Reference#Layer'>Layer</a> without an <a href='#Image_Filter'>Image_Filter</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>const&nbsp;SkImage*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_SaveLayerRec_fClipMask'><code>fClipMask</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#SkCanvas_restore'>restore()</a> clips <a href='SkCanvas_Reference#Layer'>Layer</a> by the <a href='#Color_Alpha'>Color_Alpha</a> channel of <a href='#SkCanvas_SaveLayerRec_fClipMask'>fClipMask</a> when
+<a href='SkCanvas_Reference#Layer'>Layer</a> is copied to <a href='undocumented#Device'>Device</a>. <a href='#SkCanvas_SaveLayerRec_fClipMask'>fClipMask</a> may be nullptr.    .
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>const&nbsp;SkMatrix*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_SaveLayerRec_fClipMatrix'><code>fClipMatrix</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#SkCanvas_SaveLayerRec_fClipMatrix'>fClipMatrix</a> transforms <a href='#SkCanvas_SaveLayerRec_fClipMask'>fClipMask</a> before it clips <a href='SkCanvas_Reference#Layer'>Layer</a>. If
+<a href='#SkCanvas_SaveLayerRec_fClipMask'>fClipMask</a> describes a translucent gradient, it may be scaled and rotated
+without introducing artifacts. <a href='#SkCanvas_SaveLayerRec_fClipMatrix'>fClipMatrix</a> may be nullptr.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SaveLayerFlags</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_SaveLayerRec_fSaveLayerFlags'><code>fSaveLayerFlags</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#SkCanvas_SaveLayerRec_fSaveLayerFlags'>fSaveLayerFlags</a> are used to create <a href='SkCanvas_Reference#Layer'>Layer</a> without transparency,
+create <a href='SkCanvas_Reference#Layer'>Layer</a> for LCD <a href='undocumented#Text'>text</a>, and to create <a href='SkCanvas_Reference#Layer'>Layer</a> with the
+contents of the previous <a href='SkCanvas_Reference#Layer'>Layer</a>.
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_SaveLayerRec"><div><a href='SkCanvas_Reference#Canvas'>Canvas</a> <a href='SkCanvas_Reference#Layer'>Layer</a> captures a red <a href='#Paint_Anti_Alias'>Anti_Aliased</a> <a href='undocumented#Circle'>circle</a> and a blue <a href='undocumented#Alias'>Aliased</a> <a href='undocumented#Circle'>circle</a> scaled
+up by four. After drawing another red <a href='undocumented#Circle'>circle</a> without scaling on top, the <a href='SkCanvas_Reference#Layer'>Layer</a> is
+transferred to the main <a href='SkCanvas_Reference#Canvas'>canvas</a>.
+</div></fiddle-embed></div>
+
+<a name='Layer_SaveLayerRec_Constructors'></a>
+
+<a name='SkCanvas_SaveLayerRec_SaveLayerRec'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkCanvas_SaveLayerRec_SaveLayerRec'>SaveLayerRec()</a>
+</pre>
+
+Sets <a href='#SkCanvas_SaveLayerRec_fBounds'>fBounds</a>, <a href='#SkCanvas_SaveLayerRec_fPaint'>fPaint</a>, and <a href='#SkCanvas_SaveLayerRec_fBackdrop'>fBackdrop</a> to nullptr. Clears <a href='#SkCanvas_SaveLayerRec_fSaveLayerFlags'>fSaveLayerFlags</a>.
+
+### Return Value
+
+empty <a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a>
+
+### Example
+
+<div><fiddle-embed name="b5cea1eed80a0eb04ddbab3f36dff73f">
+
+#### Example Output
+
+~~~~
+rec1 == rec2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_save'>save</a> <a href='#SkCanvas_restore'>restore</a> <a href='#SkCanvas_saveLayer'>saveLayer</a> <a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a> <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a>
+
+<a name='SkCanvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>, <a href='#SkCanvas_SaveLayerFlags'>SaveLayerFlags</a> saveLayerFlags = 0)
+</pre>
+
+Sets <a href='#SkCanvas_SaveLayerRec_fBounds'>fBounds</a>, <a href='#SkCanvas_SaveLayerRec_fPaint'>fPaint</a>, and <a href='#SkCanvas_SaveLayerRec_fSaveLayerFlags'>fSaveLayerFlags</a>; sets <a href='#SkCanvas_SaveLayerRec_fBackdrop'>fBackdrop</a> to nullptr.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_bounds'><code><strong>bounds</strong></code></a></td>
+    <td><a href='SkCanvas_Reference#Layer'>layer</a> dimensions; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_paint'><code><strong>paint</strong></code></a></td>
+    <td>applied to <a href='SkCanvas_Reference#Layer'>layer</a> when overlaying prior <a href='SkCanvas_Reference#Layer'>layer</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_saveLayerFlags'><code><strong>saveLayerFlags</strong></code></a></td>
+    <td><a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a> options to modify <a href='SkCanvas_Reference#Layer'>layer</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a> with empty <a href='#SkCanvas_SaveLayerRec_fBackdrop'>fBackdrop</a>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star">
+
+#### Example Output
+
+~~~~
+rec1 == rec2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_save'>save</a> <a href='#SkCanvas_restore'>restore</a> <a href='#SkCanvas_saveLayer'>saveLayer</a> <a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a> <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a>
+
+<a name='SkCanvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_const_SkImageFilter_star'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>, const <a href='undocumented#SkImageFilter'>SkImageFilter</a>* backdrop,
+             <a href='#SkCanvas_SaveLayerFlags'>SaveLayerFlags</a> saveLayerFlags)
+</pre>
+
+Sets <a href='#SkCanvas_SaveLayerRec_fBounds'>fBounds</a>, <a href='#SkCanvas_SaveLayerRec_fPaint'>fPaint</a>, <a href='#SkCanvas_SaveLayerRec_fBackdrop'>fBackdrop</a>, and <a href='#SkCanvas_SaveLayerRec_fSaveLayerFlags'>fSaveLayerFlags</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_const_SkImageFilter_star_bounds'><code><strong>bounds</strong></code></a></td>
+    <td><a href='SkCanvas_Reference#Layer'>layer</a> dimensions; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_const_SkImageFilter_star_paint'><code><strong>paint</strong></code></a></td>
+    <td>applied to <a href='SkCanvas_Reference#Layer'>layer</a> when overlaying prior <a href='SkCanvas_Reference#Layer'>layer</a>;</td>
+  </tr>
+</table>
+
+may be nullptr
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_const_SkImageFilter_star_backdrop'><code><strong>backdrop</strong></code></a></td>
+    <td>prior <a href='SkCanvas_Reference#Layer'>layer</a> copied with <a href='undocumented#SkImageFilter'>SkImageFilter</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_const_SkImageFilter_star_saveLayerFlags'><code><strong>saveLayerFlags</strong></code></a></td>
+    <td><a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a> options to modify <a href='SkCanvas_Reference#Layer'>layer</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a> fully specified
+
+### Example
+
+<div><fiddle-embed name="@Canvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_const_SkImageFilter_star">
+
+#### Example Output
+
+~~~~
+rec1 == rec2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_save'>save</a> <a href='#SkCanvas_restore'>restore</a> <a href='#SkCanvas_saveLayer'>saveLayer</a> <a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a> <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a>
+
+<a name='SkCanvas_saveLayer_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkCanvas_saveLayer'>saveLayer</a>(const <a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a>& layerRec)
+</pre>
+
+Saves <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip, and allocates <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> for subsequent drawing.
+
+Calling <a href='#SkCanvas_restore'>restore()</a> discards changes to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and clip,
+and blends <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> with <a href='SkColor_Reference#Alpha'>alpha</a> opacity onto the prior <a href='SkCanvas_Reference#Layer'>layer</a>.
+
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> may be changed by <a href='#SkCanvas_translate'>translate()</a>, <a href='#SkCanvas_scale'>scale()</a>, <a href='#SkCanvas_rotate'>rotate()</a>, <a href='#SkCanvas_skew'>skew()</a>, <a href='#SkCanvas_concat'>concat()</a>,
+<a href='#SkCanvas_setMatrix'>setMatrix</a>(), and <a href='#SkCanvas_resetMatrix'>resetMatrix</a>(). Clip may be changed by <a href='#SkCanvas_clipRect'>clipRect</a>(), <a href='#SkCanvas_clipRRect'>clipRRect</a>(),
+<a href='#SkCanvas_clipPath'>clipPath</a>(), <a href='#SkCanvas_clipRegion'>clipRegion</a>().
+
+<a href='#SkCanvas_SaveLayerRec'>SaveLayerRec</a> contains the state used to create the <a href='SkCanvas_Reference#Layer'>layer</a>.
+
+Call <a href='#SkCanvas_restoreToCount'>restoreToCount</a>() with returned value to restore this and subsequent saves.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_saveLayer_3_layerRec'><code><strong>layerRec</strong></code></a></td>
+    <td><a href='SkCanvas_Reference#Layer'>layer</a> state</td>
+  </tr>
+</table>
+
+### Return Value
+
+depth of save  <a href='#State_Stack'>state stack</a> before this call was made.
+
+### Example
+
+<div><fiddle-embed name="@Canvas_saveLayer_3"><div>The example draws an <a href='SkImage_Reference#Image'>image</a>, and saves it into a <a href='SkCanvas_Reference#Layer'>Layer</a> with <a href='#SkCanvas_kInitWithPrevious_SaveLayerFlag'>kInitWithPrevious_SaveLayerFlag</a>.
+Next it punches a hole in <a href='SkCanvas_Reference#Layer'>Layer</a> and restore with <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kPlus'>kPlus</a>.
+Where <a href='SkCanvas_Reference#Layer'>Layer</a> was cleared, the original <a href='SkImage_Reference#Image'>image</a> will draw unchanged.
+Outside of the <a href='undocumented#Circle'>circle</a> the mandrill is brightened.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_save'>save</a> <a href='#SkCanvas_restore'>restore</a> <a href='#SkCanvas_saveLayer'>saveLayer</a> <a href='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a> <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a>
+
+<a name='Matrix'></a>
+
+<a name='SkCanvas_translate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void translate(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Translates <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> by <a href='#SkCanvas_translate_dx'>dx</a> along the x-axis and <a href='#SkCanvas_translate_dy'>dy</a> along the y-axis.
+
+Mathematically, replaces <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> with a translation <a href='SkMatrix_Reference#Matrix'>matrix</a>
+<a href='undocumented#Premultiply'>premultiplied</a> with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+This has the effect of moving the drawing by (<a href='#SkCanvas_translate_dx'>dx</a>, <a href='#SkCanvas_translate_dy'>dy</a>) before transforming
+the result with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_translate_dx'><code><strong>dx</strong></code></a></td>
+    <td>distance to translate on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_translate_dy'><code><strong>dy</strong></code></a></td>
+    <td>distance to translate on y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_translate"><div><a href='#SkCanvas_scale'>scale()</a> followed by <a href='#SkCanvas_translate'>translate()</a> produces different results from <a href='#SkCanvas_translate'>translate()</a> followed
+by <a href='#SkCanvas_scale'>scale()</a>.
+
+The blue stroke follows translate of (50, 50); a black
+fill follows scale of (2, 1/2.f). After restoring the clip, which resets
+<a href='SkMatrix_Reference#Matrix'>Matrix</a>, a red frame follows the same scale of (2, 1/2.f); a gray fill
+follows translate of (50, 50).
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_concat'>concat()</a> <a href='#SkCanvas_scale'>scale()</a> <a href='#SkCanvas_skew'>skew()</a> <a href='#SkCanvas_rotate'>rotate()</a> <a href='#SkCanvas_setMatrix'>setMatrix</a>
+
+<a name='SkCanvas_scale'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void scale(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy)
+</pre>
+
+Scales <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> by <a href='#SkCanvas_scale_sx'>sx</a> on the x-axis and <a href='#SkCanvas_scale_sy'>sy</a> on the y-axis.
+
+Mathematically, replaces <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> with a scale <a href='SkMatrix_Reference#Matrix'>matrix</a>
+<a href='undocumented#Premultiply'>premultiplied</a> with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+This has the effect of scaling the drawing by (<a href='#SkCanvas_scale_sx'>sx</a>, <a href='#SkCanvas_scale_sy'>sy</a>) before transforming
+the result with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_scale_sx'><code><strong>sx</strong></code></a></td>
+    <td>amount to scale on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_scale_sy'><code><strong>sy</strong></code></a></td>
+    <td>amount to scale on y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_scale"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_concat'>concat()</a> <a href='#SkCanvas_translate'>translate()</a> <a href='#SkCanvas_skew'>skew()</a> <a href='#SkCanvas_rotate'>rotate()</a> <a href='#SkCanvas_setMatrix'>setMatrix</a>
+
+<a name='SkCanvas_rotate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void rotate(<a href='undocumented#SkScalar'>SkScalar</a> degrees)
+</pre>
+
+Rotates <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> by <a href='#SkCanvas_rotate_degrees'>degrees</a>. Positive <a href='#SkCanvas_rotate_degrees'>degrees</a> rotates clockwise.
+
+Mathematically, replaces <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> with a rotation <a href='SkMatrix_Reference#Matrix'>matrix</a>
+<a href='undocumented#Premultiply'>premultiplied</a> with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+This has the effect of rotating the drawing by <a href='#SkCanvas_rotate_degrees'>degrees</a> before transforming
+the result with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_rotate_degrees'><code><strong>degrees</strong></code></a></td>
+    <td>amount to rotate, in <a href='#SkCanvas_rotate_degrees'>degrees</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_rotate"><div>Draw clock hands at time 5:10. The hour hand and minute hand <a href='SkPoint_Reference#Point'>point</a> up and
+are rotated clockwise.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_concat'>concat()</a> <a href='#SkCanvas_translate'>translate()</a> <a href='#SkCanvas_skew'>skew()</a> <a href='#SkCanvas_scale'>scale()</a> <a href='#SkCanvas_setMatrix'>setMatrix</a>
+
+<a name='SkCanvas_rotate_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void rotate(<a href='undocumented#SkScalar'>SkScalar</a> degrees, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py)
+</pre>
+
+Rotates <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> by <a href='#SkCanvas_rotate_2_degrees'>degrees</a> about a <a href='SkPoint_Reference#Point'>point</a> at (<a href='#SkCanvas_rotate_2_px'>px</a>, <a href='#SkCanvas_rotate_2_py'>py</a>). Positive <a href='#SkCanvas_rotate_2_degrees'>degrees</a> rotates
+clockwise.
+
+Mathematically, constructs a rotation <a href='SkMatrix_Reference#Matrix'>matrix</a>; <a href='undocumented#Premultiply'>premultiplies</a> the rotation <a href='SkMatrix_Reference#Matrix'>matrix</a> by
+a translation <a href='SkMatrix_Reference#Matrix'>matrix</a>; then replaces <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> with the resulting <a href='SkMatrix_Reference#Matrix'>matrix</a>
+<a href='undocumented#Premultiply'>premultiplied</a> with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+This has the effect of rotating the drawing about a given <a href='SkPoint_Reference#Point'>point</a> before
+transforming the result with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_rotate_2_degrees'><code><strong>degrees</strong></code></a></td>
+    <td>amount to rotate, in <a href='#SkCanvas_rotate_2_degrees'>degrees</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_rotate_2_px'><code><strong>px</strong></code></a></td>
+    <td>x-axis value of the <a href='SkPoint_Reference#Point'>point</a> to rotate about</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_rotate_2_py'><code><strong>py</strong></code></a></td>
+    <td>y-axis value of the <a href='SkPoint_Reference#Point'>point</a> to rotate about</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_rotate_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_concat'>concat()</a> <a href='#SkCanvas_translate'>translate()</a> <a href='#SkCanvas_skew'>skew()</a> <a href='#SkCanvas_scale'>scale()</a> <a href='#SkCanvas_setMatrix'>setMatrix</a>
+
+<a name='SkCanvas_skew'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void skew(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy)
+</pre>
+
+Skews <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> by <a href='#SkCanvas_skew_sx'>sx</a> on the x-axis and <a href='#SkCanvas_skew_sy'>sy</a> on the y-axis. A positive value of <a href='#SkCanvas_skew_sx'>sx</a>
+skews the drawing right as y-axis values increase; a positive value of <a href='#SkCanvas_skew_sy'>sy</a> skews
+the drawing down as x-axis values increase.
+
+Mathematically, replaces <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> with a skew <a href='SkMatrix_Reference#Matrix'>matrix</a> <a href='undocumented#Premultiply'>premultiplied</a> with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+This has the effect of skewing the drawing by (<a href='#SkCanvas_skew_sx'>sx</a>, <a href='#SkCanvas_skew_sy'>sy</a>) before transforming
+the result with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_skew_sx'><code><strong>sx</strong></code></a></td>
+    <td>amount to skew on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_skew_sy'><code><strong>sy</strong></code></a></td>
+    <td>amount to skew on y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_skew"><div>Black <a href='undocumented#Text'>text</a> mimics an oblique <a href='undocumented#Text'>text</a> style by using a negative skew on x-axis
+that shifts the geometry to the right as the y-axis values decrease.
+Red <a href='undocumented#Text'>text</a> uses a positive skew on y-axis to shift the geometry down
+as the x-axis values increase.
+Blue <a href='undocumented#Text'>text</a> combines <a href='#SkCanvas_skew_sx'>sx</a> and <a href='#SkCanvas_skew_sy'>sy</a> skew to rotate and scale.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_concat'>concat()</a> <a href='#SkCanvas_translate'>translate()</a> <a href='#SkCanvas_rotate'>rotate()</a> <a href='#SkCanvas_scale'>scale()</a> <a href='#SkCanvas_setMatrix'>setMatrix</a>
+
+<a name='SkCanvas_concat'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_concat'>concat</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='SkMatrix_Reference#Matrix'>matrix</a>)
+</pre>
+
+Replaces <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> with <a href='#SkCanvas_concat_matrix'>matrix</a> <a href='undocumented#Premultiply'>premultiplied</a> with existing <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+This has the effect of transforming the drawn geometry by <a href='#SkCanvas_concat_matrix'>matrix</a>, before
+transforming the result with existing <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_concat_matrix'><code><strong>matrix</strong></code></a></td>
+    <td><a href='#SkCanvas_concat_matrix'>matrix</a> to <a href='undocumented#Premultiply'>premultiply</a> with existing <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_concat"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_translate'>translate()</a> <a href='#SkCanvas_rotate'>rotate()</a> <a href='#SkCanvas_scale'>scale()</a> <a href='#SkCanvas_skew'>skew()</a> <a href='#SkCanvas_setMatrix'>setMatrix</a>
+
+<a name='SkCanvas_setMatrix'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_setMatrix'>setMatrix</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='SkMatrix_Reference#Matrix'>matrix</a>)
+</pre>
+
+Replaces <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> with <a href='#SkCanvas_setMatrix_matrix'>matrix</a>.
+Unlike <a href='#SkCanvas_concat'>concat()</a>, any prior <a href='#SkCanvas_setMatrix_matrix'>matrix</a> state is overwritten.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_setMatrix_matrix'><code><strong>matrix</strong></code></a></td>
+    <td><a href='#SkCanvas_setMatrix_matrix'>matrix</a> to copy, replacing existing <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_setMatrix"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_resetMatrix'>resetMatrix</a> <a href='#SkCanvas_concat'>concat()</a> <a href='#SkCanvas_translate'>translate()</a> <a href='#SkCanvas_rotate'>rotate()</a> <a href='#SkCanvas_scale'>scale()</a> <a href='#SkCanvas_skew'>skew()</a>
+
+<a name='SkCanvas_resetMatrix'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_resetMatrix'>resetMatrix</a>()
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to the identity <a href='SkMatrix_Reference#Matrix'>matrix</a>.
+Any prior <a href='SkMatrix_Reference#Matrix'>matrix</a> state is overwritten.
+
+### Example
+
+<div><fiddle-embed name="@Canvas_resetMatrix"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_setMatrix'>setMatrix</a> <a href='#SkCanvas_concat'>concat()</a> <a href='#SkCanvas_translate'>translate()</a> <a href='#SkCanvas_rotate'>rotate()</a> <a href='#SkCanvas_scale'>scale()</a> <a href='#SkCanvas_skew'>skew()</a>
+
+<a name='SkCanvas_getTotalMatrix'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='#SkCanvas_getTotalMatrix'>getTotalMatrix</a>()const
+</pre>
+
+Returns <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+This does not account for translation by <a href='undocumented#SkBaseDevice'>SkBaseDevice</a> or <a href='SkSurface_Reference#SkSurface'>SkSurface</a>.
+
+### Return Value
+
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> in <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_getTotalMatrix">
+
+#### Example Output
+
+~~~~
+isIdentity true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_setMatrix'>setMatrix</a> <a href='#SkCanvas_resetMatrix'>resetMatrix</a> <a href='#SkCanvas_concat'>concat()</a>
+
+<a name='Clip'></a>
+
+---
+
+Clip is built from a stack of clipping <a href='SkPath_Reference#Path'>paths</a>. Each <a href='SkPath_Reference#Path'>Path</a> in the
+stack can be constructed from one or more <a href='#Path_Overview_Contour'>Path_Contour</a> elements. The
+<a href='#Path_Overview_Contour'>Path_Contour</a> may be composed of any number of <a href='#Path_Verb'>Path_Verb</a> segments. Each
+<a href='#Path_Overview_Contour'>Path_Contour</a> forms a closed area; <a href='#Path_Fill_Type'>Path_Fill_Type</a> defines the area enclosed
+by <a href='#Path_Overview_Contour'>Path_Contour</a>.
+
+Clip stack of <a href='SkPath_Reference#Path'>Path</a> elements successfully restrict the <a href='SkPath_Reference#Path'>Path</a> area. Each
+<a href='SkPath_Reference#Path'>Path</a> is transformed by <a href='SkMatrix_Reference#Matrix'>Matrix</a>, then intersected with or subtracted from the
+prior Clip to form the replacement Clip. Use <a href='undocumented#SkClipOp'>SkClipOp</a>::<a href='#SkClipOp_kDifference'>kDifference</a>
+to subtract <a href='SkPath_Reference#Path'>Path</a> from Clip; use <a href='undocumented#SkClipOp'>SkClipOp</a>::<a href='#SkClipOp_kIntersect'>kIntersect</a> to intersect <a href='SkPath_Reference#Path'>Path</a>
+with Clip.
+
+A clipping <a href='SkPath_Reference#Path'>Path</a> may be <a href='#Paint_Anti_Alias'>Anti_Aliased</a>; if <a href='SkPath_Reference#Path'>Path</a>, after transformation, is
+composed of horizontal and vertical <a href='undocumented#Line'>lines</a>, clearing <a href='#Paint_Anti_Alias'>Anti_Alias</a> allows whole pixels
+to either be inside or outside the clip. The fastest drawing has a <a href='undocumented#Alias'>Aliased</a>,
+rectangular clip.
+
+If clipping <a href='SkPath_Reference#Path'>Path</a> has <a href='#Paint_Anti_Alias'>Anti_Alias</a> set, clip may partially clip a <a href='undocumented#Pixel'>pixel</a>, requiring
+that drawing blend partially with the destination along the edge. A rotated
+rectangular <a href='#Paint_Anti_Alias'>Anti_Aliased</a> clip looks smoother but draws slower.
+
+Clip can combine with <a href='SkRect_Reference#Rect'>Rect</a> and <a href='#RRect'>Round_Rect</a> primitives; like
+<a href='SkPath_Reference#Path'>Path</a>, these are transformed by <a href='SkMatrix_Reference#Matrix'>Matrix</a> before they are combined with Clip.
+
+Clip can combine with <a href='SkRegion_Reference#Region'>Region</a>. <a href='SkRegion_Reference#Region'>Region</a> is assumed to be in <a href='undocumented#Device'>Device</a> coordinates
+and is unaffected by <a href='SkMatrix_Reference#Matrix'>Matrix</a>.
+
+### Example
+
+<div><fiddle-embed name="@Clip"><div>Draw a red <a href='undocumented#Circle'>circle</a> with an <a href='undocumented#Alias'>Aliased</a> clip and an <a href='#Paint_Anti_Alias'>Anti_Aliased</a> clip.
+Use an  <a href='SkImage_Reference#Image'>image filter</a> to zoom into the pixels drawn.
+The edge of the <a href='undocumented#Alias'>Aliased</a> clip fully draws pixels in the red <a href='undocumented#Circle'>circle</a>.
+The edge of the <a href='#Paint_Anti_Alias'>Anti_Aliased</a> clip partially draws pixels in the red <a href='undocumented#Circle'>circle</a>.
+</div></fiddle-embed></div>
+
+<a name='SkCanvas_clipRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_clipRect'>clipRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='undocumented#SkClipOp'>SkClipOp</a> op, bool doAntiAlias)
+</pre>
+
+Replaces clip with the intersection or difference of clip and <a href='#SkCanvas_clipRect_rect'>rect</a>,
+with an <a href='undocumented#Alias'>aliased</a> or <a href='SkPaint_Reference#Anti_Alias'>anti-aliased</a> clip edge. <a href='#SkCanvas_clipRect_rect'>rect</a> is transformed by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+before it is combined with clip.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_clipRect_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to combine with clip</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_clipRect_op'><code><strong>op</strong></code></a></td>
+    <td><a href='undocumented#SkClipOp'>SkClipOp</a> to apply to clip</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_clipRect_doAntiAlias'><code><strong>doAntiAlias</strong></code></a></td>
+    <td>true if clip is to be <a href='SkPaint_Reference#Anti_Alias'>anti-aliased</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_clipRect"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_clipRRect'>clipRRect</a> <a href='#SkCanvas_clipPath'>clipPath</a> <a href='#SkCanvas_clipRegion'>clipRegion</a>
+
+<a name='SkCanvas_clipRect_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_clipRect'>clipRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='undocumented#SkClipOp'>SkClipOp</a> op)
+</pre>
+
+Replaces clip with the intersection or difference of clip and <a href='#SkCanvas_clipRect_2_rect'>rect</a>.
+Resulting clip is <a href='undocumented#Alias'>aliased</a>; pixels are fully contained by the clip.
+<a href='#SkCanvas_clipRect_2_rect'>rect</a> is transformed by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> before it is combined with clip.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_clipRect_2_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to combine with clip</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_clipRect_2_op'><code><strong>op</strong></code></a></td>
+    <td><a href='undocumented#SkClipOp'>SkClipOp</a> to apply to clip</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_clipRect_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_clipRRect'>clipRRect</a> <a href='#SkCanvas_clipPath'>clipPath</a> <a href='#SkCanvas_clipRegion'>clipRegion</a>
+
+<a name='SkCanvas_clipRect_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_clipRect'>clipRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, bool doAntiAlias = false)
+</pre>
+
+Replaces clip with the intersection of clip and <a href='#SkCanvas_clipRect_3_rect'>rect</a>.
+Resulting clip is <a href='undocumented#Alias'>aliased</a>; pixels are fully contained by the clip.
+<a href='#SkCanvas_clipRect_3_rect'>rect</a> is transformed by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+before it is combined with clip.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_clipRect_3_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to combine with clip</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_clipRect_3_doAntiAlias'><code><strong>doAntiAlias</strong></code></a></td>
+    <td>true if clip is to be <a href='SkPaint_Reference#Anti_Alias'>anti-aliased</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_clipRect_3"><div>A <a href='undocumented#Circle'>circle</a> drawn in pieces looks uniform when drawn <a href='undocumented#Alias'>Aliased</a>.
+The same <a href='undocumented#Circle'>circle</a> pieces blend with pixels more than once when <a href='#Paint_Anti_Alias'>Anti_Aliased</a>,
+visible as a thin pair of <a href='undocumented#Line'>lines</a> through the right <a href='undocumented#Circle'>circle</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_clipRRect'>clipRRect</a> <a href='#SkCanvas_clipPath'>clipPath</a> <a href='#SkCanvas_clipRegion'>clipRegion</a>
+
+<a name='SkCanvas_clipRRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_clipRRect'>clipRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect, <a href='undocumented#SkClipOp'>SkClipOp</a> op, bool doAntiAlias)
+</pre>
+
+Replaces clip with the intersection or difference of clip and <a href='#SkCanvas_clipRRect_rrect'>rrect</a>,
+with an <a href='undocumented#Alias'>aliased</a> or <a href='SkPaint_Reference#Anti_Alias'>anti-aliased</a> clip edge.
+<a href='#SkCanvas_clipRRect_rrect'>rrect</a> is transformed by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+before it is combined with clip.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_clipRRect_rrect'><code><strong>rrect</strong></code></a></td>
+    <td><a href='SkRRect_Reference#SkRRect'>SkRRect</a> to combine with clip</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_clipRRect_op'><code><strong>op</strong></code></a></td>
+    <td><a href='undocumented#SkClipOp'>SkClipOp</a> to apply to clip</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_clipRRect_doAntiAlias'><code><strong>doAntiAlias</strong></code></a></td>
+    <td>true if clip is to be <a href='SkPaint_Reference#Anti_Alias'>anti-aliased</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_clipRRect"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_clipRect'>clipRect</a> <a href='#SkCanvas_clipPath'>clipPath</a> <a href='#SkCanvas_clipRegion'>clipRegion</a>
+
+<a name='SkCanvas_clipRRect_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_clipRRect'>clipRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect, <a href='undocumented#SkClipOp'>SkClipOp</a> op)
+</pre>
+
+Replaces clip with the intersection or difference of clip and <a href='#SkCanvas_clipRRect_2_rrect'>rrect</a>.
+Resulting clip is <a href='undocumented#Alias'>aliased</a>; pixels are fully contained by the clip.
+<a href='#SkCanvas_clipRRect_2_rrect'>rrect</a> is transformed by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> before it is combined with clip.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_clipRRect_2_rrect'><code><strong>rrect</strong></code></a></td>
+    <td><a href='SkRRect_Reference#SkRRect'>SkRRect</a> to combine with clip</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_clipRRect_2_op'><code><strong>op</strong></code></a></td>
+    <td><a href='undocumented#SkClipOp'>SkClipOp</a> to apply to clip</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_clipRRect_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_clipRect'>clipRect</a> <a href='#SkCanvas_clipPath'>clipPath</a> <a href='#SkCanvas_clipRegion'>clipRegion</a>
+
+<a name='SkCanvas_clipRRect_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_clipRRect'>clipRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect, bool doAntiAlias = false)
+</pre>
+
+Replaces clip with the intersection of clip and <a href='#SkCanvas_clipRRect_3_rrect'>rrect</a>,
+with an <a href='undocumented#Alias'>aliased</a> or <a href='SkPaint_Reference#Anti_Alias'>anti-aliased</a> clip edge.
+<a href='#SkCanvas_clipRRect_3_rrect'>rrect</a> is transformed by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> before it is combined with clip.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_clipRRect_3_rrect'><code><strong>rrect</strong></code></a></td>
+    <td><a href='SkRRect_Reference#SkRRect'>SkRRect</a> to combine with clip</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_clipRRect_3_doAntiAlias'><code><strong>doAntiAlias</strong></code></a></td>
+    <td>true if clip is to be <a href='SkPaint_Reference#Anti_Alias'>anti-aliased</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_clipRRect_3"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_clipRect'>clipRect</a> <a href='#SkCanvas_clipPath'>clipPath</a> <a href='#SkCanvas_clipRegion'>clipRegion</a>
+
+<a name='SkCanvas_clipPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_clipPath'>clipPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>, <a href='undocumented#SkClipOp'>SkClipOp</a> op, bool doAntiAlias)
+</pre>
+
+Replaces clip with the intersection or difference of clip and <a href='#SkCanvas_clipPath_path'>path</a>,
+with an <a href='undocumented#Alias'>aliased</a> or <a href='SkPaint_Reference#Anti_Alias'>anti-aliased</a> clip edge. <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_FillType'>FillType</a> determines if <a href='#SkCanvas_clipPath_path'>path</a>
+describes the area inside or outside its <a href='SkPath_Overview#Contour'>contours</a>; and if  <a href='SkPath_Overview#Contour'>path contour</a> overlaps
+itself or another  <a href='SkPath_Overview#Contour'>path contour</a>, whether the overlaps form part of the area.
+<a href='#SkCanvas_clipPath_path'>path</a> is transformed by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> before it is combined with clip.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_clipPath_path'><code><strong>path</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to combine with clip</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_clipPath_op'><code><strong>op</strong></code></a></td>
+    <td><a href='undocumented#SkClipOp'>SkClipOp</a> to apply to clip</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_clipPath_doAntiAlias'><code><strong>doAntiAlias</strong></code></a></td>
+    <td>true if clip is to be <a href='SkPaint_Reference#Anti_Alias'>anti-aliased</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_clipPath"><div>Top figure uses <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kInverseWinding_FillType'>kInverseWinding_FillType</a> and <a href='undocumented#SkClipOp'>SkClipOp</a>::<a href='#SkClipOp_kDifference'>kDifference</a>;
+area outside clip is subtracted from <a href='undocumented#Circle'>circle</a>.
+
+Bottom figure uses <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kWinding_FillType'>kWinding_FillType</a> and <a href='undocumented#SkClipOp'>SkClipOp</a>::<a href='#SkClipOp_kIntersect'>kIntersect</a>;
+area inside clip is intersected with <a href='undocumented#Circle'>circle</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_clipRect'>clipRect</a> <a href='#SkCanvas_clipRRect'>clipRRect</a> <a href='#SkCanvas_clipRegion'>clipRegion</a>
+
+<a name='SkCanvas_clipPath_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_clipPath'>clipPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>, <a href='undocumented#SkClipOp'>SkClipOp</a> op)
+</pre>
+
+Replaces clip with the intersection or difference of clip and <a href='#SkCanvas_clipPath_2_path'>path</a>.
+Resulting clip is <a href='undocumented#Alias'>aliased</a>; pixels are fully contained by the clip.
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_FillType'>FillType</a> determines if <a href='#SkCanvas_clipPath_2_path'>path</a>
+describes the area inside or outside its <a href='SkPath_Overview#Contour'>contours</a>; and if  <a href='SkPath_Overview#Contour'>path contour</a> overlaps
+itself or another  <a href='SkPath_Overview#Contour'>path contour</a>, whether the overlaps form part of the area.
+<a href='#SkCanvas_clipPath_2_path'>path</a> is transformed by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+before it is combined with clip.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_clipPath_2_path'><code><strong>path</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to combine with clip</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_clipPath_2_op'><code><strong>op</strong></code></a></td>
+    <td><a href='undocumented#SkClipOp'>SkClipOp</a> to apply to clip</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_clipPath_2"><div>Overlapping <a href='SkRect_Reference#Rect'>Rects</a> form a clip. When clip <a href='#Path_Fill_Type'>Path_Fill_Type</a> is set to
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kWinding_FillType'>kWinding_FillType</a>, the overlap is included. Set to
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a>, the overlap is excluded and forms a hole.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_clipRect'>clipRect</a> <a href='#SkCanvas_clipRRect'>clipRRect</a> <a href='#SkCanvas_clipRegion'>clipRegion</a>
+
+<a name='SkCanvas_clipPath_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_clipPath'>clipPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>, bool doAntiAlias = false)
+</pre>
+
+Replaces clip with the intersection of clip and <a href='#SkCanvas_clipPath_3_path'>path</a>.
+Resulting clip is <a href='undocumented#Alias'>aliased</a>; pixels are fully contained by the clip.
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_FillType'>FillType</a> determines if <a href='#SkCanvas_clipPath_3_path'>path</a>
+describes the area inside or outside its <a href='SkPath_Overview#Contour'>contours</a>; and if  <a href='SkPath_Overview#Contour'>path contour</a> overlaps
+itself or another  <a href='SkPath_Overview#Contour'>path contour</a>, whether the overlaps form part of the area.
+<a href='#SkCanvas_clipPath_3_path'>path</a> is transformed by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> before it is combined with clip.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_clipPath_3_path'><code><strong>path</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to combine with clip</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_clipPath_3_doAntiAlias'><code><strong>doAntiAlias</strong></code></a></td>
+    <td>true if clip is to be <a href='SkPaint_Reference#Anti_Alias'>anti-aliased</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_clipPath_3"><div>Clip loops over itself covering its center twice. When clip <a href='#Path_Fill_Type'>Path_Fill_Type</a>
+is set to <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kWinding_FillType'>kWinding_FillType</a>, the overlap is included. Set to
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a>, the overlap is excluded and forms a hole.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_clipRect'>clipRect</a> <a href='#SkCanvas_clipRRect'>clipRRect</a> <a href='#SkCanvas_clipRegion'>clipRegion</a>
+
+<a name='SkCanvas_clipRegion'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_clipRegion'>clipRegion</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& deviceRgn, <a href='undocumented#SkClipOp'>SkClipOp</a> op = <a href='undocumented#SkClipOp'>SkClipOp</a>::<a href='#SkClipOp_kIntersect'>kIntersect</a>)
+</pre>
+
+Replaces clip with the intersection or difference of clip and <a href='SkRegion_Reference#SkRegion'>SkRegion</a> <a href='#SkCanvas_clipRegion_deviceRgn'>deviceRgn</a>.
+Resulting clip is <a href='undocumented#Alias'>aliased</a>; pixels are fully contained by the clip.
+<a href='#SkCanvas_clipRegion_deviceRgn'>deviceRgn</a> is unaffected by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_clipRegion_deviceRgn'><code><strong>deviceRgn</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> to combine with clip</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_clipRegion_op'><code><strong>op</strong></code></a></td>
+    <td><a href='undocumented#SkClipOp'>SkClipOp</a> to apply to clip</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_clipRegion"><div><a href='SkRegion_Reference#Region'>region</a> is unaffected by <a href='SkCanvas_Reference#Canvas'>canvas</a> rotation; iRect is affected by <a href='SkCanvas_Reference#Canvas'>canvas</a> rotation.
+Both clips are <a href='undocumented#Alias'>Aliased</a>; this is not noticeable on <a href='SkRegion_Reference#Region'>Region</a> clip because it
+aligns to <a href='undocumented#Pixel'>pixel</a> boundaries.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_clipRect'>clipRect</a> <a href='#SkCanvas_clipRRect'>clipRRect</a> <a href='#SkCanvas_clipPath'>clipPath</a>
+
+<a name='SkCanvas_quickReject'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkCanvas_quickReject'>quickReject</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>)const
+</pre>
+
+Returns true if <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_quickReject_rect'>rect</a>, transformed by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, can be quickly determined to be
+outside of clip. May return false even though <a href='#SkCanvas_quickReject_rect'>rect</a> is outside of clip.
+
+Use to check if an area to be drawn is clipped out, to skip subsequent draw calls.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_quickReject_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to compare with clip</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkCanvas_quickReject_rect'>rect</a>, transformed by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, does not intersect clip
+
+### Example
+
+<div><fiddle-embed name="@Canvas_quickReject">
+
+#### Example Output
+
+~~~~
+quickReject true
+quickReject false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_getLocalClipBounds'>getLocalClipBounds</a> <a href='#SkCanvas_getTotalMatrix'>getTotalMatrix</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_drawsNothing'>drawsNothing</a>
+
+<a name='SkCanvas_quickReject_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkCanvas_quickReject'>quickReject</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>)const
+</pre>
+
+Returns true if <a href='#SkCanvas_quickReject_2_path'>path</a>, transformed by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, can be quickly determined to be
+outside of clip. May return false even though <a href='#SkCanvas_quickReject_2_path'>path</a> is outside of clip.
+
+Use to check if an area to be drawn is clipped out, to skip subsequent draw calls.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_quickReject_2_path'><code><strong>path</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to compare with clip</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkCanvas_quickReject_2_path'>path</a>, transformed by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, does not intersect clip
+
+### Example
+
+<div><fiddle-embed name="@Canvas_quickReject_2">
+
+#### Example Output
+
+~~~~
+quickReject true
+quickReject false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_getLocalClipBounds'>getLocalClipBounds</a> <a href='#SkCanvas_getTotalMatrix'>getTotalMatrix</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_drawsNothing'>drawsNothing</a>
+
+<a name='SkCanvas_getLocalClipBounds'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_getLocalClipBounds'>getLocalClipBounds</a>()const
+</pre>
+
+Returns bounds of clip, transformed by inverse of <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. If clip is empty,
+return <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_MakeEmpty'>MakeEmpty</a>, where all <a href='SkRect_Reference#SkRect'>SkRect</a> sides equal zero.
+
+<a href='SkRect_Reference#SkRect'>SkRect</a> returned is outset by one to account for partial <a href='undocumented#Pixel'>pixel</a> coverage if clip
+is <a href='SkPaint_Reference#Anti_Alias'>anti-aliased</a>.
+
+### Return Value
+
+bounds of clip in local coordinates
+
+### Example
+
+<div><fiddle-embed name="@Canvas_getLocalClipBounds"><div>Initial bounds is <a href='undocumented#Device'>device</a> bounds outset by 1 on all sides.
+Clipped bounds is <a href='#SkCanvas_clipPath'>clipPath</a> bounds outset by 1 on all sides.
+Scaling the <a href='SkCanvas_Reference#Canvas'>canvas</a> by two on both axes scales the local bounds by 1/2
+on both axes.
+</div>
+
+#### Example Output
+
+~~~~
+left:-1  top:-1  right:257  bottom:257
+left:29  top:129  right:121  bottom:231
+left:14.5  top:64.5  right:60.5  bottom:115.5
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_getDeviceClipBounds'>getDeviceClipBounds</a> <a href='#SkCanvas_getBaseLayerSize'>getBaseLayerSize</a> <a href='#SkCanvas_quickReject'>quickReject</a>
+
+<a name='SkCanvas_getLocalClipBounds_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkCanvas_getLocalClipBounds'>getLocalClipBounds</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* bounds)const
+</pre>
+
+Returns <a href='#SkCanvas_getLocalClipBounds_2_bounds'>bounds</a> of clip, transformed by inverse of <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. If clip is empty,
+return false, and set <a href='#SkCanvas_getLocalClipBounds_2_bounds'>bounds</a> to <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_MakeEmpty'>MakeEmpty</a>, where all <a href='SkRect_Reference#SkRect'>SkRect</a> sides equal zero.
+
+<a href='#SkCanvas_getLocalClipBounds_2_bounds'>bounds</a> is outset by one to account for partial <a href='undocumented#Pixel'>pixel</a> coverage if clip
+is <a href='SkPaint_Reference#Anti_Alias'>anti-aliased</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_getLocalClipBounds_2_bounds'><code><strong>bounds</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> of clip in local coordinates</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if clip <a href='#SkCanvas_getLocalClipBounds_2_bounds'>bounds</a> is not empty
+
+### Example
+
+<div><fiddle-embed name="@Canvas_getLocalClipBounds_2">
+
+#### Example Output
+
+~~~~
+local bounds empty = false
+local bounds empty = true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_getDeviceClipBounds'>getDeviceClipBounds</a> <a href='#SkCanvas_getBaseLayerSize'>getBaseLayerSize</a> <a href='#SkCanvas_quickReject'>quickReject</a>
+
+<a name='SkCanvas_getDeviceClipBounds'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkCanvas_getDeviceClipBounds'>getDeviceClipBounds</a>()const
+</pre>
+
+Returns <a href='SkIRect_Reference#SkIRect'>SkIRect</a> bounds of clip, unaffected by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. If clip is empty,
+return <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_MakeEmpty'>MakeEmpty</a>, where all <a href='SkRect_Reference#SkRect'>SkRect</a> sides equal zero.
+
+Unlike <a href='#SkCanvas_getLocalClipBounds'>getLocalClipBounds</a>(), returned <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is not outset.
+
+### Return Value
+
+bounds of clip in <a href='undocumented#SkBaseDevice'>SkBaseDevice</a> coordinates
+
+### Example
+
+<div><fiddle-embed name="@Canvas_getDeviceClipBounds"><div>Initial bounds is <a href='undocumented#Device'>device</a> bounds, not outset.
+Clipped bounds is <a href='#SkCanvas_clipPath'>clipPath</a> bounds, not outset.
+Scaling the <a href='SkCanvas_Reference#Canvas'>canvas</a> by 1/2 on both axes scales the <a href='undocumented#Device'>device</a> bounds by 1/2
+on both axes.
+</div>
+
+#### Example Output
+
+~~~~
+left:0  top:0  right:256  bottom:256
+left:30  top:130  right:120  bottom:230
+left:15  top:65  right:60  bottom:115
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_getLocalClipBounds'>getLocalClipBounds</a> <a href='#SkCanvas_getBaseLayerSize'>getBaseLayerSize</a> <a href='#SkCanvas_quickReject'>quickReject</a>
+
+<a name='SkCanvas_getDeviceClipBounds_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkCanvas_getDeviceClipBounds'>getDeviceClipBounds</a>(<a href='SkIRect_Reference#SkIRect'>SkIRect</a>* bounds)const
+</pre>
+
+Returns <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkCanvas_getDeviceClipBounds_2_bounds'>bounds</a> of clip, unaffected by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. If clip is empty,
+return false, and set <a href='#SkCanvas_getDeviceClipBounds_2_bounds'>bounds</a> to <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_MakeEmpty'>MakeEmpty</a>, where all <a href='SkRect_Reference#SkRect'>SkRect</a> sides equal zero.
+
+Unlike <a href='#SkCanvas_getLocalClipBounds'>getLocalClipBounds</a>(), <a href='#SkCanvas_getDeviceClipBounds_2_bounds'>bounds</a> is not outset.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_getDeviceClipBounds_2_bounds'><code><strong>bounds</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> of clip in <a href='undocumented#Device'>device</a> coordinates</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if clip <a href='#SkCanvas_getDeviceClipBounds_2_bounds'>bounds</a> is not empty
+
+### Example
+
+<div><fiddle-embed name="@Canvas_getDeviceClipBounds_2">
+
+#### Example Output
+
+~~~~
+device bounds empty = false
+device bounds empty = true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_getLocalClipBounds'>getLocalClipBounds</a> <a href='#SkCanvas_getBaseLayerSize'>getBaseLayerSize</a> <a href='#SkCanvas_quickReject'>quickReject</a>
+
+<a name='Draw'></a>
+
+<a name='SkCanvas_drawColor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawColor'>drawColor</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#Color'>color</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode = <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOver'>kSrcOver</a>)
+</pre>
+
+Fills clip with  <a href='#SkCanvas_drawColor_color'>color color</a>.
+<a href='#SkCanvas_drawColor_mode'>mode</a> determines how ARGB is combined with destination.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawColor_color'><code><strong>color</strong></code></a></td>
+    <td><a href='undocumented#Unpremultiply'>unpremultiplied</a> ARGB</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawColor_mode'><code><strong>mode</strong></code></a></td>
+    <td><a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> used to combine source <a href='#SkCanvas_drawColor_color'>color</a> and destination</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawColor"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_clear'>clear</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_erase'>erase</a> <a href='#SkCanvas_drawPaint'>drawPaint</a>
+
+<a name='SkCanvas_clear'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void clear(<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#Color'>color</a>)
+</pre>
+
+Fills clip with  <a href='#SkCanvas_clear_color'>color color</a> using <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrc'>kSrc</a>.
+This has the effect of replacing all pixels contained by clip with <a href='#SkCanvas_clear_color'>color</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_clear_color'><code><strong>color</strong></code></a></td>
+    <td><a href='undocumented#Unpremultiply'>unpremultiplied</a> ARGB</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_clear"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawColor'>drawColor</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_erase'>erase</a> <a href='#SkCanvas_drawPaint'>drawPaint</a>
+
+<a name='SkCanvas_discard'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_discard'>discard()</a>
+</pre>
+
+Makes <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> contents undefined. Subsequent calls that read <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> pixels,
+such as drawing with <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, return undefined results. <a href='#SkCanvas_discard'>discard()</a> does
+not change clip or <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+<a href='#SkCanvas_discard'>discard()</a> may do nothing, depending on the implementation of <a href='SkSurface_Reference#SkSurface'>SkSurface</a> or <a href='undocumented#SkBaseDevice'>SkBaseDevice</a>
+that created <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>.
+
+<a href='#SkCanvas_discard'>discard()</a> allows optimized performance on subsequent draws by removing
+cached <a href='undocumented#Data'>data</a> associated with <a href='SkSurface_Reference#SkSurface'>SkSurface</a> or <a href='undocumented#SkBaseDevice'>SkBaseDevice</a>.
+It is not necessary to call <a href='#SkCanvas_discard'>discard()</a> once done with <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>;
+any cached <a href='undocumented#Data'>data</a> is deleted when owning <a href='SkSurface_Reference#SkSurface'>SkSurface</a> or <a href='undocumented#SkBaseDevice'>SkBaseDevice</a> is deleted.
+
+### See Also
+
+<a href='#SkCanvas_flush'>flush()</a> <a href='undocumented#GrContext'>GrContext</a>::<a href='#GrContext_abandonContext'>abandonContext</a>
+
+<a name='SkCanvas_drawPaint'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawPaint'>drawPaint</a>(const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Fills clip with <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawPaint_paint'>paint</a>. <a href='SkPaint_Reference#SkPaint'>SkPaint</a> components <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkShader'>SkShader</a>,
+<a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> affect drawing;
+<a href='undocumented#SkPathEffect'>SkPathEffect</a> in <a href='#SkCanvas_drawPaint_paint'>paint</a> is ignored.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPaint_paint'><code><strong>paint</strong></code></a></td>
+    <td>graphics state used to fill <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawPaint"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_clear'>clear</a> <a href='#SkCanvas_drawColor'>drawColor</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_erase'>erase</a>
+
+<a name='SkCanvas_PointMode'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkCanvas_PointMode'>PointMode</a> {
+        <a href='#SkCanvas_kPoints_PointMode'>kPoints_PointMode</a>,
+        <a href='#SkCanvas_kLines_PointMode'>kLines_PointMode</a>,
+        <a href='#SkCanvas_kPolygon_PointMode'>kPolygon_PointMode</a>,
+    };
+
+</pre>
+
+Selects if an array of <a href='SkPoint_Reference#Point'>points</a> are drawn as discrete <a href='SkPoint_Reference#Point'>points</a>, as <a href='undocumented#Line'>lines</a>, or as
+an open polygon.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_kPoints_PointMode'><code>SkCanvas::kPoints_PointMode</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+draw each point separately</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_kLines_PointMode'><code>SkCanvas::kLines_PointMode</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+draw each pair of points as a line segment</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_kPolygon_PointMode'><code>SkCanvas::kPolygon_PointMode</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+draw the array of points as a open polygon</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_PointMode"><div>The upper left corner shows three squares when drawn as <a href='SkPoint_Reference#Point'>points</a>.
+The upper right corner shows one <a href='undocumented#Line'>line</a>; when drawn as <a href='undocumented#Line'>lines</a>, two <a href='SkPoint_Reference#Point'>points</a> are required per <a href='undocumented#Line'>line</a>.
+The lower right corner shows two <a href='undocumented#Line'>lines</a>; when draw as polygon, no miter is drawn at the corner.
+The lower left corner shows two <a href='undocumented#Line'>lines</a> with a miter when <a href='SkPath_Reference#Path'>path</a> contains polygon.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawLine'>drawLine</a> <a href='#SkCanvas_drawPoint'>drawPoint</a> <a href='#SkCanvas_drawPath'>drawPath</a>
+
+<a name='SkCanvas_drawPoints'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawPoints'>drawPoints</a>(<a href='#SkCanvas_PointMode'>PointMode</a> mode, size_t count, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='#SkCanvas_drawPoints_pts'>pts</a> using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawPoints_paint'>paint</a>.
+<a href='#SkCanvas_drawPoints_count'>count</a> is the number of <a href='SkPoint_Reference#Point'>points</a>; if <a href='#SkCanvas_drawPoints_count'>count</a> is less than one, has no effect.
+<a href='#SkCanvas_drawPoints_mode'>mode</a> may be one of: <a href='#SkCanvas_kPoints_PointMode'>kPoints_PointMode</a>, <a href='#SkCanvas_kLines_PointMode'>kLines_PointMode</a>, or <a href='#SkCanvas_kPolygon_PointMode'>kPolygon_PointMode</a>.
+
+If <a href='#SkCanvas_drawPoints_mode'>mode</a> is <a href='#SkCanvas_kPoints_PointMode'>kPoints_PointMode</a>, the shape of <a href='SkPoint_Reference#Point'>point</a> drawn depends on <a href='#SkCanvas_drawPoints_paint'>paint</a>
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Cap'>Cap</a>. If <a href='#SkCanvas_drawPoints_paint'>paint</a> is set to <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kRound_Cap'>kRound_Cap</a>, each <a href='SkPoint_Reference#Point'>point</a> draws a
+<a href='undocumented#Circle'>circle</a> of diameter <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width. If <a href='#SkCanvas_drawPoints_paint'>paint</a> is set to <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kSquare_Cap'>kSquare_Cap</a>
+or <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kButt_Cap'>kButt_Cap</a>, each <a href='SkPoint_Reference#Point'>point</a> draws a square of width and height
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width.
+
+If <a href='#SkCanvas_drawPoints_mode'>mode</a> is <a href='#SkCanvas_kLines_PointMode'>kLines_PointMode</a>, each pair of <a href='SkPoint_Reference#Point'>points</a> draws a <a href='undocumented#Line'>line</a> segment.
+One <a href='undocumented#Line'>line</a> is drawn for every two <a href='SkPoint_Reference#Point'>points</a>; each <a href='SkPoint_Reference#Point'>point</a> is used once. If <a href='#SkCanvas_drawPoints_count'>count</a> is odd,
+the final <a href='SkPoint_Reference#Point'>point</a> is ignored.
+
+If <a href='#SkCanvas_drawPoints_mode'>mode</a> is <a href='#SkCanvas_kPolygon_PointMode'>kPolygon_PointMode</a>, each adjacent pair of <a href='SkPoint_Reference#Point'>points</a> draws a <a href='undocumented#Line'>line</a> segment.
+<a href='#SkCanvas_drawPoints_count'>count</a> minus one <a href='undocumented#Line'>lines</a> are drawn; the first and last <a href='SkPoint_Reference#Point'>point</a> are used once.
+
+Each <a href='undocumented#Line'>line</a> segment respects <a href='#SkCanvas_drawPoints_paint'>paint</a> <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Cap'>Cap</a> and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width.
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> is ignored, as if were set to <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kStroke_Style'>kStroke_Style</a>.
+
+Always draws each element one at a time; is not affected by
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Join'>Join</a>, and unlike <a href='#SkCanvas_drawPath'>drawPath</a>(), does not create a mask from all <a href='SkPoint_Reference#Point'>points</a>
+and <a href='undocumented#Line'>lines</a> before drawing.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPoints_mode'><code><strong>mode</strong></code></a></td>
+    <td>whether <a href='#SkCanvas_drawPoints_pts'>pts</a> draws <a href='SkPoint_Reference#Point'>points</a> or <a href='undocumented#Line'>lines</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPoints_count'><code><strong>count</strong></code></a></td>
+    <td>number of <a href='SkPoint_Reference#Point'>points</a> in the array</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPoints_pts'><code><strong>pts</strong></code></a></td>
+    <td>array of <a href='SkPoint_Reference#Point'>points</a> to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPoints_paint'><code><strong>paint</strong></code></a></td>
+    <td>stroke, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawPoints"><div>
+
+<table>  <tr>
+    <td>The first column draws <a href='SkPoint_Reference#Point'>points</a>.</td>
+  </tr>  <tr>
+    <td>The second column draws <a href='SkPoint_Reference#Point'>points</a> as <a href='undocumented#Line'>lines</a>.</td>
+  </tr>  <tr>
+    <td>The third column draws <a href='SkPoint_Reference#Point'>points</a> as a polygon.</td>
+  </tr>  <tr>
+    <td>The fourth column draws <a href='SkPoint_Reference#Point'>points</a> as a polygonal <a href='SkPath_Reference#Path'>path</a>.</td>
+  </tr>  <tr>
+    <td>The first row uses a round cap and round join.</td>
+  </tr>  <tr>
+    <td>The second row uses a square cap and a miter join.</td>
+  </tr>  <tr>
+    <td>The third row uses a butt cap and a bevel join.</td>
+  </tr>
+</table>
+
+The transparent <a href='SkColor_Reference#Color'>color</a> makes multiple <a href='undocumented#Line'>line</a> draws visible;
+the <a href='SkPath_Reference#Path'>path</a> is drawn all at once.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawLine'>drawLine</a> <a href='#SkCanvas_drawPoint'>drawPoint</a> <a href='#SkCanvas_drawPath'>drawPath</a>
+
+<a name='SkCanvas_drawPoint'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawPoint'>drawPoint</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkPoint_Reference#Point'>point</a> at (<a href='#SkCanvas_drawPoint_x'>x</a>, <a href='#SkCanvas_drawPoint_y'>y</a>) using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawPoint_paint'>paint</a>.
+
+The shape of <a href='SkPoint_Reference#Point'>point</a> drawn depends on <a href='#SkCanvas_drawPoint_paint'>paint</a> <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Cap'>Cap</a>.
+If <a href='#SkCanvas_drawPoint_paint'>paint</a> is set to <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kRound_Cap'>kRound_Cap</a>, draw a <a href='undocumented#Circle'>circle</a> of diameter
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width. If <a href='#SkCanvas_drawPoint_paint'>paint</a> is set to <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kSquare_Cap'>kSquare_Cap</a> or <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kButt_Cap'>kButt_Cap</a>,
+draw a square of width and height <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width.
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> is ignored, as if were set to <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kStroke_Style'>kStroke_Style</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPoint_x'><code><strong>x</strong></code></a></td>
+    <td>left edge of <a href='undocumented#Circle'>circle</a> or square</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPoint_y'><code><strong>y</strong></code></a></td>
+    <td>top edge of <a href='undocumented#Circle'>circle</a> or square</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPoint_paint'><code><strong>paint</strong></code></a></td>
+    <td>stroke, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawPoint"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawPoints'>drawPoints</a> <a href='#SkCanvas_drawCircle'>drawCircle</a> <a href='#SkCanvas_drawRect'>drawRect</a> <a href='#SkCanvas_drawLine'>drawLine</a> <a href='#SkCanvas_drawPath'>drawPath</a>
+
+<a name='SkCanvas_drawPoint_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawPoint'>drawPoint</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> p, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkPoint_Reference#Point'>point</a> <a href='#SkCanvas_drawPoint_2_p'>p</a> using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawPoint_2_paint'>paint</a>.
+
+The shape of <a href='SkPoint_Reference#Point'>point</a> drawn depends on <a href='#SkCanvas_drawPoint_2_paint'>paint</a> <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Cap'>Cap</a>.
+If <a href='#SkCanvas_drawPoint_2_paint'>paint</a> is set to <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kRound_Cap'>kRound_Cap</a>, draw a <a href='undocumented#Circle'>circle</a> of diameter
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width. If <a href='#SkCanvas_drawPoint_2_paint'>paint</a> is set to <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kSquare_Cap'>kSquare_Cap</a> or <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kButt_Cap'>kButt_Cap</a>,
+draw a square of width and height <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width.
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> is ignored, as if were set to <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kStroke_Style'>kStroke_Style</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPoint_2_p'><code><strong>p</strong></code></a></td>
+    <td>top-left edge of <a href='undocumented#Circle'>circle</a> or square</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPoint_2_paint'><code><strong>paint</strong></code></a></td>
+    <td>stroke, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawPoint_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawPoints'>drawPoints</a> <a href='#SkCanvas_drawCircle'>drawCircle</a> <a href='#SkCanvas_drawRect'>drawRect</a> <a href='#SkCanvas_drawLine'>drawLine</a> <a href='#SkCanvas_drawPath'>drawPath</a>
+
+<a name='SkCanvas_drawLine'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawLine'>drawLine</a>(<a href='undocumented#SkScalar'>SkScalar</a> x0, <a href='undocumented#SkScalar'>SkScalar</a> y0, <a href='undocumented#SkScalar'>SkScalar</a> x1, <a href='undocumented#SkScalar'>SkScalar</a> y1, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='undocumented#Line'>line</a> segment from (<a href='#SkCanvas_drawLine_x0'>x0</a>, <a href='#SkCanvas_drawLine_y0'>y0</a>) to (<a href='#SkCanvas_drawLine_x1'>x1</a>, <a href='#SkCanvas_drawLine_y1'>y1</a>) using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawLine_paint'>paint</a>.
+In <a href='#SkCanvas_drawLine_paint'>paint</a>: <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width describes the <a href='undocumented#Line'>line</a> thickness;
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Cap'>Cap</a> draws the end rounded or square;
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> is ignored, as if were set to <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kStroke_Style'>kStroke_Style</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawLine_x0'><code><strong>x0</strong></code></a></td>
+    <td>start of <a href='undocumented#Line'>line</a> segment on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawLine_y0'><code><strong>y0</strong></code></a></td>
+    <td>start of <a href='undocumented#Line'>line</a> segment on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawLine_x1'><code><strong>x1</strong></code></a></td>
+    <td>end of <a href='undocumented#Line'>line</a> segment on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawLine_y1'><code><strong>y1</strong></code></a></td>
+    <td>end of <a href='undocumented#Line'>line</a> segment on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawLine_paint'><code><strong>paint</strong></code></a></td>
+    <td>stroke, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawLine"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawPoint'>drawPoint</a> <a href='#SkCanvas_drawCircle'>drawCircle</a> <a href='#SkCanvas_drawRect'>drawRect</a> <a href='#SkCanvas_drawPath'>drawPath</a>
+
+<a name='SkCanvas_drawLine_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawLine'>drawLine</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> p0, <a href='SkPoint_Reference#SkPoint'>SkPoint</a> p1, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='undocumented#Line'>line</a> segment from <a href='#SkCanvas_drawLine_2_p0'>p0</a> to <a href='#SkCanvas_drawLine_2_p1'>p1</a> using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawLine_2_paint'>paint</a>.
+In <a href='#SkCanvas_drawLine_2_paint'>paint</a>: <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width describes the <a href='undocumented#Line'>line</a> thickness;
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Cap'>Cap</a> draws the end rounded or square;
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> is ignored, as if were set to <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kStroke_Style'>kStroke_Style</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawLine_2_p0'><code><strong>p0</strong></code></a></td>
+    <td>start of <a href='undocumented#Line'>line</a> segment</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawLine_2_p1'><code><strong>p1</strong></code></a></td>
+    <td>end of <a href='undocumented#Line'>line</a> segment</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawLine_2_paint'><code><strong>paint</strong></code></a></td>
+    <td>stroke, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawLine_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawPoint'>drawPoint</a> <a href='#SkCanvas_drawCircle'>drawCircle</a> <a href='#SkCanvas_drawRect'>drawRect</a> <a href='#SkCanvas_drawPath'>drawPath</a>
+
+<a name='SkCanvas_drawRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawRect'>drawRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawRect_rect'>rect</a> using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawRect_paint'>paint</a>.
+In <a href='#SkCanvas_drawRect_paint'>paint</a>: <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> determines if rectangle is stroked or filled;
+if stroked, <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width describes the <a href='undocumented#Line'>line</a> thickness, and
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Join'>Join</a> draws the corners rounded or square.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawRect_rect'><code><strong>rect</strong></code></a></td>
+    <td>rectangle to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawRect_paint'><code><strong>paint</strong></code></a></td>
+    <td>stroke or fill, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawRect"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawIRect'>drawIRect</a> <a href='#SkCanvas_drawRRect'>drawRRect</a> <a href='#SkCanvas_drawRoundRect'>drawRoundRect</a> <a href='#SkCanvas_drawRegion'>drawRegion</a> <a href='#SkCanvas_drawPath'>drawPath</a> <a href='#SkCanvas_drawLine'>drawLine</a>
+
+<a name='SkCanvas_drawIRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawIRect'>drawIRect</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkCanvas_drawIRect_rect'>rect</a> using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawIRect_paint'>paint</a>.
+In <a href='#SkCanvas_drawIRect_paint'>paint</a>: <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> determines if rectangle is stroked or filled;
+if stroked, <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width describes the <a href='undocumented#Line'>line</a> thickness, and
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Join'>Join</a> draws the corners rounded or square.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawIRect_rect'><code><strong>rect</strong></code></a></td>
+    <td>rectangle to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawIRect_paint'><code><strong>paint</strong></code></a></td>
+    <td>stroke or fill, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawIRect"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawRect'>drawRect</a> <a href='#SkCanvas_drawRRect'>drawRRect</a> <a href='#SkCanvas_drawRoundRect'>drawRoundRect</a> <a href='#SkCanvas_drawRegion'>drawRegion</a> <a href='#SkCanvas_drawPath'>drawPath</a> <a href='#SkCanvas_drawLine'>drawLine</a>
+
+<a name='SkCanvas_drawRegion'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawRegion'>drawRegion</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkRegion_Reference#SkRegion'>SkRegion</a> <a href='#SkCanvas_drawRegion_region'>region</a> using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawRegion_paint'>paint</a>.
+In <a href='#SkCanvas_drawRegion_paint'>paint</a>: <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> determines if rectangle is stroked or filled;
+if stroked, <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width describes the <a href='undocumented#Line'>line</a> thickness, and
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Join'>Join</a> draws the corners rounded or square.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawRegion_region'><code><strong>region</strong></code></a></td>
+    <td><a href='#SkCanvas_drawRegion_region'>region</a> to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawRegion_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke or fill, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawRegion"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawRect'>drawRect</a> <a href='#SkCanvas_drawIRect'>drawIRect</a> <a href='#SkCanvas_drawPath'>drawPath</a>
+
+<a name='SkCanvas_drawOval'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawOval'>drawOval</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='#SkCanvas_drawOval_oval'>oval</a> <a href='#SkCanvas_drawOval_oval'>oval</a> using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a>.
+In <a href='#SkCanvas_drawOval_paint'>paint</a>: <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> determines if <a href='#SkCanvas_drawOval_oval'>oval</a> is stroked or filled;
+if stroked, <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width describes the <a href='undocumented#Line'>line</a> thickness.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawOval_oval'><code><strong>oval</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> bounds of <a href='#SkCanvas_drawOval_oval'>oval</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawOval_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke or fill, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawOval"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawCircle'>drawCircle</a> <a href='#SkCanvas_drawPoint'>drawPoint</a> <a href='#SkCanvas_drawPath'>drawPath</a> <a href='#SkCanvas_drawRRect'>drawRRect</a> <a href='#SkCanvas_drawRoundRect'>drawRoundRect</a>
+
+<a name='SkCanvas_drawRRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawRRect'>drawRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='#SkCanvas_drawRRect_rrect'>rrect</a> using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawRRect_paint'>paint</a>.
+In <a href='#SkCanvas_drawRRect_paint'>paint</a>: <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> determines if <a href='#SkCanvas_drawRRect_rrect'>rrect</a> is stroked or filled;
+if stroked, <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width describes the <a href='undocumented#Line'>line</a> thickness.
+
+<a href='#SkCanvas_drawRRect_rrect'>rrect</a> may represent a rectangle, <a href='undocumented#Circle'>circle</a>, <a href='undocumented#Oval'>oval</a>, uniformly rounded rectangle, or
+may have any combination of positive non-square radii for the four corners.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawRRect_rrect'><code><strong>rrect</strong></code></a></td>
+    <td><a href='SkRRect_Reference#SkRRect'>SkRRect</a> with up to eight corner radii to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawRRect_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke or fill, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawRRect"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawRect'>drawRect</a> <a href='#SkCanvas_drawRoundRect'>drawRoundRect</a> <a href='#SkCanvas_drawDRRect'>drawDRRect</a> <a href='#SkCanvas_drawCircle'>drawCircle</a> <a href='#SkCanvas_drawOval'>drawOval</a> <a href='#SkCanvas_drawPath'>drawPath</a>
+
+<a name='SkCanvas_drawDRRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawDRRect'>drawDRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& outer, const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& inner, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='#SkCanvas_drawDRRect_outer'>outer</a> and <a href='#SkCanvas_drawDRRect_inner'>inner</a>
+using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawDRRect_paint'>paint</a>.
+<a href='#SkCanvas_drawDRRect_outer'>outer</a> must contain <a href='#SkCanvas_drawDRRect_inner'>inner</a> or the drawing is undefined.
+In <a href='#SkCanvas_drawDRRect_paint'>paint</a>: <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> determines if <a href='SkRRect_Reference#SkRRect'>SkRRect</a> is stroked or filled;
+if stroked, <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width describes the <a href='undocumented#Line'>line</a> thickness.
+If stroked and <a href='SkRRect_Reference#SkRRect'>SkRRect</a> corner has  zero length radii, <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Join'>Join</a> can
+draw corners rounded or square.
+
+GPU-backed platforms optimize drawing when both <a href='#SkCanvas_drawDRRect_outer'>outer</a> and <a href='#SkCanvas_drawDRRect_inner'>inner</a> are
+concave and <a href='#SkCanvas_drawDRRect_outer'>outer</a> contains <a href='#SkCanvas_drawDRRect_inner'>inner</a>. These platforms may not be able to draw
+<a href='SkPath_Reference#SkPath'>SkPath</a> built with identical <a href='undocumented#Data'>data</a> as fast.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawDRRect_outer'><code><strong>outer</strong></code></a></td>
+    <td><a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='#SkCanvas_drawDRRect_outer'>outer</a> bounds to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawDRRect_inner'><code><strong>inner</strong></code></a></td>
+    <td><a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='#SkCanvas_drawDRRect_inner'>inner</a> bounds to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawDRRect_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke or fill, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawDRRect_a"></fiddle-embed></div>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawDRRect_b"><div>Outer <a href='SkRect_Reference#Rect'>Rect</a> has no corner radii, but stroke join is rounded.
+Inner <a href='#RRect'>Round_Rect</a> has corner radii; outset stroke increases radii of corners.
+Stroke join does not affect <a href='#SkCanvas_drawDRRect_inner'>inner</a> <a href='#RRect'>Round_Rect</a> since it has no sharp corners.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawRect'>drawRect</a> <a href='#SkCanvas_drawRoundRect'>drawRoundRect</a> <a href='#SkCanvas_drawRRect'>drawRRect</a> <a href='#SkCanvas_drawCircle'>drawCircle</a> <a href='#SkCanvas_drawOval'>drawOval</a> <a href='#SkCanvas_drawPath'>drawPath</a>
+
+<a name='SkCanvas_drawCircle'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawCircle'>drawCircle</a>(<a href='undocumented#SkScalar'>SkScalar</a> cx, <a href='undocumented#SkScalar'>SkScalar</a> cy, <a href='undocumented#SkScalar'>SkScalar</a> radius, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='undocumented#Circle'>circle</a> at (<a href='#SkCanvas_drawCircle_cx'>cx</a>, <a href='#SkCanvas_drawCircle_cy'>cy</a>) with <a href='#SkCanvas_drawCircle_radius'>radius</a> using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawCircle_paint'>paint</a>.
+If <a href='#SkCanvas_drawCircle_radius'>radius</a> is zero or less, nothing is drawn.
+In <a href='#SkCanvas_drawCircle_paint'>paint</a>: <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> determines if <a href='undocumented#Circle'>circle</a> is stroked or filled;
+if stroked, <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width describes the <a href='undocumented#Line'>line</a> thickness.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawCircle_cx'><code><strong>cx</strong></code></a></td>
+    <td><a href='undocumented#Circle'>circle</a> center on the x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawCircle_cy'><code><strong>cy</strong></code></a></td>
+    <td><a href='undocumented#Circle'>circle</a> center on the y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawCircle_radius'><code><strong>radius</strong></code></a></td>
+    <td>half the diameter of <a href='undocumented#Circle'>circle</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawCircle_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke or fill, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawCircle"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawOval'>drawOval</a> <a href='#SkCanvas_drawRRect'>drawRRect</a> <a href='#SkCanvas_drawRoundRect'>drawRoundRect</a> <a href='#SkCanvas_drawPath'>drawPath</a> <a href='#SkCanvas_drawArc'>drawArc</a> <a href='#SkCanvas_drawPoint'>drawPoint</a> <a href='#SkCanvas_drawLine'>drawLine</a>
+
+<a name='SkCanvas_drawCircle_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawCircle'>drawCircle</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> center, <a href='undocumented#SkScalar'>SkScalar</a> radius, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='undocumented#Circle'>circle</a> at <a href='#SkCanvas_drawCircle_2_center'>center</a> with <a href='#SkCanvas_drawCircle_2_radius'>radius</a> using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawCircle_2_paint'>paint</a>.
+If <a href='#SkCanvas_drawCircle_2_radius'>radius</a> is zero or less, nothing is drawn.
+In <a href='#SkCanvas_drawCircle_2_paint'>paint</a>: <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> determines if <a href='undocumented#Circle'>circle</a> is stroked or filled;
+if stroked, <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width describes the <a href='undocumented#Line'>line</a> thickness.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawCircle_2_center'><code><strong>center</strong></code></a></td>
+    <td><a href='undocumented#Circle'>circle</a> <a href='#SkCanvas_drawCircle_2_center'>center</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawCircle_2_radius'><code><strong>radius</strong></code></a></td>
+    <td>half the diameter of <a href='undocumented#Circle'>circle</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawCircle_2_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke or fill, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawCircle_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawOval'>drawOval</a> <a href='#SkCanvas_drawRRect'>drawRRect</a> <a href='#SkCanvas_drawRoundRect'>drawRoundRect</a> <a href='#SkCanvas_drawPath'>drawPath</a> <a href='#SkCanvas_drawArc'>drawArc</a> <a href='#SkCanvas_drawPoint'>drawPoint</a> <a href='#SkCanvas_drawLine'>drawLine</a>
+
+<a name='SkCanvas_drawArc'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawArc'>drawArc</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>, <a href='undocumented#SkScalar'>SkScalar</a> startAngle, <a href='undocumented#SkScalar'>SkScalar</a> sweepAngle, bool useCenter,
+             const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='undocumented#Arc'>arc</a> using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawArc_paint'>paint</a>.
+
+<a href='undocumented#Arc'>Arc</a> is part of <a href='#SkCanvas_drawArc_oval'>oval</a> bounded by <a href='#SkCanvas_drawArc_oval'>oval</a>, sweeping from <a href='#SkCanvas_drawArc_startAngle'>startAngle</a> to <a href='#SkCanvas_drawArc_startAngle'>startAngle</a> plus
+<a href='#SkCanvas_drawArc_sweepAngle'>sweepAngle</a>. <a href='#SkCanvas_drawArc_startAngle'>startAngle</a> and <a href='#SkCanvas_drawArc_sweepAngle'>sweepAngle</a> are in degrees.
+
+<a href='#SkCanvas_drawArc_startAngle'>startAngle</a> of zero places start <a href='SkPoint_Reference#Point'>point</a> at the right middle edge of <a href='#SkCanvas_drawArc_oval'>oval</a>.
+A positive <a href='#SkCanvas_drawArc_sweepAngle'>sweepAngle</a> places <a href='undocumented#Arc'>arc</a> end <a href='SkPoint_Reference#Point'>point</a> clockwise from start <a href='SkPoint_Reference#Point'>point</a>;
+a negative <a href='#SkCanvas_drawArc_sweepAngle'>sweepAngle</a> places <a href='undocumented#Arc'>arc</a> end <a href='SkPoint_Reference#Point'>point</a> counterclockwise from start <a href='SkPoint_Reference#Point'>point</a>.
+<a href='#SkCanvas_drawArc_sweepAngle'>sweepAngle</a> may exceed 360 degrees, a full <a href='undocumented#Circle'>circle</a>.
+If <a href='#SkCanvas_drawArc_useCenter'>useCenter</a> is true, draw a wedge that includes <a href='undocumented#Line'>lines</a> from <a href='#SkCanvas_drawArc_oval'>oval</a>
+center to <a href='undocumented#Arc'>arc</a> end <a href='SkPoint_Reference#Point'>points</a>. If <a href='#SkCanvas_drawArc_useCenter'>useCenter</a> is false, draw <a href='undocumented#Arc'>arc</a> between end <a href='SkPoint_Reference#Point'>points</a>.
+
+If <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawArc_oval'>oval</a> is empty or <a href='#SkCanvas_drawArc_sweepAngle'>sweepAngle</a> is zero, nothing is drawn.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawArc_oval'><code><strong>oval</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> bounds of <a href='#SkCanvas_drawArc_oval'>oval</a> containing <a href='undocumented#Arc'>arc</a> to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawArc_startAngle'><code><strong>startAngle</strong></code></a></td>
+    <td>angle in degrees where <a href='undocumented#Arc'>arc</a> begins</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawArc_sweepAngle'><code><strong>sweepAngle</strong></code></a></td>
+    <td>sweep angle in degrees; positive is clockwise</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawArc_useCenter'><code><strong>useCenter</strong></code></a></td>
+    <td>if true, include the center of the <a href='#SkCanvas_drawArc_oval'>oval</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawArc_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke or fill, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawArc_a"></fiddle-embed></div>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawArc_b"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_arcTo'>arcTo</a> <a href='#SkCanvas_drawCircle'>drawCircle</a> <a href='#SkCanvas_drawOval'>drawOval</a> <a href='#SkCanvas_drawPath'>drawPath</a>
+
+<a name='SkCanvas_drawRoundRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawRoundRect'>drawRoundRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='undocumented#SkScalar'>SkScalar</a> rx, <a href='undocumented#SkScalar'>SkScalar</a> ry, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkRRect_Reference#SkRRect'>SkRRect</a> bounded by <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawRoundRect_rect'>rect</a>, with corner radii (<a href='#SkCanvas_drawRoundRect_rx'>rx</a>, <a href='#SkCanvas_drawRoundRect_ry'>ry</a>) using clip,
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawRoundRect_paint'>paint</a>.
+
+In <a href='#SkCanvas_drawRoundRect_paint'>paint</a>: <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> determines if <a href='SkRRect_Reference#SkRRect'>SkRRect</a> is stroked or filled;
+if stroked, <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width describes the <a href='undocumented#Line'>line</a> thickness.
+If <a href='#SkCanvas_drawRoundRect_rx'>rx</a> or <a href='#SkCanvas_drawRoundRect_ry'>ry</a> are less than zero, they are treated as if they are zero.
+If <a href='#SkCanvas_drawRoundRect_rx'>rx</a> plus <a href='#SkCanvas_drawRoundRect_ry'>ry</a> exceeds <a href='#SkCanvas_drawRoundRect_rect'>rect</a> width or <a href='#SkCanvas_drawRoundRect_rect'>rect</a> height, radii are scaled down to fit.
+If <a href='#SkCanvas_drawRoundRect_rx'>rx</a> and <a href='#SkCanvas_drawRoundRect_ry'>ry</a> are zero, <a href='SkRRect_Reference#SkRRect'>SkRRect</a> is drawn as <a href='SkRect_Reference#SkRect'>SkRect</a> and if stroked is affected by
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Join'>Join</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawRoundRect_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> bounds of <a href='SkRRect_Reference#SkRRect'>SkRRect</a> to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawRoundRect_rx'><code><strong>rx</strong></code></a></td>
+    <td>axis length on x-axis of <a href='undocumented#Oval'>oval</a> describing rounded corners</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawRoundRect_ry'><code><strong>ry</strong></code></a></td>
+    <td>axis length on y-axis of <a href='undocumented#Oval'>oval</a> describing rounded corners</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawRoundRect_paint'><code><strong>paint</strong></code></a></td>
+    <td>stroke, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawRoundRect"><div>Top row has a zero radius a generates a rectangle.
+Second row radii sum to less than sides.
+Third row radii sum equals sides.
+Fourth row radii sum exceeds sides; radii are scaled to fit.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawRRect'>drawRRect</a> <a href='#SkCanvas_drawRect'>drawRect</a> <a href='#SkCanvas_drawDRRect'>drawDRRect</a> <a href='#SkCanvas_drawPath'>drawPath</a> <a href='#SkCanvas_drawCircle'>drawCircle</a> <a href='#SkCanvas_drawOval'>drawOval</a> <a href='#SkCanvas_drawPoint'>drawPoint</a>
+
+<a name='SkCanvas_drawPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawPath'>drawPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='#SkCanvas_drawPath_path'>path</a> using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawPath_paint'>paint</a>.
+<a href='SkPath_Reference#SkPath'>SkPath</a> contains an array of  <a href='SkPath_Overview#Contour'>path contour</a>, each of which may be open or closed.
+
+In <a href='#SkCanvas_drawPath_paint'>paint</a>: <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> determines if <a href='SkRRect_Reference#SkRRect'>SkRRect</a> is stroked or filled:
+if filled, <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_FillType'>FillType</a> determines whether  <a href='SkPath_Overview#Contour'>path contour</a> describes inside or
+outside of fill; if stroked, <a href='SkPaint_Reference#SkPaint'>SkPaint</a> stroke width describes the <a href='undocumented#Line'>line</a> thickness,
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Cap'>Cap</a> describes <a href='undocumented#Line'>line</a> ends, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Join'>Join</a> describes how
+corners are drawn.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPath_path'><code><strong>path</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPath_paint'><code><strong>paint</strong></code></a></td>
+    <td>stroke, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawPath"><div>Top rows draw stroked <a href='#SkCanvas_drawPath_path'>path</a> with combinations of joins and caps. The open <a href='SkPath_Overview#Contour'>contour</a>
+is affected by caps; the closed <a href='SkPath_Overview#Contour'>contour</a> is affected by joins.
+Bottom row draws fill the same for open and closed <a href='SkPath_Overview#Contour'>contour</a>.
+First bottom column shows winding fills overlap.
+Second bottom column shows even odd fills exclude overlap.
+Third bottom column shows inverse winding fills area outside both <a href='SkPath_Overview#Contour'>contours</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Reference#SkPath'>SkPath</a> <a href='#SkCanvas_drawLine'>drawLine</a> <a href='#SkCanvas_drawArc'>drawArc</a> <a href='#SkCanvas_drawRect'>drawRect</a> <a href='#SkCanvas_drawPoints'>drawPoints</a>
+
+<a name='Draw_Image'></a>
+
+<a href='#SkCanvas_drawImage'>drawImage</a>, <a href='#SkCanvas_drawImageRect'>drawImageRect</a>, and <a href='#SkCanvas_drawImageNine'>drawImageNine</a> can be called with a bare pointer or
+a  <a href='undocumented#Smart_Pointer'>smart pointer</a> as a convenience. The pairs of calls are otherwise identical.
+
+<a name='SkCanvas_drawImage'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawImage'>drawImage</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* <a href='SkImage_Reference#Image'>image</a>, <a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr)
+</pre>
+
+Draws <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='#SkCanvas_drawImage_image'>image</a>, with its top-left corner at (<a href='#SkCanvas_drawImage_left'>left</a>, <a href='#SkCanvas_drawImage_top'>top</a>),
+using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawImage_paint'>paint</a>.
+
+If <a href='#SkCanvas_drawImage_paint'>paint</a> is supplied, apply <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>,
+and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>. If <a href='#SkCanvas_drawImage_image'>image</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#SkShader'>SkShader</a>.
+If <a href='#SkCanvas_drawImage_paint'>paint</a> contains <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, generate mask from <a href='#SkCanvas_drawImage_image'>image</a> bounds. If generated
+mask extends beyond <a href='#SkCanvas_drawImage_image'>image</a> bounds, replicate <a href='#SkCanvas_drawImage_image'>image</a> edge colors, just as <a href='undocumented#SkShader'>SkShader</a>
+made from <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_makeShader'>makeShader</a> with <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set replicates the
+<a href='#SkCanvas_drawImage_image'>image</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples outside of its bounds.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImage_image'><code><strong>image</strong></code></a></td>
+    <td>uncompressed rectangular map of pixels</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImage_left'><code><strong>left</strong></code></a></td>
+    <td><a href='#SkCanvas_drawImage_left'>left side</a> of <a href='#SkCanvas_drawImage_image'>image</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImage_top'><code><strong>top</strong></code></a></td>
+    <td><a href='#SkCanvas_drawImage_top'>top</a> side of <a href='#SkCanvas_drawImage_image'>image</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImage_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> containing <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,</td>
+  </tr>
+</table>
+
+and so on; or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawImage"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawImageLattice'>drawImageLattice</a> <a href='#SkCanvas_drawImageNine'>drawImageNine</a> <a href='#SkCanvas_drawImageRect'>drawImageRect</a> <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_setImageFilter'>setImageFilter</a>
+
+<a name='SkCanvas_drawImage_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawImage'>drawImage</a>(const <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt;& <a href='SkImage_Reference#Image'>image</a>, <a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top,
+               const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr)
+</pre>
+
+Draws <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='#SkCanvas_drawImage_2_image'>image</a>, with its top-left corner at (<a href='#SkCanvas_drawImage_2_left'>left</a>, <a href='#SkCanvas_drawImage_2_top'>top</a>),
+using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawImage_2_paint'>paint</a>.
+
+If <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawImage_2_paint'>paint</a> is supplied, apply <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>. If <a href='#SkCanvas_drawImage_2_image'>image</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#SkShader'>SkShader</a>.
+If <a href='#SkCanvas_drawImage_2_paint'>paint</a> contains <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, generate mask from <a href='#SkCanvas_drawImage_2_image'>image</a> bounds. If generated
+mask extends beyond <a href='#SkCanvas_drawImage_2_image'>image</a> bounds, replicate <a href='#SkCanvas_drawImage_2_image'>image</a> edge colors, just as <a href='undocumented#SkShader'>SkShader</a>
+made from <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_makeShader'>makeShader</a> with <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set replicates the
+<a href='#SkCanvas_drawImage_2_image'>image</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples outside of its bounds.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImage_2_image'><code><strong>image</strong></code></a></td>
+    <td>uncompressed rectangular map of pixels</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImage_2_left'><code><strong>left</strong></code></a></td>
+    <td><a href='#SkCanvas_drawImage_2_left'>left side</a> of <a href='#SkCanvas_drawImage_2_image'>image</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImage_2_top'><code><strong>top</strong></code></a></td>
+    <td>pop side of <a href='#SkCanvas_drawImage_2_image'>image</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImage_2_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> containing <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,</td>
+  </tr>
+</table>
+
+and so on; or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawImage_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawImageLattice'>drawImageLattice</a> <a href='#SkCanvas_drawImageNine'>drawImageNine</a> <a href='#SkCanvas_drawImageRect'>drawImageRect</a> <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_setImageFilter'>setImageFilter</a>
+
+<a name='SkCanvas_SrcRectConstraint'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> {
+        <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>,
+        <a href='#SkCanvas_kFast_SrcRectConstraint'>kFast_SrcRectConstraint</a>,
+    };
+
+</pre>
+
+<a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> controls the behavior at the edge of source <a href='SkRect_Reference#Rect'>Rect</a>,
+provided to <a href='#SkCanvas_drawImageRect'>drawImageRect</a>, trading off speed for precision.
+
+<a href='#Image_Filter'>Image_Filter</a> in <a href='SkPaint_Reference#Paint'>Paint</a> may sample multiple pixels in the <a href='SkImage_Reference#Image'>image</a>. Source <a href='SkRect_Reference#Rect'>Rect</a>
+restricts the bounds of pixels that may be read. <a href='#Image_Filter'>Image_Filter</a> may slow down if
+it cannot read outside the bounds, when sampling near the edge of source <a href='SkRect_Reference#Rect'>Rect</a>.
+<a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> specifies whether an <a href='#Image_Filter'>Image_Filter</a> is allowed to read pixels
+outside source <a href='SkRect_Reference#Rect'>Rect</a>.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_kStrict_SrcRectConstraint'><code>SkCanvas::kStrict_SrcRectConstraint</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Requires <a href='#Image_Filter'>Image_Filter</a> to respect source <a href='SkRect_Reference#Rect'>Rect</a>,
+sampling only inside of its bounds, possibly with a performance penalty.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_kFast_SrcRectConstraint'><code>SkCanvas::kFast_SrcRectConstraint</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Permits <a href='#Image_Filter'>Image_Filter</a> to sample outside of source <a href='SkRect_Reference#Rect'>Rect</a>
+by half the width of <a href='#Image_Filter'>Image_Filter</a>, permitting it to run faster but with
+error at the <a href='SkImage_Reference#Image'>image</a> edges.
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_SrcRectConstraint"><div>redBorder contains a black and white checkerboard bordered by red.
+redBorder is drawn scaled by 16 on the left.
+The middle and right <a href='SkBitmap_Reference#Bitmap'>bitmaps</a> are filtered checkerboards.
+Drawing the checkerboard with <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a> shows only a blur of black and white.
+Drawing the checkerboard with <a href='#SkCanvas_kFast_SrcRectConstraint'>kFast_SrcRectConstraint</a> allows red to bleed in the corners.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawImageRect'>drawImageRect</a> <a href='#SkCanvas_drawImage'>drawImage</a> <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_setImageFilter'>setImageFilter</a>
+
+<a name='SkCanvas_drawImageRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawImageRect'>drawImageRect</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* <a href='SkImage_Reference#Image'>image</a>, const <a href='SkRect_Reference#SkRect'>SkRect</a>& src, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>,
+                   <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> constraint = <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>)
+</pre>
+
+Draws <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawImageRect_src'>src</a> of <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='#SkCanvas_drawImageRect_image'>image</a>, scaled and translated to fill <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawImageRect_dst'>dst</a>.
+Additionally transform draw using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawImageRect_paint'>paint</a>.
+
+If <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawImageRect_paint'>paint</a> is supplied, apply <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>. If <a href='#SkCanvas_drawImageRect_image'>image</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#SkShader'>SkShader</a>.
+If <a href='#SkCanvas_drawImageRect_paint'>paint</a> contains <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, generate mask from <a href='#SkCanvas_drawImageRect_image'>image</a> bounds.
+
+If generated mask extends beyond <a href='#SkCanvas_drawImageRect_image'>image</a> bounds, replicate <a href='#SkCanvas_drawImageRect_image'>image</a> edge colors, just
+as <a href='undocumented#SkShader'>SkShader</a> made from <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_makeShader'>makeShader</a> with <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set
+replicates the <a href='#SkCanvas_drawImageRect_image'>image</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples outside of its bounds.
+
+<a href='#SkCanvas_drawImageRect_constraint'>constraint</a> set to <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a> limits <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='undocumented#SkFilterQuality'>SkFilterQuality</a> to
+sample within <a href='#SkCanvas_drawImageRect_src'>src</a>; set to <a href='#SkCanvas_kFast_SrcRectConstraint'>kFast_SrcRectConstraint</a> allows sampling outside to
+improve performance.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImageRect_image'><code><strong>image</strong></code></a></td>
+    <td><a href='SkImage_Reference#SkImage'>SkImage</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_src'><code><strong>src</strong></code></a></td>
+    <td>source <a href='SkRect_Reference#SkRect'>SkRect</a> of <a href='#SkCanvas_drawImageRect_image'>image</a> to draw from</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkRect_Reference#SkRect'>SkRect</a> of <a href='#SkCanvas_drawImageRect_image'>image</a> to draw to</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> containing <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,</td>
+  </tr>
+</table>
+
+and so on; or nullptr
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImageRect_constraint'><code><strong>constraint</strong></code></a></td>
+    <td>filter strictly within <a href='#SkCanvas_drawImageRect_src'>src</a> or draw faster</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawImageRect"><div>The left <a href='SkBitmap_Reference#Bitmap'>bitmap</a> draws with <a href='SkPaint_Reference#Paint'>Paint</a> default <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, and stays within
+its bounds; there is no bleeding with <a href='#SkCanvas_kFast_SrcRectConstraint'>kFast_SrcRectConstraint</a>.
+the middle and right <a href='SkBitmap_Reference#Bitmap'>bitmaps</a> draw with <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a>; with
+<a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>, the filter remains within the checkerboard, and
+with <a href='#SkCanvas_kFast_SrcRectConstraint'>kFast_SrcRectConstraint</a> red bleeds on the edges.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> <a href='#SkCanvas_drawImage'>drawImage</a> <a href='#SkCanvas_drawImageLattice'>drawImageLattice</a> <a href='#SkCanvas_drawImageNine'>drawImageNine</a>
+
+<a name='SkCanvas_drawImageRect_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawImageRect'>drawImageRect</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* <a href='SkImage_Reference#Image'>image</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& isrc, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>,
+                   <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> constraint = <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>)
+</pre>
+
+Draws <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkCanvas_drawImageRect_2_isrc'>isrc</a> of <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='#SkCanvas_drawImageRect_2_image'>image</a>, scaled and translated to fill <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawImageRect_2_dst'>dst</a>.
+Note that <a href='#SkCanvas_drawImageRect_2_isrc'>isrc</a> is on integer <a href='undocumented#Pixel'>pixel</a> boundaries; <a href='#SkCanvas_drawImageRect_2_dst'>dst</a> may include fractional
+boundaries. Additionally transform draw using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a>
+<a href='#SkCanvas_drawImageRect_2_paint'>paint</a>.
+
+If <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawImageRect_2_paint'>paint</a> is supplied, apply <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>. If <a href='#SkCanvas_drawImageRect_2_image'>image</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#SkShader'>SkShader</a>.
+If <a href='#SkCanvas_drawImageRect_2_paint'>paint</a> contains <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, generate mask from <a href='#SkCanvas_drawImageRect_2_image'>image</a> bounds.
+
+If generated mask extends beyond <a href='#SkCanvas_drawImageRect_2_image'>image</a> bounds, replicate <a href='#SkCanvas_drawImageRect_2_image'>image</a> edge colors, just
+as <a href='undocumented#SkShader'>SkShader</a> made from <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_makeShader'>makeShader</a> with <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set
+replicates the <a href='#SkCanvas_drawImageRect_2_image'>image</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples outside of its bounds.
+
+<a href='#SkCanvas_drawImageRect_2_constraint'>constraint</a> set to <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a> limits <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='undocumented#SkFilterQuality'>SkFilterQuality</a> to
+sample within <a href='#SkCanvas_drawImageRect_2_isrc'>isrc</a>; set to <a href='#SkCanvas_kFast_SrcRectConstraint'>kFast_SrcRectConstraint</a> allows sampling outside to
+improve performance.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImageRect_2_image'><code><strong>image</strong></code></a></td>
+    <td><a href='SkImage_Reference#SkImage'>SkImage</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_2_isrc'><code><strong>isrc</strong></code></a></td>
+    <td>source <a href='SkIRect_Reference#SkIRect'>SkIRect</a> of <a href='#SkCanvas_drawImageRect_2_image'>image</a> to draw from</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_2_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkRect_Reference#SkRect'>SkRect</a> of <a href='#SkCanvas_drawImageRect_2_image'>image</a> to draw to</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_2_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> containing <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,</td>
+  </tr>
+</table>
+
+and so on; or nullptr
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImageRect_2_constraint'><code><strong>constraint</strong></code></a></td>
+    <td>filter strictly within <a href='#SkCanvas_drawImageRect_2_isrc'>isrc</a> or draw faster</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawImageRect_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> <a href='#SkCanvas_drawImage'>drawImage</a> <a href='#SkCanvas_drawImageLattice'>drawImageLattice</a> <a href='#SkCanvas_drawImageNine'>drawImageNine</a>
+
+<a name='SkCanvas_drawImageRect_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawImageRect'>drawImageRect</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* <a href='SkImage_Reference#Image'>image</a>, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='#SkCanvas_drawImageRect_3_image'>image</a>, scaled and translated to fill <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawImageRect_3_dst'>dst</a>, using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>,
+and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawImageRect_3_paint'>paint</a>.
+
+If <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawImageRect_3_paint'>paint</a> is supplied, apply <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>. If <a href='#SkCanvas_drawImageRect_3_image'>image</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#SkShader'>SkShader</a>.
+If <a href='#SkCanvas_drawImageRect_3_paint'>paint</a> contains <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, generate mask from <a href='#SkCanvas_drawImageRect_3_image'>image</a> bounds.
+
+If generated mask extends beyond <a href='#SkCanvas_drawImageRect_3_image'>image</a> bounds, replicate <a href='#SkCanvas_drawImageRect_3_image'>image</a> edge colors, just
+as <a href='undocumented#SkShader'>SkShader</a> made from <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_makeShader'>makeShader</a> with <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set
+replicates the <a href='#SkCanvas_drawImageRect_3_image'>image</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples outside of its bounds.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImageRect_3_image'><code><strong>image</strong></code></a></td>
+    <td><a href='SkImage_Reference#SkImage'>SkImage</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_3_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkRect_Reference#SkRect'>SkRect</a> of <a href='#SkCanvas_drawImageRect_3_image'>image</a> to draw to</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_3_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> containing <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,</td>
+  </tr>
+</table>
+
+and so on; or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawImageRect_3"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> <a href='#SkCanvas_drawImage'>drawImage</a> <a href='#SkCanvas_drawImageLattice'>drawImageLattice</a> <a href='#SkCanvas_drawImageNine'>drawImageNine</a>
+
+<a name='SkCanvas_drawImageRect_4'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawImageRect'>drawImageRect</a>(const <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt;& <a href='SkImage_Reference#Image'>image</a>, const <a href='SkRect_Reference#SkRect'>SkRect</a>& src, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                   const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>, <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> constraint = <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>)
+</pre>
+
+Draws <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawImageRect_4_src'>src</a> of <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='#SkCanvas_drawImageRect_4_image'>image</a>, scaled and translated to fill <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawImageRect_4_dst'>dst</a>.
+Additionally transform draw using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawImageRect_4_paint'>paint</a>.
+
+If <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawImageRect_4_paint'>paint</a> is supplied, apply <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>. If <a href='#SkCanvas_drawImageRect_4_image'>image</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#SkShader'>SkShader</a>.
+If <a href='#SkCanvas_drawImageRect_4_paint'>paint</a> contains <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, generate mask from <a href='#SkCanvas_drawImageRect_4_image'>image</a> bounds.
+
+If generated mask extends beyond <a href='#SkCanvas_drawImageRect_4_image'>image</a> bounds, replicate <a href='#SkCanvas_drawImageRect_4_image'>image</a> edge colors, just
+as <a href='undocumented#SkShader'>SkShader</a> made from <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_makeShader'>makeShader</a> with <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set
+replicates the <a href='#SkCanvas_drawImageRect_4_image'>image</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples outside of its bounds.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImageRect_4_image'><code><strong>image</strong></code></a></td>
+    <td><a href='SkImage_Reference#SkImage'>SkImage</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_4_src'><code><strong>src</strong></code></a></td>
+    <td>source <a href='SkRect_Reference#SkRect'>SkRect</a> of <a href='#SkCanvas_drawImageRect_4_image'>image</a> to draw from</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_4_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkRect_Reference#SkRect'>SkRect</a> of <a href='#SkCanvas_drawImageRect_4_image'>image</a> to draw to</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_4_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> containing <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,</td>
+  </tr>
+</table>
+
+and so on; or nullptr
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImageRect_4_constraint'><code><strong>constraint</strong></code></a></td>
+    <td>filter strictly within <a href='#SkCanvas_drawImageRect_4_src'>src</a> or draw faster</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawImageRect_4"><div><a href='SkCanvas_Reference#Canvas'>Canvas</a> scales and translates; transformation from <a href='#SkCanvas_drawImageRect_4_src'>src</a> to <a href='#SkCanvas_drawImageRect_4_dst'>dst</a> also scales.
+The two <a href='SkMatrix_Reference#Matrix'>matrices</a> are concatenated to create the final transformation.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> <a href='#SkCanvas_drawImage'>drawImage</a> <a href='#SkCanvas_drawImageLattice'>drawImageLattice</a> <a href='#SkCanvas_drawImageNine'>drawImageNine</a>
+
+<a name='SkCanvas_drawImageRect_5'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawImageRect'>drawImageRect</a>(const <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt;& <a href='SkImage_Reference#Image'>image</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& isrc, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                   const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>, <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> constraint = <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>)
+</pre>
+
+Draws <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkCanvas_drawImageRect_5_isrc'>isrc</a> of <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='#SkCanvas_drawImageRect_5_image'>image</a>, scaled and translated to fill <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawImageRect_5_dst'>dst</a>.
+<a href='#SkCanvas_drawImageRect_5_isrc'>isrc</a> is on integer <a href='undocumented#Pixel'>pixel</a> boundaries; <a href='#SkCanvas_drawImageRect_5_dst'>dst</a> may include fractional boundaries.
+Additionally transform draw using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawImageRect_5_paint'>paint</a>.
+
+If <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawImageRect_5_paint'>paint</a> is supplied, apply <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>. If <a href='#SkCanvas_drawImageRect_5_image'>image</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#SkShader'>SkShader</a>.
+If <a href='#SkCanvas_drawImageRect_5_paint'>paint</a> contains <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, generate mask from <a href='#SkCanvas_drawImageRect_5_image'>image</a> bounds.
+
+If generated mask extends beyond <a href='#SkCanvas_drawImageRect_5_image'>image</a> bounds, replicate <a href='#SkCanvas_drawImageRect_5_image'>image</a> edge colors, just
+as <a href='undocumented#SkShader'>SkShader</a> made from <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_makeShader'>makeShader</a> with <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set
+replicates the <a href='#SkCanvas_drawImageRect_5_image'>image</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples outside of its bounds.
+
+<a href='#SkCanvas_drawImageRect_5_constraint'>constraint</a> set to <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a> limits <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='undocumented#SkFilterQuality'>SkFilterQuality</a> to
+sample within <a href='#SkCanvas_drawImageRect_5_image'>image</a>; set to <a href='#SkCanvas_kFast_SrcRectConstraint'>kFast_SrcRectConstraint</a> allows sampling outside to
+improve performance.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImageRect_5_image'><code><strong>image</strong></code></a></td>
+    <td><a href='SkImage_Reference#SkImage'>SkImage</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_5_isrc'><code><strong>isrc</strong></code></a></td>
+    <td>source <a href='SkIRect_Reference#SkIRect'>SkIRect</a> of <a href='#SkCanvas_drawImageRect_5_image'>image</a> to draw from</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_5_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkRect_Reference#SkRect'>SkRect</a> of <a href='#SkCanvas_drawImageRect_5_image'>image</a> to draw to</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_5_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> containing <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,</td>
+  </tr>
+</table>
+
+and so on; or nullptr
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImageRect_5_constraint'><code><strong>constraint</strong></code></a></td>
+    <td>filter strictly within <a href='#SkCanvas_drawImageRect_5_image'>image</a> or draw faster</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawImageRect_5"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> <a href='#SkCanvas_drawImage'>drawImage</a> <a href='#SkCanvas_drawImageLattice'>drawImageLattice</a> <a href='#SkCanvas_drawImageNine'>drawImageNine</a>
+
+<a name='SkCanvas_drawImageRect_6'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawImageRect'>drawImageRect</a>(const <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt;& <a href='SkImage_Reference#Image'>image</a>, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='#SkCanvas_drawImageRect_6_image'>image</a>, scaled and translated to fill <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawImageRect_6_dst'>dst</a>,
+using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawImageRect_6_paint'>paint</a>.
+
+If <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawImageRect_6_paint'>paint</a> is supplied, apply <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>. If <a href='#SkCanvas_drawImageRect_6_image'>image</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#SkShader'>SkShader</a>.
+If <a href='#SkCanvas_drawImageRect_6_paint'>paint</a> contains <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, generate mask from <a href='#SkCanvas_drawImageRect_6_image'>image</a> bounds.
+
+If generated mask extends beyond <a href='#SkCanvas_drawImageRect_6_image'>image</a> bounds, replicate <a href='#SkCanvas_drawImageRect_6_image'>image</a> edge colors, just
+as <a href='undocumented#SkShader'>SkShader</a> made from <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_makeShader'>makeShader</a> with <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set
+replicates the <a href='#SkCanvas_drawImageRect_6_image'>image</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples outside of its bounds.
+
+constraint set to <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a> limits <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='undocumented#SkFilterQuality'>SkFilterQuality</a> to
+sample within <a href='#SkCanvas_drawImageRect_6_image'>image</a>; set to <a href='#SkCanvas_kFast_SrcRectConstraint'>kFast_SrcRectConstraint</a> allows sampling outside to
+improve performance.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImageRect_6_image'><code><strong>image</strong></code></a></td>
+    <td><a href='SkImage_Reference#SkImage'>SkImage</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_6_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkRect_Reference#SkRect'>SkRect</a> of <a href='#SkCanvas_drawImageRect_6_image'>image</a> to draw to</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageRect_6_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> containing <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,</td>
+  </tr>
+</table>
+
+and so on; or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawImageRect_6"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> <a href='#SkCanvas_drawImage'>drawImage</a> <a href='#SkCanvas_drawImageLattice'>drawImageLattice</a> <a href='#SkCanvas_drawImageNine'>drawImageNine</a>
+
+<a name='SkCanvas_drawImageNine'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawImageNine'>drawImageNine</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* <a href='SkImage_Reference#Image'>image</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& center, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                   const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr)
+</pre>
+
+Draws <a href='SkImage_Reference#Image'>Image</a> <a href='#SkCanvas_drawImageNine_image'>image</a> stretched proportionally to fit into <a href='SkRect_Reference#Rect'>Rect</a> <a href='#SkCanvas_drawImageNine_dst'>dst</a>.
+<a href='SkIRect_Reference#IRect'>IRect</a> <a href='#SkCanvas_drawImageNine_center'>center</a> divides the <a href='#SkCanvas_drawImageNine_image'>image</a> into nine sections: four sides, four corners, and
+the <a href='#SkCanvas_drawImageNine_center'>center</a>. Corners are unmodified or scaled down proportionately if their sides
+are larger than <a href='#SkCanvas_drawImageNine_dst'>dst</a>; <a href='#SkCanvas_drawImageNine_center'>center</a> and four sides are scaled to fit remaining space, if any.
+
+Additionally transform draw using Clip, <a href='SkMatrix_Reference#Matrix'>Matrix</a>, and optional <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawImageNine_paint'>paint</a>.
+If <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawImageNine_paint'>paint</a> is supplied, apply <a href='#Color_Filter'>Color_Filter</a>, <a href='#Color_Alpha'>Color_Alpha</a>, <a href='#Image_Filter'>Image_Filter</a>,
+<a href='#Blend_Mode'>Blend_Mode</a>, and <a href='#Draw_Looper'>Draw_Looper</a>. If image is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#Shader'>Shader</a>.
+If <a href='#SkCanvas_drawImageNine_paint'>paint</a> contains <a href='#Mask_Filter'>Mask_Filter</a>, generate mask from image bounds. If <a href='#SkCanvas_drawImageNine_paint'>paint</a>
+<a href='#Filter_Quality'>Filter_Quality</a> set to <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, disable <a href='undocumented#Pixel'>pixel</a> filtering. For all
+other values of <a href='#SkCanvas_drawImageNine_paint'>paint</a> <a href='#Filter_Quality'>Filter_Quality</a>, use <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> to filter pixels.
+Any <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> on <a href='#SkCanvas_drawImageNine_paint'>paint</a> is ignored as is <a href='#SkCanvas_drawImageNine_paint'>paint</a> <a href='#Paint_Anti_Alias'>Anti_Aliasing</a> state.
+If generated mask extends beyond <a href='#SkCanvas_drawImageNine_image'>image</a> bounds, replicate <a href='#SkCanvas_drawImageNine_image'>image</a> edge colors, just
+as <a href='undocumented#Shader'>Shader</a> made from <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_makeShader'>makeShader</a> with <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set
+replicates the <a href='#SkCanvas_drawImageNine_image'>image</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples outside of its bounds.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImageNine_image'><code><strong>image</strong></code></a></td>
+    <td><a href='SkImage_Reference#Image'>Image</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageNine_center'><code><strong>center</strong></code></a></td>
+    <td><a href='SkIRect_Reference#IRect'>IRect</a> edge of <a href='#SkCanvas_drawImageNine_image'>image</a> corners and sides</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageNine_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkRect_Reference#Rect'>Rect</a> of <a href='#SkCanvas_drawImageNine_image'>image</a> to draw to</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageNine_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#Paint'>Paint</a> containing <a href='#Blend_Mode'>Blend_Mode</a>, <a href='#Color_Filter'>Color_Filter</a>, <a href='#Image_Filter'>Image_Filter</a>,
+and so on; or nullptr
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawImageNine"><div>The leftmost <a href='#SkCanvas_drawImageNine_image'>image</a> is smaller than <a href='#SkCanvas_drawImageNine_center'>center</a>; only corners are drawn, all scaled to fit.
+The second <a href='#SkCanvas_drawImageNine_image'>image</a> equals the <a href='undocumented#Size'>size</a> of <a href='#SkCanvas_drawImageNine_center'>center</a>; only corners are drawn without scaling.
+The remaining images are larger than <a href='#SkCanvas_drawImageNine_center'>center</a>. All corners draw without scaling.
+The sides and <a href='#SkCanvas_drawImageNine_center'>center</a> are scaled if needed to take up the remaining space.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawImage'>drawImage</a> <a href='#SkCanvas_drawBitmapNine'>drawBitmapNine</a> <a href='#SkCanvas_drawImageLattice'>drawImageLattice</a> <a href='#SkCanvas_drawImageRect'>drawImageRect</a>
+
+<a name='SkCanvas_drawImageNine_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawImageNine'>drawImageNine</a>(const <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt;& <a href='SkImage_Reference#Image'>image</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& center, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                   const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr)
+</pre>
+
+Draws <a href='SkImage_Reference#Image'>Image</a> <a href='#SkCanvas_drawImageNine_2_image'>image</a> stretched proportionally to fit into <a href='SkRect_Reference#Rect'>Rect</a> <a href='#SkCanvas_drawImageNine_2_dst'>dst</a>.
+<a href='SkIRect_Reference#IRect'>IRect</a> <a href='#SkCanvas_drawImageNine_2_center'>center</a> divides the <a href='#SkCanvas_drawImageNine_2_image'>image</a> into nine sections: four sides, four corners, and
+the <a href='#SkCanvas_drawImageNine_2_center'>center</a>. Corners are not scaled, or scaled down proportionately if their sides
+are larger than <a href='#SkCanvas_drawImageNine_2_dst'>dst</a>; <a href='#SkCanvas_drawImageNine_2_center'>center</a> and four sides are scaled to fit remaining space, if any.
+
+Additionally transform draw using Clip, <a href='SkMatrix_Reference#Matrix'>Matrix</a>, and optional <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawImageNine_2_paint'>paint</a>.
+If <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawImageNine_2_paint'>paint</a> is supplied, apply <a href='#Color_Filter'>Color_Filter</a>, <a href='#Color_Alpha'>Color_Alpha</a>, <a href='#Image_Filter'>Image_Filter</a>,
+<a href='#Blend_Mode'>Blend_Mode</a>, and <a href='#Draw_Looper'>Draw_Looper</a>. If image is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#Shader'>Shader</a>.
+If <a href='#SkCanvas_drawImageNine_2_paint'>paint</a> contains <a href='#Mask_Filter'>Mask_Filter</a>, generate mask from image bounds. If <a href='#SkCanvas_drawImageNine_2_paint'>paint</a>
+<a href='#Filter_Quality'>Filter_Quality</a> set to <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, disable <a href='undocumented#Pixel'>pixel</a> filtering. For all
+other values of <a href='#SkCanvas_drawImageNine_2_paint'>paint</a> <a href='#Filter_Quality'>Filter_Quality</a>, use <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> to filter pixels.
+Any <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> on <a href='#SkCanvas_drawImageNine_2_paint'>paint</a> is ignored as is <a href='#SkCanvas_drawImageNine_2_paint'>paint</a> <a href='#Paint_Anti_Alias'>Anti_Aliasing</a> state.
+If generated mask extends beyond <a href='#SkCanvas_drawImageNine_2_image'>image</a> bounds, replicate <a href='#SkCanvas_drawImageNine_2_image'>image</a> edge colors, just
+as <a href='undocumented#Shader'>Shader</a> made from <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_makeShader'>makeShader</a> with <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set
+replicates the <a href='#SkCanvas_drawImageNine_2_image'>image</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples outside of its bounds.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImageNine_2_image'><code><strong>image</strong></code></a></td>
+    <td><a href='SkImage_Reference#Image'>Image</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageNine_2_center'><code><strong>center</strong></code></a></td>
+    <td><a href='SkIRect_Reference#IRect'>IRect</a> edge of <a href='#SkCanvas_drawImageNine_2_image'>image</a> corners and sides</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageNine_2_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkRect_Reference#Rect'>Rect</a> of <a href='#SkCanvas_drawImageNine_2_image'>image</a> to draw to</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageNine_2_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#Paint'>Paint</a> containing <a href='#Blend_Mode'>Blend_Mode</a>, <a href='#Color_Filter'>Color_Filter</a>, <a href='#Image_Filter'>Image_Filter</a>,
+and so on; or nullptr
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawImageNine_2"><div>The two leftmost images has four corners and sides to the left and right of <a href='#SkCanvas_drawImageNine_2_center'>center</a>.
+The leftmost <a href='#SkCanvas_drawImageNine_2_image'>image</a> scales the width of corners proportionately to fit.
+The third and fourth <a href='#SkCanvas_drawImageNine_2_image'>image</a> corners are not scaled; the sides and <a href='#SkCanvas_drawImageNine_2_center'>center</a> are scaled to
+fill the remaining space.
+The rightmost <a href='#SkCanvas_drawImageNine_2_image'>image</a> has four corners scaled vertically to fit, and uses sides above
+and below <a href='#SkCanvas_drawImageNine_2_center'>center</a> to fill the remaining space.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawImage'>drawImage</a> <a href='#SkCanvas_drawBitmapNine'>drawBitmapNine</a> <a href='#SkCanvas_drawImageLattice'>drawImageLattice</a> <a href='#SkCanvas_drawImageRect'>drawImageRect</a>
+
+<a name='SkCanvas_drawBitmap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawBitmap'>drawBitmap</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, <a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr)
+</pre>
+
+Draws <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> <a href='#SkCanvas_drawBitmap_bitmap'>bitmap</a>, with its top-left corner at (<a href='#SkCanvas_drawBitmap_left'>left</a>, <a href='#SkCanvas_drawBitmap_top'>top</a>),
+using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawBitmap_paint'>paint</a>.
+
+If <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawBitmap_paint'>paint</a> is not nullptr, apply <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>. If <a href='#SkCanvas_drawBitmap_bitmap'>bitmap</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#SkShader'>SkShader</a>.
+If <a href='#SkCanvas_drawBitmap_paint'>paint</a> contains <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, generate mask from <a href='#SkCanvas_drawBitmap_bitmap'>bitmap</a> bounds.
+
+If generated mask extends beyond <a href='#SkCanvas_drawBitmap_bitmap'>bitmap</a> bounds, replicate <a href='#SkCanvas_drawBitmap_bitmap'>bitmap</a> edge colors,
+just as <a href='undocumented#SkShader'>SkShader</a> made from <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_MakeBitmapShader'>MakeBitmapShader</a> with
+<a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set replicates the <a href='#SkCanvas_drawBitmap_bitmap'>bitmap</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples
+outside of its bounds.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawBitmap_bitmap'><code><strong>bitmap</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmap_left'><code><strong>left</strong></code></a></td>
+    <td><a href='#SkCanvas_drawBitmap_left'>left side</a> of <a href='#SkCanvas_drawBitmap_bitmap'>bitmap</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmap_top'><code><strong>top</strong></code></a></td>
+    <td><a href='#SkCanvas_drawBitmap_top'>top</a> side of <a href='#SkCanvas_drawBitmap_bitmap'>bitmap</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmap_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> containing <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,</td>
+  </tr>
+</table>
+
+and so on; or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawBitmap"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawImage'>drawImage</a> <a href='#SkCanvas_drawBitmapLattice'>drawBitmapLattice</a> <a href='#SkCanvas_drawBitmapNine'>drawBitmapNine</a> <a href='#SkCanvas_drawBitmapRect'>drawBitmapRect</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_readPixels'>readPixels</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_writePixels'>writePixels</a>
+
+<a name='SkCanvas_drawBitmapRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawBitmapRect'>drawBitmapRect</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, const <a href='SkRect_Reference#SkRect'>SkRect</a>& src, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                    const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>, <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> constraint = <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>)
+</pre>
+
+Draws <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawBitmapRect_src'>src</a> of <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> <a href='#SkCanvas_drawBitmapRect_bitmap'>bitmap</a>, scaled and translated to fill <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawBitmapRect_dst'>dst</a>.
+Additionally transform draw using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawBitmapRect_paint'>paint</a>.
+
+If <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawBitmapRect_paint'>paint</a> is supplied, apply <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>. If <a href='#SkCanvas_drawBitmapRect_bitmap'>bitmap</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#SkShader'>SkShader</a>.
+If <a href='#SkCanvas_drawBitmapRect_paint'>paint</a> contains <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, generate mask from <a href='#SkCanvas_drawBitmapRect_bitmap'>bitmap</a> bounds.
+
+If generated mask extends beyond <a href='#SkCanvas_drawBitmapRect_bitmap'>bitmap</a> bounds, replicate <a href='#SkCanvas_drawBitmapRect_bitmap'>bitmap</a> edge colors,
+just as <a href='undocumented#SkShader'>SkShader</a> made from <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_MakeBitmapShader'>MakeBitmapShader</a> with
+<a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set replicates the <a href='#SkCanvas_drawBitmapRect_bitmap'>bitmap</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples
+outside of its bounds.
+
+<a href='#SkCanvas_drawBitmapRect_constraint'>constraint</a> set to <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a> limits <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='undocumented#SkFilterQuality'>SkFilterQuality</a> to
+sample within <a href='#SkCanvas_drawBitmapRect_src'>src</a>; set to <a href='#SkCanvas_kFast_SrcRectConstraint'>kFast_SrcRectConstraint</a> allows sampling outside to
+improve performance.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawBitmapRect_bitmap'><code><strong>bitmap</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmapRect_src'><code><strong>src</strong></code></a></td>
+    <td>source <a href='SkRect_Reference#SkRect'>SkRect</a> of <a href='SkImage_Reference#Image'>image</a> to draw from</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmapRect_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkRect_Reference#SkRect'>SkRect</a> of <a href='SkImage_Reference#Image'>image</a> to draw to</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmapRect_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> containing <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,</td>
+  </tr>
+</table>
+
+and so on; or nullptr
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawBitmapRect_constraint'><code><strong>constraint</strong></code></a></td>
+    <td>filter strictly within <a href='#SkCanvas_drawBitmapRect_src'>src</a> or draw faster</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawBitmapRect"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawImageRect'>drawImageRect</a> <a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawBitmapLattice'>drawBitmapLattice</a> <a href='#SkCanvas_drawBitmapNine'>drawBitmapNine</a>
+
+<a name='SkCanvas_drawBitmapRect_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawBitmapRect'>drawBitmapRect</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& isrc, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                    const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>, <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> constraint = <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>)
+</pre>
+
+Draws <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkCanvas_drawBitmapRect_2_isrc'>isrc</a> of <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> <a href='#SkCanvas_drawBitmapRect_2_bitmap'>bitmap</a>, scaled and translated to fill <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawBitmapRect_2_dst'>dst</a>.
+<a href='#SkCanvas_drawBitmapRect_2_isrc'>isrc</a> is on integer <a href='undocumented#Pixel'>pixel</a> boundaries; <a href='#SkCanvas_drawBitmapRect_2_dst'>dst</a> may include fractional boundaries.
+Additionally transform draw using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawBitmapRect_2_paint'>paint</a>.
+
+If <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawBitmapRect_2_paint'>paint</a> is supplied, apply <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>. If <a href='#SkCanvas_drawBitmapRect_2_bitmap'>bitmap</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#SkShader'>SkShader</a>.
+If <a href='#SkCanvas_drawBitmapRect_2_paint'>paint</a> contains <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, generate mask from <a href='#SkCanvas_drawBitmapRect_2_bitmap'>bitmap</a> bounds.
+
+If generated mask extends beyond <a href='#SkCanvas_drawBitmapRect_2_bitmap'>bitmap</a> bounds, replicate <a href='#SkCanvas_drawBitmapRect_2_bitmap'>bitmap</a> edge colors,
+just as <a href='undocumented#SkShader'>SkShader</a> made from <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_MakeBitmapShader'>MakeBitmapShader</a> with
+<a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set replicates the <a href='#SkCanvas_drawBitmapRect_2_bitmap'>bitmap</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples
+outside of its bounds.
+
+<a href='#SkCanvas_drawBitmapRect_2_constraint'>constraint</a> set to <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a> limits <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='undocumented#SkFilterQuality'>SkFilterQuality</a> to
+sample within <a href='#SkCanvas_drawBitmapRect_2_isrc'>isrc</a>; set to <a href='#SkCanvas_kFast_SrcRectConstraint'>kFast_SrcRectConstraint</a> allows sampling outside to
+improve performance.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawBitmapRect_2_bitmap'><code><strong>bitmap</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmapRect_2_isrc'><code><strong>isrc</strong></code></a></td>
+    <td>source <a href='SkIRect_Reference#SkIRect'>SkIRect</a> of <a href='SkImage_Reference#Image'>image</a> to draw from</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmapRect_2_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkRect_Reference#SkRect'>SkRect</a> of <a href='SkImage_Reference#Image'>image</a> to draw to</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmapRect_2_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> containing <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,</td>
+  </tr>
+</table>
+
+and so on; or nullptr
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawBitmapRect_2_constraint'><code><strong>constraint</strong></code></a></td>
+    <td>sample strictly within <a href='#SkCanvas_drawBitmapRect_2_isrc'>isrc</a>, or draw faster</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawBitmapRect_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawImageRect'>drawImageRect</a> <a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawBitmapLattice'>drawBitmapLattice</a> <a href='#SkCanvas_drawBitmapNine'>drawBitmapNine</a>
+
+<a name='SkCanvas_drawBitmapRect_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawBitmapRect'>drawBitmapRect</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>,
+                    <a href='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> constraint = <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a>)
+</pre>
+
+Draws <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> <a href='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a>, scaled and translated to fill <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawBitmapRect_3_dst'>dst</a>.
+<a href='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a> bounds is on integer <a href='undocumented#Pixel'>pixel</a> boundaries; <a href='#SkCanvas_drawBitmapRect_3_dst'>dst</a> may include fractional boundaries.
+Additionally transform draw using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawBitmapRect_3_paint'>paint</a>.
+
+If <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawBitmapRect_3_paint'>paint</a> is supplied, apply <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>. If <a href='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#SkShader'>SkShader</a>.
+If <a href='#SkCanvas_drawBitmapRect_3_paint'>paint</a> contains <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, generate mask from <a href='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a> bounds.
+
+If generated mask extends beyond <a href='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a> bounds, replicate <a href='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a> edge colors,
+just as <a href='undocumented#SkShader'>SkShader</a> made from <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_MakeBitmapShader'>MakeBitmapShader</a> with
+<a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set replicates the <a href='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples
+outside of its bounds.
+
+<a href='#SkCanvas_drawBitmapRect_3_constraint'>constraint</a> set to <a href='#SkCanvas_kStrict_SrcRectConstraint'>kStrict_SrcRectConstraint</a> limits <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='undocumented#SkFilterQuality'>SkFilterQuality</a> to
+sample within <a href='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a>; set to <a href='#SkCanvas_kFast_SrcRectConstraint'>kFast_SrcRectConstraint</a> allows sampling outside to
+improve performance.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawBitmapRect_3_bitmap'><code><strong>bitmap</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmapRect_3_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkRect_Reference#SkRect'>SkRect</a> of <a href='SkImage_Reference#Image'>image</a> to draw to</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmapRect_3_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> containing <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,</td>
+  </tr>
+</table>
+
+and so on; or nullptr
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawBitmapRect_3_constraint'><code><strong>constraint</strong></code></a></td>
+    <td>filter strictly within <a href='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a> or draw faster</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawBitmapRect_3"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawImageRect'>drawImageRect</a> <a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawBitmapLattice'>drawBitmapLattice</a> <a href='#SkCanvas_drawBitmapNine'>drawBitmapNine</a>
+
+<a name='SkCanvas_drawBitmapNine'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawBitmapNine'>drawBitmapNine</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& center, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                    const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr)
+</pre>
+
+Draws <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkCanvas_drawBitmapNine_bitmap'>bitmap</a> stretched proportionally to fit into <a href='SkRect_Reference#Rect'>Rect</a> <a href='#SkCanvas_drawBitmapNine_dst'>dst</a>.
+<a href='SkIRect_Reference#IRect'>IRect</a> <a href='#SkCanvas_drawBitmapNine_center'>center</a> divides the <a href='#SkCanvas_drawBitmapNine_bitmap'>bitmap</a> into nine sections: four sides, four corners,
+and the <a href='#SkCanvas_drawBitmapNine_center'>center</a>. Corners are not scaled, or scaled down proportionately if their
+sides are larger than <a href='#SkCanvas_drawBitmapNine_dst'>dst</a>; <a href='#SkCanvas_drawBitmapNine_center'>center</a> and four sides are scaled to fit remaining
+space, if any.
+
+Additionally transform draw using Clip, <a href='SkMatrix_Reference#Matrix'>Matrix</a>, and optional <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawBitmapNine_paint'>paint</a>.
+If <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawBitmapNine_paint'>paint</a> is supplied, apply <a href='#Color_Filter'>Color_Filter</a>, <a href='#Color_Alpha'>Color_Alpha</a>, <a href='#Image_Filter'>Image_Filter</a>,
+<a href='#Blend_Mode'>Blend_Mode</a>, and <a href='#Draw_Looper'>Draw_Looper</a>. If bitmap is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#Shader'>Shader</a>.
+If <a href='#SkCanvas_drawBitmapNine_paint'>paint</a> contains <a href='#Mask_Filter'>Mask_Filter</a>, generate mask from bitmap bounds. If <a href='#SkCanvas_drawBitmapNine_paint'>paint</a>
+<a href='#Filter_Quality'>Filter_Quality</a> set to <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, disable <a href='undocumented#Pixel'>pixel</a> filtering. For all
+other values of <a href='#SkCanvas_drawBitmapNine_paint'>paint</a> <a href='#Filter_Quality'>Filter_Quality</a>, use <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> to filter pixels.
+Any <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> on <a href='#SkCanvas_drawBitmapNine_paint'>paint</a> is ignored as is <a href='#SkCanvas_drawBitmapNine_paint'>paint</a> <a href='#Paint_Anti_Alias'>Anti_Aliasing</a> state.
+If generated mask extends beyond <a href='#SkCanvas_drawBitmapNine_bitmap'>bitmap</a> bounds, replicate <a href='#SkCanvas_drawBitmapNine_bitmap'>bitmap</a> edge colors,
+just as <a href='undocumented#Shader'>Shader</a> made from <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_MakeBitmapShader'>MakeBitmapShader</a> with
+<a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set replicates the <a href='#SkCanvas_drawBitmapNine_bitmap'>bitmap</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples
+outside of its bounds.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawBitmapNine_bitmap'><code><strong>bitmap</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#Bitmap'>Bitmap</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmapNine_center'><code><strong>center</strong></code></a></td>
+    <td><a href='SkIRect_Reference#IRect'>IRect</a> edge of <a href='SkImage_Reference#Image'>image</a> corners and sides</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmapNine_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkRect_Reference#Rect'>Rect</a> of <a href='SkImage_Reference#Image'>image</a> to draw to</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmapNine_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#Paint'>Paint</a> containing <a href='#Blend_Mode'>Blend_Mode</a>, <a href='#Color_Filter'>Color_Filter</a>, <a href='#Image_Filter'>Image_Filter</a>,
+and so on; or nullptr
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawBitmapNine"><div>The two leftmost <a href='#SkCanvas_drawBitmapNine_bitmap'>bitmap</a> draws has four corners and sides to the left and right of <a href='#SkCanvas_drawBitmapNine_center'>center</a>.
+The leftmost  <a href='SkBitmap_Reference#Bitmap_Draw'>bitmap draw</a> scales the width of corners proportionately to fit.
+The third and fourth draw corners are not scaled; the sides and <a href='#SkCanvas_drawBitmapNine_center'>center</a> are scaled to
+fill the remaining space.
+The rightmost  <a href='SkBitmap_Reference#Bitmap_Draw'>bitmap draw</a> has four corners scaled vertically to fit, and uses sides above
+and below <a href='#SkCanvas_drawBitmapNine_center'>center</a> to fill the remaining space.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawImageNine'>drawImageNine</a> <a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawBitmapLattice'>drawBitmapLattice</a> <a href='#SkCanvas_drawBitmapRect'>drawBitmapRect</a>
+
+<a name='Draw_Image_Lattice'></a>
+
+<a name='SkCanvas_Lattice'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    struct <a href='#SkCanvas_Lattice'>Lattice</a> {
+
+        enum <a href='#SkCanvas_Lattice_RectType'>RectType</a> : uint8_t {
+            <a href='#SkCanvas_Lattice_kDefault'>kDefault</a> = 0,
+            <a href='#SkCanvas_Lattice_kTransparent'>kTransparent</a>,
+            <a href='#SkCanvas_Lattice_kFixedColor'>kFixedColor</a>,
+        };
+
+        const int* <a href='#SkCanvas_Lattice_fXDivs'>fXDivs</a>;
+        const int* <a href='#SkCanvas_Lattice_fYDivs'>fYDivs</a>;
+        const <a href='#SkCanvas_Lattice_RectType'>RectType</a>* <a href='#SkCanvas_Lattice_fRectTypes'>fRectTypes</a>;
+        int <a href='#SkCanvas_Lattice_fXCount'>fXCount</a>;
+        int <a href='#SkCanvas_Lattice_fYCount'>fYCount</a>;
+        const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>* <a href='#SkCanvas_Lattice_fBounds'>fBounds</a>;
+        const <a href='SkColor_Reference#SkColor'>SkColor</a>* <a href='#SkCanvas_Lattice_fColors'>fColors</a>;
+    };
+
+</pre>
+
+<a href='#SkCanvas_Lattice'>Lattice</a> divides <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> or <a href='SkImage_Reference#Image'>Image</a> into a rectangular grid.
+Grid entries on even columns and even rows are fixed; these entries are
+always drawn at their original <a href='undocumented#Size'>size</a> if the destination is large enough.
+If the destination side is too small to hold the fixed entries, all fixed
+entries are proportionately scaled down to fit.
+The grid entries not on even columns and rows are scaled to fit the
+remaining space, if any.
+
+<a name='SkCanvas_Lattice_RectType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+        enum <a href='#SkCanvas_Lattice_RectType'>RectType</a> : uint8_t {
+            <a href='#SkCanvas_Lattice_kDefault'>kDefault</a> = 0,
+            <a href='#SkCanvas_Lattice_kTransparent'>kTransparent</a>,
+            <a href='#SkCanvas_Lattice_kFixedColor'>kFixedColor</a>,
+        };
+
+</pre>
+
+Optional setting per rectangular grid entry to make it transparent,
+or to fill the grid entry with a <a href='SkColor_Reference#Color'>color</a>.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_Lattice_kDefault'><code>SkCanvas::Lattice::kDefault</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+draws Bitmap into lattice rectangle</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_Lattice_kTransparent'><code>SkCanvas::Lattice::kTransparent</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+skips lattice rectangle by making it transparent</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_Lattice_kFixedColor'><code>SkCanvas::Lattice::kFixedColor</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+draws one of fColors into lattice rectangle</td>
+  </tr>
+</table>
+
+<a name='Draw_Image_Lattice_Members'></a><table style='border-collapse: collapse; width: 62.5em'>
+
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Type</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Member</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>const&nbsp;int*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_Lattice_fXDivs'><code>fXDivs</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Array of x-axis values that divide the <a href='SkBitmap_Reference#Bitmap'>bitmap</a> vertically.
+Array entries must be unique, increasing, greater than or equal to
+<a href='#SkCanvas_Lattice_fBounds'>fBounds</a> left edge, and less than <a href='#SkCanvas_Lattice_fBounds'>fBounds</a> right edge.
+Set the first element to <a href='#SkCanvas_Lattice_fBounds'>fBounds</a> left to collapse the left column of
+fixed grid entries.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>const&nbsp;int*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_Lattice_fYDivs'><code>fYDivs</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Array of y-axis values that divide the <a href='SkBitmap_Reference#Bitmap'>bitmap</a> horizontally.
+Array entries must be unique, increasing, greater than or equal to
+<a href='#SkCanvas_Lattice_fBounds'>fBounds</a> top edge, and less than <a href='#SkCanvas_Lattice_fBounds'>fBounds</a> bottom edge.
+Set the first element to <a href='#SkCanvas_Lattice_fBounds'>fBounds</a> top to collapse the top row of fixed
+grid entries.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>const&nbsp;RectType*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_Lattice_fRectTypes'><code>fRectTypes</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Optional array of fill types, one per rectangular grid entry:
+array length must be <code>(<a href='#SkCanvas_Lattice_fXCount'>fXCount</a> + 1) * (<a href='#SkCanvas_Lattice_fYCount'>fYCount</a> + 1)</code>.
+
+Each <a href='#SkCanvas_Lattice_RectType'>RectType</a> is one of: <a href='#SkCanvas_Lattice_kDefault'>kDefault</a>, <a href='#SkCanvas_Lattice_kTransparent'>kTransparent</a>, <a href='#SkCanvas_Lattice_kFixedColor'>kFixedColor</a>.
+
+Array entries correspond to the rectangular grid entries, ascending
+left to right and then top to bottom.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>int</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_Lattice_fXCount'><code>fXCount</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Number of entries in <a href='#SkCanvas_Lattice_fXDivs'>fXDivs</a> array; one less than the number of
+horizontal divisions.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>int</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_Lattice_fYCount'><code>fYCount</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Number of entries in <a href='#SkCanvas_Lattice_fYDivs'>fYDivs</a> array; one less than the number of vertical
+divisions.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>const&nbsp;SkIRect*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_Lattice_fBounds'><code>fBounds</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Optional subset <a href='SkIRect_Reference#IRect'>IRect</a> source to draw from.
+If nullptr, source bounds is dimensions of <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> or <a href='SkImage_Reference#Image'>Image</a>.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>const&nbsp;SkColor*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkCanvas_Lattice_fColors'><code>fColors</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Optional array of colors, one per rectangular grid entry.
+Array length must be <code>(<a href='#SkCanvas_Lattice_fXCount'>fXCount</a> + 1) * (<a href='#SkCanvas_Lattice_fYCount'>fYCount</a> + 1)</code>.
+
+Array entries correspond to the rectangular grid entries, ascending
+left to right, then top to bottom.
+</td>
+  </tr>
+</table>
+
+<a name='SkCanvas_drawBitmapLattice'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawBitmapLattice'>drawBitmapLattice</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, const <a href='#SkCanvas_Lattice'>Lattice</a>& lattice, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                       const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr)
+</pre>
+
+Draws <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> <a href='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> stretched proportionally to fit into <a href='SkRect_Reference#Rect'>Rect</a> <a href='#SkCanvas_drawBitmapLattice_dst'>dst</a>.
+
+<a href='#SkCanvas_Lattice'>Lattice</a> <a href='#SkCanvas_drawBitmapLattice_lattice'>lattice</a> divides <a href='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> into a rectangular grid.
+Each intersection of an even-numbered row and column is fixed; like the corners
+of <a href='#SkCanvas_drawBitmapNine'>drawBitmapNine</a>, fixed <a href='#SkCanvas_drawBitmapLattice_lattice'>lattice</a> elements never scale larger than their initial
+<a href='undocumented#Size'>size</a> and shrink proportionately when all fixed elements exceed the <a href='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a>
+dimension. All other grid elements scale to fill the available space, if any.
+
+Additionally transform draw using Clip, <a href='SkMatrix_Reference#Matrix'>Matrix</a>, and optional <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawBitmapLattice_paint'>paint</a>.
+If <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawBitmapLattice_paint'>paint</a> is supplied, apply <a href='#Color_Filter'>Color_Filter</a>, <a href='#Color_Alpha'>Color_Alpha</a>, <a href='#Image_Filter'>Image_Filter</a>,
+<a href='#Blend_Mode'>Blend_Mode</a>, and <a href='#Draw_Looper'>Draw_Looper</a>. If bitmap is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#Shader'>Shader</a>.
+If <a href='#SkCanvas_drawBitmapLattice_paint'>paint</a> contains <a href='#Mask_Filter'>Mask_Filter</a>, generate mask from bitmap bounds. If <a href='#SkCanvas_drawBitmapLattice_paint'>paint</a>
+<a href='#Filter_Quality'>Filter_Quality</a> set to <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, disable <a href='undocumented#Pixel'>pixel</a> filtering. For all
+other values of <a href='#SkCanvas_drawBitmapLattice_paint'>paint</a> <a href='#Filter_Quality'>Filter_Quality</a>, use <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> to filter pixels.
+Any <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> on <a href='#SkCanvas_drawBitmapLattice_paint'>paint</a> is ignored as is <a href='#SkCanvas_drawBitmapLattice_paint'>paint</a> <a href='#Paint_Anti_Alias'>Anti_Aliasing</a> state.
+If generated mask extends beyond <a href='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> bounds, replicate <a href='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> edge colors,
+just as <a href='undocumented#Shader'>Shader</a> made from <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_MakeBitmapShader'>MakeBitmapShader</a> with
+<a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set replicates the <a href='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples
+outside of its bounds.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawBitmapLattice_bitmap'><code><strong>bitmap</strong></code></a></td>
+    <td><a href='SkBitmap_Reference#Bitmap'>Bitmap</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmapLattice_lattice'><code><strong>lattice</strong></code></a></td>
+    <td>division of <a href='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> into fixed and variable rectangles</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmapLattice_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkRect_Reference#Rect'>Rect</a> of <a href='SkImage_Reference#Image'>image</a> to draw to</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawBitmapLattice_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#Paint'>Paint</a> containing <a href='#Blend_Mode'>Blend_Mode</a>, <a href='#Color_Filter'>Color_Filter</a>, <a href='#Image_Filter'>Image_Filter</a>,
+and so on; or nullptr
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawBitmapLattice"><div>The two leftmost <a href='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> draws has four corners and sides to the left and right of center.
+The leftmost  <a href='SkBitmap_Reference#Bitmap_Draw'>bitmap draw</a> scales the width of corners proportionately to fit.
+The third and fourth draw corners are not scaled; the sides are scaled to
+fill the remaining space; the center is transparent.
+The rightmost  <a href='SkBitmap_Reference#Bitmap_Draw'>bitmap draw</a> has four corners scaled vertically to fit, and uses sides above
+and below center to fill the remaining space.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawImageLattice'>drawImageLattice</a> <a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawBitmapNine'>drawBitmapNine</a> <a href='#SkCanvas_Lattice'>Lattice</a>
+
+<a name='SkCanvas_drawImageLattice'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawImageLattice'>drawImageLattice</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* <a href='SkImage_Reference#Image'>image</a>, const <a href='#SkCanvas_Lattice'>Lattice</a>& lattice, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst,
+                      const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr)
+</pre>
+
+Draws <a href='SkImage_Reference#Image'>Image</a> <a href='#SkCanvas_drawImageLattice_image'>image</a> stretched proportionally to fit into <a href='SkRect_Reference#Rect'>Rect</a> <a href='#SkCanvas_drawImageLattice_dst'>dst</a>.
+
+<a href='#SkCanvas_Lattice'>Lattice</a> <a href='#SkCanvas_drawImageLattice_lattice'>lattice</a> divides <a href='#SkCanvas_drawImageLattice_image'>image</a> into a rectangular grid.
+Each intersection of an even-numbered row and column is fixed; like the corners
+of <a href='#SkCanvas_drawBitmapNine'>drawBitmapNine</a>, fixed <a href='#SkCanvas_drawImageLattice_lattice'>lattice</a> elements never scale larger than their initial
+<a href='undocumented#Size'>size</a> and shrink proportionately when all fixed elements exceed the <a href='SkBitmap_Reference#Bitmap'>bitmap</a>
+dimension. All other grid elements scale to fill the available space, if any.
+
+Additionally transform draw using Clip, <a href='SkMatrix_Reference#Matrix'>Matrix</a>, and optional <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawImageLattice_paint'>paint</a>.
+If <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawImageLattice_paint'>paint</a> is supplied, apply <a href='#Color_Filter'>Color_Filter</a>, <a href='#Color_Alpha'>Color_Alpha</a>, <a href='#Image_Filter'>Image_Filter</a>,
+<a href='#Blend_Mode'>Blend_Mode</a>, and <a href='#Draw_Looper'>Draw_Looper</a>. If image is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#Shader'>Shader</a>.
+If <a href='#SkCanvas_drawImageLattice_paint'>paint</a> contains <a href='#Mask_Filter'>Mask_Filter</a>, generate mask from image bounds. If <a href='#SkCanvas_drawImageLattice_paint'>paint</a>
+<a href='#Filter_Quality'>Filter_Quality</a> set to <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, disable <a href='undocumented#Pixel'>pixel</a> filtering. For all
+other values of <a href='#SkCanvas_drawImageLattice_paint'>paint</a> <a href='#Filter_Quality'>Filter_Quality</a>, use <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> to filter pixels.
+Any <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> on <a href='#SkCanvas_drawImageLattice_paint'>paint</a> is ignored as is <a href='#SkCanvas_drawImageLattice_paint'>paint</a> <a href='#Paint_Anti_Alias'>Anti_Aliasing</a> state.
+If generated mask extends beyond <a href='SkBitmap_Reference#Bitmap'>bitmap</a> bounds, replicate <a href='SkBitmap_Reference#Bitmap'>bitmap</a> edge colors,
+just as <a href='undocumented#Shader'>Shader</a> made from <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_MakeBitmapShader'>MakeBitmapShader</a> with
+<a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> set replicates the <a href='SkBitmap_Reference#Bitmap'>bitmap</a> edge <a href='SkColor_Reference#Color'>color</a> when it samples
+outside of its bounds.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawImageLattice_image'><code><strong>image</strong></code></a></td>
+    <td><a href='SkImage_Reference#Image'>Image</a> containing pixels, dimensions, and format</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageLattice_lattice'><code><strong>lattice</strong></code></a></td>
+    <td>division of <a href='SkBitmap_Reference#Bitmap'>bitmap</a> into fixed and variable rectangles</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageLattice_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkRect_Reference#Rect'>Rect</a> of <a href='#SkCanvas_drawImageLattice_image'>image</a> to draw to</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawImageLattice_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#Paint'>Paint</a> containing <a href='#Blend_Mode'>Blend_Mode</a>, <a href='#Color_Filter'>Color_Filter</a>, <a href='#Image_Filter'>Image_Filter</a>,
+and so on; or nullptr
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawImageNine"><div>The leftmost <a href='#SkCanvas_drawImageLattice_image'>image</a> is smaller than center; only corners are drawn, all scaled to fit.
+The second <a href='#SkCanvas_drawImageLattice_image'>image</a> equals the <a href='undocumented#Size'>size</a> of center; only corners are drawn without scaling.
+The remaining images are larger than center. All corners draw without scaling. The sides
+are scaled if needed to take up the remaining space; the center is transparent.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawBitmapLattice'>drawBitmapLattice</a> <a href='#SkCanvas_drawImage'>drawImage</a> <a href='#SkCanvas_drawImageNine'>drawImageNine</a> <a href='#SkCanvas_Lattice'>Lattice</a>
+
+<a name='Draw_Text'></a>
+
+<a name='SkCanvas_drawText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawText'>drawText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='#SkCanvas_drawText_text'>text</a>, with origin at (<a href='#SkCanvas_drawText_x'>x</a>, <a href='#SkCanvas_drawText_y'>y</a>), using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawText_paint'>paint</a>.
+
+<a href='#SkCanvas_drawText_text'>text</a> meaning depends on <a href='undocumented#SkTextEncoding'>SkTextEncoding</a>; by default, <a href='#SkCanvas_drawText_text'>text</a> is encoded as
+UTF-8.
+
+<a href='#SkCanvas_drawText_x'>x</a> and <a href='#SkCanvas_drawText_y'>y</a> meaning depends on <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::Align and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> vertical <a href='#SkCanvas_drawText_text'>text</a>; by default
+<a href='#SkCanvas_drawText_text'>text</a> draws left to right, positioning the first <a href='undocumented#Glyph'>glyph</a>   <a href='undocumented#Left_Side_Bearing'>left side bearing</a> at <a href='#SkCanvas_drawText_x'>x</a>
+and its baseline at <a href='#SkCanvas_drawText_y'>y</a>. <a href='undocumented#Text'>Text</a> <a href='undocumented#Size'>size</a> is affected by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawText_text'>text</a> <a href='undocumented#Size'>size</a>.
+
+All elements of <a href='#SkCanvas_drawText_paint'>paint</a>: <a href='undocumented#SkPathEffect'>SkPathEffect</a>, <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkShader'>SkShader</a>,
+<a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>; apply to <a href='#SkCanvas_drawText_text'>text</a>. By default, draws
+filled 12 <a href='SkPoint_Reference#Point'>point</a> black <a href='undocumented#Glyph'>glyphs</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawText_text'><code><strong>text</strong></code></a></td>
+    <td>character code <a href='SkPoint_Reference#Point'>points</a> or <a href='undocumented#Glyph'>glyphs</a> drawn</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawText_byteLength'><code><strong>byteLength</strong></code></a></td>
+    <td>byte length of <a href='#SkCanvas_drawText_text'>text</a> array</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawText_x'><code><strong>x</strong></code></a></td>
+    <td>start of <a href='#SkCanvas_drawText_text'>text</a> on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawText_y'><code><strong>y</strong></code></a></td>
+    <td>start of <a href='#SkCanvas_drawText_text'>text</a> on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawText_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='#SkCanvas_drawText_text'>text</a> <a href='undocumented#Size'>size</a>, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawText"><div>The same <a href='#SkCanvas_drawText_text'>text</a> is drawn varying <a href='#Paint_Text_Size'>Paint_Text_Size</a> and varying
+<a href='SkMatrix_Reference#Matrix'>Matrix</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawString'>drawString</a> <a href='#SkCanvas_drawPosText'>drawPosText</a> <a href='#SkCanvas_drawPosTextH'>drawPosTextH</a> <a href='#SkCanvas_drawTextBlob'>drawTextBlob</a> <a href='#SkCanvas_drawTextRSXform'>drawTextRSXform</a>
+
+<a name='SkCanvas_drawString'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawString'>drawString</a>(const char* <a href='undocumented#String'>string</a>, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws null terminated <a href='#SkCanvas_drawString_string'>string</a>, with origin at (<a href='#SkCanvas_drawString_x'>x</a>, <a href='#SkCanvas_drawString_y'>y</a>), using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawString_paint'>paint</a>.
+
+<a href='#SkCanvas_drawString_string'>string</a> meaning depends on <a href='undocumented#SkTextEncoding'>SkTextEncoding</a>; by default, strings are encoded
+as UTF-8. Other values of <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> are unlikely to produce the desired
+results, since zero bytes may be embedded in the <a href='#SkCanvas_drawString_string'>string</a>.
+
+<a href='#SkCanvas_drawString_x'>x</a> and <a href='#SkCanvas_drawString_y'>y</a> meaning depends on <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::Align and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> vertical <a href='undocumented#Text'>text</a>; by default
+<a href='#SkCanvas_drawString_string'>string</a> draws left to right, positioning the first <a href='undocumented#Glyph'>glyph</a>   <a href='undocumented#Left_Side_Bearing'>left side bearing</a> at <a href='#SkCanvas_drawString_x'>x</a>
+and its baseline at <a href='#SkCanvas_drawString_y'>y</a>. <a href='undocumented#Text'>Text</a> <a href='undocumented#Size'>size</a> is affected by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a>.
+
+All elements of <a href='#SkCanvas_drawString_paint'>paint</a>: <a href='undocumented#SkPathEffect'>SkPathEffect</a>, <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkShader'>SkShader</a>,
+<a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>; apply to <a href='undocumented#Text'>text</a>. By default, draws
+filled 12 <a href='SkPoint_Reference#Point'>point</a> black <a href='undocumented#Glyph'>glyphs</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawString_string'><code><strong>string</strong></code></a></td>
+    <td>character code <a href='SkPoint_Reference#Point'>points</a> or <a href='undocumented#Glyph'>glyphs</a> drawn,</td>
+  </tr>
+</table>
+
+ending with a char value of zero
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawString_x'><code><strong>x</strong></code></a></td>
+    <td>start of <a href='#SkCanvas_drawString_string'>string</a> on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawString_y'><code><strong>y</strong></code></a></td>
+    <td>start of <a href='#SkCanvas_drawString_string'>string</a> on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawString_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a>, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawString"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawText'>drawText</a> <a href='#SkCanvas_drawPosText'>drawPosText</a> <a href='#SkCanvas_drawPosTextH'>drawPosTextH</a> <a href='#SkCanvas_drawTextBlob'>drawTextBlob</a> <a href='#SkCanvas_drawTextRSXform'>drawTextRSXform</a>
+
+<a name='SkCanvas_drawString_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawString'>drawString</a>(const <a href='undocumented#SkString'>SkString</a>& <a href='undocumented#String'>string</a>, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws null terminated <a href='#SkCanvas_drawString_2_string'>string</a>, with origin at (<a href='#SkCanvas_drawString_2_x'>x</a>, <a href='#SkCanvas_drawString_2_y'>y</a>), using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawString_2_paint'>paint</a>.
+
+<a href='#SkCanvas_drawString_2_string'>string</a> meaning depends on <a href='undocumented#SkTextEncoding'>SkTextEncoding</a>; by default, strings are encoded
+as UTF-8. Other values of <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> are unlikely to produce the desired
+results, since zero bytes may be embedded in the <a href='#SkCanvas_drawString_2_string'>string</a>.
+
+<a href='#SkCanvas_drawString_2_x'>x</a> and <a href='#SkCanvas_drawString_2_y'>y</a> meaning depends on <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::Align and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> vertical <a href='undocumented#Text'>text</a>; by default
+<a href='#SkCanvas_drawString_2_string'>string</a> draws left to right, positioning the first <a href='undocumented#Glyph'>glyph</a>   <a href='undocumented#Left_Side_Bearing'>left side bearing</a> at <a href='#SkCanvas_drawString_2_x'>x</a>
+and its baseline at <a href='#SkCanvas_drawString_2_y'>y</a>. <a href='undocumented#Text'>Text</a> <a href='undocumented#Size'>size</a> is affected by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a>.
+
+All elements of <a href='#SkCanvas_drawString_2_paint'>paint</a>: <a href='undocumented#SkPathEffect'>SkPathEffect</a>, <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkShader'>SkShader</a>,
+<a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>; apply to <a href='undocumented#Text'>text</a>. By default, draws
+filled 12 <a href='SkPoint_Reference#Point'>point</a> black <a href='undocumented#Glyph'>glyphs</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawString_2_string'><code><strong>string</strong></code></a></td>
+    <td>character code <a href='SkPoint_Reference#Point'>points</a> or <a href='undocumented#Glyph'>glyphs</a> drawn,</td>
+  </tr>
+</table>
+
+ending with a char value of zero
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawString_2_x'><code><strong>x</strong></code></a></td>
+    <td>start of <a href='#SkCanvas_drawString_2_string'>string</a> on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawString_2_y'><code><strong>y</strong></code></a></td>
+    <td>start of <a href='#SkCanvas_drawString_2_string'>string</a> on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawString_2_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a>, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawString_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawText'>drawText</a> <a href='#SkCanvas_drawPosText'>drawPosText</a> <a href='#SkCanvas_drawPosTextH'>drawPosTextH</a> <a href='#SkCanvas_drawTextBlob'>drawTextBlob</a> <a href='#SkCanvas_drawTextRSXform'>drawTextRSXform</a>
+
+<a name='SkCanvas_drawPosText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawPosText'>drawPosText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pos[], const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws each <a href='undocumented#Glyph'>glyph</a> in <a href='#SkCanvas_drawPosText_text'>text</a> with the origin in <a href='#SkCanvas_drawPosText_pos'>pos</a> array, using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawPosText_paint'>paint</a>. The number of entries in <a href='#SkCanvas_drawPosText_pos'>pos</a> array must match the number of <a href='undocumented#Glyph'>glyphs</a>
+described by <a href='#SkCanvas_drawPosText_byteLength'>byteLength</a> of <a href='#SkCanvas_drawPosText_text'>text</a>.
+
+<a href='#SkCanvas_drawPosText_text'>text</a> meaning depends on <a href='undocumented#SkTextEncoding'>SkTextEncoding</a>; by default, <a href='#SkCanvas_drawPosText_text'>text</a> is encoded as
+UTF-8. <a href='#SkCanvas_drawPosText_pos'>pos</a> elements meaning depends on <a href='SkPaint_Reference#SkPaint'>SkPaint</a> vertical <a href='#SkCanvas_drawPosText_text'>text</a>; by default
+<a href='undocumented#Glyph'>glyph</a>   <a href='undocumented#Left_Side_Bearing'>left side bearing</a> and baseline are relative to <a href='SkPoint_Reference#SkPoint'>SkPoint</a> in <a href='#SkCanvas_drawPosText_pos'>pos</a> array.
+<a href='undocumented#Text'>Text</a> <a href='undocumented#Size'>size</a> is affected by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawPosText_text'>text</a> <a href='undocumented#Size'>size</a>.
+
+All elements of <a href='#SkCanvas_drawPosText_paint'>paint</a>: <a href='undocumented#SkPathEffect'>SkPathEffect</a>, <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkShader'>SkShader</a>,
+<a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>; apply to <a href='#SkCanvas_drawPosText_text'>text</a>. By default, draws
+filled 12 <a href='SkPoint_Reference#Point'>point</a> black <a href='undocumented#Glyph'>glyphs</a>.
+
+Layout engines such as Harfbuzz typically position each <a href='undocumented#Glyph'>glyph</a>
+rather than using the  <a href='SkFont_Reference#Font_Advance'>font advance</a> widths.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPosText_text'><code><strong>text</strong></code></a></td>
+    <td>character code <a href='SkPoint_Reference#Point'>points</a> or <a href='undocumented#Glyph'>glyphs</a> drawn</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPosText_byteLength'><code><strong>byteLength</strong></code></a></td>
+    <td>byte length of <a href='#SkCanvas_drawPosText_text'>text</a> array</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPosText_pos'><code><strong>pos</strong></code></a></td>
+    <td>array of <a href='undocumented#Glyph'>glyph</a> origins</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPosText_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='#SkCanvas_drawPosText_text'>text</a> <a href='undocumented#Size'>size</a>, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="bf0b2402533a23b6392e0676b7a8414c"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawText'>drawText</a> <a href='#SkCanvas_drawPosTextH'>drawPosTextH</a> <a href='#SkCanvas_drawTextBlob'>drawTextBlob</a> <a href='#SkCanvas_drawTextRSXform'>drawTextRSXform</a>
+
+<a name='SkCanvas_drawPosTextH'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawPosTextH'>drawPosTextH</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, const <a href='undocumented#SkScalar'>SkScalar</a> xpos[], <a href='undocumented#SkScalar'>SkScalar</a> constY,
+                  const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws each <a href='undocumented#Glyph'>glyph</a> in <a href='#SkCanvas_drawPosTextH_text'>text</a> with its origin composed from <a href='#SkCanvas_drawPosTextH_xpos'>xpos</a> array and
+<a href='#SkCanvas_drawPosTextH_constY'>constY</a>, using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawPosTextH_paint'>paint</a>. The number of entries in <a href='#SkCanvas_drawPosTextH_xpos'>xpos</a> array
+must match the number of <a href='undocumented#Glyph'>glyphs</a> described by <a href='#SkCanvas_drawPosTextH_byteLength'>byteLength</a> of <a href='#SkCanvas_drawPosTextH_text'>text</a>.
+
+<a href='#SkCanvas_drawPosTextH_text'>text</a> meaning depends on <a href='undocumented#SkTextEncoding'>SkTextEncoding</a>; by default, <a href='#SkCanvas_drawPosTextH_text'>text</a> is encoded as
+UTF-8. <a href='#SkCanvas_drawPosTextH_xpos'>xpos</a> elements meaning depends on <a href='SkPaint_Reference#SkPaint'>SkPaint</a> vertical <a href='#SkCanvas_drawPosTextH_text'>text</a>;
+by default each <a href='undocumented#Glyph'>glyph</a>   <a href='undocumented#Left_Side_Bearing'>left side bearing</a> is positioned at an <a href='#SkCanvas_drawPosTextH_xpos'>xpos</a> element and
+its baseline is positioned at <a href='#SkCanvas_drawPosTextH_constY'>constY</a>. <a href='undocumented#Text'>Text</a> <a href='undocumented#Size'>size</a> is affected by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> and
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawPosTextH_text'>text</a> <a href='undocumented#Size'>size</a>.
+
+All elements of <a href='#SkCanvas_drawPosTextH_paint'>paint</a>: <a href='undocumented#SkPathEffect'>SkPathEffect</a>, <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkShader'>SkShader</a>,
+<a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>; apply to <a href='#SkCanvas_drawPosTextH_text'>text</a>. By default, draws
+filled 12 <a href='SkPoint_Reference#Point'>point</a> black <a href='undocumented#Glyph'>glyphs</a>.
+
+Layout engines such as Harfbuzz typically position each <a href='undocumented#Glyph'>glyph</a>
+rather than using the  <a href='SkFont_Reference#Font_Advance'>font advance</a> widths if all <a href='undocumented#Glyph'>glyphs</a> share the same
+baseline.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPosTextH_text'><code><strong>text</strong></code></a></td>
+    <td>character code <a href='SkPoint_Reference#Point'>points</a> or <a href='undocumented#Glyph'>glyphs</a> drawn</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPosTextH_byteLength'><code><strong>byteLength</strong></code></a></td>
+    <td>byte length of <a href='#SkCanvas_drawPosTextH_text'>text</a> array</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPosTextH_xpos'><code><strong>xpos</strong></code></a></td>
+    <td>array of x-axis positions, used to position each <a href='undocumented#Glyph'>glyph</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPosTextH_constY'><code><strong>constY</strong></code></a></td>
+    <td>shared y-axis value for all of x-axis positions</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPosTextH_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='#SkCanvas_drawPosTextH_text'>text</a> <a href='undocumented#Size'>size</a>, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="95c6a7ef82993a8d2add676080e9438a"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawText'>drawText</a> <a href='#SkCanvas_drawPosText'>drawPosText</a> <a href='#SkCanvas_drawTextBlob'>drawTextBlob</a> <a href='#SkCanvas_drawTextRSXform'>drawTextRSXform</a>
+
+<a name='SkCanvas_drawTextRSXform'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawTextRSXform'>drawTextRSXform</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, const <a href='undocumented#SkRSXform'>SkRSXform</a> xform[],
+                     const <a href='SkRect_Reference#SkRect'>SkRect</a>* cullRect, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='#SkCanvas_drawTextRSXform_text'>text</a>, transforming each <a href='undocumented#Glyph'>glyph</a> by the corresponding <a href='undocumented#SkRSXform'>SkRSXform</a>,
+using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawTextRSXform_paint'>paint</a>.
+
+<a href='undocumented#SkRSXform'>SkRSXform</a> <a href='#SkCanvas_drawTextRSXform_xform'>xform</a> array specifies a separate square scale, rotation, and translation
+for each <a href='undocumented#Glyph'>glyph</a>. <a href='#SkCanvas_drawTextRSXform_xform'>xform</a> does not affect <a href='#SkCanvas_drawTextRSXform_paint'>paint</a> <a href='undocumented#SkShader'>SkShader</a>.
+
+Optional <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawTextRSXform_cullRect'>cullRect</a> is a conservative bounds of <a href='#SkCanvas_drawTextRSXform_text'>text</a>, taking into account
+<a href='undocumented#SkRSXform'>SkRSXform</a> and <a href='#SkCanvas_drawTextRSXform_paint'>paint</a>. If <a href='#SkCanvas_drawTextRSXform_cullRect'>cullRect</a> is outside of clip, <a href='SkCanvas_Reference#Canvas'>canvas</a> can skip drawing.
+
+All elements of <a href='#SkCanvas_drawTextRSXform_paint'>paint</a>: <a href='undocumented#SkPathEffect'>SkPathEffect</a>, <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkShader'>SkShader</a>,
+<a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>; apply to <a href='#SkCanvas_drawTextRSXform_text'>text</a>. By default, draws
+filled 12 <a href='SkPoint_Reference#Point'>point</a> black <a href='undocumented#Glyph'>glyphs</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawTextRSXform_text'><code><strong>text</strong></code></a></td>
+    <td>character code <a href='SkPoint_Reference#Point'>points</a> or <a href='undocumented#Glyph'>glyphs</a> drawn</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawTextRSXform_byteLength'><code><strong>byteLength</strong></code></a></td>
+    <td>byte length of <a href='#SkCanvas_drawTextRSXform_text'>text</a> array</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawTextRSXform_xform'><code><strong>xform</strong></code></a></td>
+    <td><a href='undocumented#SkRSXform'>SkRSXform</a> rotates, scales, and translates each <a href='undocumented#Glyph'>glyph</a> individually</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawTextRSXform_cullRect'><code><strong>cullRect</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> bounds of <a href='#SkCanvas_drawTextRSXform_text'>text</a> for efficient clipping; or nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawTextRSXform_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='#SkCanvas_drawTextRSXform_text'>text</a> <a href='undocumented#Size'>size</a>, blend, <a href='SkColor_Reference#Color'>color</a>, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawTextRSXform"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawText'>drawText</a> <a href='#SkCanvas_drawPosText'>drawPosText</a> <a href='#SkCanvas_drawTextBlob'>drawTextBlob</a>
+
+<a name='SkCanvas_drawTextBlob'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawTextBlob'>drawTextBlob</a>(const <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>* blob, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='#Text_Blob'>Text_Blob</a> <a href='#SkCanvas_drawTextBlob_blob'>blob</a> at (<a href='#SkCanvas_drawTextBlob_x'>x</a>, <a href='#SkCanvas_drawTextBlob_y'>y</a>), using Clip, <a href='SkMatrix_Reference#Matrix'>Matrix</a>, and <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawTextBlob_paint'>paint</a>.
+
+<a href='#SkCanvas_drawTextBlob_blob'>blob</a> contains <a href='undocumented#Glyph'>Glyphs</a>, their positions, and <a href='#SkCanvas_drawTextBlob_paint'>paint</a> attributes specific to <a href='undocumented#Text'>text</a>: <a href='undocumented#Typeface'>Typeface</a>, <a href='#Font_Size'>Font_Size</a>, <a href='#Font_Scale_X'>Font_Scale_X</a>,
+<a href='#Font_Skew_X'>Font_Skew_X</a>, <a href='#Font_Hinting'>Font_Hinting</a>, <a href='#Paint_Anti_Alias'>Paint_Anti_Alias</a>, <a href='#Font_Embolden'>Font_Embolden</a>, <a href='#Font_Force_Hinting'>Font_Force_Hinting</a>,
+<a href='#Font_Embedded_Bitmaps'>Font_Embedded_Bitmaps</a>, <a href='#Font_Hinting_Spacing'>Font_Hinting_Spacing</a>, <a href='#Font_Anti_Alias'>Font_Anti_Alias</a>, <a href='#Font_Linear'>Font_Linear</a>,
+and <a href='#Font_Subpixel'>Font_Subpixel</a>
+.
+
+<a href='#Paint_Text_Encoding'>Paint_Text_Encoding</a> must be set to <a href='undocumented#SkTextEncoding::kGlyphID'>SkTextEncoding::kGlyphID</a>.
+
+Elements of <a href='#SkCanvas_drawTextBlob_paint'>paint</a>: <a href='#Paint_Anti_Alias'>Anti_Alias</a>, <a href='#Blend_Mode'>Blend_Mode</a>, <a href='SkColor_Reference#Color'>Color</a> including <a href='#Color_Alpha'>Color_Alpha</a>,
+<a href='#Color_Filter'>Color_Filter</a>, <a href='#Paint_Dither'>Paint_Dither</a>, <a href='#Draw_Looper'>Draw_Looper</a>, <a href='#Mask_Filter'>Mask_Filter</a>, <a href='#Path_Effect'>Path_Effect</a>, <a href='undocumented#Shader'>Shader</a>, and
+<a href='#Paint_Style'>Paint_Style</a>; apply to <a href='#SkCanvas_drawTextBlob_blob'>blob</a>. If <a href='SkPaint_Reference#Paint'>Paint</a> contains <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kStroke_Style'>kStroke_Style</a>:
+<a href='#Paint_Miter_Limit'>Paint_Miter_Limit</a>, <a href='#Paint_Stroke_Cap'>Paint_Stroke_Cap</a>, <a href='#Paint_Stroke_Join'>Paint_Stroke_Join</a>, and <a href='#Paint_Stroke_Width'>Paint_Stroke_Width</a>;
+apply to <a href='SkPath_Reference#Path'>Path</a> created from <a href='#SkCanvas_drawTextBlob_blob'>blob</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawTextBlob_blob'><code><strong>blob</strong></code></a></td>
+    <td><a href='undocumented#Glyph'>Glyphs</a>, positions, and their paints' <a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a>, <a href='undocumented#Typeface'>typeface</a>, and so on</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawTextBlob_x'><code><strong>x</strong></code></a></td>
+    <td>horizontal offset applied to <a href='#SkCanvas_drawTextBlob_blob'>blob</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawTextBlob_y'><code><strong>y</strong></code></a></td>
+    <td>vertical offset applied to <a href='#SkCanvas_drawTextBlob_blob'>blob</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawTextBlob_paint'><code><strong>paint</strong></code></a></td>
+    <td>blend, <a href='SkColor_Reference#Color'>color</a>, stroking, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="005502b502c1282cb8d306d6c8d998fb"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawText'>drawText</a> <a href='#SkCanvas_drawPosText'>drawPosText</a> <a href='#SkCanvas_drawPosTextH'>drawPosTextH</a>
+
+<a name='SkCanvas_drawTextBlob_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawTextBlob'>drawTextBlob</a>(const <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>&gt;& blob, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='#Text_Blob'>Text_Blob</a> <a href='#SkCanvas_drawTextBlob_2_blob'>blob</a> at (<a href='#SkCanvas_drawTextBlob_2_x'>x</a>, <a href='#SkCanvas_drawTextBlob_2_y'>y</a>), using Clip, <a href='SkMatrix_Reference#Matrix'>Matrix</a>, and <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawTextBlob_2_paint'>paint</a>.
+
+<a href='#SkCanvas_drawTextBlob_2_blob'>blob</a> contains <a href='undocumented#Glyph'>Glyphs</a>, their positions, and <a href='#SkCanvas_drawTextBlob_2_paint'>paint</a> attributes specific to <a href='undocumented#Text'>text</a>: <a href='undocumented#Typeface'>Typeface</a>, <a href='#Font_Size'>Font_Size</a>, <a href='#Font_Scale_X'>Font_Scale_X</a>,
+<a href='#Font_Skew_X'>Font_Skew_X</a>, <a href='#Font_Hinting'>Font_Hinting</a>, <a href='#Paint_Anti_Alias'>Paint_Anti_Alias</a>, <a href='#Font_Embolden'>Font_Embolden</a>, <a href='#Font_Force_Hinting'>Font_Force_Hinting</a>,
+<a href='#Font_Embedded_Bitmaps'>Font_Embedded_Bitmaps</a>, <a href='#Font_Hinting_Spacing'>Font_Hinting_Spacing</a>, <a href='#Font_Anti_Alias'>Font_Anti_Alias</a>, <a href='#Font_Linear'>Font_Linear</a>,
+and <a href='#Font_Subpixel'>Font_Subpixel</a>
+.
+
+<a href='#Paint_Text_Encoding'>Paint_Text_Encoding</a> must be set to <a href='undocumented#SkTextEncoding::kGlyphID'>SkTextEncoding::kGlyphID</a>.
+
+Elements of <a href='#SkCanvas_drawTextBlob_2_paint'>paint</a>: <a href='#Path_Effect'>Path_Effect</a>, <a href='#Mask_Filter'>Mask_Filter</a>, <a href='undocumented#Shader'>Shader</a>, <a href='#Color_Filter'>Color_Filter</a>,
+<a href='#Image_Filter'>Image_Filter</a>, and <a href='#Draw_Looper'>Draw_Looper</a>; apply to <a href='#SkCanvas_drawTextBlob_2_blob'>blob</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawTextBlob_2_blob'><code><strong>blob</strong></code></a></td>
+    <td><a href='undocumented#Glyph'>Glyphs</a>, positions, and their paints' <a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a>, <a href='undocumented#Typeface'>typeface</a>, and so on</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawTextBlob_2_x'><code><strong>x</strong></code></a></td>
+    <td>horizontal offset applied to <a href='#SkCanvas_drawTextBlob_2_blob'>blob</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawTextBlob_2_y'><code><strong>y</strong></code></a></td>
+    <td>vertical offset applied to <a href='#SkCanvas_drawTextBlob_2_blob'>blob</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawTextBlob_2_paint'><code><strong>paint</strong></code></a></td>
+    <td>blend, <a href='SkColor_Reference#Color'>color</a>, stroking, and so on, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawTextBlob_2"><div><a href='SkPaint_Reference#Paint'>Paint</a> attributes related to <a href='undocumented#Text'>text</a>, like <a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a>, have no effect on <a href='#SkCanvas_drawTextBlob_2_paint'>paint</a> passed to <a href='#SkCanvas_drawTextBlob'>drawTextBlob</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawText'>drawText</a> <a href='#SkCanvas_drawPosText'>drawPosText</a> <a href='#SkCanvas_drawPosTextH'>drawPosTextH</a>
+
+<a name='SkCanvas_drawPicture'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawPicture'>drawPicture</a>(const <a href='SkPicture_Reference#SkPicture'>SkPicture</a>* <a href='SkPicture_Reference#Picture'>picture</a>)
+</pre>
+
+Draws <a href='SkPicture_Reference#SkPicture'>SkPicture</a> <a href='#SkCanvas_drawPicture_picture'>picture</a>, using clip and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+Clip and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> are unchanged by <a href='#SkCanvas_drawPicture_picture'>picture</a> contents, as if
+<a href='#SkCanvas_save'>save()</a> was called before and <a href='#SkCanvas_restore'>restore()</a> was called after <a href='#SkCanvas_drawPicture'>drawPicture</a>().
+
+<a href='SkPicture_Reference#SkPicture'>SkPicture</a> records a series of draw commands for later playback.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPicture_picture'><code><strong>picture</strong></code></a></td>
+    <td>recorded drawing commands to play</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawPicture_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawDrawable'>drawDrawable</a> <a href='SkPicture_Reference#SkPicture'>SkPicture</a> <a href='SkPicture_Reference#SkPicture'>SkPicture</a>::<a href='#SkPicture_playback'>playback</a>
+
+<a name='SkCanvas_drawPicture_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawPicture'>drawPicture</a>(const <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkPicture_Reference#SkPicture'>SkPicture</a>&gt;& <a href='SkPicture_Reference#Picture'>picture</a>)
+</pre>
+
+Draws <a href='SkPicture_Reference#SkPicture'>SkPicture</a> <a href='#SkCanvas_drawPicture_2_picture'>picture</a>, using clip and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+Clip and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> are unchanged by <a href='#SkCanvas_drawPicture_2_picture'>picture</a> contents, as if
+<a href='#SkCanvas_save'>save()</a> was called before and <a href='#SkCanvas_restore'>restore()</a> was called after <a href='#SkCanvas_drawPicture'>drawPicture</a>().
+
+<a href='SkPicture_Reference#SkPicture'>SkPicture</a> records a series of draw commands for later playback.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPicture_2_picture'><code><strong>picture</strong></code></a></td>
+    <td>recorded drawing commands to play</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawPicture_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawDrawable'>drawDrawable</a> <a href='SkPicture_Reference#SkPicture'>SkPicture</a> <a href='SkPicture_Reference#SkPicture'>SkPicture</a>::<a href='#SkPicture_playback'>playback</a>
+
+<a name='SkCanvas_drawPicture_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawPicture'>drawPicture</a>(const <a href='SkPicture_Reference#SkPicture'>SkPicture</a>* <a href='SkPicture_Reference#Picture'>picture</a>, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* <a href='SkMatrix_Reference#Matrix'>matrix</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkPicture_Reference#SkPicture'>SkPicture</a> <a href='#SkCanvas_drawPicture_3_picture'>picture</a>, using clip and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>; transforming <a href='#SkCanvas_drawPicture_3_picture'>picture</a> with
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkCanvas_drawPicture_3_matrix'>matrix</a>, if provided; and use <a href='SkPaint_Reference#SkPaint'>SkPaint</a>  <a href='#SkCanvas_drawPicture_3_paint'>paint alpha</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>,
+<a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, if provided.
+
+<a href='#SkCanvas_drawPicture_3_matrix'>matrix</a> transformation is equivalent to: <a href='#SkCanvas_save'>save()</a>, <a href='#SkCanvas_concat'>concat()</a>, <a href='#SkCanvas_drawPicture'>drawPicture</a>(), <a href='#SkCanvas_restore'>restore()</a>.
+<a href='#SkCanvas_drawPicture_3_paint'>paint</a> use is equivalent to: <a href='#SkCanvas_saveLayer'>saveLayer</a>(), <a href='#SkCanvas_drawPicture'>drawPicture</a>(), <a href='#SkCanvas_restore'>restore()</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPicture_3_picture'><code><strong>picture</strong></code></a></td>
+    <td>recorded drawing commands to play</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPicture_3_matrix'><code><strong>matrix</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to rotate, scale, translate, and so on; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPicture_3_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> to apply transparency, filtering, and so on; may be nullptr</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawPicture_3"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawDrawable'>drawDrawable</a> <a href='SkPicture_Reference#SkPicture'>SkPicture</a> <a href='SkPicture_Reference#SkPicture'>SkPicture</a>::<a href='#SkPicture_playback'>playback</a>
+
+<a name='SkCanvas_drawPicture_4'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawPicture'>drawPicture</a>(const <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkPicture_Reference#SkPicture'>SkPicture</a>&gt;& <a href='SkPicture_Reference#Picture'>picture</a>, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* <a href='SkMatrix_Reference#Matrix'>matrix</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkPicture_Reference#SkPicture'>SkPicture</a> <a href='#SkCanvas_drawPicture_4_picture'>picture</a>, using clip and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>; transforming <a href='#SkCanvas_drawPicture_4_picture'>picture</a> with
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkCanvas_drawPicture_4_matrix'>matrix</a>, if provided; and use <a href='SkPaint_Reference#SkPaint'>SkPaint</a>  <a href='#SkCanvas_drawPicture_4_paint'>paint alpha</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>,
+<a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, if provided.
+
+<a href='#SkCanvas_drawPicture_4_matrix'>matrix</a> transformation is equivalent to: <a href='#SkCanvas_save'>save()</a>, <a href='#SkCanvas_concat'>concat()</a>, <a href='#SkCanvas_drawPicture'>drawPicture</a>(), <a href='#SkCanvas_restore'>restore()</a>.
+<a href='#SkCanvas_drawPicture_4_paint'>paint</a> use is equivalent to: <a href='#SkCanvas_saveLayer'>saveLayer</a>(), <a href='#SkCanvas_drawPicture'>drawPicture</a>(), <a href='#SkCanvas_restore'>restore()</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPicture_4_picture'><code><strong>picture</strong></code></a></td>
+    <td>recorded drawing commands to play</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPicture_4_matrix'><code><strong>matrix</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to rotate, scale, translate, and so on; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPicture_4_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> to apply transparency, filtering, and so on; may be nullptr</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawPicture_4"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawDrawable'>drawDrawable</a> <a href='SkPicture_Reference#SkPicture'>SkPicture</a> <a href='SkPicture_Reference#SkPicture'>SkPicture</a>::<a href='#SkPicture_playback'>playback</a>
+
+<a name='SkCanvas_drawVertices'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawVertices'>drawVertices</a>(const <a href='undocumented#SkVertices'>SkVertices</a>* <a href='undocumented#Vertices'>vertices</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='undocumented#SkVertices'>SkVertices</a> <a href='#SkCanvas_drawVertices_vertices'>vertices</a>, a triangle mesh, using clip and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+If  <a href='undocumented#Vertices_Texs'>vertices texs</a> and  <a href='undocumented#Vertices_Colors'>vertices colors</a> are defined in <a href='#SkCanvas_drawVertices_vertices'>vertices</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawVertices_paint'>paint</a>
+contains <a href='undocumented#SkShader'>SkShader</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> <a href='#SkCanvas_drawVertices_mode'>mode</a> combines  <a href='undocumented#Vertices_Colors'>vertices colors</a> with <a href='undocumented#SkShader'>SkShader</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawVertices_vertices'><code><strong>vertices</strong></code></a></td>
+    <td>triangle mesh to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawVertices_mode'><code><strong>mode</strong></code></a></td>
+    <td>combines  <a href='undocumented#Vertices_Colors'>vertices colors</a> with <a href='undocumented#SkShader'>SkShader</a>, if both are present</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawVertices_paint'><code><strong>paint</strong></code></a></td>
+    <td>specifies the <a href='undocumented#SkShader'>SkShader</a>, used as <a href='undocumented#SkVertices'>SkVertices</a> <a href='undocumented#Texture'>texture</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawVertices"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawPatch'>drawPatch</a> <a href='#SkCanvas_drawPicture'>drawPicture</a>
+
+<a name='SkCanvas_drawVertices_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawVertices'>drawVertices</a>(const <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkVertices'>SkVertices</a>&gt;& <a href='undocumented#Vertices'>vertices</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='undocumented#SkVertices'>SkVertices</a> <a href='#SkCanvas_drawVertices_2_vertices'>vertices</a>, a triangle mesh, using clip and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+If  <a href='undocumented#Vertices_Texs'>vertices texs</a> and  <a href='undocumented#Vertices_Colors'>vertices colors</a> are defined in <a href='#SkCanvas_drawVertices_2_vertices'>vertices</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawVertices_2_paint'>paint</a>
+contains <a href='undocumented#SkShader'>SkShader</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> <a href='#SkCanvas_drawVertices_2_mode'>mode</a> combines  <a href='undocumented#Vertices_Colors'>vertices colors</a> with <a href='undocumented#SkShader'>SkShader</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawVertices_2_vertices'><code><strong>vertices</strong></code></a></td>
+    <td>triangle mesh to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawVertices_2_mode'><code><strong>mode</strong></code></a></td>
+    <td>combines  <a href='undocumented#Vertices_Colors'>vertices colors</a> with <a href='undocumented#SkShader'>SkShader</a>, if both are present</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawVertices_2_paint'><code><strong>paint</strong></code></a></td>
+    <td>specifies the <a href='undocumented#SkShader'>SkShader</a>, used as <a href='undocumented#SkVertices'>SkVertices</a> <a href='undocumented#Texture'>texture</a>, may be nullptr</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawVertices_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawPatch'>drawPatch</a> <a href='#SkCanvas_drawPicture'>drawPicture</a>
+
+<a name='SkCanvas_drawVertices_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawVertices'>drawVertices</a>(const <a href='undocumented#SkVertices'>SkVertices</a>* <a href='undocumented#Vertices'>vertices</a>, const <a href='undocumented#SkVertices'>SkVertices</a>::<a href='#SkVertices_Bone'>Bone</a> bones[], int boneCount,
+                  <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='undocumented#SkVertices'>SkVertices</a> <a href='#SkCanvas_drawVertices_3_vertices'>vertices</a>, a triangle mesh, using clip and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. Bone <a href='undocumented#Data'>data</a> is used to
+deform <a href='#SkCanvas_drawVertices_3_vertices'>vertices</a> with bone <a href='SkPath_Reference#Conic_Weight'>weights</a>.
+If  <a href='undocumented#Vertices_Texs'>vertices texs</a> and  <a href='undocumented#Vertices_Colors'>vertices colors</a> are defined in <a href='#SkCanvas_drawVertices_3_vertices'>vertices</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawVertices_3_paint'>paint</a>
+contains <a href='undocumented#SkShader'>SkShader</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> <a href='#SkCanvas_drawVertices_3_mode'>mode</a> combines  <a href='undocumented#Vertices_Colors'>vertices colors</a> with <a href='undocumented#SkShader'>SkShader</a>.
+The first element of <a href='#SkCanvas_drawVertices_3_bones'>bones</a> should be an object to world space transformation <a href='SkMatrix_Reference#Matrix'>matrix</a> that
+will be applied before performing mesh deformations. If no such transformation is needed,
+it should be the identity <a href='SkMatrix_Reference#Matrix'>matrix</a>.
+<a href='#SkCanvas_drawVertices_3_boneCount'>boneCount</a> must be at most 80, and thus the <a href='undocumented#Size'>size</a> of <a href='#SkCanvas_drawVertices_3_bones'>bones</a> should be at most 80.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawVertices_3_vertices'><code><strong>vertices</strong></code></a></td>
+    <td>triangle mesh to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawVertices_3_bones'><code><strong>bones</strong></code></a></td>
+    <td>bone <a href='SkMatrix_Reference#Matrix'>matrix</a> <a href='undocumented#Data'>data</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawVertices_3_boneCount'><code><strong>boneCount</strong></code></a></td>
+    <td>number of bone <a href='SkMatrix_Reference#Matrix'>matrices</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawVertices_3_mode'><code><strong>mode</strong></code></a></td>
+    <td>combines  <a href='undocumented#Vertices_Colors'>vertices colors</a> with <a href='undocumented#SkShader'>SkShader</a>, if both are present</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawVertices_3_paint'><code><strong>paint</strong></code></a></td>
+    <td>specifies the <a href='undocumented#SkShader'>SkShader</a>, used as <a href='undocumented#SkVertices'>SkVertices</a> <a href='undocumented#Texture'>texture</a>, may be nullptr</td>
+  </tr>
+</table>
+
+### See Also
+
+<a href='#SkCanvas_drawPatch'>drawPatch</a> <a href='#SkCanvas_drawPicture'>drawPicture</a>
+
+<a name='SkCanvas_drawVertices_4'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawVertices'>drawVertices</a>(const <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkVertices'>SkVertices</a>&gt;& <a href='undocumented#Vertices'>vertices</a>, const <a href='undocumented#SkVertices'>SkVertices</a>::<a href='#SkVertices_Bone'>Bone</a> bones[], int boneCount,
+                  <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='undocumented#SkVertices'>SkVertices</a> <a href='#SkCanvas_drawVertices_4_vertices'>vertices</a>, a triangle mesh, using clip and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. Bone <a href='undocumented#Data'>data</a> is used to
+deform <a href='#SkCanvas_drawVertices_4_vertices'>vertices</a> with bone <a href='SkPath_Reference#Conic_Weight'>weights</a>.
+If  <a href='undocumented#Vertices_Texs'>vertices texs</a> and  <a href='undocumented#Vertices_Colors'>vertices colors</a> are defined in <a href='#SkCanvas_drawVertices_4_vertices'>vertices</a>, and <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawVertices_4_paint'>paint</a>
+contains <a href='undocumented#SkShader'>SkShader</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> <a href='#SkCanvas_drawVertices_4_mode'>mode</a> combines  <a href='undocumented#Vertices_Colors'>vertices colors</a> with <a href='undocumented#SkShader'>SkShader</a>.
+The first element of <a href='#SkCanvas_drawVertices_4_bones'>bones</a> should be an object to world space transformation <a href='SkMatrix_Reference#Matrix'>matrix</a> that
+will be applied before performing mesh deformations. If no such transformation is needed,
+it should be the identity <a href='SkMatrix_Reference#Matrix'>matrix</a>.
+<a href='#SkCanvas_drawVertices_4_boneCount'>boneCount</a> must be at most 80, and thus the <a href='undocumented#Size'>size</a> of <a href='#SkCanvas_drawVertices_4_bones'>bones</a> should be at most 80.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawVertices_4_vertices'><code><strong>vertices</strong></code></a></td>
+    <td>triangle mesh to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawVertices_4_bones'><code><strong>bones</strong></code></a></td>
+    <td>bone <a href='SkMatrix_Reference#Matrix'>matrix</a> <a href='undocumented#Data'>data</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawVertices_4_boneCount'><code><strong>boneCount</strong></code></a></td>
+    <td>number of bone <a href='SkMatrix_Reference#Matrix'>matrices</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawVertices_4_mode'><code><strong>mode</strong></code></a></td>
+    <td>combines  <a href='undocumented#Vertices_Colors'>vertices colors</a> with <a href='undocumented#SkShader'>SkShader</a>, if both are present</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawVertices_4_paint'><code><strong>paint</strong></code></a></td>
+    <td>specifies the <a href='undocumented#SkShader'>SkShader</a>, used as <a href='undocumented#SkVertices'>SkVertices</a> <a href='undocumented#Texture'>texture</a>, may be nullptr</td>
+  </tr>
+</table>
+
+### See Also
+
+<a href='#SkCanvas_drawPatch'>drawPatch</a> <a href='#SkCanvas_drawPicture'>drawPicture</a>
+
+<a name='SkCanvas_drawPatch'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawPatch'>drawPatch</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='SkPath_Reference#Cubic'>cubics</a>[12], const <a href='SkColor_Reference#SkColor'>SkColor</a> colors[4], const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> texCoords[4],
+               <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws a  <a href='undocumented#Coons_Patch'>Coons patch</a>: the interpolation of four <a href='#SkCanvas_drawPatch_cubics'>cubics</a> with shared corners,
+associating a <a href='SkColor_Reference#Color'>color</a>, and optionally a <a href='undocumented#Texture'>texture</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a>, with each corner.
+
+<a href='undocumented#Coons_Patch'>Coons patch</a> uses clip and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, <a href='#SkCanvas_drawPatch_paint'>paint</a> <a href='undocumented#SkShader'>SkShader</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>,
+<a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>. If <a href='undocumented#SkShader'>SkShader</a> is provided it is treated
+as  <a href='undocumented#Coons_Patch'>Coons patch</a> <a href='undocumented#Texture'>texture</a>; <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> <a href='#SkCanvas_drawPatch_mode'>mode</a> combines <a href='SkColor_Reference#Color'>color</a> <a href='#SkCanvas_drawPatch_colors'>colors</a> and <a href='undocumented#SkShader'>SkShader</a> if
+both are provided.
+
+<a href='SkPath_Reference#Point_Array'>SkPoint array</a> <a href='#SkCanvas_drawPatch_cubics'>cubics</a> specifies four <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPath_Reference#Cubic'>cubic</a> starting at the top-left corner,
+in clockwise order, sharing every fourth <a href='SkPoint_Reference#Point'>point</a>. The last <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPath_Reference#Cubic'>cubic</a> ends at the
+first <a href='SkPoint_Reference#Point'>point</a>.
+
+<a href='SkColor_Reference#Color'>Color</a> array <a href='SkColor_Reference#Color'>color</a> associates <a href='#SkCanvas_drawPatch_colors'>colors</a> with corners in top-left, top-right,
+bottom-right, bottom-left order.
+
+If <a href='#SkCanvas_drawPatch_paint'>paint</a> contains <a href='undocumented#SkShader'>SkShader</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> <a href='#SkCanvas_drawPatch_texCoords'>texCoords</a> maps <a href='undocumented#SkShader'>SkShader</a> as <a href='undocumented#Texture'>texture</a> to
+corners in top-left, top-right, bottom-right, bottom-left order.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPatch_cubics'><code><strong>cubics</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPath_Reference#Cubic'>cubic</a> array, sharing common <a href='SkPoint_Reference#Point'>points</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPatch_colors'><code><strong>colors</strong></code></a></td>
+    <td><a href='SkColor_Reference#Color'>color</a> array, one for each corner</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPatch_texCoords'><code><strong>texCoords</strong></code></a></td>
+    <td><a href='SkPath_Reference#Point_Array'>SkPoint array</a> of <a href='undocumented#Texture'>texture</a> coordinates, mapping <a href='undocumented#SkShader'>SkShader</a> to corners;</td>
+  </tr>
+</table>
+
+may be nullptr
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPatch_mode'><code><strong>mode</strong></code></a></td>
+    <td><a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> for <a href='#SkCanvas_drawPatch_colors'>colors</a>, and for <a href='undocumented#SkShader'>SkShader</a> if <a href='#SkCanvas_drawPatch_paint'>paint</a> has one</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPatch_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='undocumented#SkShader'>SkShader</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawPatch"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawVertices'>drawVertices</a> <a href='#SkCanvas_drawPicture'>drawPicture</a>
+
+<a name='SkCanvas_drawPatch_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawPatch'>drawPatch</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='SkPath_Reference#Cubic'>cubics</a>[12], const <a href='SkColor_Reference#SkColor'>SkColor</a> colors[4], const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> texCoords[4],
+               const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPath_Reference#Cubic'>cubic</a>  <a href='undocumented#Coons_Patch'>Coons patch</a>: the interpolation of four <a href='#SkCanvas_drawPatch_2_cubics'>cubics</a> with shared corners,
+associating a <a href='SkColor_Reference#Color'>color</a>, and optionally a <a href='undocumented#Texture'>texture</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a>, with each corner.
+
+<a href='undocumented#Coons_Patch'>Coons patch</a> uses clip and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, <a href='#SkCanvas_drawPatch_2_paint'>paint</a> <a href='undocumented#SkShader'>SkShader</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>,
+<a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>. If <a href='undocumented#SkShader'>SkShader</a> is provided it is treated
+as  <a href='undocumented#Coons_Patch'>Coons patch</a> <a href='undocumented#Texture'>texture</a>; <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode combines <a href='SkColor_Reference#Color'>color</a> <a href='#SkCanvas_drawPatch_2_colors'>colors</a> and <a href='undocumented#SkShader'>SkShader</a> if
+both are provided.
+
+<a href='SkPath_Reference#Point_Array'>SkPoint array</a> <a href='#SkCanvas_drawPatch_2_cubics'>cubics</a> specifies four <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPath_Reference#Cubic'>cubic</a> starting at the top-left corner,
+in clockwise order, sharing every fourth <a href='SkPoint_Reference#Point'>point</a>. The last <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPath_Reference#Cubic'>cubic</a> ends at the
+first <a href='SkPoint_Reference#Point'>point</a>.
+
+<a href='SkColor_Reference#Color'>Color</a> array <a href='SkColor_Reference#Color'>color</a> associates <a href='#SkCanvas_drawPatch_2_colors'>colors</a> with corners in top-left, top-right,
+bottom-right, bottom-left order.
+
+If <a href='#SkCanvas_drawPatch_2_paint'>paint</a> contains <a href='undocumented#SkShader'>SkShader</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> <a href='#SkCanvas_drawPatch_2_texCoords'>texCoords</a> maps <a href='undocumented#SkShader'>SkShader</a> as <a href='undocumented#Texture'>texture</a> to
+corners in top-left, top-right, bottom-right, bottom-left order.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPatch_2_cubics'><code><strong>cubics</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPath_Reference#Cubic'>cubic</a> array, sharing common <a href='SkPoint_Reference#Point'>points</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPatch_2_colors'><code><strong>colors</strong></code></a></td>
+    <td><a href='SkColor_Reference#Color'>color</a> array, one for each corner</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawPatch_2_texCoords'><code><strong>texCoords</strong></code></a></td>
+    <td><a href='SkPath_Reference#Point_Array'>SkPoint array</a> of <a href='undocumented#Texture'>texture</a> coordinates, mapping <a href='undocumented#SkShader'>SkShader</a> to corners;</td>
+  </tr>
+</table>
+
+may be nullptr
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawPatch_2_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='undocumented#SkShader'>SkShader</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, used to draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="4e8b7409531c9211a2afcf632005a38c"></fiddle-embed></div>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawPatch_2_b"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawVertices'>drawVertices</a> <a href='#SkCanvas_drawPicture'>drawPicture</a>
+
+<a name='SkCanvas_drawAtlas'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawAtlas'>drawAtlas</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* atlas, const <a href='undocumented#SkRSXform'>SkRSXform</a> xform[], const <a href='SkRect_Reference#SkRect'>SkRect</a> tex[],
+               const <a href='SkColor_Reference#SkColor'>SkColor</a> colors[], int count, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode, const <a href='SkRect_Reference#SkRect'>SkRect</a>* cullRect,
+               const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws a set of <a href='undocumented#Sprite'>sprites</a> from <a href='#SkCanvas_drawAtlas_atlas'>atlas</a>, using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawAtlas_paint'>paint</a>.
+<a href='#SkCanvas_drawAtlas_paint'>paint</a> uses <a href='SkPaint_Reference#Anti_Alias'>anti-alias</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>
+to draw, if present. For each entry in the array, <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawAtlas_tex'>tex</a> locates <a href='undocumented#Sprite'>sprite</a> in
+<a href='#SkCanvas_drawAtlas_atlas'>atlas</a>, and <a href='undocumented#SkRSXform'>SkRSXform</a> <a href='#SkCanvas_drawAtlas_xform'>xform</a> transforms it into destination space.
+
+<a href='#SkCanvas_drawAtlas_xform'>xform</a>, <a href='undocumented#Text'>text</a>, and <a href='#SkCanvas_drawAtlas_colors'>colors</a> if present, must contain <a href='#SkCanvas_drawAtlas_count'>count</a> entries.
+Optional <a href='#SkCanvas_drawAtlas_colors'>colors</a> are applied for each <a href='undocumented#Sprite'>sprite</a> using <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> <a href='#SkCanvas_drawAtlas_mode'>mode</a>, treating
+<a href='undocumented#Sprite'>sprite</a> as source and <a href='#SkCanvas_drawAtlas_colors'>colors</a> as destination.
+Optional <a href='#SkCanvas_drawAtlas_cullRect'>cullRect</a> is a conservative bounds of all transformed <a href='undocumented#Sprite'>sprites</a>.
+If <a href='#SkCanvas_drawAtlas_cullRect'>cullRect</a> is outside of clip, <a href='SkCanvas_Reference#Canvas'>canvas</a> can skip drawing.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawAtlas_atlas'><code><strong>atlas</strong></code></a></td>
+    <td><a href='SkImage_Reference#SkImage'>SkImage</a> containing <a href='undocumented#Sprite'>sprites</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_xform'><code><strong>xform</strong></code></a></td>
+    <td><a href='undocumented#SkRSXform'>SkRSXform</a> mappings for <a href='undocumented#Sprite'>sprites</a> in <a href='#SkCanvas_drawAtlas_atlas'>atlas</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_tex'><code><strong>tex</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> locations of <a href='undocumented#Sprite'>sprites</a> in <a href='#SkCanvas_drawAtlas_atlas'>atlas</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_colors'><code><strong>colors</strong></code></a></td>
+    <td>one per <a href='undocumented#Sprite'>sprite</a>, blended with <a href='undocumented#Sprite'>sprite</a> using <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_count'><code><strong>count</strong></code></a></td>
+    <td>number of <a href='undocumented#Sprite'>sprites</a> to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_mode'><code><strong>mode</strong></code></a></td>
+    <td><a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> combining <a href='#SkCanvas_drawAtlas_colors'>colors</a> and <a href='undocumented#Sprite'>sprites</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_cullRect'><code><strong>cullRect</strong></code></a></td>
+    <td>bounds of transformed <a href='undocumented#Sprite'>sprites</a> for efficient clipping; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and so on; may be nullptr</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawAtlas"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawImage'>drawImage</a>
+
+<a name='SkCanvas_drawAtlas_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawAtlas'>drawAtlas</a>(const <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt;& atlas, const <a href='undocumented#SkRSXform'>SkRSXform</a> xform[], const <a href='SkRect_Reference#SkRect'>SkRect</a> tex[],
+               const <a href='SkColor_Reference#SkColor'>SkColor</a> colors[], int count, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode, const <a href='SkRect_Reference#SkRect'>SkRect</a>* cullRect,
+               const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws a set of <a href='undocumented#Sprite'>sprites</a> from <a href='#SkCanvas_drawAtlas_2_atlas'>atlas</a>, using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawAtlas_2_paint'>paint</a>.
+<a href='#SkCanvas_drawAtlas_2_paint'>paint</a> uses <a href='SkPaint_Reference#Anti_Alias'>anti-alias</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>
+to draw, if present. For each entry in the array, <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawAtlas_2_tex'>tex</a> locates <a href='undocumented#Sprite'>sprite</a> in
+<a href='#SkCanvas_drawAtlas_2_atlas'>atlas</a>, and <a href='undocumented#SkRSXform'>SkRSXform</a> <a href='#SkCanvas_drawAtlas_2_xform'>xform</a> transforms it into destination space.
+
+<a href='#SkCanvas_drawAtlas_2_xform'>xform</a>, <a href='undocumented#Text'>text</a>, and <a href='#SkCanvas_drawAtlas_2_colors'>colors</a> if present, must contain <a href='#SkCanvas_drawAtlas_2_count'>count</a> entries.
+Optional <a href='#SkCanvas_drawAtlas_2_colors'>colors</a> is applied for each <a href='undocumented#Sprite'>sprite</a> using <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>.
+Optional <a href='#SkCanvas_drawAtlas_2_cullRect'>cullRect</a> is a conservative bounds of all transformed <a href='undocumented#Sprite'>sprites</a>.
+If <a href='#SkCanvas_drawAtlas_2_cullRect'>cullRect</a> is outside of clip, <a href='SkCanvas_Reference#Canvas'>canvas</a> can skip drawing.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawAtlas_2_atlas'><code><strong>atlas</strong></code></a></td>
+    <td><a href='SkImage_Reference#SkImage'>SkImage</a> containing <a href='undocumented#Sprite'>sprites</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_2_xform'><code><strong>xform</strong></code></a></td>
+    <td><a href='undocumented#SkRSXform'>SkRSXform</a> mappings for <a href='undocumented#Sprite'>sprites</a> in <a href='#SkCanvas_drawAtlas_2_atlas'>atlas</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_2_tex'><code><strong>tex</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> locations of <a href='undocumented#Sprite'>sprites</a> in <a href='#SkCanvas_drawAtlas_2_atlas'>atlas</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_2_colors'><code><strong>colors</strong></code></a></td>
+    <td>one per <a href='undocumented#Sprite'>sprite</a>, blended with <a href='undocumented#Sprite'>sprite</a> using <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_2_count'><code><strong>count</strong></code></a></td>
+    <td>number of <a href='undocumented#Sprite'>sprites</a> to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_2_mode'><code><strong>mode</strong></code></a></td>
+    <td><a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> combining <a href='#SkCanvas_drawAtlas_2_colors'>colors</a> and <a href='undocumented#Sprite'>sprites</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_2_cullRect'><code><strong>cullRect</strong></code></a></td>
+    <td>bounds of transformed <a href='undocumented#Sprite'>sprites</a> for efficient clipping; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_2_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and so on; may be nullptr</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawAtlas_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawImage'>drawImage</a>
+
+<a name='SkCanvas_drawAtlas_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawAtlas'>drawAtlas</a>(const <a href='SkImage_Reference#SkImage'>SkImage</a>* atlas, const <a href='undocumented#SkRSXform'>SkRSXform</a> xform[], const <a href='SkRect_Reference#SkRect'>SkRect</a> tex[], int count,
+               const <a href='SkRect_Reference#SkRect'>SkRect</a>* cullRect, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws a set of <a href='undocumented#Sprite'>sprites</a> from <a href='#SkCanvas_drawAtlas_3_atlas'>atlas</a>, using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawAtlas_3_paint'>paint</a>.
+<a href='#SkCanvas_drawAtlas_3_paint'>paint</a> uses <a href='SkPaint_Reference#Anti_Alias'>anti-alias</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>
+to draw, if present. For each entry in the array, <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawAtlas_3_tex'>tex</a> locates <a href='undocumented#Sprite'>sprite</a> in
+<a href='#SkCanvas_drawAtlas_3_atlas'>atlas</a>, and <a href='undocumented#SkRSXform'>SkRSXform</a> <a href='#SkCanvas_drawAtlas_3_xform'>xform</a> transforms it into destination space.
+
+<a href='#SkCanvas_drawAtlas_3_xform'>xform</a> and <a href='undocumented#Text'>text</a> must contain <a href='#SkCanvas_drawAtlas_3_count'>count</a> entries.
+Optional <a href='#SkCanvas_drawAtlas_3_cullRect'>cullRect</a> is a conservative bounds of all transformed <a href='undocumented#Sprite'>sprites</a>.
+If <a href='#SkCanvas_drawAtlas_3_cullRect'>cullRect</a> is outside of clip, <a href='SkCanvas_Reference#Canvas'>canvas</a> can skip drawing.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawAtlas_3_atlas'><code><strong>atlas</strong></code></a></td>
+    <td><a href='SkImage_Reference#SkImage'>SkImage</a> containing <a href='undocumented#Sprite'>sprites</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_3_xform'><code><strong>xform</strong></code></a></td>
+    <td><a href='undocumented#SkRSXform'>SkRSXform</a> mappings for <a href='undocumented#Sprite'>sprites</a> in <a href='#SkCanvas_drawAtlas_3_atlas'>atlas</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_3_tex'><code><strong>tex</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> locations of <a href='undocumented#Sprite'>sprites</a> in <a href='#SkCanvas_drawAtlas_3_atlas'>atlas</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_3_count'><code><strong>count</strong></code></a></td>
+    <td>number of <a href='undocumented#Sprite'>sprites</a> to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_3_cullRect'><code><strong>cullRect</strong></code></a></td>
+    <td>bounds of transformed <a href='undocumented#Sprite'>sprites</a> for efficient clipping; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_3_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and so on; may be nullptr</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawAtlas_3"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawImage'>drawImage</a>
+
+<a name='SkCanvas_drawAtlas_4'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawAtlas'>drawAtlas</a>(const <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt;& atlas, const <a href='undocumented#SkRSXform'>SkRSXform</a> xform[], const <a href='SkRect_Reference#SkRect'>SkRect</a> tex[], int count,
+               const <a href='SkRect_Reference#SkRect'>SkRect</a>* cullRect, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws a set of <a href='undocumented#Sprite'>sprites</a> from <a href='#SkCanvas_drawAtlas_4_atlas'>atlas</a>, using clip, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, and optional <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkCanvas_drawAtlas_4_paint'>paint</a>.
+<a href='#SkCanvas_drawAtlas_4_paint'>paint</a> uses <a href='SkPaint_Reference#Anti_Alias'>anti-alias</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>
+to draw, if present. For each entry in the array, <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkCanvas_drawAtlas_4_tex'>tex</a> locates <a href='undocumented#Sprite'>sprite</a> in
+<a href='#SkCanvas_drawAtlas_4_atlas'>atlas</a>, and <a href='undocumented#SkRSXform'>SkRSXform</a> <a href='#SkCanvas_drawAtlas_4_xform'>xform</a> transforms it into destination space.
+
+<a href='#SkCanvas_drawAtlas_4_xform'>xform</a> and <a href='undocumented#Text'>text</a> must contain <a href='#SkCanvas_drawAtlas_4_count'>count</a> entries.
+Optional <a href='#SkCanvas_drawAtlas_4_cullRect'>cullRect</a> is a conservative bounds of all transformed <a href='undocumented#Sprite'>sprites</a>.
+If <a href='#SkCanvas_drawAtlas_4_cullRect'>cullRect</a> is outside of clip, <a href='SkCanvas_Reference#Canvas'>canvas</a> can skip drawing.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawAtlas_4_atlas'><code><strong>atlas</strong></code></a></td>
+    <td><a href='SkImage_Reference#SkImage'>SkImage</a> containing <a href='undocumented#Sprite'>sprites</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_4_xform'><code><strong>xform</strong></code></a></td>
+    <td><a href='undocumented#SkRSXform'>SkRSXform</a> mappings for <a href='undocumented#Sprite'>sprites</a> in <a href='#SkCanvas_drawAtlas_4_atlas'>atlas</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_4_tex'><code><strong>tex</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> locations of <a href='undocumented#Sprite'>sprites</a> in <a href='#SkCanvas_drawAtlas_4_atlas'>atlas</a></td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_4_count'><code><strong>count</strong></code></a></td>
+    <td>number of <a href='undocumented#Sprite'>sprites</a> to draw</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_4_cullRect'><code><strong>cullRect</strong></code></a></td>
+    <td>bounds of transformed <a href='undocumented#Sprite'>sprites</a> for efficient clipping; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAtlas_4_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and so on; may be nullptr</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawAtlas_4"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='#SkCanvas_drawImage'>drawImage</a>
+
+<a name='SkCanvas_drawDrawable'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawDrawable'>drawDrawable</a>(<a href='undocumented#SkDrawable'>SkDrawable</a>* <a href='undocumented#Drawable'>drawable</a>, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* <a href='SkMatrix_Reference#Matrix'>matrix</a> = nullptr)
+</pre>
+
+Draws <a href='undocumented#SkDrawable'>SkDrawable</a> <a href='#SkCanvas_drawDrawable_drawable'>drawable</a> using clip and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, concatenated with
+optional <a href='#SkCanvas_drawDrawable_matrix'>matrix</a>.
+
+If <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> has an asynchronous implementation, as is the case
+when it is recording into <a href='SkPicture_Reference#SkPicture'>SkPicture</a>, then <a href='#SkCanvas_drawDrawable_drawable'>drawable</a> will be referenced,
+so that <a href='undocumented#SkDrawable'>SkDrawable</a>::<a href='#SkDrawable_draw'>draw()</a> can be called when the operation is finalized. To force
+immediate drawing, call <a href='undocumented#SkDrawable'>SkDrawable</a>::<a href='#SkDrawable_draw'>draw()</a> instead.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawDrawable_drawable'><code><strong>drawable</strong></code></a></td>
+    <td>custom struct encapsulating drawing commands</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawDrawable_matrix'><code><strong>matrix</strong></code></a></td>
+    <td>transformation applied to drawing; may be nullptr</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawDrawable"></fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#SkDrawable'>SkDrawable</a> <a href='#SkCanvas_drawPicture'>drawPicture</a>
+
+<a name='SkCanvas_drawDrawable_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawDrawable'>drawDrawable</a>(<a href='undocumented#SkDrawable'>SkDrawable</a>* <a href='undocumented#Drawable'>drawable</a>, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y)
+</pre>
+
+Draws <a href='undocumented#SkDrawable'>SkDrawable</a> <a href='#SkCanvas_drawDrawable_2_drawable'>drawable</a> using clip and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, offset by (<a href='#SkCanvas_drawDrawable_2_x'>x</a>, <a href='#SkCanvas_drawDrawable_2_y'>y</a>).
+
+If <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> has an asynchronous implementation, as is the case
+when it is recording into <a href='SkPicture_Reference#SkPicture'>SkPicture</a>, then <a href='#SkCanvas_drawDrawable_2_drawable'>drawable</a> will be referenced,
+so that <a href='undocumented#SkDrawable'>SkDrawable</a>::<a href='#SkDrawable_draw'>draw()</a> can be called when the operation is finalized. To force
+immediate drawing, call <a href='undocumented#SkDrawable'>SkDrawable</a>::<a href='#SkDrawable_draw'>draw()</a> instead.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawDrawable_2_drawable'><code><strong>drawable</strong></code></a></td>
+    <td>custom struct encapsulating drawing commands</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawDrawable_2_x'><code><strong>x</strong></code></a></td>
+    <td>offset into <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> writable pixels on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawDrawable_2_y'><code><strong>y</strong></code></a></td>
+    <td>offset into <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> writable pixels on y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Canvas_drawDrawable_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#SkDrawable'>SkDrawable</a> <a href='#SkCanvas_drawPicture'>drawPicture</a>
+
+<a name='SkCanvas_drawAnnotation'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawAnnotation'>drawAnnotation</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, const char key[], <a href='undocumented#SkData'>SkData</a>* value)
+</pre>
+
+Associates <a href='SkRect_Reference#SkRect'>SkRect</a> on <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> with an annotation; a key-value pair, where the <a href='#SkCanvas_drawAnnotation_key'>key</a> is
+a null-terminated UTF-8 <a href='undocumented#String'>string</a>, and optional <a href='#SkCanvas_drawAnnotation_value'>value</a> is stored as <a href='undocumented#SkData'>SkData</a>.
+
+Only some <a href='SkCanvas_Reference#Canvas'>canvas</a> implementations, such as recording to <a href='SkPicture_Reference#SkPicture'>SkPicture</a>, or drawing to
+<a href='undocumented#Document_PDF'>document PDF</a>, use annotations.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawAnnotation_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> extent of <a href='SkCanvas_Reference#Canvas'>canvas</a> to annotate</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAnnotation_key'><code><strong>key</strong></code></a></td>
+    <td><a href='undocumented#String'>string</a> used for lookup</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAnnotation_value'><code><strong>value</strong></code></a></td>
+    <td><a href='undocumented#Data'>data</a> holding <a href='#SkCanvas_drawAnnotation_value'>value</a> stored in annotation</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="00b430bd80d740e19c6d020a940f56d5"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPicture_Reference#SkPicture'>SkPicture</a> <a href='undocumented#SkDocument'>SkDocument</a>
+
+<a name='SkCanvas_drawAnnotation_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkCanvas_drawAnnotation'>drawAnnotation</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, const char key[], const <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkData'>SkData</a>&gt;& value)
+</pre>
+
+Associates <a href='SkRect_Reference#SkRect'>SkRect</a> on <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> when an annotation; a key-value pair, where the <a href='#SkCanvas_drawAnnotation_2_key'>key</a> is
+a null-terminated UTF-8 <a href='undocumented#String'>string</a>, and optional <a href='#SkCanvas_drawAnnotation_2_value'>value</a> is stored as <a href='undocumented#SkData'>SkData</a>.
+
+Only some <a href='SkCanvas_Reference#Canvas'>canvas</a> implementations, such as recording to <a href='SkPicture_Reference#SkPicture'>SkPicture</a>, or drawing to
+<a href='undocumented#Document_PDF'>document PDF</a>, use annotations.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkCanvas_drawAnnotation_2_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> extent of <a href='SkCanvas_Reference#Canvas'>canvas</a> to annotate</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAnnotation_2_key'><code><strong>key</strong></code></a></td>
+    <td><a href='undocumented#String'>string</a> used for lookup</td>
+  </tr>
+  <tr>    <td><a name='SkCanvas_drawAnnotation_2_value'><code><strong>value</strong></code></a></td>
+    <td><a href='undocumented#Data'>data</a> holding <a href='#SkCanvas_drawAnnotation_2_value'>value</a> stored in annotation</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="00b430bd80d740e19c6d020a940f56d5"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPicture_Reference#SkPicture'>SkPicture</a> <a href='undocumented#SkDocument'>SkDocument</a>
+
+<a name='SkCanvas_isClipEmpty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+virtual bool <a href='#SkCanvas_isClipEmpty'>isClipEmpty</a>()const
+</pre>
+
+Returns true if clip is empty; that is, nothing will draw.
+
+May do work when called; it should not be called
+more often than needed. However, once called, subsequent calls perform no
+work until clip changes.
+
+### Return Value
+
+true if clip is empty
+
+### Example
+
+<div><fiddle-embed name="@Canvas_isClipEmpty">
+
+#### Example Output
+
+~~~~
+clip is not empty
+clip is empty
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_isClipRect'>isClipRect</a> <a href='#SkCanvas_getLocalClipBounds'>getLocalClipBounds</a> <a href='#SkCanvas_getDeviceClipBounds'>getDeviceClipBounds</a>
+
+<a name='SkCanvas_isClipRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+virtual bool <a href='#SkCanvas_isClipRect'>isClipRect</a>()const
+</pre>
+
+Returns true if clip is <a href='SkRect_Reference#SkRect'>SkRect</a> and not empty.
+Returns false if the clip is empty, or if it is not <a href='SkRect_Reference#SkRect'>SkRect</a>.
+
+### Return Value
+
+true if clip is <a href='SkRect_Reference#SkRect'>SkRect</a> and not empty
+
+### Example
+
+<div><fiddle-embed name="@Canvas_isClipRect">
+
+#### Example Output
+
+~~~~
+clip is rect
+clip is not rect
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkCanvas_isClipEmpty'>isClipEmpty</a> <a href='#SkCanvas_getLocalClipBounds'>getLocalClipBounds</a> <a href='#SkCanvas_getDeviceClipBounds'>getDeviceClipBounds</a>
+
diff --git a/src/third_party/skia/site/user/api/SkColor4f_Reference.md b/src/third_party/skia/site/user/api/SkColor4f_Reference.md
new file mode 100644
index 0000000..427a09c
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkColor4f_Reference.md
@@ -0,0 +1,540 @@
+SkColor4f Reference
+===
+
+
+<a name='SkPM4f'></a>
+
+---
+
+<a name='SkRGBA4f'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+struct <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> {
+
+    float <a href='#SkRGBA4f_fR'>fR</a>;
+    float <a href='#SkRGBA4f_fG'>fG</a>;
+    float <a href='#SkRGBA4f_fB'>fB</a>;
+    float <a href='#SkRGBA4f_fA'>fA</a>;
+
+    bool <a href='#SkRGBA4f_equal1_operator'>operator==</a>(const <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a>& other) const;
+    bool <a href='#SkRGBA4f_notequal1_operator'>operator!=</a>(const <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a>& other) const;
+    <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> <a href='#SkRGBA4f_multiply_operator'>operator*</a>(float scale) const;
+    <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> <a href='#SkRGBA4f_multiply1_operator'>operator*</a>(const <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a>& scale) const;
+    const float* <a href='#SkRGBA4f_vec'>vec()</a> const;
+    float* <a href='#SkRGBA4f_vec'>vec()</a>;
+    float <a href='#SkRGBA4f_array_operator'>operator[]</a>(int index) const;
+    float& <a href='#SkRGBA4f_array1_operator'>operator[]</a>(int index);
+    bool <a href='#SkRGBA4f_isOpaque'>isOpaque</a>() const;
+    static <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> <a href='#SkRGBA4f_FromColor'>FromColor</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#Color'>color</a>);
+    <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='#SkRGBA4f_toSkColor'>toSkColor</a>() const;
+    static <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> <a href='#SkRGBA4f_FromPMColor'>FromPMColor</a>(<a href='SkColor_Reference#SkPMColor'>SkPMColor</a>);
+    <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a><<a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>> <a href='#SkRGBA4f_premul'>premul()</a> const;
+    <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a><<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>> <a href='#SkRGBA4f_unpremul'>unpremul()</a> const;
+    uint32_t <a href='#SkRGBA4f_toBytes_RGBA'>toBytes_RGBA</a>() const;
+    static <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> <a href='#SkRGBA4f_FromBytes_RGBA'>FromBytes_RGBA</a>(uint32_t <a href='SkColor_Reference#Color'>color</a>);
+    <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> <a href='#SkRGBA4f_makeOpaque'>makeOpaque</a>() const;
+};
+
+</pre>
+
+Each component is stored as a 32-bit single precision floating <a href='SkPoint_Reference#Point'>point</a> float value.
+All values are allowed, but only the range from zero to one is meaningful.
+
+Components are independent of the others if defined with <a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>;
+<a href='#SkRGBA4f_fA'>fA</a> <a href='SkColor_Reference#Alpha'>Alpha</a> is may be greater or smaller than <a href='#SkRGBA4f_fG'>fG</a> green, <a href='#SkRGBA4f_fB'>fB</a> blue, or <a href='#SkRGBA4f_fR'>fR</a> red.
+<a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a> is shorthand for <a href='undocumented#Unpremultiply'>Unpremultiplied</a> <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a>.
+
+Components are connected if defined with <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>;
+<a href='#SkRGBA4f_fA'>fA</a> <a href='SkColor_Reference#Alpha'>Alpha</a> is equal to or larger than <a href='#SkRGBA4f_fG'>fG</a> green, <a href='#SkRGBA4f_fB'>fB</a> blue, and <a href='#SkRGBA4f_fR'>fR</a> red. The values
+stored in <a href='#SkRGBA4f_fG'>fG</a>, <a href='#SkRGBA4f_fB'>fB</a>, and <a href='#SkRGBA4f_fR'>fR</a> combine the <a href='SkColor_Reference#Color'>color</a> component with the <a href='SkColor_Reference#Alpha'>Alpha</a> component.
+
+Values smaller than zero or larger than one are allowed. Values out of range
+may be used with <a href='#Blend_Mode'>Blend_Mode</a> so that the final component is in range.<table style='border-collapse: collapse; width: 62.5em'>
+
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Type</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Member</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>float</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRGBA4f_fR'><code>fR</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Single precision float for red ranges from no red (0.0) to full red (1.0).
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>float</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRGBA4f_fG'><code>fG</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Single precision float for green ranges from no green (0.0) to full green (1.0).
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>float</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRGBA4f_fB'><code>fB</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Single precision float for blue ranges from no blue (0.0) to full blue (1.0).
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>float</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRGBA4f_fA'><code>fA</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Single precision float for <a href='SkColor_Reference#Alpha'>Alpha</a> ranges from no <a href='SkColor_Reference#Alpha'>Alpha</a> (0.0) to full <a href='SkColor_Reference#Alpha'>Alpha</a> (1.0).
+</td>
+  </tr>
+</table>
+
+<a name='SkRGBA4f_equal1_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool operator==(const <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a>& other)const
+</pre>
+
+Compares <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> with <a href='#SkRGBA4f_equal1_operator_other'>other</a>, and returns true if all components are equivalent.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRGBA4f_equal1_operator_other'><code><strong>other</strong></code></a></td>
+    <td><a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> equals <a href='#SkRGBA4f_equal1_operator_other'>other</a>
+
+### Example
+
+<div><fiddle-embed name="@RGBA4f_equal1_operator">
+
+#### Example Output
+
+~~~~
+colorRed == colorNamedRed
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRGBA4f_notequal1_operator'>operator!=</a>(const <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a>& <a href='#SkRGBA4f_equal1_operator_other'>other</a>) const
+
+<a name='SkRGBA4f_notequal1_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool operator!=(const <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a>& other)const
+</pre>
+
+Compares <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> with <a href='#SkRGBA4f_notequal1_operator_other'>other</a>, and returns true if all components are not
+equivalent.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRGBA4f_notequal1_operator_other'><code><strong>other</strong></code></a></td>
+    <td><a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> is not equal to <a href='#SkRGBA4f_notequal1_operator_other'>other</a>
+
+### Example
+
+<div><fiddle-embed name="@RGBA4f_notequal1_operator">
+
+#### Example Output
+
+~~~~
+colorGray != colorNamedGray
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRGBA4f_equal1_operator'>operator==</a>(const <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a>& <a href='#SkRGBA4f_notequal1_operator_other'>other</a>) const
+
+<a name='SkRGBA4f_multiply_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> operator*(float scale)const
+</pre>
+
+Multiplies each component by <a href='#SkRGBA4f_multiply_operator_scale'>scale</a>. Does not pin the result.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRGBA4f_multiply_operator_scale'><code><strong>scale</strong></code></a></td>
+    <td>component multiplier</td>
+  </tr>
+</table>
+
+### Return Value
+
+scaled <a href='SkColor_Reference#Color'>color</a>
+
+### See Also
+
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kMultiply'>kMultiply</a>
+
+<a name='SkRGBA4f_multiply1_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> operator*(const <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a>& scale)const
+</pre>
+
+Multiplies each component by <a href='#SkRGBA4f_multiply1_operator_scale'>scale</a> component. Does not pin the result.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRGBA4f_multiply1_operator_scale'><code><strong>scale</strong></code></a></td>
+    <td><a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> component multipliers</td>
+  </tr>
+</table>
+
+### Return Value
+
+scaled <a href='SkColor_Reference#Color'>color</a>
+
+### See Also
+
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kMultiply'>kMultiply</a>
+
+<a name='Property_Functions'></a>
+
+<a name='SkRGBA4f_vec'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const float* <a href='#SkRGBA4f_vec'>vec()</a>const
+</pre>
+
+Returns <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> components as a read-only array.
+
+### Return Value
+
+components as read-only array
+
+### Example
+
+<div><fiddle-embed name="@RGBA4f_vec">
+
+#### Example Output
+
+~~~~
+red=0.266667 green=0.533333 blue=0.8 alpha=0.533333
+[0]=0.266667 [1]=0.533333 [2]=0.8 [3]=0.533333
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a>
+
+<a name='SkRGBA4f_vec_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+float* <a href='#SkRGBA4f_vec'>vec()</a>
+</pre>
+
+Returns <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> components as a writable array.
+
+### Return Value
+
+components as writable array
+
+### Example
+
+<div><fiddle-embed name="@RGBA4f_vec_2">
+
+#### Example Output
+
+~~~~
+red=0.266667 green=0.533333 blue=0.8 alpha=0.533333
+[0]=0.266667 [1]=0.533333 [2]=0.8 [3]=1
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a>
+
+<a name='SkRGBA4f_array_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+float <a href='#SkRGBA4f_array1_operator'>operator[]</a>(int index)const
+</pre>
+
+Returns <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> component by index, zero through three. index out of range
+triggers an assert in debug builds.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRGBA4f_array_operator_index'><code><strong>index</strong></code></a></td>
+    <td>component, zero through three</td>
+  </tr>
+</table>
+
+### Return Value
+
+component by index
+
+### See Also
+
+<a href='#SkRGBA4f_vec'>vec</a>
+
+<a name='SkRGBA4f_array1_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+float& <a href='#SkRGBA4f_array1_operator'>operator[]</a>(int index)
+</pre>
+
+Returns writable component reference by index, zero through three. index out of range
+triggers an assert in debug builds.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRGBA4f_array1_operator_index'><code><strong>index</strong></code></a></td>
+    <td>component, zero through three</td>
+  </tr>
+</table>
+
+### Return Value
+
+writable component reference by index
+
+### See Also
+
+<a href='#SkRGBA4f_vec'>vec</a>
+
+<a name='Utility_Functions'></a>
+
+<a name='SkRGBA4f_isOpaque'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRGBA4f_isOpaque'>isOpaque</a>()const
+</pre>
+
+Returns true if <a href='SkColor_Reference#Alpha'>Alpha</a> component is one. <a href='SkColor_Reference#Color'>Color</a> has no transparency regardless of
+whether <a href='SkColor_Reference#Color'>color</a> is <a href='undocumented#Premultiply'>Premultiplied</a> or <a href='undocumented#Unpremultiply'>Unpremultiplied</a>. Triggers a <a href='undocumented#Debugging'>debugging</a> assert
+if <a href='SkColor_Reference#Alpha'>Alpha</a> not valid.
+
+### Return Value
+
+true if <a href='SkColor_Reference#Alpha'>Alpha</a> is one
+
+### See Also
+
+<a href='#SkRGBA4f_vec'>vec</a> <a href='SkColor_Reference#SkColorGetA'>SkColorGetA</a>
+
+<a name='SkRGBA4f_FromColor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> <a href='#SkRGBA4f_FromColor'>FromColor</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#Color'>color</a>)
+</pre>
+
+Returns closest <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> to <a href='SkColor_Reference#SkColor'>SkColor</a>. Only allowed if <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> is <a href='undocumented#Unpremultiply'>unpremultiplied</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRGBA4f_FromColor_color'><code><strong>color</strong></code></a></td>
+    <td><a href='SkColor_Reference#Color'>Color</a> with <a href='SkColor_Reference#Alpha'>Alpha</a>, red, blue, and green components</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkColor_Reference#SkColor'>SkColor</a> as <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a>
+
+### Example
+
+<div><fiddle-embed name="@RGBA4f_FromColor">
+
+#### Example Output
+
+~~~~
+red=0.301961 green=0.396078 blue=0.6 alpha=0.168627
+red=77 green=101 blue=153 alpha=43
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRGBA4f_toSkColor'>toSkColor</a>
+
+<a name='SkRGBA4f_toSkColor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='#SkRGBA4f_toSkColor'>toSkColor</a>()const
+</pre>
+
+Converts to closest <a href='SkColor_Reference#SkColor'>SkColor</a>.
+
+### Return Value
+
+closest <a href='SkColor_Reference#Color'>Color</a>
+
+### Example
+
+<div><fiddle-embed name="@RGBA4f_toSkColor">
+
+#### Example Output
+
+~~~~
+red=18 green=33 blue=82 alpha=43
+red=0.0705882 green=0.129412 blue=0.321569 alpha=0.168627
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRGBA4f_FromColor'>FromColor</a>
+
+<a name='SkRGBA4f_FromPMColor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> <a href='#SkRGBA4f_FromPMColor'>FromPMColor</a>(<a href='SkColor_Reference#SkPMColor'>SkPMColor</a>)
+</pre>
+
+Converts from <a href='undocumented#Premultiply'>Premultiplied</a> integer components to <a href='undocumented#Unpremultiply'>Unpremultiplied</a> float
+components.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRGBA4f_FromPMColor_SkPMColor'><code><strong>SkPMColor</strong></code></a></td>
+    <td><a href='undocumented#Premultiply'>Premultiplied</a> <a href='SkColor_Reference#Color'>color</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='undocumented#Unpremultiply'>Unpremultiplied</a> <a href='SkColor_Reference#Color'>color</a>
+
+### See Also
+
+<a href='#SkRGBA4f_FromColor'>FromColor</a>
+
+<a name='SkRGBA4f_premul'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a>&lt;<a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>&gt; <a href='#SkRGBA4f_premul'>premul()</a>const
+</pre>
+
+Returns <a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a> with all components <a href='undocumented#Premultiply'>premultiplied</a> by <a href='SkColor_Reference#Alpha'>Alpha</a>.
+
+### Return Value
+
+<a href='undocumented#Premultiply'>Premultiplied</a> <a href='SkColor_Reference#Color'>color</a>
+
+### See Also
+
+<a href='#SkRGBA4f_unpremul'>unpremul</a>
+
+<a name='SkRGBA4f_unpremul'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a>&lt;<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>&gt; <a href='#SkRGBA4f_unpremul'>unpremul()</a>const
+</pre>
+
+Returns <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> with all components independent of <a href='SkColor_Reference#Alpha'>Alpha</a>.
+
+### Return Value
+
+<a href='undocumented#Unpremultiply'>Unpremultiplied</a> <a href='SkColor_Reference#Color'>color</a>
+
+### See Also
+
+<a href='#SkRGBA4f_premul'>premul</a>
+
+<a name='SkRGBA4f_toBytes_RGBA'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint32_t <a href='#SkRGBA4f_toBytes_RGBA'>toBytes_RGBA</a>()const
+</pre>
+
+Produces bytes in RGBA order. Component values are not affected by <a href='SkColor_Reference#Color'>color</a> <a href='SkColor_Reference#Alpha'>Alpha</a>.
+
+### Return Value
+
+<a href='SkColor_Reference#Color'>color</a>
+
+<a name='SkRGBA4f_FromBytes_RGBA'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> <a href='#SkRGBA4f_FromBytes_RGBA'>FromBytes_RGBA</a>(uint32_t <a href='SkColor_Reference#Color'>color</a>)
+</pre>
+
+Returns from <a href='SkColor_Reference#Color'>color</a> <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a> order. Component values are
+not affected by <a href='SkColor_Reference#Color'>color</a> <a href='SkColor_Reference#Alpha'>Alpha</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRGBA4f_FromBytes_RGBA_color'><code><strong>color</strong></code></a></td>
+    <td><a href='undocumented#Premultiply'>Premultiplied</a> or <a href='undocumented#Unpremultiply'>Unpremultiplied</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkColor_Reference#Color'>color</a>
+
+<a name='SkRGBA4f_makeOpaque'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> <a href='#SkRGBA4f_makeOpaque'>makeOpaque</a>()const
+</pre>
+
+Returns <a href='SkColor_Reference#Color'>color</a> with <a href='SkColor_Reference#Alpha'>Alpha</a> set to one.
+
+### Return Value
+
+<a href='SkColor_Reference#Color'>color</a>
+
+<a name='SkColor4f'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+using <a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a> = <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a><<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>>;
+</pre>
+
diff --git a/src/third_party/skia/site/user/api/SkColor_Reference.md b/src/third_party/skia/site/user/api/SkColor_Reference.md
new file mode 100644
index 0000000..13930fe
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkColor_Reference.md
@@ -0,0 +1,761 @@
+SkColor Reference
+===
+
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+typedef uint8_t <a href='SkColor_Reference#SkAlpha'>SkAlpha</a>;
+typedef uint32_t <a href='SkColor_Reference#SkColor'>SkColor</a>;
+
+static constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(<a href='undocumented#U8CPU'>U8CPU</a> a, <a href='undocumented#U8CPU'>U8CPU</a> r, <a href='undocumented#U8CPU'>U8CPU</a> g, <a href='undocumented#U8CPU'>U8CPU</a> b);
+#define <a href='SkColor_Reference#SkColorSetRGB'>SkColorSetRGB</a>(r, g, b) <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(0xFF, r, g, b)
+#define <a href='SkColor_Reference#SkColorGetA'>SkColorGetA</a>(<a href='SkColor_Reference#Color'>color</a>) (((<a href='SkColor_Reference#Color'>color</a>) >> 24) & 0xFF)
+#define <a href='SkColor_Reference#SkColorGetR'>SkColorGetR</a>(<a href='SkColor_Reference#Color'>color</a>) (((<a href='SkColor_Reference#Color'>color</a>) >> 16) & 0xFF)
+#define <a href='SkColor_Reference#SkColorGetG'>SkColorGetG</a>(<a href='SkColor_Reference#Color'>color</a>) (((<a href='SkColor_Reference#Color'>color</a>) >> 8) & 0xFF)
+#define <a href='SkColor_Reference#SkColorGetB'>SkColorGetB</a>(<a href='SkColor_Reference#Color'>color</a>) (((<a href='SkColor_Reference#Color'>color</a>) >> 0) & 0xFF)
+
+static constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SkColorSetA'>SkColorSetA</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> c, <a href='undocumented#U8CPU'>U8CPU</a> a);
+constexpr <a href='SkColor_Reference#SkAlpha'>SkAlpha</a> <a href='SkColor_Reference#SK_AlphaTRANSPARENT'>SK_AlphaTRANSPARENT</a> = 0x00;
+constexpr <a href='SkColor_Reference#SkAlpha'>SkAlpha</a> <a href='SkColor_Reference#SK_AlphaOPAQUE'>SK_AlphaOPAQUE</a> = 0xFF;
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorTRANSPARENT'>SK_ColorTRANSPARENT</a> = <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(0x00, 0x00, 0x00, 0x00);
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorBLACK'>SK_ColorBLACK</a> = <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(0xFF, 0x00, 0x00, 0x00);
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorDKGRAY'>SK_ColorDKGRAY</a> = <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(0xFF, 0x44, 0x44, 0x44);
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorGRAY'>SK_ColorGRAY</a> = <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(0xFF, 0x88, 0x88, 0x88);
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorLTGRAY'>SK_ColorLTGRAY</a> = <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(0xFF, 0xCC, 0xCC, 0xCC);
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorWHITE'>SK_ColorWHITE</a> = <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(0xFF, 0xFF, 0xFF, 0xFF);
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorRED'>SK_ColorRED</a> = <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(0xFF, 0xFF, 0x00, 0x00);
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorGREEN'>SK_ColorGREEN</a> = <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(0xFF, 0x00, 0xFF, 0x00);
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorBLUE'>SK_ColorBLUE</a> = <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(0xFF, 0x00, 0x00, 0xFF);
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorYELLOW'>SK_ColorYELLOW</a> = <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(0xFF, 0xFF, 0xFF, 0x00);
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorCYAN'>SK_ColorCYAN</a> = <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(0xFF, 0x00, 0xFF, 0xFF);
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorMAGENTA'>SK_ColorMAGENTA</a> = <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(0xFF, 0xFF, 0x00, 0xFF);
+
+void <a href='SkColor_Reference#SkRGBToHSV'>SkRGBToHSV</a>(<a href='undocumented#U8CPU'>U8CPU</a> red, <a href='undocumented#U8CPU'>U8CPU</a> green, <a href='undocumented#U8CPU'>U8CPU</a> blue, <a href='undocumented#SkScalar'>SkScalar</a> hsv[3]);
+
+static void <a href='SkColor_Reference#SkColorToHSV'>SkColorToHSV</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#Color'>color</a>, <a href='undocumented#SkScalar'>SkScalar</a> hsv[3]);
+
+<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SkHSVToColor'>SkHSVToColor</a>(<a href='undocumented#U8CPU'>U8CPU</a> <a href='SkColor_Reference#Alpha'>alpha</a>, const <a href='undocumented#SkScalar'>SkScalar</a> hsv[3]);
+
+static <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SkHSVToColor'>SkHSVToColor</a>(const <a href='undocumented#SkScalar'>SkScalar</a> hsv[3]);
+typedef uint32_t <a href='SkColor_Reference#SkPMColor'>SkPMColor</a>;
+
+<a href='SkColor_Reference#SkPMColor'>SkPMColor</a> <a href='SkColor_Reference#SkPreMultiplyARGB'>SkPreMultiplyARGB</a>(<a href='undocumented#U8CPU'>U8CPU</a> a, <a href='undocumented#U8CPU'>U8CPU</a> r, <a href='undocumented#U8CPU'>U8CPU</a> g, <a href='undocumented#U8CPU'>U8CPU</a> b);
+
+<a href='SkColor_Reference#SkPMColor'>SkPMColor</a> <a href='SkColor_Reference#SkPreMultiplyColor'>SkPreMultiplyColor</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> c);
+template <<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> kAT>
+struct <a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> {
+    // <i><a href='SkColor4f_Reference#SkRGBA4f'>SkRGBA4f</a> interface</i>
+};
+template <> <a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a> <a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a>::<a href='SkColor4f_Reference#SkRGBA4f_FromColor'>FromColor</a>(<a href='SkColor_Reference#SkColor'>SkColor</a>);
+template <> <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a>::<a href='SkColor4f_Reference#SkRGBA4f_toSkColor'>toSkColor</a>() const;
+</pre>
+
+<a href='SkColor_Reference#Color'>Color</a> constants can be helpful to write code, documenting the meaning of values
+the represent transparency and <a href='SkColor_Reference#Color'>color</a> values. The use of <a href='SkColor_Reference#Color'>Color</a> constants is not
+required.
+
+<a name='Functions'></a>
+
+<a name='Alpha'></a>
+
+<a href='SkColor_Reference#Alpha'>Alpha</a> represents the transparency of <a href='SkColor_Reference#Color'>Color</a>. <a href='SkColor_Reference#Color'>Color</a> with <a href='SkColor_Reference#Alpha'>Alpha</a> of zero is fully
+transparent. <a href='SkColor_Reference#Color'>Color</a> with <a href='SkColor_Reference#Alpha'>Alpha</a> of 255 is fully opaque. Some, but not all <a href='undocumented#Pixel'>pixel</a>
+formats contain <a href='SkColor_Reference#Alpha'>Alpha</a>. Pixels with <a href='SkColor_Reference#Alpha'>Alpha</a> may store it as unsigned integers or
+floating <a href='SkPoint_Reference#Point'>point</a> values. Unsigned integer <a href='SkColor_Reference#Alpha'>Alpha</a> ranges from zero, fully
+transparent, to all bits set, fully opaque. Floating <a href='SkPoint_Reference#Point'>point</a> <a href='SkColor_Reference#Alpha'>Alpha</a> ranges from
+zero, fully transparent, to one, fully opaque.
+
+<a name='SkAlpha'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+typedef uint8_t <a href='SkColor_Reference#SkAlpha'>SkAlpha</a>;
+</pre>
+
+8-bit type for an <a href='SkColor_Reference#Alpha'>alpha</a> value. 255 is 100% opaque, zero is 100% transparent.
+
+<a name='SkColor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+typedef uint32_t <a href='SkColor_Reference#SkColor'>SkColor</a>;
+</pre>
+
+32-bit ARGB <a href='SkColor_Reference#Color'>Color</a> value, <a href='undocumented#Unpremultiply'>Unpremultiplied</a>. <a href='SkColor_Reference#Color'>Color</a> components are always in
+a known order. This is different from <a href='SkColor_Reference#SkPMColor'>SkPMColor</a>, which has its bytes in a configuration
+dependent order, to match the format of <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a> <a href='SkBitmap_Reference#Bitmap'>bitmaps</a>. <a href='SkColor_Reference#SkColor'>SkColor</a>
+is the type used to specify colors in <a href='SkPaint_Reference#SkPaint'>SkPaint</a> and in gradients.
+
+<a href='SkColor_Reference#Color'>Color</a> that is <a href='undocumented#Premultiply'>Premultiplied</a> has the same component values as <a href='SkColor_Reference#Color'>Color</a>
+that is <a href='undocumented#Unpremultiply'>Unpremultiplied</a> if <a href='SkColor_Reference#Alpha'>Alpha</a> is 255, fully opaque, although may have the
+component values in a different order.
+
+### See Also
+
+<a href='SkColor_Reference#SkPMColor'>SkPMColor</a>
+
+<a name='SkColorSetARGB'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static constexpr inline <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(<a href='undocumented#U8CPU'>U8CPU</a> a, <a href='undocumented#U8CPU'>U8CPU</a> r, <a href='undocumented#U8CPU'>U8CPU</a> g, <a href='undocumented#U8CPU'>U8CPU</a> b)
+</pre>
+
+Returns <a href='SkColor_Reference#Color'>Color</a> value from 8-bit component values. Asserts if SK_DEBUG is defined
+if <a href='#SkColorSetARGB_a'>a</a>, <a href='#SkColorSetARGB_r'>r</a>, <a href='#SkColorSetARGB_g'>g</a>, or <a href='#SkColorSetARGB_b'>b</a> exceed 255. Since <a href='SkColor_Reference#Color'>Color</a> is <a href='undocumented#Unpremultiply'>Unpremultiplied</a>, <a href='#SkColorSetARGB_a'>a</a> may be smaller
+than the largest of <a href='#SkColorSetARGB_r'>r</a>, <a href='#SkColorSetARGB_g'>g</a>, and <a href='#SkColorSetARGB_b'>b</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkColorSetARGB_a'><code><strong>a</strong></code></a></td>
+    <td>amount of <a href='SkColor_Reference#Alpha'>Alpha</a>, from fully transparent (0) to fully opaque (255)</td>
+  </tr>
+  <tr>    <td><a name='SkColorSetARGB_r'><code><strong>r</strong></code></a></td>
+    <td>amount of red, from no red (0) to full red (255)</td>
+  </tr>
+  <tr>    <td><a name='SkColorSetARGB_g'><code><strong>g</strong></code></a></td>
+    <td>amount of green, from no green (0) to full green (255)</td>
+  </tr>
+  <tr>    <td><a name='SkColorSetARGB_b'><code><strong>b</strong></code></a></td>
+    <td>amount of blue, from no blue (0) to full blue (255)</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkColor_Reference#Color'>color</a> and <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#Unpremultiply'>Unpremultiplied</a>
+
+### Example
+
+<div><fiddle-embed name="@ColorSetARGB"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkColorSetRGB'>SkColorSetRGB</a> <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_setARGB'>setARGB</a> <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_setColor'>setColor</a> <a href='SkColor_Reference#SkColorSetA'>SkColorSetA</a>
+
+<a name='SkColorSetRGB'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+#define <a href='SkColor_Reference#SkColorSetRGB'>SkColorSetRGB</a>(r, g, b) <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>(0xFF, r, g, b)
+r g b
+</pre>
+
+Returns <a href='SkColor_Reference#Color'>Color</a> value from 8-bit component values, with <a href='SkColor_Reference#Alpha'>Alpha</a> set
+fully opaque to 255.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkColorSetRGB_r'><code><strong>r</strong></code></a></td>
+    <td>amount of red, from no red (0) to full red (255)</td>
+  </tr>
+  <tr>    <td><a name='SkColorSetRGB_g'><code><strong>g</strong></code></a></td>
+    <td>amount of green, from no green (0) to full green (255)</td>
+  </tr>
+  <tr>    <td><a name='SkColorSetRGB_b'><code><strong>b</strong></code></a></td>
+    <td>amount of blue, from no blue (0) to full blue (255)</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkColor_Reference#Color'>color</a> with opaque <a href='SkColor_Reference#Alpha'>alpha</a>
+
+### Example
+
+<div><fiddle-embed name="@ColorSetRGB"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>
+
+<a name='SkColorGetA'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+#define <a href='SkColor_Reference#SkColorGetA'>SkColorGetA</a>(<a href='SkColor_Reference#Color'>color</a>) (((<a href='SkColor_Reference#Color'>color</a>) >> 24) & 0xFF)
+<a href='SkColor_Reference#Color'>color</a>
+</pre>
+
+Returns <a href='SkColor_Reference#Alpha'>Alpha</a> byte from <a href='SkColor_Reference#Color'>Color</a> value.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkColorGetA_color'><code><strong>color</strong></code></a></td>
+    <td><a href='SkColor_Reference#SkColor'>SkColor</a>, a 32-bit unsigned int, in 0xAARRGGBB format</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@ColorGetA"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_getAlpha'>getAlpha</a>
+
+<a name='SkColorGetR'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+#define <a href='SkColor_Reference#SkColorGetR'>SkColorGetR</a>(<a href='SkColor_Reference#Color'>color</a>) (((<a href='SkColor_Reference#Color'>color</a>) >> 16) & 0xFF)
+<a href='SkColor_Reference#Color'>color</a>
+</pre>
+
+Returns red component of <a href='SkColor_Reference#Color'>Color</a>, from zero to 255.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkColorGetR_color'><code><strong>color</strong></code></a></td>
+    <td><a href='SkColor_Reference#SkColor'>SkColor</a>, a 32-bit unsigned int, in 0xAARRGGBB format</td>
+  </tr>
+</table>
+
+### Return Value
+
+red byte
+
+### Example
+
+<div><fiddle-embed name="d6da38577f189eaa6d9df75f6c3ed252"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkColorGetG'>SkColorGetG</a> <a href='SkColor_Reference#SkColorGetB'>SkColorGetB</a>
+
+<a name='SkColorGetG'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+#define <a href='SkColor_Reference#SkColorGetG'>SkColorGetG</a>(<a href='SkColor_Reference#Color'>color</a>) (((<a href='SkColor_Reference#Color'>color</a>) >> 8) & 0xFF)
+<a href='SkColor_Reference#Color'>color</a>
+</pre>
+
+Returns green component of <a href='SkColor_Reference#Color'>Color</a>, from zero to 255.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkColorGetG_color'><code><strong>color</strong></code></a></td>
+    <td><a href='SkColor_Reference#SkColor'>SkColor</a>, a 32-bit unsigned int, in 0xAARRGGBB format</td>
+  </tr>
+</table>
+
+### Return Value
+
+green byte
+
+### Example
+
+<div><fiddle-embed name="535d38b2c019299d915170f7b03d5fea"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkColorGetR'>SkColorGetR</a> <a href='SkColor_Reference#SkColorGetB'>SkColorGetB</a>
+
+<a name='SkColorGetB'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+#define <a href='SkColor_Reference#SkColorGetB'>SkColorGetB</a>(<a href='SkColor_Reference#Color'>color</a>) (((<a href='SkColor_Reference#Color'>color</a>) >> 0) & 0xFF)
+<a href='SkColor_Reference#Color'>color</a>
+</pre>
+
+Returns blue component of <a href='SkColor_Reference#Color'>Color</a>, from zero to 255.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkColorGetB_color'><code><strong>color</strong></code></a></td>
+    <td><a href='SkColor_Reference#SkColor'>SkColor</a>, a 32-bit unsigned int, in 0xAARRGGBB format</td>
+  </tr>
+</table>
+
+### Return Value
+
+blue byte
+
+### Example
+
+<div><fiddle-embed name="9ee27675284faea375611dc88123a2c5"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkColorGetR'>SkColorGetR</a> <a href='SkColor_Reference#SkColorGetG'>SkColorGetG</a>
+
+<a name='SkColorSetA'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static constexpr inline <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SkColorSetA'>SkColorSetA</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> c, <a href='undocumented#U8CPU'>U8CPU</a> a)
+</pre>
+
+Returns <a href='undocumented#Unpremultiply'>Unpremultiplied</a> <a href='SkColor_Reference#Color'>Color</a> with red, blue, and green set from <a href='#SkColorSetA_c'>c</a>; and <a href='SkColor_Reference#Alpha'>alpha</a> set
+from <a href='#SkColorSetA_a'>a</a>. <a href='SkColor_Reference#Alpha'>Alpha</a> component of <a href='#SkColorSetA_c'>c</a> is ignored and is replaced by <a href='#SkColorSetA_a'>a</a> in result.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkColorSetA_c'><code><strong>c</strong></code></a></td>
+    <td>packed RGB, eight bits per component</td>
+  </tr>
+  <tr>    <td><a name='SkColorSetA_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkColor_Reference#Alpha'>Alpha</a>: transparent at zero, fully opaque at 255</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkColor_Reference#Color'>Color</a> with transparency
+
+### Example
+
+<div><fiddle-embed name="@ColorSetA"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>
+
+<a name='Alpha_Constants'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+constexpr <a href='SkColor_Reference#SkAlpha'>SkAlpha</a> <a href='SkColor_Reference#SK_AlphaTRANSPARENT'>SK_AlphaTRANSPARENT</a> = 0x00;
+constexpr <a href='SkColor_Reference#SkAlpha'>SkAlpha</a> <a href='SkColor_Reference#SK_AlphaOPAQUE'>SK_AlphaOPAQUE</a> = 0xFF;
+</pre>
+
+<a href='SkColor_Reference#Alpha'>Alpha</a> constants are conveniences to represent fully transparent and fully
+opaque colors and masks. Their use is not required.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SK_AlphaTRANSPARENT'><code>SK_AlphaTRANSPARENT</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0x00</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Represents fully transparent <a href='SkColor_Reference#SkAlpha'>SkAlpha</a> value. <a href='SkColor_Reference#SkAlpha'>SkAlpha</a> ranges from zero,
+fully transparent; to 255, fully opaque.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SK_AlphaOPAQUE'><code>SK_AlphaOPAQUE</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0xFF</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Represents fully opaque <a href='SkColor_Reference#SkAlpha'>SkAlpha</a> value. <a href='SkColor_Reference#SkAlpha'>SkAlpha</a> ranges from zero,
+fully transparent; to 255, fully opaque.
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Alpha_Constants_a"><div><a href='SkColor_Reference#Color'>Color</a> the parts of the <a href='SkBitmap_Reference#Bitmap'>bitmap</a> red if they mostly contain transparent pixels.
+</div></fiddle-embed></div>
+
+### Example
+
+<div><fiddle-embed name="@Alpha_Constants_b"><div><a href='SkColor_Reference#Color'>Color</a> the parts of the <a href='SkBitmap_Reference#Bitmap'>bitmap</a> green if they contain fully opaque pixels.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkAlpha'>SkAlpha</a> <a href='SkColor_Reference#SK_ColorTRANSPARENT'>SK_ColorTRANSPARENT</a> <a href='SkColor_Reference#SK_ColorBLACK'>SK_ColorBLACK</a>
+
+<a name='Color_Constants'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorTRANSPARENT'>SK_ColorTRANSPARENT</a>;
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorBLACK'>SK_ColorBLACK</a>;
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorDKGRAY'>SK_ColorDKGRAY</a>;
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorGRAY'>SK_ColorGRAY</a>;
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorLTGRAY'>SK_ColorLTGRAY</a>;
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorWHITE'>SK_ColorWHITE</a>;
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorRED'>SK_ColorRED</a>;
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorGREEN'>SK_ColorGREEN</a>;
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorBLUE'>SK_ColorBLUE</a>;
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorYELLOW'>SK_ColorYELLOW</a>;
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorCYAN'>SK_ColorCYAN</a>;
+constexpr <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SK_ColorMAGENTA'>SK_ColorMAGENTA</a>;
+</pre>
+
+<a href='SkColor_Reference#Color'>Color</a> names are provided as conveniences, but are not otherwise special.
+The values chosen for names may not be the same as values used by
+<a href='undocumented#SVG'>SVG</a>, HTML, CSS, or colors named by a platform.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SK_ColorTRANSPARENT'><code>SK_ColorTRANSPARENT</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0x00000000</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Represents fully transparent <a href='SkColor_Reference#SkColor'>SkColor</a>. May be used to initialize a destination
+containing a mask or a non-rectangular <a href='SkImage_Reference#Image'>image</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SK_ColorBLACK'><code>SK_ColorBLACK</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0xFF000000</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Represents fully opaque black.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SK_ColorDKGRAY'><code>SK_ColorDKGRAY</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0xFF444444</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Represents fully opaque dark gray.
+Note that <a href='#SVG_darkgray'>SVG_darkgray</a> is equivalent to 0xFFA9A9A9.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SK_ColorGRAY'><code>SK_ColorGRAY</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0xFF888888</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Represents fully opaque gray.
+Note that <a href='#HTML_Gray'>HTML_Gray</a> is equivalent to 0xFF808080.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SK_ColorLTGRAY'><code>SK_ColorLTGRAY</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0xFFCCCCCC</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Represents fully opaque light gray. <a href='#HTML_Silver'>HTML_Silver</a> is equivalent to 0xFFC0C0C0.
+Note that <a href='#SVG_lightgray'>SVG_lightgray</a> is equivalent to 0xFFD3D3D3.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SK_ColorWHITE'><code>SK_ColorWHITE</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0xFFFFFFFF</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Represents fully opaque white.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SK_ColorRED'><code>SK_ColorRED</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0xFFFF0000</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Represents fully opaque red.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SK_ColorGREEN'><code>SK_ColorGREEN</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0xFF00FF00</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Represents fully opaque green. <a href='#HTML_Lime'>HTML_Lime</a> is equivalent.
+Note that <a href='#HTML_Green'>HTML_Green</a> is equivalent to 0xFF008000.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SK_ColorBLUE'><code>SK_ColorBLUE</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0xFF0000FF</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Represents fully opaque blue.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SK_ColorYELLOW'><code>SK_ColorYELLOW</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0xFFFFFF00</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Represents fully opaque yellow.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SK_ColorCYAN'><code>SK_ColorCYAN</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0xFF00FFFF</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Represents fully opaque cyan. <a href='#HTML_Aqua'>HTML_Aqua</a> is equivalent.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SK_ColorMAGENTA'><code>SK_ColorMAGENTA</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0xFFFF00FF</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Represents fully opaque magenta. <a href='#HTML_Fuchsia'>HTML_Fuchsia</a> is equivalent.
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="1c2e38321464818847f953ddd45cb5a1"></fiddle-embed></div>
+
+### Example
+
+<div><fiddle-embed name="@Color_Constants_b"><div><a href='SkColor_Reference#SK_ColorTRANSPARENT'>SK_ColorTRANSPARENT</a> sets <a href='SkColor_Reference#Color'>Color</a> <a href='SkColor_Reference#Alpha'>Alpha</a> and components to zero.
+</div></fiddle-embed></div>
+
+### Example
+
+<div><fiddle-embed name="@Color_Constants_c"><div><a href='SkColor_Reference#SK_ColorBLACK'>SK_ColorBLACK</a> sets <a href='SkColor_Reference#Color'>Color</a> <a href='SkColor_Reference#Alpha'>Alpha</a> to one and components to zero.
+</div></fiddle-embed></div>
+
+### Example
+
+<div><fiddle-embed name="@Color_Constants_d"><div><a href='SkColor_Reference#SK_ColorWHITE'>SK_ColorWHITE</a> sets <a href='SkColor_Reference#Color'>Color</a> <a href='SkColor_Reference#Alpha'>Alpha</a> and components to one.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SK_ColorTRANSPARENT'>SK_ColorTRANSPARENT</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_clear'>clear</a> <a href='SkColor_Reference#SK_AlphaOPAQUE'>SK_AlphaOPAQUE</a>
+
+<a name='HSV'></a>
+
+<a name='HSV_Hue'></a>
+
+Hue represents an angle, in degrees, on a <a href='SkColor_Reference#Color'>color</a> wheel. Hue has a positive value
+modulo 360, where zero degrees is red.
+
+<a name='HSV_Saturation'></a>
+
+<a href='undocumented#Saturation'>Saturation</a> represents the intensity of the <a href='SkColor_Reference#Color'>color</a>. <a href='undocumented#Saturation'>Saturation</a> varies from zero,
+with no Hue contribution; to one, with full Hue contribution.
+
+<a name='HSV_Value'></a>
+
+Value represents the lightness of the <a href='SkColor_Reference#Color'>color</a>. Value varies from zero, black; to
+one, full brightness.
+
+<a name='SkRGBToHSV'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='SkColor_Reference#SkRGBToHSV'>SkRGBToHSV</a>(<a href='undocumented#U8CPU'>U8CPU</a> red, <a href='undocumented#U8CPU'>U8CPU</a> green, <a href='undocumented#U8CPU'>U8CPU</a> blue, <a href='undocumented#SkScalar'>SkScalar</a> hsv[3])
+</pre>
+
+Converts RGB to its HSV components.
+<a href='#SkRGBToHSV_hsv'>hsv</a>[0] contains <a href='#Color_HSV_Hue'>HSV_Hue</a>, a value from zero to less than 360.
+<a href='#SkRGBToHSV_hsv'>hsv</a>[1] contains <a href='#Color_HSV_Saturation'>HSV_Saturation</a>, a value from zero to one.
+<a href='#SkRGBToHSV_hsv'>hsv</a>[2] contains <a href='#Color_HSV_Value'>HSV_Value</a>, a value from zero to one.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRGBToHSV_red'><code><strong>red</strong></code></a></td>
+    <td><a href='#SkRGBToHSV_red'>red</a> component value from zero to 255</td>
+  </tr>
+  <tr>    <td><a name='SkRGBToHSV_green'><code><strong>green</strong></code></a></td>
+    <td><a href='#SkRGBToHSV_green'>green</a> component value from zero to 255</td>
+  </tr>
+  <tr>    <td><a name='SkRGBToHSV_blue'><code><strong>blue</strong></code></a></td>
+    <td><a href='#SkRGBToHSV_blue'>blue</a> component value from zero to 255</td>
+  </tr>
+  <tr>    <td><a name='SkRGBToHSV_hsv'><code><strong>hsv</strong></code></a></td>
+    <td>three element array which holds the resulting HSV components
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="4fb2da4a3d9b14ca4ac24eefb0f5126a"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkColorToHSV'>SkColorToHSV</a> <a href='SkColor_Reference#SkHSVToColor'>SkHSVToColor</a>
+
+<a name='SkColorToHSV'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static void <a href='SkColor_Reference#SkColorToHSV'>SkColorToHSV</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#Color'>color</a>, <a href='undocumented#SkScalar'>SkScalar</a> hsv[3])
+</pre>
+
+Converts ARGB to its HSV components. <a href='SkColor_Reference#Alpha'>Alpha</a> in ARGB is ignored.
+<a href='#SkColorToHSV_hsv'>hsv</a>[0] contains <a href='#Color_HSV_Hue'>HSV_Hue</a>, and is assigned a value from zero to less than 360.
+<a href='#SkColorToHSV_hsv'>hsv</a>[1] contains <a href='#Color_HSV_Saturation'>HSV_Saturation</a>, a value from zero to one.
+<a href='#SkColorToHSV_hsv'>hsv</a>[2] contains <a href='#Color_HSV_Value'>HSV_Value</a>, a value from zero to one.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkColorToHSV_color'><code><strong>color</strong></code></a></td>
+    <td>ARGB <a href='#SkColorToHSV_color'>color</a> to convert
+</td>
+  </tr>
+  <tr>    <td><a name='SkColorToHSV_hsv'><code><strong>hsv</strong></code></a></td>
+    <td>three element array which holds the resulting HSV components
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@ColorToHSV"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkRGBToHSV'>SkRGBToHSV</a> <a href='SkColor_Reference#SkHSVToColor'>SkHSVToColor</a>
+
+<a name='SkHSVToColor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SkHSVToColor'>SkHSVToColor</a>(<a href='undocumented#U8CPU'>U8CPU</a> <a href='SkColor_Reference#Alpha'>alpha</a>, const <a href='undocumented#SkScalar'>SkScalar</a> hsv[3])
+</pre>
+
+Converts HSV components to an ARGB <a href='SkColor_Reference#Color'>color</a>. <a href='SkColor_Reference#Alpha'>Alpha</a> is passed through unchanged.
+<a href='#SkHSVToColor_hsv'>hsv</a>[0] represents <a href='#Color_HSV_Hue'>HSV_Hue</a>, an angle from zero to less than 360.
+<a href='#SkHSVToColor_hsv'>hsv</a>[1] represents <a href='#Color_HSV_Saturation'>HSV_Saturation</a>, and varies from zero to one.
+<a href='#SkHSVToColor_hsv'>hsv</a>[2] represents <a href='#Color_HSV_Value'>HSV_Value</a>, and varies from zero to one.
+
+Out of range <a href='#SkHSVToColor_hsv'>hsv</a> values are pinned.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkHSVToColor_alpha'><code><strong>alpha</strong></code></a></td>
+    <td><a href='SkColor_Reference#Alpha'>Alpha</a> component of the returned ARGB <a href='SkColor_Reference#Color'>color </a>
+</td>
+  </tr>
+  <tr>    <td><a name='SkHSVToColor_hsv'><code><strong>hsv</strong></code></a></td>
+    <td>three element array which holds the input HSV components
+</td>
+  </tr>
+</table>
+
+### Return Value
+
+ARGB equivalent to HSV
+
+### Example
+
+<div><fiddle-embed name="@HSVToColor"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkColorToHSV'>SkColorToHSV</a> <a href='SkColor_Reference#SkRGBToHSV'>SkRGBToHSV</a>
+
+<a name='SkHSVToColor_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#SkHSVToColor'>SkHSVToColor</a>(const <a href='undocumented#SkScalar'>SkScalar</a> hsv[3])
+</pre>
+
+Converts HSV components to an ARGB <a href='SkColor_Reference#Color'>color</a>. <a href='SkColor_Reference#Alpha'>Alpha</a> is set to 255.
+<a href='#SkHSVToColor_2_hsv'>hsv</a>[0] represents <a href='#Color_HSV_Hue'>HSV_Hue</a>, an angle from zero to less than 360.
+<a href='#SkHSVToColor_2_hsv'>hsv</a>[1] represents <a href='#Color_HSV_Saturation'>HSV_Saturation</a>, and varies from zero to one.
+<a href='#SkHSVToColor_2_hsv'>hsv</a>[2] represents <a href='#Color_HSV_Value'>HSV_Value</a>, and varies from zero to one.
+
+Out of range <a href='#SkHSVToColor_2_hsv'>hsv</a> values are pinned.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkHSVToColor_2_hsv'><code><strong>hsv</strong></code></a></td>
+    <td>three element array which holds the input HSV components
+</td>
+  </tr>
+</table>
+
+### Return Value
+
+RGB equivalent to HSV
+
+### Example
+
+<div><fiddle-embed name="@HSVToColor_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkColorToHSV'>SkColorToHSV</a> <a href='SkColor_Reference#SkRGBToHSV'>SkRGBToHSV</a>
+
+<a name='PM_Color'></a>
+
+<a name='SkPMColor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+typedef uint32_t <a href='SkColor_Reference#SkPMColor'>SkPMColor</a>;
+</pre>
+
+32-bit ARGB <a href='SkColor_Reference#Color'>color</a> value, <a href='undocumented#Premultiply'>Premultiplied</a>. The byte order for this value is
+configuration dependent, matching the format of <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a> <a href='SkBitmap_Reference#Bitmap'>bitmaps</a>.
+This is different from <a href='SkColor_Reference#SkColor'>SkColor</a>, which is <a href='undocumented#Unpremultiply'>Unpremultiplied</a>, and is always in the
+same byte order.
+
+<a name='SkPreMultiplyARGB'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkColor_Reference#SkPMColor'>SkPMColor</a> <a href='SkColor_Reference#SkPreMultiplyARGB'>SkPreMultiplyARGB</a>(<a href='undocumented#U8CPU'>U8CPU</a> a, <a href='undocumented#U8CPU'>U8CPU</a> r, <a href='undocumented#U8CPU'>U8CPU</a> g, <a href='undocumented#U8CPU'>U8CPU</a> b)
+</pre>
+
+Returns <a href='#SkPreMultiplyARGB_a'>a</a> <a href='SkColor_Reference#SkPMColor'>SkPMColor</a> value from <a href='undocumented#Unpremultiply'>Unpremultiplied</a> 8-bit component values.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPreMultiplyARGB_a'><code><strong>a</strong></code></a></td>
+    <td>amount of <a href='SkColor_Reference#Alpha'>Alpha</a>, from fully transparent (0) to fully opaque (255)</td>
+  </tr>
+  <tr>    <td><a name='SkPreMultiplyARGB_r'><code><strong>r</strong></code></a></td>
+    <td>amount of red, from no red (0) to full red (255)</td>
+  </tr>
+  <tr>    <td><a name='SkPreMultiplyARGB_g'><code><strong>g</strong></code></a></td>
+    <td>amount of green, from no green (0) to full green (255)</td>
+  </tr>
+  <tr>    <td><a name='SkPreMultiplyARGB_b'><code><strong>b</strong></code></a></td>
+    <td>amount of blue, from no blue (0) to full blue (255)</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='undocumented#Premultiply'>Premultiplied</a> <a href='SkColor_Reference#Color'>Color</a>
+
+### Example
+
+<div><fiddle-embed name="756345484fd48ca0ea7b6cec350f73b8"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkPreMultiplyColor'>SkPreMultiplyColor</a>
+
+<a name='SkPreMultiplyColor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkColor_Reference#SkPMColor'>SkPMColor</a> <a href='SkColor_Reference#SkPreMultiplyColor'>SkPreMultiplyColor</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> c)
+</pre>
+
+Returns <a href='#Color_PM_Color'>PM_Color</a> closest to <a href='SkColor_Reference#Color'>Color</a> <a href='#SkPreMultiplyColor_c'>c</a>. Multiplies <a href='#SkPreMultiplyColor_c'>c</a> RGB components by the <a href='#SkPreMultiplyColor_c'>c</a> <a href='SkColor_Reference#Alpha'>Alpha</a>,
+and arranges the bytes to match the format of <a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPreMultiplyColor_c'><code><strong>c</strong></code></a></td>
+    <td><a href='undocumented#Unpremultiply'>Unpremultiplied</a> ARGB <a href='SkColor_Reference#Color'>Color</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='undocumented#Premultiply'>Premultiplied</a> <a href='SkColor_Reference#Color'>Color</a>
+
+### Example
+
+<div><fiddle-embed name="0bcc0f86a2aefc899f3500503dce6968"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkPreMultiplyARGB'>SkPreMultiplyARGB</a>
+
diff --git a/src/third_party/skia/site/user/api/SkFont_Reference.md b/src/third_party/skia/site/user/api/SkFont_Reference.md
new file mode 100644
index 0000000..35b3f41
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkFont_Reference.md
@@ -0,0 +1,1330 @@
+SkFont Reference
+===
+
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkFont_Reference#SkFont'>SkFont</a> {
+    // <i><a href='SkFont_Reference#SkFont'>SkFont</a> interface</i>
+};
+</pre>
+
+<a name='Advance'></a>
+
+<a name='Engine'></a>
+
+<a name='Size'></a>
+
+<a href='#Font_Size'>Font_Size</a> adjusts the overall <a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a> in <a href='SkPoint_Reference#Point'>points</a>.
+<a href='#Font_Size'>Font_Size</a> can be set to any positive value or zero.
+<a href='#Font_Size'>Font_Size</a> defaults to 12.
+<a href='#Font_Size'>Font_Size</a>
+
+<a name='Scale_X'></a>
+
+<a href='#Font_Scale_X'>Font_Scale_X</a> adjusts the <a href='undocumented#Text'>text</a> horizontal scale.
+<a href='undocumented#Text'>Text</a> scaling approximates condensed and expanded type faces when the actual face
+is not available.
+<a href='#Font_Scale_X'>Font_Scale_X</a> can be set to any value.
+<a href='#Font_Scale_X'>Font_Scale_X</a> defaults to 1.
+
+<a name='Skew_X'></a>
+
+<a href='#Font_Skew_X'>Font_Skew_X</a> adjusts the <a href='undocumented#Text'>text</a> horizontal slant.
+<a href='undocumented#Text'>Text</a> skewing approximates italic and oblique type faces when the actual face
+is not available.
+<a href='#Font_Skew_X'>Font_Skew_X</a> can be set to any value.
+<a href='#Font_Skew_X'>Font_Skew_X</a> defaults to 0.
+
+<a name='Embolden'></a>
+
+<a href='#Font_Embolden'>Font_Embolden</a> approximates the bold <a href='SkFont_Reference#Font'>font</a> style accompanying a normal <a href='SkFont_Reference#Font'>font</a> when a bold <a href='SkFont_Reference#Font'>font</a> face
+is not available. Skia does not provide <a href='SkFont_Reference#Font'>font</a> substitution; it is up to the client to find the
+bold <a href='SkFont_Reference#Font'>font</a> face using the platform <a href='#Font_Manager'>Font_Manager</a>.
+
+Use <a href='#Font_Skew_X'>Font_Skew_X</a> to approximate an italic <a href='SkFont_Reference#Font'>font</a> style when the italic <a href='SkFont_Reference#Font'>font</a> face
+is not available.
+
+A FreeType based port may define SK_USE_FREETYPE_EMBOLDEN at compile time to direct
+the  <a href='SkFont_Reference#Font_Engine'>font engine</a> to create the bold <a href='undocumented#Glyph'>Glyphs</a>. Otherwise, the extra bold is computed
+by increasing the stroke width and setting the <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> to
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kStrokeAndFill_Style'>kStrokeAndFill_Style</a> as needed.
+
+<a href='#Font_Embolden'>Font_Embolden</a> is disabled by default.
+
+<a name='Hinting_Spacing'></a>
+
+If Hinting is set to <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kFull'>kFull</a>, <a href='#Font_Hinting_Spacing'>Hinting_Spacing</a> adjusts the character
+spacing by the difference of the hinted and unhinted <a href='#Left_Side_Bearing'>Left_Side_Bearing</a> and
+<a href='#Right_Side_Bearing'>Right_Side_Bearing</a>. <a href='#Font_Hinting_Spacing'>Hinting_Spacing</a> only applies to platforms that use
+FreeType as their <a href='#Font_Engine'>Font_Engine</a>.
+
+<a href='#Font_Hinting_Spacing'>Hinting_Spacing</a> is not related to <a href='undocumented#Text'>text</a> kerning, where the space between
+a specific pair of characters is adjusted using <a href='undocumented#Data'>data</a> in the <a href='SkFont_Reference#Font'>font</a> kerning tables.
+
+<a name='Linear'></a>
+
+<a href='#Font_Linear'>Font_Linear</a> selects whether <a href='undocumented#Text'>text</a> is rendered as a <a href='undocumented#Glyph'>Glyph</a> or as a <a href='SkPath_Reference#Path'>Path</a>.
+If <a href='#Font_Linear'>Font_Linear</a> is set, it has the same effect as setting Hinting to <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNormal'>kNormal</a>.
+If <a href='#Font_Linear'>Font_Linear</a> is clear, it is the same as setting Hinting to <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNone'>kNone</a>.
+
+<a name='Subpixel'></a>
+
+<a href='#Font_Subpixel'>Font_Subpixel</a> uses the <a href='undocumented#Pixel'>pixel</a> transparency to represent a fractional offset.
+As the opaqueness of the <a href='SkColor_Reference#Color'>color</a> increases, the edge of the <a href='undocumented#Glyph'>glyph</a> appears to move
+towards the outside of the <a href='undocumented#Pixel'>pixel</a>.
+
+<a name='Anti_Alias'></a>
+
+When set, <a href='#Paint_Anti_Alias'>Anti_Alias</a> positions <a href='undocumented#Glyph'>glyphs</a> within a <a href='undocumented#Pixel'>pixel</a>, using <a href='SkColor_Reference#Alpha'>alpha</a> and
+possibly RGB striping. It can take advantage of the organization of RGB stripes
+that create a <a href='SkColor_Reference#Color'>color</a>, and relies on the small <a href='undocumented#Size'>size</a> of the stripe and visual perception
+to make the <a href='SkColor_Reference#Color'>color</a> fringing imperceptible.
+
+<a href='#Paint_Anti_Alias'>Anti_Alias</a> can be enabled on devices that orient stripes horizontally
+or vertically, and that order the <a href='SkColor_Reference#Color'>color</a> components as RGB or BGR. Internally, the
+<a href='undocumented#Glyph'>glyph</a> cache may store multiple copies of the same <a href='undocumented#Glyph'>glyph</a> with different <a href='SkFont_Reference#Subpixel'>sub-pixel</a>
+positions, requiring more memory.
+
+<a name='Force_Hinting'></a>
+
+If Hinting is set to <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNormal'>kNormal</a> or <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kFull'>kFull</a>, <a href='#Font_Force_Hinting'>Force_Hinting</a>
+instructs the <a href='#Font_Manager'>Font_Manager</a> to always hint <a href='undocumented#Glyph'>Glyphs</a>.
+<a href='#Font_Force_Hinting'>Force_Hinting</a> has no effect if Hinting is set to <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNone'>kNone</a> or
+<a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kSlight'>kSlight</a>.
+
+<a href='#Font_Force_Hinting'>Force_Hinting</a> only affects platforms that use FreeType as the <a href='#Font_Manager'>Font_Manager</a>.
+
+<a name='Embedded_Bitmaps'></a>
+
+<a href='#Font_Embedded_Bitmaps'>Embedded_Bitmaps</a> allows selecting custom sized <a href='SkBitmap_Reference#Bitmap'>bitmap</a> <a href='undocumented#Glyph'>Glyphs</a>.
+<a href='#Font_Embedded_Bitmaps'>Embedded_Bitmaps</a> when set chooses an embedded <a href='SkBitmap_Reference#Bitmap'>bitmap</a> <a href='undocumented#Glyph'>glyph</a> over an outline contained
+in a <a href='SkFont_Reference#Font'>font</a> if the platform supports this option.
+
+FreeType selects the <a href='SkBitmap_Reference#Bitmap'>bitmap</a> <a href='undocumented#Glyph'>glyph</a> if available when <a href='#Font_Embedded_Bitmaps'>Embedded_Bitmaps</a> is set, and selects
+the outline <a href='undocumented#Glyph'>glyph</a> if <a href='#Font_Embedded_Bitmaps'>Embedded_Bitmaps</a> is clear.
+Windows may select the <a href='SkBitmap_Reference#Bitmap'>bitmap</a> <a href='undocumented#Glyph'>glyph</a> but is not required to do so.
+<a href='#OS_X'>OS_X</a> and iOS do not support this option.
+
+<a name='SkFont'></a>
+
+---
+
+<a href='SkFont_Reference#SkFont'>SkFont</a> controls options applied when drawing and measuring <a href='undocumented#Text'>text</a>.
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkFont_Reference#SkFont'>SkFont</a> {
+
+    enum class <a href='#SkFont_Edging'>Edging</a> {
+        kAlias,
+        kAntiAlias,
+        kSubpixelAntiAlias,
+    };
+
+    <a href='#SkFont_empty_constructor'>SkFont()</a>;
+    <a href='#SkFont_SkTypeface_SkScalar'>SkFont</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkTypeface'>SkTypeface</a>> <a href='undocumented#Typeface'>typeface</a>, <a href='undocumented#SkScalar'>SkScalar</a> <a href='undocumented#Size'>size</a>);
+    <a href='#SkFont_SkTypeface_SkScalar_SkScalar_SkScalar'>SkFont</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkTypeface'>SkTypeface</a>> <a href='undocumented#Typeface'>typeface</a>, <a href='undocumented#SkScalar'>SkScalar</a> <a href='undocumented#Size'>size</a>, <a href='undocumented#SkScalar'>SkScalar</a> scaleX, <a href='undocumented#SkScalar'>SkScalar</a> skewX);
+    bool <a href='#SkFont_equal1_operator'>operator==</a>(const <a href='SkFont_Reference#SkFont'>SkFont</a>& <a href='SkFont_Reference#Font'>font</a>) const;
+    bool <a href='#SkFont_isForceAutoHinting'>isForceAutoHinting</a>() const;
+    bool <a href='#SkFont_isEmbeddedBitmaps'>isEmbeddedBitmaps</a>() const;
+    bool <a href='#SkFont_isSubpixel'>isSubpixel</a>() const;
+    bool <a href='#SkFont_isLinearMetrics'>isLinearMetrics</a>() const;
+    bool <a href='#SkFont_isEmbolden'>isEmbolden</a>() const;
+    void <a href='#SkFont_setForceAutoHinting'>setForceAutoHinting</a>(bool forceAutoHinting);
+    void <a href='#SkFont_setEmbeddedBitmaps'>setEmbeddedBitmaps</a>(bool embeddedBitmaps);
+    void <a href='#SkFont_setSubpixel'>setSubpixel</a>(bool subpixel);
+    void <a href='#SkFont_setLinearMetrics'>setLinearMetrics</a>(bool linearMetrics);
+    void <a href='#SkFont_setEmbolden'>setEmbolden</a>(bool embolden);
+    <a href='#SkFont_Edging'>Edging</a> <a href='#SkFont_getEdging'>getEdging</a>() const;
+    void <a href='#SkFont_setEdging'>setEdging</a>(<a href='#SkFont_Edging'>Edging</a> edging);
+    void <a href='#SkFont_setHinting'>setHinting</a>(<a href='undocumented#SkFontHinting'>SkFontHinting</a> hintingLevel);
+    <a href='undocumented#SkFontHinting'>SkFontHinting</a> <a href='#SkFont_getHinting'>getHinting</a>() const;
+    <a href='SkFont_Reference#SkFont'>SkFont</a> <a href='#SkFont_makeWithSize'>makeWithSize</a>(<a href='undocumented#SkScalar'>SkScalar</a> <a href='undocumented#Size'>size</a>) const;
+    <a href='undocumented#SkTypeface'>SkTypeface</a>* <a href='#SkFont_getTypeface'>getTypeface</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkFont_getSize'>getSize</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkFont_getScaleX'>getScaleX</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkFont_getSkewX'>getSkewX</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkTypeface'>SkTypeface</a>> <a href='#SkFont_refTypeface'>refTypeface</a>() const;
+    void <a href='#SkFont_setTypeface'>setTypeface</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkTypeface'>SkTypeface</a>> tf);
+    void <a href='#SkFont_setSize'>setSize</a>(<a href='undocumented#SkScalar'>SkScalar</a> textSize);
+    void <a href='#SkFont_setScaleX'>setScaleX</a>(<a href='undocumented#SkScalar'>SkScalar</a> scaleX);
+    void <a href='#SkFont_setSkewX'>setSkewX</a>(<a href='undocumented#SkScalar'>SkScalar</a> skewX);
+    int <a href='#SkFont_textToGlyphs'>textToGlyphs</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding,
+                     <a href='undocumented#SkGlyphID'>SkGlyphID</a> <a href='undocumented#Glyph'>glyphs</a>[], int maxGlyphCount) const;
+    uint16_t <a href='#SkFont_unicharToGlyph'>unicharToGlyph</a>(<a href='undocumented#SkUnichar'>SkUnichar</a> uni) const;
+    int <a href='#SkFont_countText'>countText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding) const;
+    bool <a href='#SkFont_containsText'>containsText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding) const;
+    size_t <a href='#SkFont_breakText'>breakText</a>(const void* <a href='undocumented#Text'>text</a>, size_t length, <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding, <a href='undocumented#SkScalar'>SkScalar</a> maxWidth,
+                     <a href='undocumented#SkScalar'>SkScalar</a>* measuredWidth = nullptr) const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkFont_measureText'>measureText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding,
+                         <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds = nullptr) const;
+    bool <a href='#SkFont_getPath'>getPath</a>(uint16_t glyphID, <a href='SkPath_Reference#SkPath'>SkPath</a>* <a href='SkPath_Reference#Path'>path</a>) const;
+    void <a href='#SkFont_getPaths'>getPaths</a>(const uint16_t glyphIDs[], int count,
+                  void (*glyphPathProc)(const <a href='SkPath_Reference#SkPath'>SkPath</a>* pathOrNull, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& mx, void* ctx),
+                  void* ctx) const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkFont_getMetrics'>getMetrics</a>(<a href='undocumented#SkFontMetrics'>SkFontMetrics</a>* metrics) const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkFont_getSpacing'>getSpacing</a>() const;
+};
+
+</pre>
+
+<a name='SkFont_Edging'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum class <a href='#SkFont_Edging'>Edging</a> {
+        <a href='#SkFont_Edging_kAlias'>kAlias</a>,
+        <a href='#SkFont_Edging_kAntiAlias'>kAntiAlias</a>,
+        <a href='#SkFont_Edging_kSubpixelAntiAlias'>kSubpixelAntiAlias</a>,
+    };
+
+</pre>
+
+Whether edge pixels draw opaque or with partial transparency.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFont_Edging_kAlias'><code>SkFont::Edging::kAlias</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+no transparent pixels on glyph edges</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFont_Edging_kAntiAlias'><code>SkFont::Edging::kAntiAlias</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+may have transparent pixels on glyph edges</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFont_Edging_kSubpixelAntiAlias'><code>SkFont::Edging::kSubpixelAntiAlias</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+glyph positioned in pixel using transparency</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_empty_constructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkFont_empty_constructor'>SkFont()</a>
+</pre>
+
+Constructs <a href='SkFont_Reference#SkFont'>SkFont</a> with default values.
+
+### Return Value
+
+default initialized <a href='SkFont_Reference#SkFont'>SkFont</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_SkTypeface_SkScalar'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkFont_Reference#SkFont'>SkFont</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkTypeface'>SkTypeface</a>&gt; <a href='undocumented#Typeface'>typeface</a>, <a href='undocumented#SkScalar'>SkScalar</a> <a href='undocumented#Size'>size</a>)
+</pre>
+
+Constructs <a href='SkFont_Reference#SkFont'>SkFont</a> with default values with <a href='undocumented#SkTypeface'>SkTypeface</a> and <a href='#SkFont_SkTypeface_SkScalar_size'>size</a> in <a href='SkPoint_Reference#Point'>points</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_SkTypeface_SkScalar_typeface'><code><strong>typeface</strong></code></a></td>
+    <td><a href='SkFont_Reference#Font'>font</a> and style used to draw and measure <a href='undocumented#Text'>text</a></td>
+  </tr>
+  <tr>    <td><a name='SkFont_SkTypeface_SkScalar_size'><code><strong>size</strong></code></a></td>
+    <td>typographic height of <a href='undocumented#Text'>text</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+initialized <a href='SkFont_Reference#SkFont'>SkFont</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_SkTypeface_SkScalar_SkScalar_SkScalar'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkFont_Reference#SkFont'>SkFont</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkTypeface'>SkTypeface</a>&gt; <a href='undocumented#Typeface'>typeface</a>, <a href='undocumented#SkScalar'>SkScalar</a> <a href='undocumented#Size'>size</a>, <a href='undocumented#SkScalar'>SkScalar</a> scaleX, <a href='undocumented#SkScalar'>SkScalar</a> skewX)
+</pre>
+
+Constructs <a href='SkFont_Reference#SkFont'>SkFont</a> with default values with <a href='undocumented#SkTypeface'>SkTypeface</a> and <a href='#SkFont_SkTypeface_SkScalar_SkScalar_SkScalar_size'>size</a> in <a href='SkPoint_Reference#Point'>points</a>,
+horizontal scale, and horizontal skew. Horizontal scale emulates condensed
+and expanded fonts. Horizontal skew emulates oblique fonts.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_SkTypeface_SkScalar_SkScalar_SkScalar_typeface'><code><strong>typeface</strong></code></a></td>
+    <td><a href='SkFont_Reference#Font'>font</a> and style used to draw and measure <a href='undocumented#Text'>text</a></td>
+  </tr>
+  <tr>    <td><a name='SkFont_SkTypeface_SkScalar_SkScalar_SkScalar_size'><code><strong>size</strong></code></a></td>
+    <td>typographic height of <a href='undocumented#Text'>text</a></td>
+  </tr>
+  <tr>    <td><a name='SkFont_SkTypeface_SkScalar_SkScalar_SkScalar_scaleX'><code><strong>scaleX</strong></code></a></td>
+    <td><a href='undocumented#Text'>text</a> horizontal scale</td>
+  </tr>
+  <tr>    <td><a name='SkFont_SkTypeface_SkScalar_SkScalar_SkScalar_skewX'><code><strong>skewX</strong></code></a></td>
+    <td>additional shear on x-axis relative to y-axis</td>
+  </tr>
+</table>
+
+### Return Value
+
+initialized <a href='SkFont_Reference#SkFont'>SkFont</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_equal1_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool operator==(const <a href='SkFont_Reference#SkFont'>SkFont</a>& <a href='SkFont_Reference#Font'>font</a>)const
+</pre>
+
+Compares <a href='SkFont_Reference#SkFont'>SkFont</a> and <a href='#SkFont_equal1_operator_font'>font</a>, and returns true if they are equivalent.
+May return false if <a href='undocumented#SkTypeface'>SkTypeface</a> has identical contents but different pointers.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_equal1_operator_font'><code><strong>font</strong></code></a></td>
+    <td><a href='#SkFont_equal1_operator_font'>font</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkFont_Reference#SkFont'>SkFont</a> pair are equivalent
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_isForceAutoHinting'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkFont_isForceAutoHinting'>isForceAutoHinting</a>()const
+</pre>
+
+If true, instructs the <a href='SkFont_Reference#Font'>font</a> manager to always hint <a href='undocumented#Glyph'>glyphs</a>.
+Returned value is only meaningful if platform uses FreeType as the <a href='SkFont_Reference#Font'>font</a> manager.
+
+### Return Value
+
+true if all <a href='undocumented#Glyph'>glyphs</a> are hinted
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_isEmbeddedBitmaps'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkFont_isEmbeddedBitmaps'>isEmbeddedBitmaps</a>()const
+</pre>
+
+Returns true if <a href='SkFont_Reference#Font'>font</a> engine may return <a href='undocumented#Glyph'>glyphs</a> from <a href='SkFont_Reference#Font'>font</a> <a href='SkBitmap_Reference#Bitmap'>bitmaps</a> instead of from outlines.
+
+### Return Value
+
+true if <a href='undocumented#Glyph'>glyphs</a> may be <a href='SkFont_Reference#Font'>font</a> <a href='SkBitmap_Reference#Bitmap'>bitmaps</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_isSubpixel'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkFont_isSubpixel'>isSubpixel</a>()const
+</pre>
+
+Returns true if <a href='undocumented#Glyph'>glyphs</a> at different <a href='SkFont_Reference#Subpixel'>sub-pixel</a> positions may differ on <a href='undocumented#Pixel'>pixel</a> edge coverage.
+
+### Return Value
+
+true if <a href='undocumented#Glyph'>glyph</a> positioned in <a href='undocumented#Pixel'>pixel</a> using transparency
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_isLinearMetrics'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkFont_isLinearMetrics'>isLinearMetrics</a>()const
+</pre>
+
+Returns true if <a href='undocumented#Text'>text</a> is converted to <a href='SkPath_Reference#SkPath'>SkPath</a> before drawing and measuring.
+
+### Return Value
+
+true <a href='undocumented#Glyph'>glyph</a> hints are never applied
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_isEmbolden'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkFont_isEmbolden'>isEmbolden</a>()const
+</pre>
+
+Returns true if bold is approximated by increasing the stroke width when creating <a href='undocumented#Glyph'>glyph</a>
+<a href='SkBitmap_Reference#Bitmap'>bitmaps</a> from outlines.
+
+### Return Value
+
+bold is approximated through stroke width
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_setForceAutoHinting'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkFont_setForceAutoHinting'>setForceAutoHinting</a>(bool forceAutoHinting)
+</pre>
+
+Sets whether to always hint <a href='undocumented#Glyph'>glyphs</a>.
+If <a href='#SkFont_setForceAutoHinting_forceAutoHinting'>forceAutoHinting</a> is set, instructs the  <a href='undocumented#Font_Manager'>font manager</a> to always hint <a href='undocumented#Glyph'>glyphs</a>.
+
+Only affects platforms that use FreeType as the  <a href='undocumented#Font_Manager'>font manager</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_setForceAutoHinting_forceAutoHinting'><code><strong>forceAutoHinting</strong></code></a></td>
+    <td>setting to always hint <a href='undocumented#Glyph'>glyphs</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_setEmbeddedBitmaps'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkFont_setEmbeddedBitmaps'>setEmbeddedBitmaps</a>(bool embeddedBitmaps)
+</pre>
+
+Requests, but does not require, to use <a href='SkBitmap_Reference#Bitmap'>bitmaps</a> in fonts instead of outlines.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_setEmbeddedBitmaps_embeddedBitmaps'><code><strong>embeddedBitmaps</strong></code></a></td>
+    <td>setting to use <a href='SkBitmap_Reference#Bitmap'>bitmaps</a> in fonts</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_setSubpixel'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkFont_setSubpixel'>setSubpixel</a>(bool subpixel)
+</pre>
+
+Requests, but does not require, that <a href='undocumented#Glyph'>glyphs</a> respect <a href='SkFont_Reference#Subpixel'>sub-pixel</a> positioning.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_setSubpixel_subpixel'><code><strong>subpixel</strong></code></a></td>
+    <td>setting for <a href='SkFont_Reference#Subpixel'>sub-pixel</a> positioning</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_setLinearMetrics'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkFont_setLinearMetrics'>setLinearMetrics</a>(bool linearMetrics)
+</pre>
+
+Requests, but does not require, that <a href='undocumented#Glyph'>glyphs</a> are converted to <a href='SkPath_Reference#SkPath'>SkPath</a>
+before drawing and measuring.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_setLinearMetrics_linearMetrics'><code><strong>linearMetrics</strong></code></a></td>
+    <td>setting for converting <a href='undocumented#Glyph'>glyphs</a> to <a href='SkPath_Reference#Path'>paths</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_setEmbolden'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkFont_setEmbolden'>setEmbolden</a>(bool embolden)
+</pre>
+
+Increases stroke width when creating <a href='undocumented#Glyph'>glyph</a> <a href='SkBitmap_Reference#Bitmap'>bitmaps</a> to approximate a bold <a href='undocumented#Typeface'>typeface</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_setEmbolden_embolden'><code><strong>embolden</strong></code></a></td>
+    <td>setting for bold approximation</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_getEdging'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkFont_Edging'>Edging</a> <a href='#SkFont_getEdging'>getEdging</a>()const
+</pre>
+
+Whether edge pixels draw opaque or with partial transparency.
+
+### Return Value
+
+one of: <a href='#SkFont_Edging'>Edging</a>::<a href='#SkFont_Edging_kAlias'>kAlias</a>, <a href='#SkFont_Edging'>Edging</a>::<a href='#SkFont_Edging_kAntiAlias'>kAntiAlias</a>, <a href='#SkFont_Edging'>Edging</a>::<a href='#SkFont_Edging_kSubpixelAntiAlias'>kSubpixelAntiAlias</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_setEdging'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkFont_setEdging'>setEdging</a>(<a href='#SkFont_Edging'>Edging</a> edging)
+</pre>
+
+Requests, but does not require, that edge pixels draw opaque or with
+partial transparency.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_setEdging_edging'><code><strong>edging</strong></code></a></td>
+    <td>one of: <a href='#SkFont_Edging'>Edging</a>::<a href='#SkFont_Edging_kAlias'>kAlias</a>, <a href='#SkFont_Edging'>Edging</a>::<a href='#SkFont_Edging_kAntiAlias'>kAntiAlias</a>, <a href='#SkFont_Edging'>Edging</a>::<a href='#SkFont_Edging_kSubpixelAntiAlias'>kSubpixelAntiAlias</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_setHinting'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkFont_setHinting'>setHinting</a>(<a href='undocumented#SkFontHinting'>SkFontHinting</a> hintingLevel)
+</pre>
+
+Sets level of <a href='undocumented#Glyph'>glyph</a> outline adjustment.
+Does not check for valid values of <a href='#SkFont_setHinting_hintingLevel'>hintingLevel</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_setHinting_hintingLevel'><code><strong>hintingLevel</strong></code></a></td>
+    <td>one of: <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNone'>kNone</a>, <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kSlight'>kSlight</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNormal'>kNormal</a>, <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kFull'>kFull</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_getHinting'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkFontHinting'>SkFontHinting</a> <a href='#SkFont_getHinting'>getHinting</a>()const
+</pre>
+
+Returns level of <a href='undocumented#Glyph'>glyph</a> outline adjustment.
+
+### Return Value
+
+one of: <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNone'>kNone</a>, <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kSlight'>kSlight</a>, <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNormal'>kNormal</a>,
+
+<a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kFull'>kFull</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_makeWithSize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkFont_Reference#SkFont'>SkFont</a> <a href='#SkFont_makeWithSize'>makeWithSize</a>(<a href='undocumented#SkScalar'>SkScalar</a> <a href='undocumented#Size'>size</a>)const
+</pre>
+
+Returns a <a href='SkFont_Reference#Font'>font</a> with the same attributes of this <a href='SkFont_Reference#Font'>font</a>, but with the specified <a href='#SkFont_makeWithSize_size'>size</a>.
+Returns nullptr if <a href='#SkFont_makeWithSize_size'>size</a> is less than zero, infinite, or NaN.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_makeWithSize_size'><code><strong>size</strong></code></a></td>
+    <td>typographic height of <a href='undocumented#Text'>text</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+initialized <a href='SkFont_Reference#SkFont'>SkFont</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_getTypeface'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkTypeface'>SkTypeface</a>* <a href='#SkFont_getTypeface'>getTypeface</a>()const
+</pre>
+
+Returns <a href='undocumented#SkTypeface'>SkTypeface</a> if set, or nullptr.
+Does not alter <a href='undocumented#SkTypeface'>SkTypeface</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a>.
+
+### Return Value
+
+<a href='undocumented#SkTypeface'>SkTypeface</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_getSize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a>    <a href='#SkFont_getSize'>getSize</a>()const
+</pre>
+
+Returns <a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a> in <a href='SkPoint_Reference#Point'>points</a>.
+
+### Return Value
+
+typographic height of <a href='undocumented#Text'>text</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_getScaleX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a>    <a href='#SkFont_getScaleX'>getScaleX</a>()const
+</pre>
+
+Returns <a href='undocumented#Text'>text</a> scale on x-axis.
+Default value is 1.
+
+### Return Value
+
+<a href='undocumented#Text'>text</a> horizontal scale
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_getSkewX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a>    <a href='#SkFont_getSkewX'>getSkewX</a>()const
+</pre>
+
+Returns <a href='undocumented#Text'>text</a> skew on x-axis.
+Default value is zero.
+
+### Return Value
+
+additional shear on x-axis relative to y-axis
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_refTypeface'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkTypeface'>SkTypeface</a>&gt; <a href='#SkFont_refTypeface'>refTypeface</a>()const
+</pre>
+
+Increases <a href='undocumented#SkTypeface'>SkTypeface</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Return Value
+
+<a href='undocumented#SkTypeface'>SkTypeface</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_setTypeface'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkFont_setTypeface'>setTypeface</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkTypeface'>SkTypeface</a>&gt; tf)
+</pre>
+
+Sets <a href='undocumented#SkTypeface'>SkTypeface</a> to <a href='undocumented#Typeface'>typeface</a>, decreasing <a href='undocumented#SkRefCnt'>SkRefCnt</a> of the previous <a href='undocumented#SkTypeface'>SkTypeface</a>.
+Pass nullptr to clear <a href='undocumented#SkTypeface'>SkTypeface</a> and use the default <a href='undocumented#Typeface'>typeface</a>. Increments
+<a href='#SkFont_setTypeface_tf'>tf</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_setTypeface_tf'><code><strong>tf</strong></code></a></td>
+    <td><a href='SkFont_Reference#Font'>font</a> and style used to draw <a href='undocumented#Text'>text</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_setSize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkFont_setSize'>setSize</a>(<a href='undocumented#SkScalar'>SkScalar</a> textSize)
+</pre>
+
+Sets <a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a> in <a href='SkPoint_Reference#Point'>points</a>.
+Has no effect if <a href='#SkFont_setSize_textSize'>textSize</a> is not greater than or equal to zero.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_setSize_textSize'><code><strong>textSize</strong></code></a></td>
+    <td>typographic height of <a href='undocumented#Text'>text</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_setScaleX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkFont_setScaleX'>setScaleX</a>(<a href='undocumented#SkScalar'>SkScalar</a> scaleX)
+</pre>
+
+Sets  <a href='undocumented#Text'>text scale</a> on x-axis.
+Default value is 1.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_setScaleX_scaleX'><code><strong>scaleX</strong></code></a></td>
+    <td><a href='undocumented#Text'>text</a> horizontal scale</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_setSkewX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkFont_setSkewX'>setSkewX</a>(<a href='undocumented#SkScalar'>SkScalar</a> skewX)
+</pre>
+
+Sets  <a href='undocumented#Text'>text skew</a> on x-axis.
+Default value is zero.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_setSkewX_skewX'><code><strong>skewX</strong></code></a></td>
+    <td>additional shear on x-axis relative to y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_textToGlyphs'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkFont_textToGlyphs'>textToGlyphs</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding, <a href='undocumented#SkGlyphID'>SkGlyphID</a> <a href='undocumented#Glyph'>glyphs</a>[],
+                 int maxGlyphCount)const
+</pre>
+
+Converts <a href='#SkFont_textToGlyphs_text'>text</a> into <a href='undocumented#Glyph'>glyph</a> indices.
+Returns the number of <a href='undocumented#Glyph'>glyph</a> indices represented by <a href='#SkFont_textToGlyphs_text'>text</a>.
+<a href='undocumented#SkTextEncoding'>SkTextEncoding</a> specifies how <a href='#SkFont_textToGlyphs_text'>text</a> represents characters or <a href='#SkFont_textToGlyphs_glyphs'>glyphs</a>.
+<a href='#SkFont_textToGlyphs_glyphs'>glyphs</a> may be nullptr, to compute the <a href='undocumented#Glyph'>glyph</a> count.
+
+Does not check <a href='#SkFont_textToGlyphs_text'>text</a> for valid character codes or valid <a href='undocumented#Glyph'>glyph</a> indices.
+
+If <a href='#SkFont_textToGlyphs_byteLength'>byteLength</a> equals zero, returns zero.
+If <a href='#SkFont_textToGlyphs_byteLength'>byteLength</a> includes a partial character, the partial character is ignored.
+
+If <a href='#SkFont_textToGlyphs_encoding'>encoding</a> is <a href='undocumented#SkTextEncoding::kUTF8'>SkTextEncoding::kUTF8</a> and <a href='#SkFont_textToGlyphs_text'>text</a> contains an invalid UTF-8 sequence,
+zero is returned.
+
+If <a href='#SkFont_textToGlyphs_maxGlyphCount'>maxGlyphCount</a> is not sufficient to store all the <a href='#SkFont_textToGlyphs_glyphs'>glyphs</a>, no <a href='#SkFont_textToGlyphs_glyphs'>glyphs</a> are copied.
+The total <a href='undocumented#Glyph'>glyph</a> count is returned for subsequent buffer reallocation.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_textToGlyphs_text'><code><strong>text</strong></code></a></td>
+    <td>character storage encoded with <a href='undocumented#SkTextEncoding'>SkTextEncoding</a></td>
+  </tr>
+  <tr>    <td><a name='SkFont_textToGlyphs_byteLength'><code><strong>byteLength</strong></code></a></td>
+    <td>length of character storage in bytes</td>
+  </tr>
+  <tr>    <td><a name='SkFont_textToGlyphs_encoding'><code><strong>encoding</strong></code></a></td>
+    <td>one of: <a href='undocumented#SkTextEncoding::kUTF8'>SkTextEncoding::kUTF8</a>, <a href='undocumented#SkTextEncoding::kUTF16'>SkTextEncoding::kUTF16</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#SkTextEncoding::kUTF32'>SkTextEncoding::kUTF32</a>, <a href='undocumented#SkTextEncoding::kGlyphID'>SkTextEncoding::kGlyphID</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_textToGlyphs_glyphs'><code><strong>glyphs</strong></code></a></td>
+    <td>storage for <a href='undocumented#Glyph'>glyph</a> indices; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkFont_textToGlyphs_maxGlyphCount'><code><strong>maxGlyphCount</strong></code></a></td>
+    <td>storage capacity</td>
+  </tr>
+</table>
+
+### Return Value
+
+number of <a href='#SkFont_textToGlyphs_glyphs'>glyphs</a> represented by <a href='#SkFont_textToGlyphs_text'>text</a> of length <a href='#SkFont_textToGlyphs_byteLength'>byteLength</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_unicharToGlyph'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint16_t <a href='#SkFont_unicharToGlyph'>unicharToGlyph</a>(<a href='undocumented#SkUnichar'>SkUnichar</a> uni)const
+</pre>
+
+Returns <a href='undocumented#Glyph'>glyph</a> index for Unicode character.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_unicharToGlyph_uni'><code><strong>uni</strong></code></a></td>
+    <td>Unicode character</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='undocumented#Glyph'>glyph</a> index
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_countText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkFont_countText'>countText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding)const
+</pre>
+
+Returns number of <a href='undocumented#Glyph'>glyphs</a> represented by <a href='#SkFont_countText_text'>text</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_countText_text'><code><strong>text</strong></code></a></td>
+    <td>character storage encoded with <a href='undocumented#SkTextEncoding'>SkTextEncoding</a></td>
+  </tr>
+  <tr>    <td><a name='SkFont_countText_byteLength'><code><strong>byteLength</strong></code></a></td>
+    <td>length of character storage in bytes</td>
+  </tr>
+  <tr>    <td><a name='SkFont_countText_encoding'><code><strong>encoding</strong></code></a></td>
+    <td>one of: <a href='undocumented#SkTextEncoding::kUTF8'>SkTextEncoding::kUTF8</a>, <a href='undocumented#SkTextEncoding::kUTF16'>SkTextEncoding::kUTF16</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#SkTextEncoding::kUTF32'>SkTextEncoding::kUTF32</a>, <a href='undocumented#SkTextEncoding::kGlyphID'>SkTextEncoding::kGlyphID</a>
+
+### Return Value
+
+number of <a href='undocumented#Glyph'>glyphs</a> represented by <a href='#SkFont_countText_text'>text</a> of length <a href='#SkFont_countText_byteLength'>byteLength</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_containsText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkFont_containsText'>containsText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding)const
+</pre>
+
+Returns true if all <a href='#SkFont_containsText_text'>text</a> corresponds to a non-zero <a href='undocumented#Glyph'>glyph</a> index.
+Returns false if any characters in <a href='#SkFont_containsText_text'>text</a> are not supported in
+<a href='undocumented#SkTypeface'>SkTypeface</a>.
+
+If <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> is <a href='undocumented#SkTextEncoding::kGlyphID'>SkTextEncoding::kGlyphID</a>,
+returns true if all <a href='undocumented#Glyph'>glyph</a> indices in <a href='#SkFont_containsText_text'>text</a> are non-zero;
+does not check to see if <a href='#SkFont_containsText_text'>text</a> contains valid <a href='undocumented#Glyph'>glyph</a> indices for <a href='undocumented#SkTypeface'>SkTypeface</a>.
+
+Returns true if <a href='#SkFont_containsText_byteLength'>byteLength</a> is zero.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_containsText_text'><code><strong>text</strong></code></a></td>
+    <td>array of characters or <a href='undocumented#Glyph'>glyphs</a></td>
+  </tr>
+  <tr>    <td><a name='SkFont_containsText_byteLength'><code><strong>byteLength</strong></code></a></td>
+    <td>number of bytes in <a href='#SkFont_containsText_text'>text</a> array</td>
+  </tr>
+  <tr>    <td><a name='SkFont_containsText_encoding'><code><strong>encoding</strong></code></a></td>
+    <td><a href='undocumented#Text_Encoding'>text encoding</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if all <a href='#SkFont_containsText_text'>text</a> corresponds to a non-zero <a href='undocumented#Glyph'>glyph</a> index
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_breakText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkFont_breakText'>breakText</a>(const void* <a href='undocumented#Text'>text</a>, size_t length, <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding, <a href='undocumented#SkScalar'>SkScalar</a> maxWidth,
+                 <a href='undocumented#SkScalar'>SkScalar</a>* measuredWidth = nullptr)const
+</pre>
+
+Returns the bytes of <a href='#SkFont_breakText_text'>text</a> that fit within <a href='#SkFont_breakText_maxWidth'>maxWidth</a>.
+The <a href='#SkFont_breakText_text'>text</a> fragment fits if its advance width is less than or equal to <a href='#SkFont_breakText_maxWidth'>maxWidth</a>.
+Measures only while the advance is less than or equal to <a href='#SkFont_breakText_maxWidth'>maxWidth</a>.
+Returns the advance or the <a href='#SkFont_breakText_text'>text</a> fragment in <a href='#SkFont_breakText_measuredWidth'>measuredWidth</a> if it not nullptr.
+Uses <a href='#SkFont_breakText_encoding'>encoding</a> to decode <a href='#SkFont_breakText_text'>text</a>, <a href='undocumented#SkTypeface'>SkTypeface</a> to get the  <a href='undocumented#Font_Metrics'>font metrics</a>,
+and <a href='#SkFont_breakText_text'>text</a> <a href='undocumented#Size'>size</a> to scale the metrics.
+Does not scale the advance or bounds by fake bold.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_breakText_text'><code><strong>text</strong></code></a></td>
+    <td>character codes or <a href='undocumented#Glyph'>glyph</a> indices to be measured</td>
+  </tr>
+  <tr>    <td><a name='SkFont_breakText_length'><code><strong>length</strong></code></a></td>
+    <td>number of bytes of <a href='#SkFont_breakText_text'>text</a> to measure</td>
+  </tr>
+  <tr>    <td><a name='SkFont_breakText_encoding'><code><strong>encoding</strong></code></a></td>
+    <td><a href='undocumented#Text_Encoding'>text encoding</a></td>
+  </tr>
+  <tr>    <td><a name='SkFont_breakText_maxWidth'><code><strong>maxWidth</strong></code></a></td>
+    <td>advance limit; <a href='#SkFont_breakText_text'>text</a> is measured while advance is less than <a href='#SkFont_breakText_maxWidth'>maxWidth</a></td>
+  </tr>
+  <tr>    <td><a name='SkFont_breakText_measuredWidth'><code><strong>measuredWidth</strong></code></a></td>
+    <td>returns the width of the <a href='#SkFont_breakText_text'>text</a> less than or equal to <a href='#SkFont_breakText_maxWidth'>maxWidth</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+bytes of <a href='#SkFont_breakText_text'>text</a> that fit, always less than or equal to <a href='#SkFont_breakText_length'>length</a>
+
+### Example
+
+<div><fiddle-embed name="3cad18678254526be66ef162eecd1d23"><div><a href='undocumented#Line'>Line</a> under "Breakfast" shows desired width, shorter than available characters.
+<a href='undocumented#Line'>Line</a> under "Bre" shows measured width after breaking <a href='#SkFont_breakText_text'>text</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_measureText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkFont_measureText'>measureText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding,
+                     <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds = nullptr)const
+</pre>
+
+Returns the advance width of <a href='#SkFont_measureText_text'>text</a>.
+The advance is the normal distance to move before drawing additional <a href='#SkFont_measureText_text'>text</a>.
+Returns the bounding box of <a href='#SkFont_measureText_text'>text</a> if <a href='#SkFont_measureText_bounds'>bounds</a> is not nullptr.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_measureText_text'><code><strong>text</strong></code></a></td>
+    <td>character storage encoded with <a href='undocumented#SkTextEncoding'>SkTextEncoding</a></td>
+  </tr>
+  <tr>    <td><a name='SkFont_measureText_byteLength'><code><strong>byteLength</strong></code></a></td>
+    <td>length of character storage in bytes</td>
+  </tr>
+  <tr>    <td><a name='SkFont_measureText_encoding'><code><strong>encoding</strong></code></a></td>
+    <td>one of: <a href='undocumented#SkTextEncoding::kUTF8'>SkTextEncoding::kUTF8</a>, <a href='undocumented#SkTextEncoding::kUTF16'>SkTextEncoding::kUTF16</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#SkTextEncoding::kUTF32'>SkTextEncoding::kUTF32</a>, <a href='undocumented#SkTextEncoding::kGlyphID'>SkTextEncoding::kGlyphID</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_measureText_bounds'><code><strong>bounds</strong></code></a></td>
+    <td>returns bounding box relative to (0, 0) if not nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+number of <a href='undocumented#Glyph'>glyphs</a> represented by <a href='#SkFont_measureText_text'>text</a> of length <a href='#SkFont_measureText_byteLength'>byteLength</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_getPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkFont_getPath'>getPath</a>(uint16_t glyphID, <a href='SkPath_Reference#SkPath'>SkPath</a>* <a href='SkPath_Reference#Path'>path</a>)const
+</pre>
+
+Returns <a href='#SkFont_getPath_path'>path</a> corresponding to <a href='undocumented#Glyph'>glyph</a> outline.
+If <a href='undocumented#Glyph'>glyph</a> has an outline, copies outline to <a href='#SkFont_getPath_path'>path</a> and returns true.
+<a href='#SkFont_getPath_path'>path</a> returned may be empty.
+If <a href='undocumented#Glyph'>glyph</a> is described by a <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, returns false and ignores <a href='#SkFont_getPath_path'>path</a> parameter.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_getPath_glyphID'><code><strong>glyphID</strong></code></a></td>
+    <td>index of <a href='undocumented#Glyph'>glyph</a></td>
+  </tr>
+  <tr>    <td><a name='SkFont_getPath_path'><code><strong>path</strong></code></a></td>
+    <td>pointer to existing <a href='SkPath_Reference#SkPath'>SkPath</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkFont_getPath_glyphID'>glyphID</a> is described by <a href='#SkFont_getPath_path'>path</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_getPaths'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkFont_getPaths'>getPaths</a>(const uint16_t glyphIDs[], int count, void (*glyphPathProc) (const <a href='SkPath_Reference#SkPath'>SkPath</a>* pathOrNull,
+              const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& mx, void* ctx) , void* ctx)const
+</pre>
+
+Returns <a href='SkPath_Reference#Path'>path</a> corresponding to <a href='undocumented#Glyph'>glyph</a> array.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_getPaths_glyphIDs'><code><strong>glyphIDs</strong></code></a></td>
+    <td>array of <a href='undocumented#Glyph'>glyph</a> indices</td>
+  </tr>
+  <tr>    <td><a name='SkFont_getPaths_count'><code><strong>count</strong></code></a></td>
+    <td>number of <a href='undocumented#Glyph'>glyphs</a></td>
+  </tr>
+  <tr>    <td><a name='SkFont_getPaths_glyphPathProc'><code><strong>glyphPathProc</strong></code></a></td>
+    <td>function returning one <a href='undocumented#Glyph'>glyph</a> description as <a href='SkPath_Reference#Path'>path</a></td>
+  </tr>
+  <tr>    <td><a name='SkFont_getPaths_ctx'><code><strong>ctx</strong></code></a></td>
+    <td>function context</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_getMetrics'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkFont_getMetrics'>getMetrics</a>(<a href='undocumented#SkFontMetrics'>SkFontMetrics</a>* metrics)const
+</pre>
+
+Returns <a href='undocumented#SkFontMetrics'>SkFontMetrics</a> associated with <a href='undocumented#SkTypeface'>SkTypeface</a>.
+The return value is the recommended spacing between <a href='undocumented#Line'>lines</a>: the sum of <a href='#SkFont_getMetrics_metrics'>metrics</a>
+descent, ascent, and leading.
+If <a href='#SkFont_getMetrics_metrics'>metrics</a> is not nullptr, <a href='undocumented#SkFontMetrics'>SkFontMetrics</a> is copied to <a href='#SkFont_getMetrics_metrics'>metrics</a>.
+Results are scaled by <a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a> but does not take into account
+dimensions required by  <a href='undocumented#Text'>text scale</a>,  <a href='undocumented#Text'>text skew</a>, fake bold,
+style stroke, and <a href='undocumented#SkPathEffect'>SkPathEffect</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkFont_getMetrics_metrics'><code><strong>metrics</strong></code></a></td>
+    <td>storage for <a href='undocumented#SkFontMetrics'>SkFontMetrics</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+recommended spacing between <a href='undocumented#Line'>lines</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
+<a name='SkFont_getSpacing'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkFont_getSpacing'>getSpacing</a>()const
+</pre>
+
+Returns the recommended spacing between <a href='undocumented#Line'>lines</a>: the sum of metrics
+descent, ascent, and leading.
+Result is scaled by <a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a> but does not take into account
+dimensions required by stroking and <a href='undocumented#SkPathEffect'>SkPathEffect</a>.
+Returns the same result as <a href='#SkFont_getMetrics'>getMetrics</a>().
+
+### Return Value
+
+recommended spacing between <a href='undocumented#Line'>lines</a>
+
+### Example
+
+<div><fiddle-embed name="@incomplete"></fiddle-embed></div>
+
+### See Also
+
+incomplete
+
diff --git a/src/third_party/skia/site/user/api/SkIPoint_Reference.md b/src/third_party/skia/site/user/api/SkIPoint_Reference.md
new file mode 100644
index 0000000..8d7c6eb
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkIPoint_Reference.md
@@ -0,0 +1,516 @@
+SkIPoint Reference
+===
+
+
+<a name='SkIPoint'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+struct <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> {
+
+    int32_t <a href='#SkIPoint_fX'>fX</a>;
+    int32_t <a href='#SkIPoint_fY'>fY</a>;
+
+    static constexpr <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> <a href='#SkIPoint_Make'>Make</a>(int32_t x, int32_t y);
+    int32_t <a href='#SkIPoint_x'>x()</a> const;
+    int32_t <a href='#SkIPoint_y'>y()</a> const;
+    bool <a href='#SkIPoint_isZero'>isZero</a>() const;
+    void <a href='#SkIPoint_set'>set</a>(int32_t x, int32_t y);
+    <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> operator-() const;
+    void <a href='#SkIPoint_addto_operator'>operator+=</a>(const <a href='SkIPoint_Reference#SkIVector'>SkIVector</a>& v);
+    void <a href='#SkIPoint_subtractfrom_operator'>operator-=</a>(const <a href='SkIPoint_Reference#SkIVector'>SkIVector</a>& v);
+    bool <a href='#SkIPoint_equals'>equals</a>(int32_t x, int32_t y) const;
+    friend bool <a href='#SkIPoint_equal_operator'>operator==</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& a, const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& b);
+    friend bool <a href='#SkIPoint_notequal_operator'>operator!=</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& a, const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& b);
+    friend <a href='SkIPoint_Reference#SkIVector'>SkIVector</a> <a href='#SkIPoint_subtract_operator'>operator-</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& a, const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& b);
+    friend <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> <a href='#SkIPoint_add_operator'>operator+</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& a, const <a href='SkIPoint_Reference#SkIVector'>SkIVector</a>& b);
+};
+
+</pre>
+
+<a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> holds two 32-bit integer coordinates.<table style='border-collapse: collapse; width: 62.5em'>
+
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Type</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Member</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>int32_t</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkIPoint_fX'><code>fX</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+x-axis value used by <a href='SkIPoint_Reference#IPoint'>IPoint</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>int32_t</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkIPoint_fY'><code>fY</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+y-axis value used by <a href='SkIPoint_Reference#IPoint'>IPoint</a>.
+</td>
+  </tr>
+</table>
+
+<a name='SkIPoint_Make'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static constexpr <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> <a href='#SkIPoint_Make'>Make</a>(int32_t x, int32_t y)
+</pre>
+
+Sets <a href='#SkIPoint_fX'>fX</a> to <a href='#SkIPoint_Make_x'>x</a>, <a href='#SkIPoint_fY'>fY</a> to <a href='#SkIPoint_Make_y'>y</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIPoint_Make_x'><code><strong>x</strong></code></a></td>
+    <td>integer x-axis value of constructed <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a></td>
+  </tr>
+  <tr>    <td><a name='SkIPoint_Make_y'><code><strong>y</strong></code></a></td>
+    <td>integer y-axis value of constructed <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> (<a href='#SkIPoint_Make_x'>x</a>, <a href='#SkIPoint_Make_y'>y</a>)
+
+### Example
+
+<div><fiddle-embed name="@IPoint_Make">
+
+#### Example Output
+
+~~~~
+pt1 == pt2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIPoint_set'>set()</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a>::<a href='#SkPoint_iset'>iset()</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a>::<a href='#SkPoint_Make'>Make</a>
+
+<a name='Property'></a>
+
+<a name='SkIPoint_x'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int32_t <a href='#SkIPoint_x'>x()</a>const
+</pre>
+
+Returns x-axis value of <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>.
+
+### Return Value
+
+<a href='#SkIPoint_fX'>fX</a>
+
+### Example
+
+<div><fiddle-embed name="@IPoint_x">
+
+#### Example Output
+
+~~~~
+pt1.fX == pt1.x()
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIPoint_y'>y()</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a>::<a href='#SkPoint_x'>x()</a>
+
+<a name='SkIPoint_y'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int32_t <a href='#SkIPoint_y'>y()</a>const
+</pre>
+
+Returns y-axis value of <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>.
+
+### Return Value
+
+<a href='#SkIPoint_fY'>fY</a>
+
+### Example
+
+<div><fiddle-embed name="@IPoint_y">
+
+#### Example Output
+
+~~~~
+pt1.fY == pt1.y()
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIPoint_x'>x()</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a>::<a href='#SkPoint_y'>y()</a>
+
+<a name='SkIPoint_isZero'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkIPoint_isZero'>isZero</a>()const
+</pre>
+
+Returns true if <a href='#SkIPoint_fX'>fX</a> and <a href='#SkIPoint_fY'>fY</a> are both zero.
+
+### Return Value
+
+true if <a href='#SkIPoint_fX'>fX</a> is zero and <a href='#SkIPoint_fY'>fY</a> is zero
+
+### Example
+
+<div><fiddle-embed name="@IPoint_isZero">
+
+#### Example Output
+
+~~~~
+pt.isZero() == true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a>::<a href='#SkPoint_isZero'>isZero</a>
+
+<a name='Set'></a>
+
+<a name='SkIPoint_set'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void set(int32_t x, int32_t y)
+</pre>
+
+Sets <a href='#SkIPoint_fX'>fX</a> to <a href='#SkIPoint_set_x'>x</a> and <a href='#SkIPoint_fY'>fY</a> to <a href='#SkIPoint_set_y'>y</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIPoint_set_x'><code><strong>x</strong></code></a></td>
+    <td>new value for <a href='#SkIPoint_fX'>fX</a></td>
+  </tr>
+  <tr>    <td><a name='SkIPoint_set_y'><code><strong>y</strong></code></a></td>
+    <td>new value for <a href='#SkIPoint_fY'>fY</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@IPoint_set">
+
+#### Example Output
+
+~~~~
+pt1 == pt2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIPoint_Make'>Make</a>
+
+<a name='SkIPoint_minus_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> operator-()const
+</pre>
+
+Returns <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> changing the signs of <a href='#SkIPoint_fX'>fX</a> and <a href='#SkIPoint_fY'>fY</a>.
+
+### Return Value
+
+<a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> as (-<a href='#SkIPoint_fX'>fX</a>, -<a href='#SkIPoint_fY'>fY</a>)
+
+### Example
+
+<div><fiddle-embed name="@IPoint_minus_operator">
+
+#### Example Output
+
+~~~~
+pt: 0, 0  negate: 0, 0
+pt: -1, -2  negate: 1, 2
+pt: 2147483647, -2147483647  negate: -2147483647, 2147483647
+pt: -2147483648, -2147483648  negate: -2147483648, -2147483648
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIPoint_subtract_operator'>operator-</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& a, const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& b) <a href='#SkIPoint_subtractfrom_operator'>operator-=</a>(const <a href='SkIPoint_Reference#SkIVector'>SkIVector</a>& v) <a href='SkPoint_Reference#SkPoint'>SkPoint</a>::operator-() const
+
+<a name='SkIPoint_addto_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkIPoint_addto_operator'>operator+=</a>(const <a href='SkIPoint_Reference#SkIVector'>SkIVector</a>& v)
+</pre>
+
+Offsets <a href='SkIPoint_Reference#IPoint'>IPoint</a> by <a href='#IPoint_IVector'>IVector</a> <a href='#SkIPoint_addto_operator_v'>v</a>. Sets <a href='SkIPoint_Reference#IPoint'>IPoint</a> to <code>(<a href='#SkIPoint_fX'>fX</a> + <a href='#SkIPoint_addto_operator_v'>v</a>.<a href='#SkIPoint_fX'>fX</a>, <a href='#SkIPoint_fY'>fY</a> + <a href='#SkIPoint_addto_operator_v'>v</a>.<a href='#SkIPoint_fY'>fY</a>)</code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIPoint_addto_operator_v'><code><strong>v</strong></code></a></td>
+    <td><a href='#IPoint_IVector'>IVector</a> to add</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@IPoint_addto_operator"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIPoint_add_operator'>operator+</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& a, const <a href='SkIPoint_Reference#SkIVector'>SkIVector</a>& b) <a href='SkPoint_Reference#SkPoint'>SkPoint</a>::operator+=(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& <a href='#SkIPoint_addto_operator_v'>v</a>)
+
+<a name='SkIPoint_subtractfrom_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkIPoint_subtractfrom_operator'>operator-=</a>(const <a href='SkIPoint_Reference#SkIVector'>SkIVector</a>& v)
+</pre>
+
+Subtracts <a href='#IPoint_IVector'>IVector</a> <a href='#SkIPoint_subtractfrom_operator_v'>v</a> from <a href='SkIPoint_Reference#IPoint'>IPoint</a>. Sets <a href='SkIPoint_Reference#IPoint'>IPoint</a> to: <code>(<a href='#SkIPoint_fX'>fX</a> - <a href='#SkIPoint_subtractfrom_operator_v'>v</a>.<a href='#SkIPoint_fX'>fX</a>, <a href='#SkIPoint_fY'>fY</a> - <a href='#SkIPoint_subtractfrom_operator_v'>v</a>.<a href='#SkIPoint_fY'>fY</a>)</code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIPoint_subtractfrom_operator_v'><code><strong>v</strong></code></a></td>
+    <td><a href='#IPoint_IVector'>IVector</a> to subtract</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@IPoint_subtractfrom_operator"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIPoint_subtract_operator'>operator-</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& a, const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& b) <a href='SkPoint_Reference#SkPoint'>SkPoint</a>::operator-=(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& <a href='#SkIPoint_subtractfrom_operator_v'>v</a>)
+
+<a name='SkIPoint_equals'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool equals(int32_t x, int32_t y)const
+</pre>
+
+Returns true if <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> is equivalent to <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> constructed from (<a href='#SkIPoint_equals_x'>x</a>, <a href='#SkIPoint_equals_y'>y</a>).
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIPoint_equals_x'><code><strong>x</strong></code></a></td>
+    <td>value compared with <a href='#SkIPoint_fX'>fX</a></td>
+  </tr>
+  <tr>    <td><a name='SkIPoint_equals_y'><code><strong>y</strong></code></a></td>
+    <td>value compared with <a href='#SkIPoint_fY'>fY</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> equals (<a href='#SkIPoint_equals_x'>x</a>, <a href='#SkIPoint_equals_y'>y</a>)
+
+### Example
+
+<div><fiddle-embed name="@IPoint_equals">
+
+#### Example Output
+
+~~~~
+pt: 0, 0  == pt
+pt: -1, -2  == pt
+pt: 2147483647, -1  == pt
+pt: -2147483648, -1  == pt
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIPoint_equal_operator'>operator==</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& a, const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& b)
+
+<a name='SkIPoint_equal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkIPoint_equal_operator'>operator==</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& a, const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& b)
+</pre>
+
+Returns true if <a href='#SkIPoint_equal_operator_a'>a</a> is equivalent to <a href='#SkIPoint_equal_operator_b'>b</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIPoint_equal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> to compare</td>
+  </tr>
+  <tr>    <td><a name='SkIPoint_equal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkIPoint_equal_operator_a'>a</a>.<a href='#SkIPoint_fX'>fX</a> == <a href='#SkIPoint_equal_operator_b'>b</a>.<a href='#SkIPoint_fX'>fX</a> and <a href='#SkIPoint_equal_operator_a'>a</a>.<a href='#SkIPoint_fY'>fY</a> == <a href='#SkIPoint_equal_operator_b'>b</a>.<a href='#SkIPoint_fY'>fY</a>
+
+### Example
+
+<div><fiddle-embed name="@IPoint_equal_operator">
+
+#### Example Output
+
+~~~~
+pt: 0, 0  == pt
+pt: -1, -2  == pt
+pt: 2147483647, -1  == pt
+pt: -2147483648, -1  == pt
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIPoint_equals'>equals()</a> <a href='#SkIPoint_notequal_operator'>operator!=</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& <a href='#SkIPoint_equal_operator_a'>a</a>, const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& <a href='#SkIPoint_equal_operator_b'>b</a>)
+
+<a name='SkIPoint_notequal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkIPoint_notequal_operator'>operator!=</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& a, const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& b)
+</pre>
+
+Returns true if <a href='#SkIPoint_notequal_operator_a'>a</a> is not equivalent to <a href='#SkIPoint_notequal_operator_b'>b</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIPoint_notequal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> to compare</td>
+  </tr>
+  <tr>    <td><a name='SkIPoint_notequal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkIPoint_notequal_operator_a'>a</a>.<a href='#SkIPoint_fX'>fX</a> != <a href='#SkIPoint_notequal_operator_b'>b</a>.<a href='#SkIPoint_fX'>fX</a> or <a href='#SkIPoint_notequal_operator_a'>a</a>.<a href='#SkIPoint_fY'>fY</a> != <a href='#SkIPoint_notequal_operator_b'>b</a>.<a href='#SkIPoint_fY'>fY</a>
+
+### Example
+
+<div><fiddle-embed name="@IPoint_notequal_operator">
+
+#### Example Output
+
+~~~~
+pt: 0, 0  == pt
+pt: -1, -2  == pt
+pt: 2147483647, -1  == pt
+pt: -2147483648, -1  == pt
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIPoint_equal_operator'>operator==</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& <a href='#SkIPoint_notequal_operator_a'>a</a>, const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& <a href='#SkIPoint_notequal_operator_b'>b</a>) <a href='#SkIPoint_equals'>equals()</a>
+
+<a name='SkIPoint_subtract_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIPoint_Reference#SkIVector'>SkIVector</a> <a href='#SkIPoint_subtract_operator'>operator-</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& a, const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& b)
+</pre>
+
+Returns <a href='#IPoint_IVector'>IVector</a> from <a href='#SkIPoint_subtract_operator_b'>b</a> to <a href='#SkIPoint_subtract_operator_a'>a</a>; computed as <code>(<a href='#SkIPoint_subtract_operator_a'>a</a>.<a href='#SkIPoint_fX'>fX</a> - <a href='#SkIPoint_subtract_operator_b'>b</a>.<a href='#SkIPoint_fX'>fX</a>, <a href='#SkIPoint_subtract_operator_a'>a</a>.<a href='#SkIPoint_fY'>fY</a> - <a href='#SkIPoint_subtract_operator_b'>b</a>.<a href='#SkIPoint_fY'>fY</a>)</code>.
+
+Can also be used to subtract <a href='#IPoint_IVector'>IVector</a> from <a href='#IPoint_IVector'>IVector</a>, returning <a href='#IPoint_IVector'>IVector</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIPoint_subtract_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkIPoint_Reference#IPoint'>IPoint</a> or <a href='#IPoint_IVector'>IVector</a> to subtract from</td>
+  </tr>
+  <tr>    <td><a name='SkIPoint_subtract_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='#IPoint_IVector'>IVector</a> to subtract</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='#IPoint_IVector'>IVector</a> from <a href='#SkIPoint_subtract_operator_b'>b</a> to <a href='#SkIPoint_subtract_operator_a'>a</a>
+
+### Example
+
+<div><fiddle-embed name="@IPoint_subtract_operator"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIPoint_subtractfrom_operator'>operator-=</a>(const <a href='SkIPoint_Reference#SkIVector'>SkIVector</a>& v)
+
+<a name='SkIPoint_add_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> <a href='#SkIPoint_add_operator'>operator+</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& a, const <a href='SkIPoint_Reference#SkIVector'>SkIVector</a>& b)
+</pre>
+
+Returns <a href='SkIPoint_Reference#IPoint'>IPoint</a> resulting from <a href='SkIPoint_Reference#IPoint'>IPoint</a> <a href='#SkIPoint_add_operator_a'>a</a> offset by <a href='#IPoint_IVector'>IVector</a> <a href='#SkIPoint_add_operator_b'>b</a>, computed as:
+<code>(<a href='#SkIPoint_add_operator_a'>a</a>.<a href='#SkIPoint_fX'>fX</a> + <a href='#SkIPoint_add_operator_b'>b</a>.<a href='#SkIPoint_fX'>fX</a>, <a href='#SkIPoint_add_operator_a'>a</a>.<a href='#SkIPoint_fY'>fY</a> + <a href='#SkIPoint_add_operator_b'>b</a>.<a href='#SkIPoint_fY'>fY</a>)</code>.
+
+Can also be used to offset <a href='SkIPoint_Reference#IPoint'>IPoint</a> <a href='#SkIPoint_add_operator_b'>b</a> by <a href='#IPoint_IVector'>IVector</a> <a href='#SkIPoint_add_operator_a'>a</a>, returning <a href='SkIPoint_Reference#IPoint'>IPoint</a>.
+Can also be used to add <a href='#IPoint_IVector'>IVector</a> to <a href='#IPoint_IVector'>IVector</a>, returning <a href='#IPoint_IVector'>IVector</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIPoint_add_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkIPoint_Reference#IPoint'>IPoint</a> or <a href='#IPoint_IVector'>IVector</a> to add to</td>
+  </tr>
+  <tr>    <td><a name='SkIPoint_add_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkIPoint_Reference#IPoint'>IPoint</a> or <a href='#IPoint_IVector'>IVector</a> to add</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkIPoint_Reference#IPoint'>IPoint</a> equal to <a href='#SkIPoint_add_operator_a'>a</a> offset by <a href='#SkIPoint_add_operator_b'>b</a>
+
+### Example
+
+<div><fiddle-embed name="@IPoint_add_operator"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIPoint_addto_operator'>operator+=</a>(const <a href='SkIPoint_Reference#SkIVector'>SkIVector</a>& v)
+
+<a name='IVector'></a>
+
+<a name='SkIVector'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    typedef <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> <a href='SkIPoint_Reference#SkIVector'>SkIVector</a>;
+</pre>
+
+<a href='SkIPoint_Reference#SkIVector'>SkIVector</a> provides an alternative name for <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>. <a href='SkIPoint_Reference#SkIVector'>SkIVector</a> and <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>
+can be used interchangeably for all purposes.
\ No newline at end of file
diff --git a/src/third_party/skia/site/user/api/SkIRect_Reference.md b/src/third_party/skia/site/user/api/SkIRect_Reference.md
new file mode 100644
index 0000000..5a772a3
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkIRect_Reference.md
@@ -0,0 +1,2126 @@
+SkIRect Reference
+===
+
+
+<a name='SkIRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+struct <a href='SkIRect_Reference#SkIRect'>SkIRect</a> {
+
+    int32_t <a href='#SkIRect_fLeft'>fLeft</a>;
+    int32_t <a href='#SkIRect_fTop'>fTop</a>;
+    int32_t <a href='#SkIRect_fRight'>fRight</a>;
+    int32_t <a href='#SkIRect_fBottom'>fBottom</a>;
+
+    static constexpr <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_MakeEmpty'>MakeEmpty</a>();
+    static constexpr <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_MakeWH'>MakeWH</a>(int32_t w, int32_t h);
+    static constexpr <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_MakeSize'>MakeSize</a>(const <a href='undocumented#SkISize'>SkISize</a>& <a href='undocumented#Size'>size</a>);
+    static constexpr <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_MakeLTRB'>MakeLTRB</a>(int32_t l, int32_t t,
+                                      int32_t r, int32_t b);
+    static constexpr <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_MakeXYWH'>MakeXYWH</a>(int32_t x, int32_t y,
+                                      int32_t w, int32_t h);
+    int32_t <a href='#SkIRect_left'>left()</a> const;
+    int32_t <a href='#SkIRect_top'>top()</a> const;
+    int32_t <a href='#SkIRect_right'>right()</a> const;
+    int32_t <a href='#SkIRect_bottom'>bottom()</a> const;
+    int32_t <a href='#SkIRect_x'>x()</a> const;
+    int32_t <a href='#SkIRect_y'>y()</a> const;
+    int32_t <a href='#SkIRect_width'>width()</a> const;
+    int32_t <a href='#SkIRect_height'>height()</a> const;
+    <a href='undocumented#SkISize'>SkISize</a> <a href='#SkIRect_size'>size()</a> const;
+    int64_t <a href='#SkIRect_width64'>width64</a>() const;
+    int64_t <a href='#SkIRect_height64'>height64</a>() const;
+    bool <a href='#SkIRect_isEmpty64'>isEmpty64</a>() const;
+    bool <a href='#SkIRect_isEmpty'>isEmpty</a>() const;
+    friend bool <a href='#SkIRect_equal_operator'>operator==</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& a, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& b);
+    friend bool <a href='#SkIRect_notequal_operator'>operator!=</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& a, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& b);
+    void <a href='#SkIRect_setEmpty'>setEmpty</a>();
+    void <a href='#SkIRect_set'>set</a>(int32_t left, int32_t top, int32_t right, int32_t bottom);
+    void <a href='#SkIRect_setLTRB'>setLTRB</a>(int32_t left, int32_t top, int32_t right, int32_t bottom);
+    void <a href='#SkIRect_setXYWH'>setXYWH</a>(int32_t x, int32_t y, int32_t width, int32_t height);
+    <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_makeOffset'>makeOffset</a>(int32_t dx, int32_t dy) const;
+    <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_makeInset'>makeInset</a>(int32_t dx, int32_t dy) const;
+    <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_makeOutset'>makeOutset</a>(int32_t dx, int32_t dy) const;
+    void <a href='#SkIRect_offset'>offset</a>(int32_t dx, int32_t dy);
+    void <a href='#SkIRect_offset'>offset</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& delta);
+    void <a href='#SkIRect_offsetTo'>offsetTo</a>(int32_t newX, int32_t newY);
+    void <a href='#SkIRect_inset'>inset</a>(int32_t dx, int32_t dy);
+    void <a href='#SkIRect_outset'>outset</a>(int32_t dx, int32_t dy);
+    void <a href='#SkIRect_adjust'>adjust</a>(int32_t dL, int32_t dT, int32_t dR, int32_t dB);
+    bool <a href='#SkIRect_contains'>contains</a>(int32_t x, int32_t y) const;
+    bool <a href='#SkIRect_contains'>contains</a>(int32_t left, int32_t top, int32_t right, int32_t bottom) const;
+    bool <a href='#SkIRect_contains'>contains</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& r) const;
+    bool <a href='#SkIRect_contains'>contains</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r) const;
+    bool <a href='#SkIRect_containsNoEmptyCheck'>containsNoEmptyCheck</a>(int32_t left, int32_t top,
+                              int32_t right, int32_t bottom) const;
+    bool <a href='#SkIRect_containsNoEmptyCheck'>containsNoEmptyCheck</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& r) const;
+    bool <a href='#SkIRect_intersect'>intersect</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& r);
+    bool <a href='#SkIRect_intersectNoEmptyCheck'>intersectNoEmptyCheck</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& a, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& b);
+    bool <a href='#SkIRect_intersect'>intersect</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& a, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& b);
+    bool <a href='#SkIRect_intersect'>intersect</a>(int32_t left, int32_t top, int32_t right, int32_t bottom);
+    static bool <a href='#SkIRect_Intersects'>Intersects</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& a, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& b);
+    static bool <a href='#SkIRect_IntersectsNoEmptyCheck'>IntersectsNoEmptyCheck</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& a, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& b);
+    void <a href='#SkIRect_join'>join</a>(int32_t left, int32_t top, int32_t right, int32_t bottom);
+    void <a href='#SkIRect_join'>join</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& r);
+    void <a href='#SkIRect_sort'>sort()</a>;
+    <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_makeSorted'>makeSorted</a>() const;
+    static const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='#SkIRect_EmptyIRect'>EmptyIRect</a>();
+};
+
+</pre>
+
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> holds four 32-bit integer coordinates describing the upper and
+lower bounds of a rectangle. <a href='SkIRect_Reference#SkIRect'>SkIRect</a> may be created from outer bounds or
+from position, width, and height. <a href='SkIRect_Reference#SkIRect'>SkIRect</a> describes an area; if its right
+is less than or equal to its left, or if its bottom is less than or equal to
+its top, it is considered empty.<table style='border-collapse: collapse; width: 62.5em'>
+
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Type</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Member</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>int32_t</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkIRect_fLeft'><code>fLeft</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+May contain any value. The smaller of the horizontal values when sorted.
+When equal to or greater than <a href='#SkIRect_fRight'>fRight</a>, <a href='SkIRect_Reference#IRect'>IRect</a> is empty.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>int32_t</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkIRect_fTop'><code>fTop</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+May contain any value. The smaller of the horizontal values when sorted.
+When equal to or greater than <a href='#SkIRect_fBottom'>fBottom</a>, <a href='SkIRect_Reference#IRect'>IRect</a> is empty.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>int32_t</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkIRect_fRight'><code>fRight</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+May contain any value. The larger of the vertical values when sorted.
+When equal to or less than <a href='#SkIRect_fLeft'>fLeft</a>, <a href='SkIRect_Reference#IRect'>IRect</a> is empty.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>int32_t</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkIRect_fBottom'><code>fBottom</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+May contain any value. The larger of the vertical values when sorted.
+When equal to or less than <a href='#SkIRect_fTop'>fTop</a>, <a href='SkIRect_Reference#IRect'>IRect</a> is empty.
+</td>
+  </tr>
+</table>
+
+<a name='SkIRect_MakeEmpty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static constexpr <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_MakeEmpty'>MakeEmpty</a>()
+</pre>
+
+Returns constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a> set to (0, 0, 0, 0).
+Many other rectangles are empty; if left is equal to or greater than right,
+or if top is equal to or greater than bottom. Setting all members to zero
+is a convenience, but does not designate a special empty rectangle.
+
+### Return Value
+
+bounds (0, 0, 0, 0)
+
+### Example
+
+<div><fiddle-embed name="@IRect_MakeEmpty">
+
+#### Example Output
+
+~~~~
+MakeEmpty isEmpty: true
+offset rect isEmpty: true
+inset rect isEmpty: true
+outset rect isEmpty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_EmptyIRect'>EmptyIRect</a> <a href='#SkIRect_isEmpty'>isEmpty</a> <a href='#SkIRect_setEmpty'>setEmpty</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_MakeEmpty'>MakeEmpty</a>
+
+<a name='SkIRect_MakeWH'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static constexpr <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_MakeWH'>MakeWH</a>(int32_t w, int32_t h)
+</pre>
+
+Returns constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a> set to (0, 0, <a href='#SkIRect_MakeWH_w'>w</a>, <a href='#SkIRect_MakeWH_h'>h</a>). Does not validate input; <a href='#SkIRect_MakeWH_w'>w</a> or <a href='#SkIRect_MakeWH_h'>h</a>
+may be negative.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_MakeWH_w'><code><strong>w</strong></code></a></td>
+    <td>width of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_MakeWH_h'><code><strong>h</strong></code></a></td>
+    <td>height of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+bounds (0, 0, <a href='#SkIRect_MakeWH_w'>w</a>, <a href='#SkIRect_MakeWH_h'>h</a>)
+
+### Example
+
+<div><fiddle-embed name="@IRect_MakeWH">
+
+#### Example Output
+
+~~~~
+all equal
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_MakeSize'>MakeSize</a> <a href='#SkIRect_MakeXYWH'>MakeXYWH</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_MakeWH'>MakeWH</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_MakeIWH'>MakeIWH</a>
+
+<a name='SkIRect_MakeSize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static constexpr <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_MakeSize'>MakeSize</a>(const <a href='undocumented#SkISize'>SkISize</a>& <a href='undocumented#Size'>size</a>)
+</pre>
+
+Returns constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a> set to (0, 0, <a href='#SkIRect_MakeSize_size'>size</a>.<a href='#SkISize_width'>width()</a>, <a href='#SkIRect_MakeSize_size'>size</a>.<a href='#SkISize_height'>height()</a>).
+Does not validate input; <a href='#SkIRect_MakeSize_size'>size</a>.<a href='#SkISize_width'>width()</a> or <a href='#SkIRect_MakeSize_size'>size</a>.<a href='#SkISize_height'>height()</a> may be negative.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_MakeSize_size'><code><strong>size</strong></code></a></td>
+    <td>values for <a href='SkIRect_Reference#SkIRect'>SkIRect</a> width and height</td>
+  </tr>
+</table>
+
+### Return Value
+
+bounds (0, 0, <a href='#SkIRect_MakeSize_size'>size</a>.<a href='#SkISize_width'>width()</a>, <a href='#SkIRect_MakeSize_size'>size</a>.<a href='#SkISize_height'>height()</a>)
+
+### Example
+
+<div><fiddle-embed name="@IRect_MakeSize">
+
+#### Example Output
+
+~~~~
+round width: 26  height: 36
+floor width: 25  height: 35
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_MakeWH'>MakeWH</a> <a href='#SkIRect_MakeXYWH'>MakeXYWH</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_Make'>Make</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_MakeIWH'>MakeIWH</a>
+
+<a name='SkIRect_MakeLTRB'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static constexpr <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_MakeLTRB'>MakeLTRB</a>(int32_t l, int32_t t, int32_t r, int32_t b)
+</pre>
+
+Returns constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a> set to (<a href='#SkIRect_MakeLTRB_l'>l</a>, <a href='#SkIRect_MakeLTRB_t'>t</a>, <a href='#SkIRect_MakeLTRB_r'>r</a>, <a href='#SkIRect_MakeLTRB_b'>b</a>). Does not sort input; <a href='SkIRect_Reference#SkIRect'>SkIRect</a> may
+result in <a href='#SkIRect_fLeft'>fLeft</a> greater than <a href='#SkIRect_fRight'>fRight</a>, or <a href='#SkIRect_fTop'>fTop</a> greater than <a href='#SkIRect_fBottom'>fBottom</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_MakeLTRB_l'><code><strong>l</strong></code></a></td>
+    <td>integer stored in <a href='#SkIRect_fLeft'>fLeft</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_MakeLTRB_t'><code><strong>t</strong></code></a></td>
+    <td>integer stored in <a href='#SkIRect_fTop'>fTop</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_MakeLTRB_r'><code><strong>r</strong></code></a></td>
+    <td>integer stored in <a href='#SkIRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_MakeLTRB_b'><code><strong>b</strong></code></a></td>
+    <td>integer stored in <a href='#SkIRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+bounds (<a href='#SkIRect_MakeLTRB_l'>l</a>, <a href='#SkIRect_MakeLTRB_t'>t</a>, <a href='#SkIRect_MakeLTRB_r'>r</a>, <a href='#SkIRect_MakeLTRB_b'>b</a>)
+
+### Example
+
+<div><fiddle-embed name="@IRect_MakeLTRB">
+
+#### Example Output
+
+~~~~
+rect: 5, 35, 15, 25  isEmpty: true
+rect: 5, 25, 15, 35  isEmpty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_MakeXYWH'>MakeXYWH</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_MakeLTRB'>MakeLTRB</a>
+
+<a name='SkIRect_MakeXYWH'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static constexpr <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_MakeXYWH'>MakeXYWH</a>(int32_t x, int32_t y, int32_t w, int32_t h)
+</pre>
+
+Returns constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a> set to: (<a href='#SkIRect_MakeXYWH_x'>x</a>, <a href='#SkIRect_MakeXYWH_y'>y</a>, <a href='#SkIRect_MakeXYWH_x'>x</a> + <a href='#SkIRect_MakeXYWH_w'>w</a>, <a href='#SkIRect_MakeXYWH_y'>y</a> + <a href='#SkIRect_MakeXYWH_h'>h</a>).
+Does not validate input; <a href='#SkIRect_MakeXYWH_w'>w</a> or <a href='#SkIRect_MakeXYWH_h'>h</a> may be negative.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_MakeXYWH_x'><code><strong>x</strong></code></a></td>
+    <td>stored in <a href='#SkIRect_fLeft'>fLeft</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_MakeXYWH_y'><code><strong>y</strong></code></a></td>
+    <td>stored in <a href='#SkIRect_fTop'>fTop</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_MakeXYWH_w'><code><strong>w</strong></code></a></td>
+    <td>added to <a href='#SkIRect_MakeXYWH_x'>x</a> and stored in <a href='#SkIRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_MakeXYWH_h'><code><strong>h</strong></code></a></td>
+    <td>added to <a href='#SkIRect_MakeXYWH_y'>y</a> and stored in <a href='#SkIRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+bounds at (<a href='#SkIRect_MakeXYWH_x'>x</a>, <a href='#SkIRect_MakeXYWH_y'>y</a>) with width <a href='#SkIRect_MakeXYWH_w'>w</a> and height <a href='#SkIRect_MakeXYWH_h'>h</a>
+
+### Example
+
+<div><fiddle-embed name="@IRect_MakeXYWH">
+
+#### Example Output
+
+~~~~
+rect: 5, 35, -10, 60  isEmpty: true
+rect: -10, 35, 5, 60  isEmpty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_MakeLTRB'>MakeLTRB</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_MakeXYWH'>MakeXYWH</a>
+
+<a name='Property'></a>
+
+<a name='SkIRect_left'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int32_t <a href='#SkIRect_left'>left()</a>const
+</pre>
+
+Returns left edge of <a href='SkIRect_Reference#SkIRect'>SkIRect</a>, if sorted.
+Call <a href='#SkIRect_sort'>sort()</a> to reverse <a href='#SkIRect_fLeft'>fLeft</a> and <a href='#SkIRect_fRight'>fRight</a> if needed.
+
+### Return Value
+
+<a href='#SkIRect_fLeft'>fLeft</a>
+
+### Example
+
+<div><fiddle-embed name="@IRect_left">
+
+#### Example Output
+
+~~~~
+unsorted.fLeft: 15 unsorted.left(): 15
+sorted.fLeft: 10 sorted.left(): 10
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_fLeft'>fLeft</a> <a href='#SkIRect_x'>x()</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_left'>left()</a>
+
+<a name='SkIRect_top'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int32_t <a href='#SkIRect_top'>top()</a>const
+</pre>
+
+Returns top edge of <a href='SkIRect_Reference#SkIRect'>SkIRect</a>, if sorted. Call <a href='#SkIRect_isEmpty'>isEmpty</a>() to see if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> may be invalid,
+and <a href='#SkIRect_sort'>sort()</a> to reverse <a href='#SkIRect_fTop'>fTop</a> and <a href='#SkIRect_fBottom'>fBottom</a> if needed.
+
+### Return Value
+
+<a href='#SkIRect_fTop'>fTop</a>
+
+### Example
+
+<div><fiddle-embed name="@IRect_top">
+
+#### Example Output
+
+~~~~
+unsorted.fTop: 25 unsorted.top(): 25
+sorted.fTop: 5 sorted.top(): 5
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_fTop'>fTop</a> <a href='#SkIRect_y'>y()</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_top'>top()</a>
+
+<a name='SkIRect_right'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int32_t <a href='#SkIRect_right'>right()</a>const
+</pre>
+
+Returns right edge of <a href='SkIRect_Reference#SkIRect'>SkIRect</a>, if sorted.
+Call <a href='#SkIRect_sort'>sort()</a> to reverse <a href='#SkIRect_fLeft'>fLeft</a> and <a href='#SkIRect_fRight'>fRight</a> if needed.
+
+### Return Value
+
+<a href='#SkIRect_fRight'>fRight</a>
+
+### Example
+
+<div><fiddle-embed name="@IRect_right">
+
+#### Example Output
+
+~~~~
+unsorted.fRight: 10 unsorted.right(): 10
+sorted.fRight: 15 sorted.right(): 15
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_fRight'>fRight</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_right'>right()</a>
+
+<a name='SkIRect_bottom'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int32_t <a href='#SkIRect_bottom'>bottom()</a>const
+</pre>
+
+Returns bottom edge of <a href='SkIRect_Reference#SkIRect'>SkIRect</a>, if sorted. Call <a href='#SkIRect_isEmpty'>isEmpty</a>() to see if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> may be invalid,
+and <a href='#SkIRect_sort'>sort()</a> to reverse <a href='#SkIRect_fTop'>fTop</a> and <a href='#SkIRect_fBottom'>fBottom</a> if needed.
+
+### Return Value
+
+<a href='#SkIRect_fBottom'>fBottom</a>
+
+### Example
+
+<div><fiddle-embed name="@IRect_bottom">
+
+#### Example Output
+
+~~~~
+unsorted.fBottom: 5 unsorted.bottom(): 5
+sorted.fBottom: 25 sorted.bottom(): 25
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_fBottom'>fBottom</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_bottom'>bottom()</a>
+
+<a name='SkIRect_x'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int32_t <a href='#SkIRect_x'>x()</a>const
+</pre>
+
+Returns left edge of <a href='SkIRect_Reference#SkIRect'>SkIRect</a>, if sorted. Call <a href='#SkIRect_isEmpty'>isEmpty</a>() to see if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> may be invalid,
+and <a href='#SkIRect_sort'>sort()</a> to reverse <a href='#SkIRect_fLeft'>fLeft</a> and <a href='#SkIRect_fRight'>fRight</a> if needed.
+
+### Return Value
+
+<a href='#SkIRect_fLeft'>fLeft</a>
+
+### Example
+
+<div><fiddle-embed name="@IRect_x">
+
+#### Example Output
+
+~~~~
+unsorted.fLeft: 15 unsorted.x(): 15
+sorted.fLeft: 10 sorted.x(): 10
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_fLeft'>fLeft</a> <a href='#SkIRect_left'>left()</a> <a href='#SkIRect_y'>y()</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_x'>x()</a>
+
+<a name='SkIRect_y'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int32_t <a href='#SkIRect_y'>y()</a>const
+</pre>
+
+Returns top edge of <a href='SkIRect_Reference#SkIRect'>SkIRect</a>, if sorted. Call <a href='#SkIRect_isEmpty'>isEmpty</a>() to see if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> may be invalid,
+and <a href='#SkIRect_sort'>sort()</a> to reverse <a href='#SkIRect_fTop'>fTop</a> and <a href='#SkIRect_fBottom'>fBottom</a> if needed.
+
+### Return Value
+
+<a href='#SkIRect_fTop'>fTop</a>
+
+### Example
+
+<div><fiddle-embed name="@IRect_y">
+
+#### Example Output
+
+~~~~
+unsorted.fTop: 25 unsorted.y(): 25
+sorted.fTop: 5 sorted.y(): 5
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_fTop'>fTop</a> <a href='#SkIRect_top'>top()</a> <a href='#SkIRect_x'>x()</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_y'>y()</a>
+
+<a name='SkIRect_width'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int32_t <a href='#SkIRect_width'>width()</a>const
+</pre>
+
+Returns span on the x-axis. This does not check if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is sorted, or if
+result fits in 32-bit signed integer; result may be negative.
+
+### Return Value
+
+<a href='#SkIRect_fRight'>fRight</a> minus <a href='#SkIRect_fLeft'>fLeft</a>
+
+### Example
+
+<div><fiddle-embed name="@IRect_width">
+
+#### Example Output
+
+~~~~
+unsorted width: -5
+large width: -5
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_height'>height()</a> <a href='#SkIRect_width64'>width64</a>() <a href='#SkIRect_height64'>height64</a>() <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_width'>width()</a>
+
+<a name='SkIRect_width64'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int64_t <a href='#SkIRect_width64'>width64</a>()const
+</pre>
+
+Returns span on the x-axis. This does not check if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is sorted, so the
+result may be negative. This is safer than calling <a href='#SkIRect_width'>width()</a> since <a href='#SkIRect_width'>width()</a> might
+overflow in its calculation.
+
+### Return Value
+
+<a href='#SkIRect_fRight'>fRight</a> minus <a href='#SkIRect_fLeft'>fLeft</a> cast to int64_t
+
+### Example
+
+<div><fiddle-embed name="@IRect_width64">
+
+#### Example Output
+
+~~~~
+width: -5 width64: 4294967291
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_width'>width()</a> <a href='#SkIRect_height'>height()</a> <a href='#SkIRect_height64'>height64</a>() <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_width'>width()</a>
+
+<a name='SkIRect_height'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int32_t <a href='#SkIRect_height'>height()</a>const
+</pre>
+
+Returns span on the y-axis. This does not check if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is sorted, or if
+result fits in 32-bit signed integer; result may be negative.
+
+### Return Value
+
+<a href='#SkIRect_fBottom'>fBottom</a> minus <a href='#SkIRect_fTop'>fTop</a>
+
+### Example
+
+<div><fiddle-embed name="@IRect_height">
+
+#### Example Output
+
+~~~~
+unsorted height: -5
+large height: -5
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_width'>width()</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_height'>height()</a>
+
+<a name='SkIRect_height64'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int64_t <a href='#SkIRect_height64'>height64</a>()const
+</pre>
+
+Returns span on the y-axis. This does not check if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is sorted, so the
+result may be negative. This is safer than calling <a href='#SkIRect_height'>height()</a> since <a href='#SkIRect_height'>height()</a> might
+overflow in its calculation.
+
+### Return Value
+
+<a href='#SkIRect_fBottom'>fBottom</a> minus <a href='#SkIRect_fTop'>fTop</a> cast to int64_t
+
+### Example
+
+<div><fiddle-embed name="@IRect_height64">
+
+#### Example Output
+
+~~~~
+height: -5 height64: 4294967291
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_width'>width()</a> <a href='#SkIRect_height'>height()</a> <a href='#SkIRect_width64'>width64</a>() <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_height'>height()</a>
+
+<a name='SkIRect_size'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkISize'>SkISize</a> <a href='#SkIRect_size'>size()</a>const
+</pre>
+
+Returns spans on the x-axis and y-axis. This does not check if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is sorted,
+or if result fits in 32-bit signed integer; result may be negative.
+
+### Return Value
+
+<a href='undocumented#SkISize'>SkISize</a> (width, height)
+
+### Example
+
+<div><fiddle-embed name="@IRect_size">
+
+#### Example Output
+
+~~~~
+original rect: 20, 30, 40, 50  size: 20, 20
+offset rect: 40, 50, 60, 70  size: 20, 20
+outset rect: 20, 30, 80, 90  size: 60, 60
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_height'>height()</a> <a href='#SkIRect_width'>width()</a> <a href='#SkIRect_MakeSize'>MakeSize</a>
+
+<a name='SkIRect_isEmpty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkIRect_isEmpty'>isEmpty</a>()const
+</pre>
+
+Returns true if <a href='#SkIRect_width'>width()</a> or <a href='#SkIRect_height'>height()</a> are zero or negative.
+
+### Return Value
+
+true if <a href='#SkIRect_width'>width()</a> or <a href='#SkIRect_height'>height()</a> are zero or negative
+
+### Example
+
+<div><fiddle-embed name="@IRect_isEmpty">
+
+#### Example Output
+
+~~~~
+rect: {20, 40, 10, 50} is empty
+sorted: {10, 40, 20, 50} is not empty
+rect: {20, 40, 20, 50} is empty
+sorted: {20, 40, 20, 50} is empty
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_EmptyIRect'>EmptyIRect</a> <a href='#SkIRect_MakeEmpty'>MakeEmpty</a> <a href='#SkIRect_sort'>sort</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_isEmpty'>isEmpty</a>
+
+<a name='SkIRect_isEmpty64'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkIRect_isEmpty64'>isEmpty64</a>()const
+</pre>
+
+Returns true if <a href='#SkIRect_fLeft'>fLeft</a> is equal to or greater than <a href='#SkIRect_fRight'>fRight</a>, or if <a href='#SkIRect_fTop'>fTop</a> is equal
+to or greater than <a href='#SkIRect_fBottom'>fBottom</a>. Call <a href='#SkIRect_sort'>sort()</a> to reverse rectangles with negative
+<a href='#SkIRect_width64'>width64</a>() or <a href='#SkIRect_height64'>height64</a>().
+
+### Return Value
+
+true if <a href='#SkIRect_width64'>width64</a>() or <a href='#SkIRect_height64'>height64</a>() are zero or negative
+
+### Example
+
+<div><fiddle-embed name="@IRect_isEmpty64">
+
+#### Example Output
+
+~~~~
+rect: {20, 40, 10, 50} is empty
+sorted: {10, 40, 20, 50} is not empty
+rect: {20, 40, 20, 50} is empty
+sorted: {20, 40, 20, 50} is empty
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_EmptyIRect'>EmptyIRect</a> <a href='#SkIRect_MakeEmpty'>MakeEmpty</a> <a href='#SkIRect_sort'>sort</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_isEmpty'>isEmpty</a>
+
+<a name='Operators'></a>
+
+<a name='SkIRect_equal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkIRect_equal_operator'>operator==</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& a, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& b)
+</pre>
+
+Returns true if all members in <a href='#SkIRect_equal_operator_a'>a</a>: <a href='#SkIRect_fLeft'>fLeft</a>, <a href='#SkIRect_fTop'>fTop</a>, <a href='#SkIRect_fRight'>fRight</a>, and <a href='#SkIRect_fBottom'>fBottom</a>; are
+identical to corresponding members in <a href='#SkIRect_equal_operator_b'>b</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_equal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to compare</td>
+  </tr>
+  <tr>    <td><a name='SkIRect_equal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if members are equal
+
+### Example
+
+<div><fiddle-embed name="@IRect_equal_operator">
+
+#### Example Output
+
+~~~~
+test == sorted
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_notequal_operator'>operator!=</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='#SkIRect_equal_operator_a'>a</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='#SkIRect_equal_operator_b'>b</a>)
+
+<a name='SkIRect_notequal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkIRect_notequal_operator'>operator!=</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& a, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& b)
+</pre>
+
+Returns true if any member in <a href='#SkIRect_notequal_operator_a'>a</a>: <a href='#SkIRect_fLeft'>fLeft</a>, <a href='#SkIRect_fTop'>fTop</a>, <a href='#SkIRect_fRight'>fRight</a>, and <a href='#SkIRect_fBottom'>fBottom</a>; is not
+identical to the corresponding member in <a href='#SkIRect_notequal_operator_b'>b</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_notequal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to compare</td>
+  </tr>
+  <tr>    <td><a name='SkIRect_notequal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if members are not equal
+
+### Example
+
+<div><fiddle-embed name="@IRect_notequal_operator">
+
+#### Example Output
+
+~~~~
+test != sorted
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_equal_operator'>operator==</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='#SkIRect_notequal_operator_a'>a</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='#SkIRect_notequal_operator_b'>b</a>)
+
+<a name='Set'></a>
+
+<a name='SkIRect_setEmpty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkIRect_setEmpty'>setEmpty</a>()
+</pre>
+
+Sets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> to (0, 0, 0, 0).
+
+Many other rectangles are empty; if left is equal to or greater than right,
+or if top is equal to or greater than bottom. Setting all members to zero
+is a convenience, but does not designate a special empty rectangle.
+
+### Example
+
+<div><fiddle-embed name="@IRect_setEmpty">
+
+#### Example Output
+
+~~~~
+rect: {3, 4, 1, 2} is empty
+rect: {0, 0, 0, 0} is empty
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_MakeEmpty'>MakeEmpty</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_setEmpty'>setEmpty</a>
+
+<a name='SkIRect_set'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void set(int32_t left, int32_t top, int32_t right, int32_t bottom)
+</pre>
+
+Sets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> to (<a href='#SkIRect_set_left'>left</a>, <a href='#SkIRect_set_top'>top</a>, <a href='#SkIRect_set_right'>right</a>, <a href='#SkIRect_set_bottom'>bottom</a>).
+<a href='#SkIRect_set_left'>left</a> and <a href='#SkIRect_set_right'>right</a> are not sorted; <a href='#SkIRect_set_left'>left</a> is not necessarily less than <a href='#SkIRect_set_right'>right</a>.
+<a href='#SkIRect_set_top'>top</a> and <a href='#SkIRect_set_bottom'>bottom</a> are not sorted; <a href='#SkIRect_set_top'>top</a> is not necessarily less than <a href='#SkIRect_set_bottom'>bottom</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_set_left'><code><strong>left</strong></code></a></td>
+    <td>assigned to <a href='#SkIRect_fLeft'>fLeft</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_set_top'><code><strong>top</strong></code></a></td>
+    <td>assigned to <a href='#SkIRect_fTop'>fTop</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_set_right'><code><strong>right</strong></code></a></td>
+    <td>assigned to <a href='#SkIRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_set_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>assigned to <a href='#SkIRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="1912c37076b7f3bf6aebfa167e971bec">
+
+#### Example Output
+
+~~~~
+rect1: {3, 4, 1, 2}
+rect2: {3, 4, 1, 2}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_setLTRB'>setLTRB</a> <a href='#SkIRect_setXYWH'>setXYWH</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_set'>set</a>
+
+<a name='SkIRect_setLTRB'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkIRect_setLTRB'>setLTRB</a>(int32_t left, int32_t top, int32_t right, int32_t bottom)
+</pre>
+
+Sets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> to (<a href='#SkIRect_setLTRB_left'>left</a>, <a href='#SkIRect_setLTRB_top'>top</a>, <a href='#SkIRect_setLTRB_right'>right</a>, <a href='#SkIRect_setLTRB_bottom'>bottom</a>).
+<a href='#SkIRect_setLTRB_left'>left</a> and <a href='#SkIRect_setLTRB_right'>right</a> are not sorted; <a href='#SkIRect_setLTRB_left'>left</a> is not necessarily less than <a href='#SkIRect_setLTRB_right'>right</a>.
+<a href='#SkIRect_setLTRB_top'>top</a> and <a href='#SkIRect_setLTRB_bottom'>bottom</a> are not sorted; <a href='#SkIRect_setLTRB_top'>top</a> is not necessarily less than <a href='#SkIRect_setLTRB_bottom'>bottom</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_setLTRB_left'><code><strong>left</strong></code></a></td>
+    <td>stored in <a href='#SkIRect_fLeft'>fLeft</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_setLTRB_top'><code><strong>top</strong></code></a></td>
+    <td>stored in <a href='#SkIRect_fTop'>fTop</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_setLTRB_right'><code><strong>right</strong></code></a></td>
+    <td>stored in <a href='#SkIRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_setLTRB_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>stored in <a href='#SkIRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@IRect_setLTRB">
+
+#### Example Output
+
+~~~~
+rect1: {3, 4, 1, 2}
+rect2: {3, 4, 1, 2}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_set'>set</a> <a href='#SkIRect_setXYWH'>setXYWH</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_setLTRB'>setLTRB</a>
+
+<a name='SkIRect_setXYWH'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkIRect_setXYWH'>setXYWH</a>(int32_t x, int32_t y, int32_t width, int32_t height)
+</pre>
+
+Sets <a href='SkIRect_Reference#IRect'>IRect</a> to: <code>(<a href='#SkIRect_setXYWH_x'>x</a>, <a href='#SkIRect_setXYWH_y'>y</a>, <a href='#SkIRect_setXYWH_x'>x</a> + <a href='#SkIRect_setXYWH_width'>width</a>, <a href='#SkIRect_setXYWH_y'>y</a> + <a href='#SkIRect_setXYWH_height'>height</a>)</code>.
+Does not validate input; <a href='#SkIRect_setXYWH_width'>width</a> or <a href='#SkIRect_setXYWH_height'>height</a> may be negative.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_setXYWH_x'><code><strong>x</strong></code></a></td>
+    <td>stored in <a href='#SkIRect_fLeft'>fLeft</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_setXYWH_y'><code><strong>y</strong></code></a></td>
+    <td>stored in <a href='#SkIRect_fTop'>fTop</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_setXYWH_width'><code><strong>width</strong></code></a></td>
+    <td>added to <a href='#SkIRect_setXYWH_x'>x</a> and stored in <a href='#SkIRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_setXYWH_height'><code><strong>height</strong></code></a></td>
+    <td>added to <a href='#SkIRect_setXYWH_y'>y</a> and stored in <a href='#SkIRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@IRect_setXYWH">
+
+#### Example Output
+
+~~~~
+rect: 5, 35, -10, 60  isEmpty: true
+rect: -10, 35, 5, 60  isEmpty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_MakeXYWH'>MakeXYWH</a> <a href='#SkIRect_setLTRB'>setLTRB</a> <a href='#SkIRect_set'>set</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_setXYWH'>setXYWH</a>
+
+<a name='Inset_Outset_Offset'></a>
+
+<a name='SkIRect_makeOffset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_makeOffset'>makeOffset</a>(int32_t dx, int32_t dy)const
+</pre>
+
+Returns <a href='SkIRect_Reference#SkIRect'>SkIRect</a> offset by (<a href='#SkIRect_makeOffset_dx'>dx</a>, <a href='#SkIRect_makeOffset_dy'>dy</a>).
+
+If <a href='#SkIRect_makeOffset_dx'>dx</a> is negative, <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned is moved to the left.
+If <a href='#SkIRect_makeOffset_dx'>dx</a> is positive, <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned is moved to the right.
+If <a href='#SkIRect_makeOffset_dy'>dy</a> is negative, <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned is moved upward.
+If <a href='#SkIRect_makeOffset_dy'>dy</a> is positive, <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned is moved downward.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_makeOffset_dx'><code><strong>dx</strong></code></a></td>
+    <td>offset added to <a href='#SkIRect_fLeft'>fLeft</a> and <a href='#SkIRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_makeOffset_dy'><code><strong>dy</strong></code></a></td>
+    <td>offset added to <a href='#SkIRect_fTop'>fTop</a> and <a href='#SkIRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> offset by <a href='#SkIRect_makeOffset_dx'>dx</a> and <a href='#SkIRect_makeOffset_dy'>dy</a>, with original width and height
+
+### Example
+
+<div><fiddle-embed name="@IRect_makeOffset">
+
+#### Example Output
+
+~~~~
+rect: 10, 50, 20, 60  isEmpty: false
+rect: 25, 82, 35, 92  isEmpty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_offset'>offset()</a> <a href='#SkIRect_makeInset'>makeInset</a> <a href='#SkIRect_makeOutset'>makeOutset</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_makeOffset'>makeOffset</a>
+
+<a name='SkIRect_makeInset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_makeInset'>makeInset</a>(int32_t dx, int32_t dy)const
+</pre>
+
+Returns <a href='SkIRect_Reference#SkIRect'>SkIRect</a>, inset by (<a href='#SkIRect_makeInset_dx'>dx</a>, <a href='#SkIRect_makeInset_dy'>dy</a>).
+
+If <a href='#SkIRect_makeInset_dx'>dx</a> is negative, <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned is wider.
+If <a href='#SkIRect_makeInset_dx'>dx</a> is positive, <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned is narrower.
+If <a href='#SkIRect_makeInset_dy'>dy</a> is negative, <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned is taller.
+If <a href='#SkIRect_makeInset_dy'>dy</a> is positive, <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned is shorter.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_makeInset_dx'><code><strong>dx</strong></code></a></td>
+    <td>offset added to <a href='#SkIRect_fLeft'>fLeft</a> and subtracted from <a href='#SkIRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_makeInset_dy'><code><strong>dy</strong></code></a></td>
+    <td>offset added to <a href='#SkIRect_fTop'>fTop</a> and subtracted from <a href='#SkIRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> inset symmetrically left and right, top and bottom
+
+### Example
+
+<div><fiddle-embed name="@IRect_makeInset">
+
+#### Example Output
+
+~~~~
+rect: 10, 50, 20, 60  isEmpty: false
+rect: 25, 82, 5, 28  isEmpty: true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_inset'>inset()</a> <a href='#SkIRect_makeOffset'>makeOffset</a> <a href='#SkIRect_makeOutset'>makeOutset</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_makeInset'>makeInset</a>
+
+<a name='SkIRect_makeOutset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_makeOutset'>makeOutset</a>(int32_t dx, int32_t dy)const
+</pre>
+
+Returns <a href='SkIRect_Reference#SkIRect'>SkIRect</a>, outset by (<a href='#SkIRect_makeOutset_dx'>dx</a>, <a href='#SkIRect_makeOutset_dy'>dy</a>).
+
+If <a href='#SkIRect_makeOutset_dx'>dx</a> is negative, <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned is narrower.
+If <a href='#SkIRect_makeOutset_dx'>dx</a> is positive, <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned is wider.
+If <a href='#SkIRect_makeOutset_dy'>dy</a> is negative, <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned is shorter.
+If <a href='#SkIRect_makeOutset_dy'>dy</a> is positive, <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned is taller.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_makeOutset_dx'><code><strong>dx</strong></code></a></td>
+    <td>offset subtracted to <a href='#SkIRect_fLeft'>fLeft</a> and added from <a href='#SkIRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_makeOutset_dy'><code><strong>dy</strong></code></a></td>
+    <td>offset subtracted to <a href='#SkIRect_fTop'>fTop</a> and added from <a href='#SkIRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> outset symmetrically left and right, top and bottom
+
+### Example
+
+<div><fiddle-embed name="@IRect_makeOutset">
+
+#### Example Output
+
+~~~~
+rect: 10, 50, 20, 60  isEmpty: false
+rect: -5, 18, 35, 92  isEmpty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_outset'>outset()</a> <a href='#SkIRect_makeOffset'>makeOffset</a> <a href='#SkIRect_makeInset'>makeInset</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_makeOutset'>makeOutset</a>
+
+<a name='SkIRect_offset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void offset(int32_t dx, int32_t dy)
+</pre>
+
+Offsets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> by adding <a href='#SkIRect_offset_dx'>dx</a> to <a href='#SkIRect_fLeft'>fLeft</a>, <a href='#SkIRect_fRight'>fRight</a>; and by adding <a href='#SkIRect_offset_dy'>dy</a> to <a href='#SkIRect_fTop'>fTop</a>, <a href='#SkIRect_fBottom'>fBottom</a>.
+
+If <a href='#SkIRect_offset_dx'>dx</a> is negative, moves <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned to the left.
+If <a href='#SkIRect_offset_dx'>dx</a> is positive, moves <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned to the right.
+If <a href='#SkIRect_offset_dy'>dy</a> is negative, moves <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned upward.
+If <a href='#SkIRect_offset_dy'>dy</a> is positive, moves <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned downward.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_offset_dx'><code><strong>dx</strong></code></a></td>
+    <td>offset added to <a href='#SkIRect_fLeft'>fLeft</a> and <a href='#SkIRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_offset_dy'><code><strong>dy</strong></code></a></td>
+    <td>offset added to <a href='#SkIRect_fTop'>fTop</a> and <a href='#SkIRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@IRect_offset">
+
+#### Example Output
+
+~~~~
+rect: 15, 27, 55, 86
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_offsetTo'>offsetTo</a> <a href='#SkIRect_makeOffset'>makeOffset</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_offset'>offset</a>
+
+<a name='SkIRect_offset_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void offset(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& delta)
+</pre>
+
+Offsets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> by adding <a href='#SkIRect_offset_2_delta'>delta</a>.<a href='#SkIPoint_fX'>fX</a> to <a href='#SkIRect_fLeft'>fLeft</a>, <a href='#SkIRect_fRight'>fRight</a>; and by adding <a href='#SkIRect_offset_2_delta'>delta</a>.<a href='#SkIPoint_fY'>fY</a> to
+<a href='#SkIRect_fTop'>fTop</a>, <a href='#SkIRect_fBottom'>fBottom</a>.
+
+If <a href='#SkIRect_offset_2_delta'>delta</a>.<a href='#SkIPoint_fX'>fX</a> is negative, moves <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned to the left.
+If <a href='#SkIRect_offset_2_delta'>delta</a>.<a href='#SkIPoint_fX'>fX</a> is positive, moves <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned to the right.
+If <a href='#SkIRect_offset_2_delta'>delta</a>.<a href='#SkIPoint_fY'>fY</a> is negative, moves <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned upward.
+If <a href='#SkIRect_offset_2_delta'>delta</a>.<a href='#SkIPoint_fY'>fY</a> is positive, moves <a href='SkIRect_Reference#SkIRect'>SkIRect</a> returned downward.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_offset_2_delta'><code><strong>delta</strong></code></a></td>
+    <td>offset added to <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@IRect_offset_2">
+
+#### Example Output
+
+~~~~
+rect: 15, 27, 55, 86
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_offsetTo'>offsetTo</a> <a href='#SkIRect_makeOffset'>makeOffset</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_offset'>offset</a>
+
+<a name='SkIRect_offsetTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkIRect_offsetTo'>offsetTo</a>(int32_t newX, int32_t newY)
+</pre>
+
+Offsets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> so that <a href='#SkIRect_fLeft'>fLeft</a> equals <a href='#SkIRect_offsetTo_newX'>newX</a>, and <a href='#SkIRect_fTop'>fTop</a> equals <a href='#SkIRect_offsetTo_newY'>newY</a>. width and height
+are unchanged.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_offsetTo_newX'><code><strong>newX</strong></code></a></td>
+    <td>stored in <a href='#SkIRect_fLeft'>fLeft</a>, preserving <a href='#SkIRect_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_offsetTo_newY'><code><strong>newY</strong></code></a></td>
+    <td>stored in <a href='#SkIRect_fTop'>fTop</a>, preserving <a href='#SkIRect_height'>height()</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@IRect_offsetTo">
+
+#### Example Output
+
+~~~~
+rect: 15, 27, 55, 86
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_offset'>offset</a> <a href='#SkIRect_makeOffset'>makeOffset</a> <a href='#SkIRect_setXYWH'>setXYWH</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_offsetTo'>offsetTo</a>
+
+<a name='SkIRect_inset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void inset(int32_t dx, int32_t dy)
+</pre>
+
+Insets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> by (<a href='#SkIRect_inset_dx'>dx</a>,<a href='#SkIRect_inset_dy'>dy</a>).
+
+If <a href='#SkIRect_inset_dx'>dx</a> is positive, makes <a href='SkIRect_Reference#SkIRect'>SkIRect</a> narrower.
+If <a href='#SkIRect_inset_dx'>dx</a> is negative, makes <a href='SkIRect_Reference#SkIRect'>SkIRect</a> wider.
+If <a href='#SkIRect_inset_dy'>dy</a> is positive, makes <a href='SkIRect_Reference#SkIRect'>SkIRect</a> shorter.
+If <a href='#SkIRect_inset_dy'>dy</a> is negative, makes <a href='SkIRect_Reference#SkIRect'>SkIRect</a> taller.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_inset_dx'><code><strong>dx</strong></code></a></td>
+    <td>offset added to <a href='#SkIRect_fLeft'>fLeft</a> and subtracted from <a href='#SkIRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_inset_dy'><code><strong>dy</strong></code></a></td>
+    <td>offset added to <a href='#SkIRect_fTop'>fTop</a> and subtracted from <a href='#SkIRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@IRect_inset">
+
+#### Example Output
+
+~~~~
+rect: 15, 27, 45, 60
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_outset'>outset</a> <a href='#SkIRect_makeInset'>makeInset</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_inset'>inset</a>
+
+<a name='SkIRect_outset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void outset(int32_t dx, int32_t dy)
+</pre>
+
+Outsets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> by (<a href='#SkIRect_outset_dx'>dx</a>, <a href='#SkIRect_outset_dy'>dy</a>).
+
+If <a href='#SkIRect_outset_dx'>dx</a> is positive, makes <a href='SkIRect_Reference#SkIRect'>SkIRect</a> wider.
+If <a href='#SkIRect_outset_dx'>dx</a> is negative, makes <a href='SkIRect_Reference#SkIRect'>SkIRect</a> narrower.
+If <a href='#SkIRect_outset_dy'>dy</a> is positive, makes <a href='SkIRect_Reference#SkIRect'>SkIRect</a> taller.
+If <a href='#SkIRect_outset_dy'>dy</a> is negative, makes <a href='SkIRect_Reference#SkIRect'>SkIRect</a> shorter.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_outset_dx'><code><strong>dx</strong></code></a></td>
+    <td>subtracted to <a href='#SkIRect_fLeft'>fLeft</a> and added from <a href='#SkIRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_outset_dy'><code><strong>dy</strong></code></a></td>
+    <td>subtracted to <a href='#SkIRect_fTop'>fTop</a> and added from <a href='#SkIRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@IRect_outset">
+
+#### Example Output
+
+~~~~
+rect: 5, 1, 55, 86
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_inset'>inset</a> <a href='#SkIRect_makeOutset'>makeOutset</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_outset'>outset</a>
+
+<a name='Intersection'></a>
+
+<a href='#IRect'>IRects</a> intersect when they enclose a common area. To intersect, each of the pair
+must describe area; <a href='#SkIRect_fLeft'>fLeft</a> is less than <a href='#SkIRect_fRight'>fRight</a>, and <a href='#SkIRect_fTop'>fTop</a> is less than <a href='#SkIRect_fBottom'>fBottom</a>;
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_isEmpty'>isEmpty</a>() returns false. The intersection of <a href='SkIRect_Reference#IRect'>IRect</a> pair can be described by:
+<code>(<a href='undocumented#max()'>max</a>(a.<a href='#SkIRect_fLeft'>fLeft</a>, b.<a href='#SkIRect_fLeft'>fLeft</a>), <a href='undocumented#max()'>max</a>(a.<a href='#SkIRect_fTop'>fTop</a>, b.<a href='#SkIRect_fTop'>fTop</a>),
+<a href='undocumented#min()'>min</a>(a.<a href='#SkIRect_fRight'>fRight</a>, b.<a href='#SkIRect_fRight'>fRight</a>), <a href='undocumented#min()'>min</a>(a.<a href='#SkIRect_fBottom'>fBottom</a>, b.<a href='#SkIRect_fBottom'>fBottom</a>))</code>.
+
+The intersection is only meaningful if the resulting <a href='SkIRect_Reference#IRect'>IRect</a> is not empty and
+describes an area: <a href='#SkIRect_fLeft'>fLeft</a> is less than <a href='#SkIRect_fRight'>fRight</a>, and <a href='#SkIRect_fTop'>fTop</a> is less than <a href='#SkIRect_fBottom'>fBottom</a>.
+
+<a name='SkIRect_adjust'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkIRect_adjust'>adjust</a>(int32_t dL, int32_t dT, int32_t dR, int32_t dB)
+</pre>
+
+Adjusts <a href='SkIRect_Reference#SkIRect'>SkIRect</a> by adding <a href='#SkIRect_adjust_dL'>dL</a> to <a href='#SkIRect_fLeft'>fLeft</a>, <a href='#SkIRect_adjust_dT'>dT</a> to <a href='#SkIRect_fTop'>fTop</a>, <a href='#SkIRect_adjust_dR'>dR</a> to <a href='#SkIRect_fRight'>fRight</a>, and <a href='#SkIRect_adjust_dB'>dB</a> to <a href='#SkIRect_fBottom'>fBottom</a>.
+
+If <a href='#SkIRect_adjust_dL'>dL</a> is positive, narrows <a href='SkIRect_Reference#SkIRect'>SkIRect</a> on the left. If negative, widens it on the left.
+If <a href='#SkIRect_adjust_dT'>dT</a> is positive, shrinks <a href='SkIRect_Reference#SkIRect'>SkIRect</a> on the top. If negative, lengthens it on the top.
+If <a href='#SkIRect_adjust_dR'>dR</a> is positive, narrows <a href='SkIRect_Reference#SkIRect'>SkIRect</a> on the right. If negative, widens it on the right.
+If <a href='#SkIRect_adjust_dB'>dB</a> is positive, shrinks <a href='SkIRect_Reference#SkIRect'>SkIRect</a> on the bottom. If negative, lengthens it on the bottom.
+
+The resulting <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is not checked for validity. Thus, if the resulting <a href='SkIRect_Reference#SkIRect'>SkIRect</a> left is
+greater than right, the <a href='SkIRect_Reference#SkIRect'>SkIRect</a> will be considered empty. Call <a href='#SkIRect_sort'>sort()</a> after this call
+if that is not the desired behavior.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_adjust_dL'><code><strong>dL</strong></code></a></td>
+    <td>offset added to <a href='#SkIRect_fLeft'>fLeft</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_adjust_dT'><code><strong>dT</strong></code></a></td>
+    <td>offset added to <a href='#SkIRect_fTop'>fTop</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_adjust_dR'><code><strong>dR</strong></code></a></td>
+    <td>offset added to <a href='#SkIRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_adjust_dB'><code><strong>dB</strong></code></a></td>
+    <td>offset added to <a href='#SkIRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@IRect_adjust">
+
+#### Example Output
+
+~~~~
+rect: 10, 10, 20, 20
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_inset'>inset outset</a>
+
+<a name='SkIRect_contains'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool contains(int32_t x, int32_t y)const
+</pre>
+
+Returns true if: <code><a href='#SkIRect_fLeft'>fLeft</a> <= <a href='#SkIRect_contains_x'>x</a> < <a href='#SkIRect_fRight'>fRight</a> && <a href='#SkIRect_fTop'>fTop</a> <= <a href='#SkIRect_contains_y'>y</a> < <a href='#SkIRect_fBottom'>fBottom</a></code>.
+Returns false if <a href='SkIRect_Reference#IRect'>IRect</a> is empty.
+
+Considers input to describe constructed <a href='SkIRect_Reference#IRect'>IRect</a>: <code>(<a href='#SkIRect_contains_x'>x</a>, <a href='#SkIRect_contains_y'>y</a>, <a href='#SkIRect_contains_x'>x</a> + 1, <a href='#SkIRect_contains_y'>y</a> + 1)</code> and
+returns true if constructed area is completely enclosed by <a href='SkIRect_Reference#IRect'>IRect</a> area.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_contains_x'><code><strong>x</strong></code></a></td>
+    <td>test <a href='SkIPoint_Reference#IPoint'>IPoint</a> x-coordinate</td>
+  </tr>
+  <tr>    <td><a name='SkIRect_contains_y'><code><strong>y</strong></code></a></td>
+    <td>test <a href='SkIPoint_Reference#IPoint'>IPoint</a> y-coordinate</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if (<a href='#SkIRect_contains_x'>x</a>, <a href='#SkIRect_contains_y'>y</a>) is inside <a href='SkIRect_Reference#IRect'>IRect</a>
+
+### Example
+
+<div><fiddle-embed name="@IRect_contains">
+
+#### Example Output
+
+~~~~
+rect: (30, 50, 40, 60) contains (30, 50)
+rect: (30, 50, 40, 60) does not contain (40, 50)
+rect: (30, 50, 40, 60) does not contain (30, 60)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_containsNoEmptyCheck'>containsNoEmptyCheck</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_contains'>contains</a>
+
+<a name='SkIRect_contains_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool contains(int32_t left, int32_t top, int32_t right, int32_t bottom)const
+</pre>
+
+Constructs <a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersect from (<a href='#SkIRect_contains_2_left'>left</a>, <a href='#SkIRect_contains_2_top'>top</a>, <a href='#SkIRect_contains_2_right'>right</a>, <a href='#SkIRect_contains_2_bottom'>bottom</a>). Does not sort
+construction.
+
+Returns true if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> contains construction.
+Returns false if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is empty or construction is empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_contains_2_left'><code><strong>left</strong></code></a></td>
+    <td>x-axis minimum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_contains_2_top'><code><strong>top</strong></code></a></td>
+    <td>y-axis minimum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_contains_2_right'><code><strong>right</strong></code></a></td>
+    <td>x-axis maximum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_contains_2_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>y-axis maximum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if all sides of <a href='SkIRect_Reference#SkIRect'>SkIRect</a> are outside construction
+
+### Example
+
+<div><fiddle-embed name="eae55f284818d9965ec5834747d14a48">
+
+#### Example Output
+
+~~~~
+rect: (30, 50, 40, 60) contains (30, 50, 31, 51)
+rect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)
+rect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_containsNoEmptyCheck'>containsNoEmptyCheck</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_contains'>contains</a>
+
+<a name='SkIRect_contains_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool contains(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& r)const
+</pre>
+
+Returns true if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> contains <a href='#SkIRect_contains_3_r'>r</a>.
+Returns false if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is empty or <a href='#SkIRect_contains_3_r'>r</a> is empty.
+
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> contains <a href='#SkIRect_contains_3_r'>r</a> when <a href='SkIRect_Reference#SkIRect'>SkIRect</a> area completely includes <a href='#SkIRect_contains_3_r'>r</a> area.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_contains_3_r'><code><strong>r</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> contained</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if all sides of <a href='SkIRect_Reference#SkIRect'>SkIRect</a> are outside <a href='#SkIRect_contains_3_r'>r</a>
+
+### Example
+
+<div><fiddle-embed name="@IRect_contains_3">
+
+#### Example Output
+
+~~~~
+rect: (30, 50, 40, 60) contains (30, 50, 31, 51)
+rect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)
+rect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_containsNoEmptyCheck'>containsNoEmptyCheck</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_contains'>contains</a>
+
+<a name='SkIRect_contains_4'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool contains(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r)const
+</pre>
+
+Returns true if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> contains <a href='#SkIRect_contains_4_r'>r</a>.
+Returns false if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is empty or <a href='#SkIRect_contains_4_r'>r</a> is empty.
+
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> contains <a href='#SkIRect_contains_4_r'>r</a> when <a href='SkIRect_Reference#SkIRect'>SkIRect</a> area completely includes <a href='#SkIRect_contains_4_r'>r</a> area.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_contains_4_r'><code><strong>r</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> contained</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if all sides of <a href='SkIRect_Reference#SkIRect'>SkIRect</a> are outside <a href='#SkIRect_contains_4_r'>r</a>
+
+### Example
+
+<div><fiddle-embed name="@IRect_contains_4">
+
+#### Example Output
+
+~~~~
+rect: (30, 50, 40, 60) contains (30, 50, 31, 51)
+rect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)
+rect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_containsNoEmptyCheck'>containsNoEmptyCheck</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_contains'>contains</a>
+
+<a name='SkIRect_containsNoEmptyCheck'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkIRect_containsNoEmptyCheck'>containsNoEmptyCheck</a>(int32_t left, int32_t top, int32_t right, int32_t bottom)const
+</pre>
+
+Constructs <a href='SkIRect_Reference#SkIRect'>SkIRect</a> from (<a href='#SkIRect_containsNoEmptyCheck_left'>left</a>, <a href='#SkIRect_containsNoEmptyCheck_top'>top</a>, <a href='#SkIRect_containsNoEmptyCheck_right'>right</a>, <a href='#SkIRect_containsNoEmptyCheck_bottom'>bottom</a>). Does not sort
+construction.
+
+Returns true if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> contains construction.
+Asserts if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is empty or construction is empty, and if SK_DEBUG is defined.
+
+Return is undefined if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is empty or construction is empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_containsNoEmptyCheck_left'><code><strong>left</strong></code></a></td>
+    <td>x-axis minimum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_containsNoEmptyCheck_top'><code><strong>top</strong></code></a></td>
+    <td>y-axis minimum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_containsNoEmptyCheck_right'><code><strong>right</strong></code></a></td>
+    <td>x-axis maximum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_containsNoEmptyCheck_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>y-axis maximum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if all sides of <a href='SkIRect_Reference#SkIRect'>SkIRect</a> are outside construction
+
+### Example
+
+<div><fiddle-embed name="@IRect_containsNoEmptyCheck">
+
+#### Example Output
+
+~~~~
+rect: (30, 50, 40, 60) contains (30, 50, 31, 51)
+rect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)
+rect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_contains'>contains</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_contains'>contains</a>
+
+<a name='SkIRect_containsNoEmptyCheck_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkIRect_containsNoEmptyCheck'>containsNoEmptyCheck</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& r)const
+</pre>
+
+Returns true if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> contains construction.
+Asserts if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is empty or construction is empty, and if SK_DEBUG is defined.
+
+Return is undefined if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is empty or construction is empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_containsNoEmptyCheck_2_r'><code><strong>r</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> contained</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if all sides of <a href='SkIRect_Reference#SkIRect'>SkIRect</a> are outside <a href='#SkIRect_containsNoEmptyCheck_2_r'>r</a>
+
+### Example
+
+<div><fiddle-embed name="@IRect_containsNoEmptyCheck_2">
+
+#### Example Output
+
+~~~~
+rect: (30, 50, 40, 60) contains (30, 50, 31, 51)
+rect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)
+rect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_contains'>contains</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_contains'>contains</a>
+
+<a name='SkIRect_intersect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool intersect(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& r)
+</pre>
+
+Returns true if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> intersects <a href='#SkIRect_intersect_r'>r</a>, and sets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersection.
+Returns false if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> does not intersect <a href='#SkIRect_intersect_r'>r</a>, and leaves <a href='SkIRect_Reference#SkIRect'>SkIRect</a> unchanged.
+
+Returns false if either <a href='#SkIRect_intersect_r'>r</a> or <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is empty, leaving <a href='SkIRect_Reference#SkIRect'>SkIRect</a> unchanged.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_intersect_r'><code><strong>r</strong></code></a></td>
+    <td>limit of result</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkIRect_intersect_r'>r</a> and <a href='SkIRect_Reference#SkIRect'>SkIRect</a> have area in common
+
+### Example
+
+<div><fiddle-embed name="@IRect_intersect"><div>Two <a href='undocumented#SkDebugf'>SkDebugf</a> calls are required. If the calls are combined, their arguments
+may not be evaluated in left to right order: the printed intersection may
+be before or after the call to intersect.
+</div>
+
+#### Example Output
+
+~~~~
+intersection: 30, 60, 50, 80
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_Intersects'>Intersects</a> <a href='#SkIRect_intersectNoEmptyCheck'>intersectNoEmptyCheck</a> <a href='#SkIRect_join'>join</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_intersect'>intersect</a>
+
+<a name='SkIRect_intersect_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool intersect(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& a, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& b)
+</pre>
+
+Returns true if <a href='#SkIRect_intersect_2_a'>a</a> intersects <a href='#SkIRect_intersect_2_b'>b</a>, and sets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersection.
+Returns false if <a href='#SkIRect_intersect_2_a'>a</a> does not intersect <a href='#SkIRect_intersect_2_b'>b</a>, and leaves <a href='SkIRect_Reference#SkIRect'>SkIRect</a> unchanged.
+
+Returns false if either <a href='#SkIRect_intersect_2_a'>a</a> or <a href='#SkIRect_intersect_2_b'>b</a> is empty, leaving <a href='SkIRect_Reference#SkIRect'>SkIRect</a> unchanged.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_intersect_2_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersect</td>
+  </tr>
+  <tr>    <td><a name='SkIRect_intersect_2_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersect</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkIRect_intersect_2_a'>a</a> and <a href='#SkIRect_intersect_2_b'>b</a> have area in common
+
+### Example
+
+<div><fiddle-embed name="@IRect_intersect_2">
+
+#### Example Output
+
+~~~~
+intersection: 30, 60, 50, 80
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_Intersects'>Intersects</a> <a href='#SkIRect_intersectNoEmptyCheck'>intersectNoEmptyCheck</a> <a href='#SkIRect_join'>join</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_intersect'>intersect</a>
+
+<a name='SkIRect_intersectNoEmptyCheck'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkIRect_intersectNoEmptyCheck'>intersectNoEmptyCheck</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& a, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& b)
+</pre>
+
+Returns true if <a href='#SkIRect_intersectNoEmptyCheck_a'>a</a> intersects <a href='#SkIRect_intersectNoEmptyCheck_b'>b</a>, and sets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersection.
+Returns false if <a href='#SkIRect_intersectNoEmptyCheck_a'>a</a> does not intersect <a href='#SkIRect_intersectNoEmptyCheck_b'>b</a>, and leaves <a href='SkIRect_Reference#SkIRect'>SkIRect</a> unchanged.
+
+Asserts if either <a href='#SkIRect_intersectNoEmptyCheck_a'>a</a> or <a href='#SkIRect_intersectNoEmptyCheck_b'>b</a> is empty, and if SK_DEBUG is defined.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_intersectNoEmptyCheck_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersect</td>
+  </tr>
+  <tr>    <td><a name='SkIRect_intersectNoEmptyCheck_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersect</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkIRect_intersectNoEmptyCheck_a'>a</a> and <a href='#SkIRect_intersectNoEmptyCheck_b'>b</a> have area in common
+
+### Example
+
+<div><fiddle-embed name="d35fbc9fdea71df8b8a12fd3da50d11c">
+
+#### Example Output
+
+~~~~
+intersection: 30, 60, 50, 80
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_Intersects'>Intersects</a> <a href='#SkIRect_intersect'>intersect</a> <a href='#SkIRect_join'>join</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_intersect'>intersect</a>
+
+<a name='SkIRect_intersect_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool intersect(int32_t left, int32_t top, int32_t right, int32_t bottom)
+</pre>
+
+Constructs <a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersect from (<a href='#SkIRect_intersect_3_left'>left</a>, <a href='#SkIRect_intersect_3_top'>top</a>, <a href='#SkIRect_intersect_3_right'>right</a>, <a href='#SkIRect_intersect_3_bottom'>bottom</a>). Does not sort
+construction.
+
+Returns true if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> intersects construction, and sets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersection.
+Returns false if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> does not intersect construction, and leaves <a href='SkIRect_Reference#SkIRect'>SkIRect</a> unchanged.
+
+Returns false if either construction or <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is empty, leaving <a href='SkIRect_Reference#SkIRect'>SkIRect</a> unchanged.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_intersect_3_left'><code><strong>left</strong></code></a></td>
+    <td>x-axis minimum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_intersect_3_top'><code><strong>top</strong></code></a></td>
+    <td>y-axis minimum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_intersect_3_right'><code><strong>right</strong></code></a></td>
+    <td>x-axis maximum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_intersect_3_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>y-axis maximum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if construction and <a href='SkIRect_Reference#SkIRect'>SkIRect</a> have area in common
+
+### Example
+
+<div><fiddle-embed name="200422990eded2f754ab9893118f2645"><div>Two <a href='undocumented#SkDebugf'>SkDebugf</a> calls are required. If the calls are combined, their arguments
+may not be evaluated in <a href='#SkIRect_intersect_3_left'>left</a> to <a href='#SkIRect_intersect_3_right'>right</a> order: the printed intersection may
+be before or after the call to intersect.
+</div>
+
+#### Example Output
+
+~~~~
+intersection: 30, 60, 50, 80
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_intersectNoEmptyCheck'>intersectNoEmptyCheck</a> <a href='#SkIRect_Intersects'>Intersects</a> <a href='#SkIRect_join'>join</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_intersect'>intersect</a>
+
+<a name='SkIRect_Intersects'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static bool <a href='#SkIRect_Intersects'>Intersects</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& a, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& b)
+</pre>
+
+Returns true if <a href='#SkIRect_Intersects_a'>a</a> intersects <a href='#SkIRect_Intersects_b'>b</a>.
+Returns false if either <a href='#SkIRect_Intersects_a'>a</a> or <a href='#SkIRect_Intersects_b'>b</a> is empty, or do not intersect.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_Intersects_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersect</td>
+  </tr>
+  <tr>    <td><a name='SkIRect_Intersects_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersect</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkIRect_Intersects_a'>a</a> and <a href='#SkIRect_Intersects_b'>b</a> have area in common
+
+### Example
+
+<div><fiddle-embed name="@IRect_Intersects">
+
+#### Example Output
+
+~~~~
+intersection
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_IntersectsNoEmptyCheck'>IntersectsNoEmptyCheck</a> <a href='#SkIRect_intersect'>intersect</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_intersect'>intersect</a>
+
+<a name='SkIRect_IntersectsNoEmptyCheck'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static bool <a href='#SkIRect_IntersectsNoEmptyCheck'>IntersectsNoEmptyCheck</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& a, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& b)
+</pre>
+
+Returns true if <a href='#SkIRect_IntersectsNoEmptyCheck_a'>a</a> intersects <a href='#SkIRect_IntersectsNoEmptyCheck_b'>b</a>.
+Asserts if either <a href='#SkIRect_IntersectsNoEmptyCheck_a'>a</a> or <a href='#SkIRect_IntersectsNoEmptyCheck_b'>b</a> is empty, and if SK_DEBUG is defined.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_IntersectsNoEmptyCheck_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersect</td>
+  </tr>
+  <tr>    <td><a name='SkIRect_IntersectsNoEmptyCheck_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersect</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkIRect_IntersectsNoEmptyCheck_a'>a</a> and <a href='#SkIRect_IntersectsNoEmptyCheck_b'>b</a> have area in common
+
+### Example
+
+<div><fiddle-embed name="dba234d15162fb5b26e1a96529ca6a2a">
+
+#### Example Output
+
+~~~~
+intersection
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_Intersects'>Intersects</a> <a href='#SkIRect_intersect'>intersect</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_intersect'>intersect</a>
+
+<a name='Join'></a>
+
+<a name='SkIRect_join'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void join(int32_t left, int32_t top, int32_t right, int32_t bottom)
+</pre>
+
+Constructs <a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersect from (<a href='#SkIRect_join_left'>left</a>, <a href='#SkIRect_join_top'>top</a>, <a href='#SkIRect_join_right'>right</a>, <a href='#SkIRect_join_bottom'>bottom</a>). Does not sort
+construction.
+
+Sets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> to the union of itself and the construction.
+
+Has no effect if construction is empty. Otherwise, if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is empty, sets
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> to construction.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_join_left'><code><strong>left</strong></code></a></td>
+    <td>x-axis minimum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_join_top'><code><strong>top</strong></code></a></td>
+    <td>y-axis minimum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_join_right'><code><strong>right</strong></code></a></td>
+    <td>x-axis maximum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkIRect_join_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>y-axis maximum of constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="c00ef06289d21db70340e465690e0e08">
+
+#### Example Output
+
+~~~~
+join: 10, 20, 55, 65
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_set'>set</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_join'>join</a>
+
+<a name='SkIRect_join_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void join(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& r)
+</pre>
+
+Sets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> to the union of itself and <a href='#SkIRect_join_2_r'>r</a>.
+
+Has no effect if <a href='#SkIRect_join_2_r'>r</a> is empty. Otherwise, if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> is empty, sets <a href='SkIRect_Reference#SkIRect'>SkIRect</a> to <a href='#SkIRect_join_2_r'>r</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkIRect_join_2_r'><code><strong>r</strong></code></a></td>
+    <td>expansion <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@IRect_join_2">
+
+#### Example Output
+
+~~~~
+join: 10, 20, 55, 65
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_set'>set</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_join'>join</a>
+
+<a name='Sorting'></a>
+
+<a name='SkIRect_sort'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkIRect_sort'>sort()</a>
+</pre>
+
+Swaps <a href='#SkIRect_fLeft'>fLeft</a> and <a href='#SkIRect_fRight'>fRight</a> if <a href='#SkIRect_fLeft'>fLeft</a> is greater than <a href='#SkIRect_fRight'>fRight</a>; and swaps
+<a href='#SkIRect_fTop'>fTop</a> and <a href='#SkIRect_fBottom'>fBottom</a> if <a href='#SkIRect_fTop'>fTop</a> is greater than <a href='#SkIRect_fBottom'>fBottom</a>. Result may be empty,
+and <a href='#SkIRect_width'>width()</a> and <a href='#SkIRect_height'>height()</a> will be zero or positive.
+
+### Example
+
+<div><fiddle-embed name="@IRect_sort">
+
+#### Example Output
+
+~~~~
+rect: 30, 50, 20, 10
+sorted: 20, 10, 30, 50
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_makeSorted'>makeSorted</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_sort'>sort</a>
+
+<a name='SkIRect_makeSorted'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkIRect_makeSorted'>makeSorted</a>()const
+</pre>
+
+Returns <a href='SkIRect_Reference#SkIRect'>SkIRect</a> with <a href='#SkIRect_fLeft'>fLeft</a> and <a href='#SkIRect_fRight'>fRight</a> swapped if <a href='#SkIRect_fLeft'>fLeft</a> is greater than <a href='#SkIRect_fRight'>fRight</a>; and
+with <a href='#SkIRect_fTop'>fTop</a> and <a href='#SkIRect_fBottom'>fBottom</a> swapped if <a href='#SkIRect_fTop'>fTop</a> is greater than <a href='#SkIRect_fBottom'>fBottom</a>. Result may be empty;
+and <a href='#SkIRect_width'>width()</a> and <a href='#SkIRect_height'>height()</a> will be zero or positive.
+
+### Return Value
+
+sorted <a href='SkIRect_Reference#SkIRect'>SkIRect</a>
+
+### Example
+
+<div><fiddle-embed name="@IRect_makeSorted">
+
+#### Example Output
+
+~~~~
+rect: 30, 50, 20, 10
+sorted: 20, 10, 30, 50
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_sort'>sort</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_makeSorted'>makeSorted</a>
+
+<a name='SkIRect_EmptyIRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='#SkIRect_EmptyIRect'>EmptyIRect</a>()
+</pre>
+
+Returns a reference to immutable empty <a href='SkIRect_Reference#SkIRect'>SkIRect</a>, set to (0, 0, 0, 0).
+
+### Return Value
+
+global <a href='SkIRect_Reference#SkIRect'>SkIRect</a> set to all zeroes
+
+### Example
+
+<div><fiddle-embed name="@IRect_EmptyIRect">
+
+#### Example Output
+
+~~~~
+rect: 0, 0, 0, 0
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkIRect_MakeEmpty'>MakeEmpty</a>
+
diff --git a/src/third_party/skia/site/user/api/SkImageInfo_Reference.md b/src/third_party/skia/site/user/api/SkImageInfo_Reference.md
new file mode 100644
index 0000000..32f6bb3
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkImageInfo_Reference.md
@@ -0,0 +1,2287 @@
+SkImageInfo Reference
+===
+
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+enum <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> {
+    <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>,
+    <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>,
+    <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+    <a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>,
+    <a href='SkImageInfo_Reference#kLastEnum_SkAlphaType'>kLastEnum_SkAlphaType</a> = <a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>,
+};
+
+static bool <a href='SkImageInfo_Reference#SkAlphaTypeIsOpaque'>SkAlphaTypeIsOpaque</a>(<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> at);
+;
+
+enum <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> {
+    <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kRGBA_F32_SkColorType'>kRGBA_F32_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kLastEnum_SkColorType'>kLastEnum_SkColorType</a> = <a href='SkImageInfo_Reference#kRGBA_F32_SkColorType'>kRGBA_F32_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a> = <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a> = <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>,
+};
+
+int <a href='SkImageInfo_Reference#SkColorTypeBytesPerPixel'>SkColorTypeBytesPerPixel</a>(<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> ct);
+;
+
+bool <a href='SkImageInfo_Reference#SkColorTypeIsAlwaysOpaque'>SkColorTypeIsAlwaysOpaque</a>(<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> ct);
+;
+
+bool <a href='SkImageInfo_Reference#SkColorTypeValidateAlphaType'>SkColorTypeValidateAlphaType</a>(<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkImage_colorType'>colorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImage_alphaType'>alphaType</a>,
+                                  <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>* canonical = nullptr);
+;
+
+enum <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> {
+    <a href='SkImageInfo_Reference#kJPEG_SkYUVColorSpace'>kJPEG_SkYUVColorSpace</a>,
+    <a href='SkImageInfo_Reference#kRec601_SkYUVColorSpace'>kRec601_SkYUVColorSpace</a>,
+    <a href='SkImageInfo_Reference#kRec709_SkYUVColorSpace'>kRec709_SkYUVColorSpace</a>,
+    <a href='SkImageInfo_Reference#kLastEnum_SkYUVColorSpace'>kLastEnum_SkYUVColorSpace</a> = <a href='SkImageInfo_Reference#kRec709_SkYUVColorSpace'>kRec709_SkYUVColorSpace</a>,
+};
+
+struct <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> {
+    // <i><a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> interface</i>
+};
+</pre>
+
+<a href='#Image_Info'>Image_Info</a> specifies the dimensions and encoding of the pixels in a <a href='SkBitmap_Reference#Bitmap'>Bitmap</a>.
+The dimensions are integral width and height. The encoding is how <a href='undocumented#Pixel'>pixel</a>
+bits describe <a href='#Color_Alpha'>Color_Alpha</a>, transparency; <a href='SkColor_Reference#Color'>Color</a> components red, blue,
+and green; and <a href='#Color_Space'>Color_Space</a>, the range and linearity of colors.
+
+<a href='#Image_Info'>Image_Info</a> describes an uncompressed raster pixels. In contrast, <a href='SkImage_Reference#Image'>Image</a>
+additionally describes compressed pixels like PNG, and <a href='SkSurface_Reference#Surface'>Surface</a> describes
+destinations on the GPU. <a href='SkImage_Reference#Image'>Image</a> and <a href='SkSurface_Reference#Surface'>Surface</a> may be specified by <a href='#Image_Info'>Image_Info</a>,
+but <a href='SkImage_Reference#Image'>Image</a> and <a href='SkSurface_Reference#Surface'>Surface</a> may not contain <a href='#Image_Info'>Image_Info</a>.
+
+<a name='Alpha_Type'></a>
+
+<a name='SkAlphaType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+enum <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> {
+    <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>,
+    <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>,
+    <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+    <a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>,
+    <a href='SkImageInfo_Reference#kLastEnum_SkAlphaType'>kLastEnum_SkAlphaType</a> = <a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>,
+};
+
+</pre>
+
+Describes how to interpret the <a href='SkColor_Reference#Alpha'>alpha</a> component of a <a href='undocumented#Pixel'>pixel</a>. A <a href='undocumented#Pixel'>pixel</a> may
+be opaque, or <a href='#Color_Alpha'>Color_Alpha</a>, describing multiple levels of transparency.
+
+In simple blending, <a href='#Color_Alpha'>Color_Alpha</a> <a href='SkPath_Reference#Conic_Weight'>weights</a> the draw <a href='SkColor_Reference#Color'>color</a> and the destination
+<a href='SkColor_Reference#Color'>color</a> to create a new <a href='SkColor_Reference#Color'>color</a>. If <a href='SkColor_Reference#Alpha'>alpha</a> describes a weight from zero to one,
+new <a href='SkColor_Reference#Color'>color</a> is set to: <code>draw <a href='SkColor_Reference#Color'>color</a> * <a href='SkColor_Reference#Alpha'>alpha</a> + destination <a href='SkColor_Reference#Color'>color</a> * (1 - <a href='SkColor_Reference#Alpha'>alpha</a>)</code>.
+
+In practice <a href='SkColor_Reference#Alpha'>alpha</a> is encoded in two or more bits, where 1.0 equals all bits set.
+
+RGB may have <a href='#Color_Alpha'>Color_Alpha</a> included in each component value; the stored
+value is the original RGB multiplied by <a href='#Color_Alpha'>Color_Alpha</a>. <a href='undocumented#Premultiply'>Premultiplied</a> <a href='SkColor_Reference#Color'>color</a>
+components improve performance.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Details</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kUnknown_SkAlphaType'><code>kUnknown_SkAlphaType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#Image_Info_Alpha_Type'>Alpha_Type</a> is uninitialized.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kOpaque_SkAlphaType'><code>kOpaque_SkAlphaType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Opaque'>Opaque</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Pixels are opaque. The <a href='#Image_Info_Color_Type'>Color_Type</a> must have no explicit <a href='SkColor_Reference#Alpha'>alpha</a>
+component, or all <a href='SkColor_Reference#Alpha'>alpha</a> components must be set to their maximum value.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kPremul_SkAlphaType'><code>kPremul_SkAlphaType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Premul'>Premul</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Pixels have <a href='SkColor_Reference#Alpha'>Alpha</a> <a href='undocumented#Premultiply'>Premultiplied</a> into <a href='SkColor_Reference#Color'>color</a> components.
+<a href='SkSurface_Reference#Surface'>Surface</a> pixels must be <a href='undocumented#Premultiply'>Premultiplied</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kUnpremul_SkAlphaType'><code>kUnpremul_SkAlphaType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Unpremul'>Unpremul</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='undocumented#Pixel'>Pixel</a> <a href='SkColor_Reference#Color'>color</a> component values are independent of <a href='SkColor_Reference#Alpha'>alpha</a> value.
+Images generated from encoded <a href='undocumented#Data'>data</a> like PNG do not <a href='undocumented#Premultiply'>Premultiply</a> <a href='undocumented#Pixel'>pixel</a> <a href='SkColor_Reference#Color'>color</a>
+components. <a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a> is supported for <a href='SkImage_Reference#Image'>Image</a> pixels, but not for
+<a href='SkSurface_Reference#Surface'>Surface</a> pixels.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kLastEnum_SkAlphaType'><code>kLastEnum_SkAlphaType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Used by tests to iterate through all valid values.
+</td>
+  </tr>
+</table>
+
+### See Also
+
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a>
+
+<a name='Alpha_Type_Opaque'></a>
+
+---
+
+Use <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a> as a hint to optimize drawing when <a href='SkColor_Reference#Alpha'>Alpha</a> component
+of all <a href='undocumented#Pixel'>pixel</a> is set to its maximum value of 1.0; all <a href='SkColor_Reference#Alpha'>alpha</a> component bits are set.
+If <a href='#Image_Info'>Image_Info</a> is set to <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a> but all <a href='SkColor_Reference#Alpha'>alpha</a> values are not 1.0,
+results are undefined.
+
+### Example
+
+<div><fiddle-embed name="79146a1a41d58d22582fdc567c6ffe4e"><div><a href='SkColor_Reference#SkPreMultiplyARGB'>SkPreMultiplyARGB</a> parameter a is set to 255, its maximum value, and is interpreted
+as <a href='#Color_Alpha'>Color_Alpha</a> of 1.0. <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a> may be set to improve performance.
+If <a href='SkColor_Reference#SkPreMultiplyARGB'>SkPreMultiplyARGB</a> parameter a is set to a value smaller than 255,
+<a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a> must be used instead to avoid undefined results.
+The four displayed values are the original component values, though not necessarily
+in the same order.
+</div></fiddle-embed></div>
+
+<a name='Alpha_Type_Premul'></a>
+
+---
+
+Use <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a> when stored <a href='SkColor_Reference#Color'>color</a> components are the original <a href='SkColor_Reference#Color'>color</a>
+multiplied by the <a href='SkColor_Reference#Alpha'>alpha</a> component. The <a href='SkColor_Reference#Alpha'>alpha</a> component range of 0.0 to 1.0 is
+achieved by dividing the integer bit value by the maximum bit value.
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+stored <a href='SkColor_Reference#Color'>color</a> = original <a href='SkColor_Reference#Color'>color</a> * <a href='SkColor_Reference#Alpha'>alpha</a> / max <a href='SkColor_Reference#Alpha'>alpha </a>
+</pre>
+
+The <a href='SkColor_Reference#Color'>color</a> component must be equal to or smaller than the <a href='SkColor_Reference#Alpha'>alpha</a> component,
+or the results are undefined.
+
+### Example
+
+<div><fiddle-embed name="ad696b39c915803d566e96896ec3a36c"><div><a href='SkColor_Reference#SkPreMultiplyARGB'>SkPreMultiplyARGB</a> parameter a is set to 150, less than its maximum value, and is
+interpreted as <a href='#Color_Alpha'>Color_Alpha</a> of about 0.6. <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a> must be set, since
+<a href='SkColor_Reference#SkPreMultiplyARGB'>SkPreMultiplyARGB</a> parameter a is set to a value smaller than 255,
+to avoid undefined results.
+The four displayed values reflect that the <a href='SkColor_Reference#Alpha'>alpha</a> component has been multiplied
+by the original <a href='SkColor_Reference#Color'>color</a>.
+</div></fiddle-embed></div>
+
+<a name='Alpha_Type_Unpremul'></a>
+
+---
+
+Use <a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a> if stored <a href='SkColor_Reference#Color'>color</a> components are not divided by the
+<a href='SkColor_Reference#Alpha'>alpha</a> component. Some drawing destinations may not support
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>.
+
+### Example
+
+<div><fiddle-embed name="b8216a9e5ff5bc61a0e46eba7d36307b"><div><a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a> parameter a is set to 150, less than its maximum value, and is
+interpreted as <a href='#Color_Alpha'>Color_Alpha</a> of about 0.6. <a href='SkColor_Reference#Color'>color</a> is not <a href='undocumented#Premultiply'>Premultiplied</a>;
+<a href='SkColor_Reference#Color'>color</a> components may have values greater than  <a href='SkColor_Reference#Color'>color alpha</a>.
+The four displayed values are the original component values, though not necessarily
+in the same order.
+</div></fiddle-embed></div>
+
+<a name='SkAlphaTypeIsOpaque'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static bool <a href='SkImageInfo_Reference#SkAlphaTypeIsOpaque'>SkAlphaTypeIsOpaque</a>(<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> at)
+</pre>
+
+Returns true if <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> equals <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>. <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a> is a
+hint that the <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is opaque, or that all <a href='SkColor_Reference#Alpha'>alpha</a> values are set to
+their 1.0 equivalent. If <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not
+opaque, then the result of drawing any <a href='undocumented#Pixel'>pixel</a> with a <a href='SkColor_Reference#Alpha'>alpha</a> value less than
+1.0 is undefined.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkAlphaTypeIsOpaque_at'><code><strong>at</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+
+### Return Value
+
+true if <a href='#SkAlphaTypeIsOpaque_at'>at</a> equals <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>
+
+<a name='Color_Type'></a>
+
+<a name='SkColorType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+enum <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> {
+    <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kRGBA_F32_SkColorType'>kRGBA_F32_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kLastEnum_SkColorType'>kLastEnum_SkColorType</a> = <a href='SkImageInfo_Reference#kRGBA_F32_SkColorType'>kRGBA_F32_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a> = <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>,
+    <a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a> = <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>,
+};
+
+</pre>
+
+Describes how <a href='undocumented#Pixel'>pixel</a> bits encode <a href='SkColor_Reference#Color'>color</a>. A <a href='undocumented#Pixel'>pixel</a> may be an <a href='SkColor_Reference#Alpha'>alpha</a> mask, a
+grayscale, RGB, or ARGB.
+
+<a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a> selects the native 32-bit ARGB format. On <a href='#Little_Endian'>Little_Endian</a>
+processors, pixels containing 8-bit ARGB components pack into 32-bit
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>. On <a href='#Big_Endian'>Big_Endian</a> processors, pixels pack into 32-bit
+<a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Details</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kUnknown_SkColorType'><code>kUnknown_SkColorType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#Image_Info_Color_Type'>Color_Type</a> is set to <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a> by default. If set,
+encoding format and <a href='undocumented#Size'>size</a> is unknown.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kAlpha_8_SkColorType'><code>kAlpha_8_SkColorType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Alpha_8'>Alpha&nbsp;8</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Stores 8-bit byte <a href='undocumented#Pixel'>pixel</a> encoding that represents transparency. Value of zero
+is completely transparent; a value of 255 is completely opaque.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kRGB_565_SkColorType'><code>kRGB_565_SkColorType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#RGB_565'>RGB&nbsp;565</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Stores 16-bit word <a href='undocumented#Pixel'>pixel</a> encoding that contains five bits of blue,
+six bits of green, and five bits of red.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kARGB_4444_SkColorType'><code>kARGB_4444_SkColorType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#ARGB_4444'>ARGB&nbsp;4444</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Stores 16-bit word <a href='undocumented#Pixel'>pixel</a> encoding that contains four bits of <a href='SkColor_Reference#Alpha'>alpha</a>,
+four bits of blue, four bits of green, and four bits of red.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kRGBA_8888_SkColorType'><code>kRGBA_8888_SkColorType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>4</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#RGBA_8888'>RGBA&nbsp;8888</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Stores 32-bit word <a href='undocumented#Pixel'>pixel</a> encoding that contains eight bits of red,
+eight bits of green, eight bits of blue, and eight bits of <a href='SkColor_Reference#Alpha'>alpha</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kRGB_888x_SkColorType'><code>kRGB_888x_SkColorType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>5</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#RGB_888'>RGB&nbsp;888</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Stores 32-bit word <a href='undocumented#Pixel'>pixel</a> encoding that contains eight bits of red,
+eight bits of green, eight bits of blue, and eight unused bits.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kBGRA_8888_SkColorType'><code>kBGRA_8888_SkColorType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>6</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#BGRA_8888'>BGRA&nbsp;8888</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Stores 32-bit word <a href='undocumented#Pixel'>pixel</a> encoding that contains eight bits of blue,
+eight bits of green, eight bits of red, and eight bits of <a href='SkColor_Reference#Alpha'>alpha</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kRGBA_1010102_SkColorType'><code>kRGBA_1010102_SkColorType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>7</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#RGBA_1010102'>RGBA&nbsp;1010102</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Stores 32-bit word <a href='undocumented#Pixel'>pixel</a> encoding that contains ten bits of red,
+ten bits of green, ten bits of blue, and two bits of <a href='SkColor_Reference#Alpha'>alpha</a>.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kRGB_101010x_SkColorType'><code>kRGB_101010x_SkColorType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>8</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#RGB_101010'>RGB&nbsp;101010</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Stores 32-bit word <a href='undocumented#Pixel'>pixel</a> encoding that contains ten bits of red,
+ten bits of green, ten bits of blue, and two unused bits.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kGray_8_SkColorType'><code>kGray_8_SkColorType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>9</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Gray_8'>Gray&nbsp;8</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Stores 8-bit byte <a href='undocumented#Pixel'>pixel</a> encoding that equivalent to equal values for red,
+blue, and green, representing colors from black to white.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kRGBA_F16_SkColorType'><code>kRGBA_F16_SkColorType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>10</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#RGBA_F16'>RGBA&nbsp;F16</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Stores 64-bit word <a href='undocumented#Pixel'>pixel</a> encoding that contains 16 bits of blue,
+16 bits of green, 16 bits of red, and 16 bits of <a href='SkColor_Reference#Alpha'>alpha</a>. Each component
+is encoded as a half float.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kRGBA_F32_SkColorType'><code>kRGBA_F32_SkColorType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>11</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#RGBA_F32'>RGBA&nbsp;F32</a>&nbsp;</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Stores 128-bit word <a href='undocumented#Pixel'>pixel</a> encoding that contains 32 bits of blue,
+32 bits of green, 32 bits of red, and 32 bits of <a href='SkColor_Reference#Alpha'>alpha</a>. Each component
+is encoded as a single precision float.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kLastEnum_SkColorType'><code>kLastEnum_SkColorType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>11</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Used by tests to iterate through all valid values.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kN32_SkColorType'><code>kN32_SkColorType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>4 or 6</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Encodes ARGB as either <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a> or
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, whichever is native to the platform.
+</td>
+  </tr>
+</table>
+
+### See Also
+
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a>
+
+<a name='Color_Type_Alpha_8'></a>
+
+---
+
+<a href='SkColor_Reference#Alpha'>Alpha</a> pixels encode transparency without <a href='SkColor_Reference#Color'>color</a> information. Value of zero is
+completely transparent; a value of 255 is completely opaque. <a href='SkBitmap_Reference#Bitmap'>Bitmap</a>
+pixels do not visibly draw, because its pixels have no <a href='SkColor_Reference#Color'>color</a> information.
+When <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is set to <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, the paired <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is
+ignored.
+
+### Example
+
+<div><fiddle-embed name="@Color_Type_Alpha_8"><div><a href='SkColor_Reference#Alpha'>Alpha</a> pixels can modify another draw. orangePaint fills the bounds of <a href='SkBitmap_Reference#Bitmap'>bitmap</a>,
+with its transparency set to alpha8 <a href='undocumented#Pixel'>pixel</a> value.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#Alpha'>Alpha</a> <a href='#Image_Info_Color_Type_Gray_8'>Gray_8</a>
+
+<a name='Color_Type_RGB_565'></a>
+
+---
+
+<a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a> encodes RGB to fit in a 16-bit word. Red and blue
+components use five bits describing 32 levels. Green components, more sensitive
+to the eye, use six bits describing 64 levels. <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a> has no
+bits for <a href='SkColor_Reference#Alpha'>Alpha</a>.
+Pixels are fully opaque as if its <a href='#Color_Alpha'>Color_Alpha</a> was set to one, and should
+always be paired with <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>.
+
+![Color_Type_RGB_565](https://fiddle.skia.org/i/6dec0226490a4ac1977dc87a31564147_raster.png "")
+
+### Example
+
+<div><fiddle-embed name="@Color_Type_RGB_565"></fiddle-embed></div>
+
+### See Also
+
+<a href='#Image_Info_Color_Type_ARGB_4444'>ARGB_4444</a> <a href='#Image_Info_Color_Type_RGBA_8888'>RGBA_8888</a>
+
+<a name='Color_Type_ARGB_4444'></a>
+
+---
+
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a> encodes ARGB to fit in 16-bit word. Each
+component: <a href='SkColor_Reference#Alpha'>alpha</a>, blue, green, and red; use four bits, describing 16 levels.
+Note that <a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a> is misnamed; the acronym does not
+describe the actual component order.
+
+![Color_Type_ARGB_4444](https://fiddle.skia.org/i/e8008512f0d197051e3f26faa67bafc2_raster.png "")
+
+If paired with <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>: blue, green, and red components are
+<a href='undocumented#Premultiply'>Premultiplied</a> by the <a href='SkColor_Reference#Alpha'>alpha</a> value. If blue, green, or red is greater than <a href='SkColor_Reference#Alpha'>alpha</a>,
+the drawn result is undefined.
+
+If paired with <a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>: <a href='SkColor_Reference#Alpha'>alpha</a>, blue, green, and red components
+may have any value. There may be a performance penalty with <a href='undocumented#Unpremultiply'>Unpremultiplied</a>
+pixels.
+
+If paired with <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>: all <a href='SkColor_Reference#Alpha'>alpha</a> component values are at the maximum;
+blue, green, and red components are fully opaque. If any <a href='SkColor_Reference#Alpha'>alpha</a> component is
+less than 15, the drawn result is undefined.
+
+### Example
+
+<div><fiddle-embed name="@Color_Type_ARGB_4444"></fiddle-embed></div>
+
+### See Also
+
+<a href='#Image_Info_Color_Type_RGBA_8888'>RGBA_8888</a>
+
+<a name='Color_Type_RGBA_8888'></a>
+
+---
+
+<a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a> encodes ARGB into a 32-bit word. Each component:
+red, green, blue, <a href='SkColor_Reference#Alpha'>alpha</a>; use eight bits, describing 256 levels.
+
+![Color_Type_RGBA_8888](https://fiddle.skia.org/i/9abc324f670e6468f09385551aae5a1c_raster.png "")
+
+If paired with <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>: red, green, and blue components are
+<a href='undocumented#Premultiply'>Premultiplied</a> by the <a href='SkColor_Reference#Alpha'>alpha</a> value. If red, green, or blue is greater than <a href='SkColor_Reference#Alpha'>alpha</a>,
+the drawn result is undefined.
+
+If paired with <a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>: <a href='SkColor_Reference#Alpha'>alpha</a>, red, green, and blue components
+may have any value. There may be a performance penalty with <a href='undocumented#Unpremultiply'>Unpremultiplied</a>
+pixels.
+
+If paired with <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>: all <a href='SkColor_Reference#Alpha'>alpha</a> component values are at the maximum;
+red, green, and blue components are fully opaque. If any <a href='SkColor_Reference#Alpha'>alpha</a> component is
+less than 255, the drawn result is undefined.
+
+On <a href='#Big_Endian'>Big_Endian</a> platforms, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a> is the native <a href='#Image_Info_Color_Type'>Color_Type</a>, and
+will have the best performance. Use <a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a> to choose the best
+<a href='#Image_Info_Color_Type'>Color_Type</a> for the platform at compile time.
+
+### Example
+
+<div><fiddle-embed name="@Color_Type_RGBA_8888"></fiddle-embed></div>
+
+### See Also
+
+<a href='#Image_Info_Color_Type_RGB_888'>RGB_888</a> <a href='#Image_Info_Color_Type_BGRA_8888'>BGRA_8888</a>
+
+<a name='Color_Type_RGB_888'></a>
+
+---
+
+<a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a> encodes RGB into a 32-bit word. Each component:
+red, green, blue; use eight bits, describing 256 levels. Eight bits are
+unused. Pixels described by <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a> are fully opaque as if
+their <a href='#Color_Alpha'>Color_Alpha</a> was set to one, and should always be paired with
+<a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>.
+
+![Color_Type_RGB_888](https://fiddle.skia.org/i/7527d7ade4764302818e250cd4e03962_raster.png "")
+
+### Example
+
+<div><fiddle-embed name="@Color_Type_RGB_888"></fiddle-embed></div>
+
+### See Also
+
+<a href='#Image_Info_Color_Type_RGBA_8888'>RGBA_8888</a> <a href='#Image_Info_Color_Type_BGRA_8888'>BGRA_8888</a>
+
+<a name='Color_Type_BGRA_8888'></a>
+
+---
+
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a> encodes ARGB into a 32-bit word. Each component:
+blue, green, red, and <a href='SkColor_Reference#Alpha'>alpha</a>; use eight bits, describing 256 levels.
+
+![Color_Type_BGRA_8888](https://fiddle.skia.org/i/6c35ca14d88b0de200ba7f897f889ad7_raster.png "")
+
+If paired with <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>: blue, green, and red components are
+<a href='undocumented#Premultiply'>Premultiplied</a> by the <a href='SkColor_Reference#Alpha'>alpha</a> value. If blue, green, or red is greater than <a href='SkColor_Reference#Alpha'>alpha</a>,
+the drawn result is undefined.
+
+If paired with <a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>: blue, green, red, and <a href='SkColor_Reference#Alpha'>alpha</a> components
+may have any value. There may be a performance penalty with <a href='undocumented#Unpremultiply'>Unpremultiplied</a>
+pixels.
+
+If paired with <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>: all <a href='SkColor_Reference#Alpha'>alpha</a> component values are at the maximum;
+blue, green, and red components are fully opaque. If any <a href='SkColor_Reference#Alpha'>alpha</a> component is
+less than 255, the drawn result is undefined.
+
+On <a href='#Little_Endian'>Little_Endian</a> platforms, <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a> is the native <a href='#Image_Info_Color_Type'>Color_Type</a>,
+and will have the best performance. Use <a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a> to choose the best
+<a href='#Image_Info_Color_Type'>Color_Type</a> for the platform at compile time.
+
+### Example
+
+<div><fiddle-embed name="@Color_Type_BGRA_8888"></fiddle-embed></div>
+
+### See Also
+
+<a href='#Image_Info_Color_Type_RGBA_8888'>RGBA_8888</a>
+
+<a name='Color_Type_RGBA_1010102'></a>
+
+---
+
+<a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a> encodes ARGB into a 32-bit word. Each
+<a href='SkColor_Reference#Color'>Color</a> component: red, green, and blue; use ten bits, describing 1024 levels.
+Two bits contain <a href='SkColor_Reference#Alpha'>alpha</a>, describing four levels. Possible <a href='SkColor_Reference#Alpha'>alpha</a>
+values are zero: fully transparent; one: 33% opaque; two: 67% opaque;
+three: fully opaque.
+
+At present, <a href='SkColor_Reference#Color'>Color</a> in <a href='SkPaint_Reference#Paint'>Paint</a> does not provide enough precision to
+draw all colors possible to a <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a> <a href='SkSurface_Reference#Surface'>Surface</a>.
+
+![Color_Type_RGBA_1010102](https://fiddle.skia.org/i/8d78daf69145f611054f289a7443a670_raster.png "")
+
+If paired with <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>: red, green, and blue components are
+<a href='undocumented#Premultiply'>Premultiplied</a> by the <a href='SkColor_Reference#Alpha'>alpha</a> value. If red, green, or blue is greater than the
+<a href='SkColor_Reference#Alpha'>alpha</a> replicated to ten bits, the drawn result is undefined.
+
+If paired with <a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>: <a href='SkColor_Reference#Alpha'>alpha</a>, red, green, and blue components
+may have any value. There may be a performance penalty with <a href='undocumented#Unpremultiply'>Unpremultiplied</a>
+pixels.
+
+If paired with <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>: all <a href='SkColor_Reference#Alpha'>alpha</a> component values are at the maximum;
+red, green, and blue components are fully opaque. If any <a href='SkColor_Reference#Alpha'>alpha</a> component is
+less than three, the drawn result is undefined.
+
+### Example
+
+<div><fiddle-embed name="@Color_Type_RGBA_1010102"></fiddle-embed></div>
+
+### See Also
+
+<a href='#Image_Info_Color_Type_RGB_101010'>RGB_101010</a> <a href='#Image_Info_Color_Type_RGBA_8888'>RGBA_8888</a>
+
+<a name='Color_Type_RGB_101010'></a>
+
+---
+
+<a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a> encodes RGB into a 32-bit word. Each
+<a href='SkColor_Reference#Color'>Color</a> component: red, green, and blue; use ten bits, describing 1024 levels.
+Two bits are unused. Pixels described by <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a> are fully
+opaque as if its <a href='#Color_Alpha'>Color_Alpha</a> was set to one, and should always be paired
+with <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>.
+
+At present, <a href='SkColor_Reference#Color'>Color</a> in <a href='SkPaint_Reference#Paint'>Paint</a> does not provide enough precision to
+draw all colors possible to a <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a> <a href='SkSurface_Reference#Surface'>Surface</a>.
+
+![Color_Type_RGB_101010](https://fiddle.skia.org/i/4c9f4d939e2047269d73fa3507caf01f_raster.png "")
+
+### Example
+
+<div><fiddle-embed name="@Color_Type_RGB_101010"></fiddle-embed></div>
+
+### See Also
+
+<a href='#Image_Info_Color_Type_RGBA_1010102'>RGBA_1010102</a>
+
+<a name='Color_Type_Gray_8'></a>
+
+---
+
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a> encodes grayscale level in eight bits that is equivalent
+to equal values for red, blue, and green, representing colors from black to
+white.  Pixels described by <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a> are fully
+opaque as if its <a href='#Color_Alpha'>Color_Alpha</a> was set to one, and should always be paired with
+<a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>.
+
+### Example
+
+<div><fiddle-embed name="@Color_Type_Gray_8"></fiddle-embed></div>
+
+### See Also
+
+<a href='#Image_Info_Color_Type_Alpha_8'>Alpha_8</a>
+
+<a name='Color_Type_RGBA_F16'></a>
+
+---
+
+<a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a> encodes ARGB into a 64-bit word. Each component:
+blue, green, red, and <a href='SkColor_Reference#Alpha'>alpha</a>; use 16 bits, describing a floating <a href='SkPoint_Reference#Point'>point</a> value,
+from -65500 to 65000 with 3.31 decimal digits of precision.
+
+At present, <a href='SkColor_Reference#Color'>Color</a> in <a href='SkPaint_Reference#Paint'>Paint</a> does not provide enough precision or range to
+draw all colors possible to a <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a> <a href='SkSurface_Reference#Surface'>Surface</a>.
+
+Each component encodes a floating <a href='SkPoint_Reference#Point'>point</a> value using
+<a href='https://www.khronos.org/opengl/wiki/Small_Float_Formats'>Half floats</a></a>. Meaningful colors are represented by the range 0.0 to 1.0, although smaller
+and larger values may be useful when used in combination with <a href='#Transfer_Mode'>Transfer_Mode</a>.
+
+![Color_Type_RGBA_F16](https://fiddle.skia.org/i/1bb35ae52173e0fef874022ca8138adc_raster.png "")
+
+If paired with <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>: blue, green, and red components are
+<a href='undocumented#Premultiply'>Premultiplied</a> by the <a href='SkColor_Reference#Alpha'>alpha</a> value. If blue, green, or red is greater than <a href='SkColor_Reference#Alpha'>alpha</a>,
+the drawn result is undefined.
+
+If paired with <a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>: blue, green, red, and <a href='SkColor_Reference#Alpha'>alpha</a> components
+may have any value. There may be a performance penalty with <a href='undocumented#Unpremultiply'>Unpremultiplied</a>
+pixels.
+
+If paired with <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>: all <a href='SkColor_Reference#Alpha'>alpha</a> component values are at the maximum;
+blue, green, and red components are fully opaque. If any <a href='SkColor_Reference#Alpha'>alpha</a> component is
+less than one, the drawn result is undefined.
+
+### Example
+
+<div><fiddle-embed name="@Color_Type_RGBA_F16"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a>
+
+<a name='Color_Type_RGBA_F32'></a>
+
+---
+
+<a href='SkImageInfo_Reference#kRGBA_F32_SkColorType'>kRGBA_F32_SkColorType</a> encodes ARGB into a 128-bit word. Each component:
+blue, green, red, and <a href='SkColor_Reference#Alpha'>alpha</a>; use 32 bits, describing a floating <a href='SkPoint_Reference#Point'>point</a> value,
+from -3.402823e+38 to 3.402823e+38 with 7.225 decimal digits of precision.
+
+At present, <a href='SkColor_Reference#Color'>Color</a> in <a href='SkPaint_Reference#Paint'>Paint</a> does not provide enough precision or range to
+draw all colors possible to a <a href='SkImageInfo_Reference#kRGBA_F32_SkColorType'>kRGBA_F32_SkColorType</a> <a href='SkSurface_Reference#Surface'>Surface</a>.
+
+Each component encodes a floating <a href='SkPoint_Reference#Point'>point</a> value using
+<a href='https://en.wikipedia.org/wiki/Single-precision_floating-point_format'>single-precision floats</a></a>. Meaningful colors are represented by the range 0.0 to 1.0, although smaller
+and larger values may be useful when used in combination with <a href='#Transfer_Mode'>Transfer_Mode</a>.
+
+![Color_Type_RGBA_F32](https://fiddle.skia.org/i/4ba31a8f9bc94a996f34da81ef541a9c_raster.png "")
+
+If paired with <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>: blue, green, and red components are
+<a href='undocumented#Premultiply'>Premultiplied</a> by the <a href='SkColor_Reference#Alpha'>alpha</a> value. If blue, green, or red is greater than <a href='SkColor_Reference#Alpha'>alpha</a>,
+the drawn result is undefined.
+
+If paired with <a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>: blue, green, red, and <a href='SkColor_Reference#Alpha'>alpha</a> components
+may have any value. There may be a performance penalty with <a href='undocumented#Unpremultiply'>Unpremultiplied</a>
+pixels.
+
+If paired with <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>: all <a href='SkColor_Reference#Alpha'>alpha</a> component values are at the maximum;
+blue, green, and red components are fully opaque. If any <a href='SkColor_Reference#Alpha'>alpha</a> component is
+less than one, the drawn result is undefined.
+
+### See Also
+
+<a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a>
+
+<a name='SkColorTypeBytesPerPixel'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='SkImageInfo_Reference#SkColorTypeBytesPerPixel'>SkColorTypeBytesPerPixel</a>(<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> ct)
+</pre>
+
+Returns the number of bytes required to store a <a href='undocumented#Pixel'>pixel</a>, including unused padding.
+Returns zero if <a href='#SkColorTypeBytesPerPixel_ct'>ct</a> is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a> or invalid.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkColorTypeBytesPerPixel_ct'><code><strong>ct</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+### Return Value
+
+bytes per <a href='undocumented#Pixel'>pixel</a>
+
+### Example
+
+<div><fiddle-embed name="@ColorTypeBytesPerPixel"><a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>
+
+<a name='SkColorTypeIsAlwaysOpaque'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='SkImageInfo_Reference#SkColorTypeIsAlwaysOpaque'>SkColorTypeIsAlwaysOpaque</a>(<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> ct)
+</pre>
+
+Returns true if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> always decodes <a href='SkColor_Reference#Alpha'>alpha</a> to 1.0, making the <a href='undocumented#Pixel'>pixel</a>
+fully opaque. If true, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> does not reserve bits to encode <a href='SkColor_Reference#Alpha'>alpha</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkColorTypeIsAlwaysOpaque_ct'><code><strong>ct</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+### Return Value
+
+true if <a href='SkColor_Reference#Alpha'>alpha</a> is always set to 1.0
+
+### Example
+
+<div><fiddle-embed name="@ColorTypeIsAlwaysOpaque"><a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkImageInfo_Reference#SkColorTypeValidateAlphaType'>SkColorTypeValidateAlphaType</a>
+
+<a name='SkColorTypeValidateAlphaType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='SkImageInfo_Reference#SkColorTypeValidateAlphaType'>SkColorTypeValidateAlphaType</a>(<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> colorType, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> alphaType,
+                                  <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>* canonical = nullptr)
+</pre>
+
+Returns true if <a href='#SkColorTypeValidateAlphaType_canonical'>canonical</a> can be set to a valid <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> for <a href='#SkColorTypeValidateAlphaType_colorType'>colorType</a>. If
+there is more than one valid <a href='#SkColorTypeValidateAlphaType_canonical'>canonical</a> <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, set to <a href='#SkColorTypeValidateAlphaType_alphaType'>alphaType</a>, if valid.
+If true is returned and <a href='#SkColorTypeValidateAlphaType_canonical'>canonical</a> is not nullptr, store valid <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>.
+
+Returns false only if <a href='#SkColorTypeValidateAlphaType_alphaType'>alphaType</a> is <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>,  <a href='SkImageInfo_Reference#Color_Type'>color type</a> is not
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not always opaque. If false is returned,
+<a href='#SkColorTypeValidateAlphaType_canonical'>canonical</a> is ignored.
+
+For <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>: set <a href='#SkColorTypeValidateAlphaType_canonical'>canonical</a> to <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a> and return true.
+For <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>: set <a href='#SkColorTypeValidateAlphaType_canonical'>canonical</a> to <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a> or
+<a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a> and return true if <a href='#SkColorTypeValidateAlphaType_alphaType'>alphaType</a> is not <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>.
+For <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>, and
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>: set <a href='#SkColorTypeValidateAlphaType_canonical'>canonical</a> to <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a> and return true.
+For <a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, and <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>: set <a href='#SkColorTypeValidateAlphaType_canonical'>canonical</a> to <a href='#SkColorTypeValidateAlphaType_alphaType'>alphaType</a>
+and return true if <a href='#SkColorTypeValidateAlphaType_alphaType'>alphaType</a> is not <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkColorTypeValidateAlphaType_colorType'><code><strong>colorType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkColorTypeValidateAlphaType_alphaType'><code><strong>alphaType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkColorTypeValidateAlphaType_canonical'><code><strong>canonical</strong></code></a></td>
+    <td>storage for <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if valid <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> can be associated with <a href='#SkColorTypeValidateAlphaType_colorType'>colorType</a>
+
+### Example
+
+<div><fiddle-embed name="@ColorTypeValidateAlphaType"><a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkImageInfo_Reference#SkColorTypeIsAlwaysOpaque'>SkColorTypeIsAlwaysOpaque</a>
+
+<a name='YUV_ColorSpace'></a>
+
+<a name='SkYUVColorSpace'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+enum <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> {
+    <a href='SkImageInfo_Reference#kJPEG_SkYUVColorSpace'>kJPEG_SkYUVColorSpace</a>,
+    <a href='SkImageInfo_Reference#kRec601_SkYUVColorSpace'>kRec601_SkYUVColorSpace</a>,
+    <a href='SkImageInfo_Reference#kRec709_SkYUVColorSpace'>kRec709_SkYUVColorSpace</a>,
+    <a href='SkImageInfo_Reference#kLastEnum_SkYUVColorSpace'>kLastEnum_SkYUVColorSpace</a> = <a href='SkImageInfo_Reference#kRec709_SkYUVColorSpace'>kRec709_SkYUVColorSpace</a>,
+};
+
+</pre>
+
+Describes <a href='SkColor_Reference#Color'>color</a> range of YUV pixels. The <a href='SkColor_Reference#Color'>color</a> mapping from YUV to RGB varies
+depending on the source. YUV pixels may be generated by JPEG images, standard
+video streams, or high definition video streams. Each has its own mapping from
+YUV and RGB.
+
+JPEG YUV values encode the full range of 0 to 255 for all three components.
+Video YUV values range from 16 to 235 for all three components. Details of
+encoding and conversion to RGB are described in
+<a href='https://en.wikipedia.org/wiki/YCbCr'>YCbCr color space</a></a> .
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kJPEG_SkYUVColorSpace'><code>kJPEG_SkYUVColorSpace</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Describes standard JPEG  <a href='undocumented#Color_Space'>color space</a>;
+<a href='https://en.wikipedia.org/wiki/Rec._601'>CCIR 601</a></a> with full range of 0 to 255 for components.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kRec601_SkYUVColorSpace'><code>kRec601_SkYUVColorSpace</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Describes standard used by standard definition television;
+<a href='https://en.wikipedia.org/wiki/Rec._601'>CCIR 601</a></a> with studio range of 16 to 235 range for components.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kRec709_SkYUVColorSpace'><code>kRec709_SkYUVColorSpace</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Describes standard used by high definition television;
+<a href='https://en.wikipedia.org/wiki/Rec._709'>Rec. 709</a></a> with studio range of 16 to 235 range for components.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kLastEnum_SkYUVColorSpace'><code>kLastEnum_SkYUVColorSpace</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Used by tests to iterate through all valid values.
+</td>
+  </tr>
+</table>
+
+### See Also
+
+<a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_MakeFromYUVTexturesCopy'>MakeFromYUVTexturesCopy</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_MakeFromNV12TexturesCopy'>MakeFromNV12TexturesCopy</a>
+
+<a name='SkImageInfo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+struct <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> {
+
+    <a href='#SkImageInfo_empty_constructor'>SkImageInfo()</a>;
+    static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_Make'>Make</a>(int width, int height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> ct, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> at,
+                            <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> cs = nullptr);
+    static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_MakeN32'>MakeN32</a>(int width, int height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> at,
+                               <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> cs = nullptr);
+    static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_MakeS32'>MakeS32</a>(int width, int height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> at);
+    static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_MakeN32Premul'>MakeN32Premul</a>(int width, int height, <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> cs = nullptr);
+    static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_MakeN32Premul'>MakeN32Premul</a>(const <a href='undocumented#SkISize'>SkISize</a>& <a href='undocumented#Size'>size</a>);
+    static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_MakeA8'>MakeA8</a>(int width, int height);
+    static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_MakeUnknown'>MakeUnknown</a>(int width, int height);
+    static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_MakeUnknown'>MakeUnknown</a>();
+    int <a href='#SkImageInfo_width'>width()</a> const;
+    int <a href='#SkImageInfo_height'>height()</a> const;
+    <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkImageInfo_colorType'>colorType</a>() const;
+    <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImageInfo_alphaType'>alphaType</a>() const;
+    <a href='undocumented#SkColorSpace'>SkColorSpace</a>* <a href='#SkImageInfo_colorSpace'>colorSpace</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> <a href='#SkImageInfo_refColorSpace'>refColorSpace</a>() const;
+    bool <a href='#SkImageInfo_isEmpty'>isEmpty</a>() const;
+    bool <a href='#SkImageInfo_isOpaque'>isOpaque</a>() const;
+    <a href='undocumented#SkISize'>SkISize</a> <a href='#SkImageInfo_dimensions'>dimensions()</a> const;
+    <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkImageInfo_bounds'>bounds()</a> const;
+    bool <a href='#SkImageInfo_gammaCloseToSRGB'>gammaCloseToSRGB</a>() const;
+    <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_makeWH'>makeWH</a>(int newWidth, int newHeight) const;
+    <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_makeAlphaType'>makeAlphaType</a>(<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> newAlphaType) const;
+    <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_makeColorType'>makeColorType</a>(<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> newColorType) const;
+    <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_makeColorSpace'>makeColorSpace</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> cs) const;
+    int <a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>() const;
+    int <a href='#SkImageInfo_shiftPerPixel'>shiftPerPixel</a>() const;
+    uint64_t <a href='#SkImageInfo_minRowBytes64'>minRowBytes64</a>() const;
+    size_t <a href='#SkImageInfo_minRowBytes'>minRowBytes</a>() const;
+    size_t <a href='#SkImageInfo_computeOffset'>computeOffset</a>(int x, int y, size_t rowBytes) const;
+    bool <a href='#SkImageInfo_equal1_operator'>operator==</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& other) const;
+    bool <a href='#SkImageInfo_notequal1_operator'>operator!=</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& other) const;
+    size_t <a href='#SkImageInfo_computeByteSize'>computeByteSize</a>(size_t rowBytes) const;
+    size_t <a href='#SkImageInfo_computeMinByteSize'>computeMinByteSize</a>() const;
+    static bool <a href='#SkImageInfo_ByteSizeOverflowed'>ByteSizeOverflowed</a>(size_t byteSize);
+    bool <a href='#SkImageInfo_validRowBytes'>validRowBytes</a>(size_t rowBytes) const;
+    void <a href='#SkImageInfo_reset'>reset()</a>;
+    void <a href='#SkImageInfo_validate'>validate()</a> const;
+};
+
+</pre>
+
+Describes <a href='undocumented#Pixel'>pixel</a> dimensions and encoding. <a href='SkBitmap_Reference#Bitmap'>Bitmap</a>, <a href='SkImage_Reference#Image'>Image</a>, <a href='SkPixmap_Reference#Pixmap'>Pixmap</a>, and <a href='SkSurface_Reference#Surface'>Surface</a>
+can be created from <a href='#Image_Info'>Image_Info</a>. <a href='#Image_Info'>Image_Info</a> can be retrieved from <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> and
+<a href='SkPixmap_Reference#Pixmap'>Pixmap</a>, but not from <a href='SkImage_Reference#Image'>Image</a> and <a href='SkSurface_Reference#Surface'>Surface</a>. For example, <a href='SkImage_Reference#Image'>Image</a> and <a href='SkSurface_Reference#Surface'>Surface</a>
+implementations may defer <a href='undocumented#Pixel'>pixel</a> depth, so may not completely specify <a href='#Image_Info'>Image_Info</a>.
+
+<a href='#Image_Info'>Image_Info</a> contains dimensions, the <a href='undocumented#Pixel'>pixel</a> integral width and height. It encodes
+how <a href='undocumented#Pixel'>pixel</a> bits describe <a href='#Color_Alpha'>Color_Alpha</a>, transparency; <a href='SkColor_Reference#Color'>Color</a> components red, blue,
+and green; and <a href='#Color_Space'>Color_Space</a>, the range and linearity of colors.
+
+<a name='SkImageInfo_empty_constructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkImageInfo_empty_constructor'>SkImageInfo()</a>
+</pre>
+
+Creates an empty <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> with <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>,
+a width and height of zero, and no <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+
+### Return Value
+
+empty <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="f206f698e7a8db3d84334c26b1a702dc"><div>An empty <a href='#Image_Info'>Image_Info</a> may be passed to <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_accessTopLayerPixels'>accessTopLayerPixels</a> as storage
+for the <a href='SkCanvas_Reference#Canvas'>Canvas</a> actual <a href='#Image_Info'>Image_Info</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_Make'>Make</a> <a href='#SkImageInfo_MakeN32'>MakeN32</a> <a href='#SkImageInfo_MakeS32'>MakeS32</a> <a href='#SkImageInfo_MakeA8'>MakeA8</a>
+
+<a name='SkImageInfo_Make'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_Make'>Make</a>(int width, int height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> ct, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> at,
+                        <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; cs = nullptr)
+</pre>
+
+Creates <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> from integral dimensions <a href='#SkImageInfo_Make_width'>width</a> and <a href='#SkImageInfo_Make_height'>height</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkImageInfo_Make_ct'>ct</a>,
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImageInfo_Make_at'>at</a>, and optionally <a href='undocumented#SkColorSpace'>SkColorSpace</a> <a href='#SkImageInfo_Make_cs'>cs</a>.
+
+If <a href='undocumented#SkColorSpace'>SkColorSpace</a> <a href='#SkImageInfo_Make_cs'>cs</a> is nullptr and <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> is part of drawing source: <a href='undocumented#SkColorSpace'>SkColorSpace</a>
+defaults to sRGB, mapping into <a href='SkSurface_Reference#SkSurface'>SkSurface</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+
+Parameters are not validated to see if their values are legal, or that the
+combination is supported.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_Make_width'><code><strong>width</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> column count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkImageInfo_Make_height'><code><strong>height</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> row count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkImageInfo_Make_ct'><code><strong>ct</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_Make_at'><code><strong>at</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_Make_cs'><code><strong>cs</strong></code></a></td>
+    <td>range of colors; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_Make"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_MakeN32'>MakeN32</a> <a href='#SkImageInfo_MakeN32Premul'>MakeN32Premul</a> <a href='#SkImageInfo_MakeS32'>MakeS32</a> <a href='#SkImageInfo_MakeA8'>MakeA8</a>
+
+<a name='SkImageInfo_MakeN32'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_MakeN32'>MakeN32</a>(int width, int height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> at, <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; cs = nullptr)
+</pre>
+
+Creates <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> from integral dimensions <a href='#SkImageInfo_MakeN32_width'>width</a> and <a href='#SkImageInfo_MakeN32_height'>height</a>, <a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a>,
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImageInfo_MakeN32_at'>at</a>, and optionally <a href='undocumented#SkColorSpace'>SkColorSpace</a> <a href='#SkImageInfo_MakeN32_cs'>cs</a>. <a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a> will equal either
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a> or <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, whichever is optimal.
+
+If <a href='undocumented#SkColorSpace'>SkColorSpace</a> <a href='#SkImageInfo_MakeN32_cs'>cs</a> is nullptr and <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> is part of drawing source: <a href='undocumented#SkColorSpace'>SkColorSpace</a>
+defaults to sRGB, mapping into <a href='SkSurface_Reference#SkSurface'>SkSurface</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+
+Parameters are not validated to see if their values are legal, or that the
+combination is supported.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_MakeN32_width'><code><strong>width</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> column count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkImageInfo_MakeN32_height'><code><strong>height</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> row count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkImageInfo_MakeN32_at'><code><strong>at</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_MakeN32_cs'><code><strong>cs</strong></code></a></td>
+    <td>range of colors; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="78cea0c4cac205b61ad6f6c982cbd888"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_Make'>Make</a> <a href='#SkImageInfo_MakeN32Premul'>MakeN32Premul</a> <a href='#SkImageInfo_MakeS32'>MakeS32</a> <a href='#SkImageInfo_MakeA8'>MakeA8</a>
+
+<a name='SkImageInfo_MakeS32'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_MakeS32'>MakeS32</a>(int width, int height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> at)
+</pre>
+
+Creates <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> from integral dimensions <a href='#SkImageInfo_MakeS32_width'>width</a> and <a href='#SkImageInfo_MakeS32_height'>height</a>, <a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a>,
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImageInfo_MakeS32_at'>at</a>, with sRGB <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+
+Parameters are not validated to see if their values are legal, or that the
+combination is supported.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_MakeS32_width'><code><strong>width</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> column count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkImageInfo_MakeS32_height'><code><strong>height</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> row count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkImageInfo_MakeS32_at'><code><strong>at</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+
+### Return Value
+
+created <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_MakeS32"><div>Top gradient is drawn to offScreen without <a href='#Color_Space'>Color_Space</a>. It is darker than middle
+gradient, drawn to offScreen with sRGB <a href='#Color_Space'>Color_Space</a>. Bottom gradient shares bits
+with middle, but does not specify the <a href='#Color_Space'>Color_Space</a> in noColorSpaceBitmap. A source
+without <a href='#Color_Space'>Color_Space</a> is treated as sRGB; the bottom gradient is identical to the
+middle gradient.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_Make'>Make</a> <a href='#SkImageInfo_MakeN32'>MakeN32</a> <a href='#SkImageInfo_MakeN32Premul'>MakeN32Premul</a> <a href='#SkImageInfo_MakeA8'>MakeA8</a>
+
+<a name='SkImageInfo_MakeN32Premul'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_MakeN32Premul'>MakeN32Premul</a>(int width, int height, <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; cs = nullptr)
+</pre>
+
+Creates <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> from integral dimensions <a href='#SkImageInfo_MakeN32Premul_width'>width</a> and <a href='#SkImageInfo_MakeN32Premul_height'>height</a>, <a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a>,
+<a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>, with optional <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+
+If <a href='undocumented#SkColorSpace'>SkColorSpace</a> <a href='#SkImageInfo_MakeN32Premul_cs'>cs</a> is nullptr and <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> is part of drawing source: <a href='undocumented#SkColorSpace'>SkColorSpace</a>
+defaults to sRGB, mapping into <a href='SkSurface_Reference#SkSurface'>SkSurface</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+
+Parameters are not validated to see if their values are legal, or that the
+combination is supported.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_MakeN32Premul_width'><code><strong>width</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> column count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkImageInfo_MakeN32Premul_height'><code><strong>height</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> row count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkImageInfo_MakeN32Premul_cs'><code><strong>cs</strong></code></a></td>
+    <td>range of colors; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="525650a67e19fdd8ca9f72b7eda65174"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_MakeN32'>MakeN32</a> <a href='#SkImageInfo_MakeS32'>MakeS32</a> <a href='#SkImageInfo_MakeA8'>MakeA8</a> <a href='#SkImageInfo_Make'>Make</a>
+
+<a name='SkImageInfo_MakeN32Premul_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_MakeN32Premul'>MakeN32Premul</a>(const <a href='undocumented#SkISize'>SkISize</a>& <a href='undocumented#Size'>size</a>)
+</pre>
+
+Creates <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> from integral dimensions width and height, <a href='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a>,
+<a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>, with <a href='undocumented#SkColorSpace'>SkColorSpace</a> set to nullptr.
+
+If <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> is part of drawing source: <a href='undocumented#SkColorSpace'>SkColorSpace</a> defaults to sRGB, mapping
+into <a href='SkSurface_Reference#SkSurface'>SkSurface</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+
+Parameters are not validated to see if their values are legal, or that the
+combination is supported.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_MakeN32Premul_2_size'><code><strong>size</strong></code></a></td>
+    <td>width and height, each must be zero or greater</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="b9026d7f39029756bd7cab9542c64f4e"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_MakeN32'>MakeN32</a> <a href='#SkImageInfo_MakeS32'>MakeS32</a> <a href='#SkImageInfo_MakeA8'>MakeA8</a> <a href='#SkImageInfo_Make'>Make</a>
+
+<a name='SkImageInfo_MakeA8'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_MakeA8'>MakeA8</a>(int width, int height)
+</pre>
+
+Creates <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> from integral dimensions <a href='#SkImageInfo_MakeA8_width'>width</a> and <a href='#SkImageInfo_MakeA8_height'>height</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>,
+<a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>, with <a href='undocumented#SkColorSpace'>SkColorSpace</a> set to nullptr.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_MakeA8_width'><code><strong>width</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> column count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkImageInfo_MakeA8_height'><code><strong>height</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> row count; must be zero or greater</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_MakeA8"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_MakeN32'>MakeN32</a> <a href='#SkImageInfo_MakeS32'>MakeS32</a> <a href='#SkImageInfo_Make'>Make</a>
+
+<a name='SkImageInfo_MakeUnknown'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_MakeUnknown'>MakeUnknown</a>(int width, int height)
+</pre>
+
+Creates <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> from integral dimensions <a href='#SkImageInfo_MakeUnknown_width'>width</a> and <a href='#SkImageInfo_MakeUnknown_height'>height</a>, <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>,
+<a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, with <a href='undocumented#SkColorSpace'>SkColorSpace</a> set to nullptr.
+
+Returned <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> as part of source does not draw, and as part of destination
+can not be drawn to.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_MakeUnknown_width'><code><strong>width</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> column count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkImageInfo_MakeUnknown_height'><code><strong>height</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> row count; must be zero or greater</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="75f13a78b28b08c72baf32b7d868de1c"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_empty_constructor'>SkImageInfo()</a> <a href='#SkImageInfo_MakeN32'>MakeN32</a> <a href='#SkImageInfo_MakeS32'>MakeS32</a> <a href='#SkImageInfo_Make'>Make</a>
+
+<a name='SkImageInfo_MakeUnknown_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_MakeUnknown'>MakeUnknown</a>()
+</pre>
+
+Creates <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> from integral dimensions width and height set to zero,
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, with <a href='undocumented#SkColorSpace'>SkColorSpace</a> set to nullptr.
+
+Returned <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> as part of source does not draw, and as part of destination
+can not be drawn to.
+
+### Return Value
+
+created <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="a1af7696ae0cdd6f379546dd1f211b7a"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_empty_constructor'>SkImageInfo()</a> <a href='#SkImageInfo_MakeN32'>MakeN32</a> <a href='#SkImageInfo_MakeS32'>MakeS32</a> <a href='#SkImageInfo_Make'>Make</a>
+
+<a name='Property'></a>
+
+<a name='SkImageInfo_width'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkImageInfo_width'>width()</a>const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> count in each row.
+
+### Return Value
+
+<a href='undocumented#Pixel'>pixel</a> width
+
+### Example
+
+<div><fiddle-embed name="e2491817695290d0218be77f091b8460"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_height'>height</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_width'>width</a> <a href='undocumented#SkPixelRef'>SkPixelRef</a>::<a href='#SkPixelRef_width'>width</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_width'>width</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_width'>width</a>
+
+<a name='SkImageInfo_height'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkImageInfo_height'>height()</a>const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> row count.
+
+### Return Value
+
+<a href='undocumented#Pixel'>pixel</a> height
+
+### Example
+
+<div><fiddle-embed name="72c35baaeddca1d912edf93d19429c8e"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_width'>width</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_height'>height</a> <a href='undocumented#SkPixelRef'>SkPixelRef</a>::<a href='#SkPixelRef_height'>height</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_height'>height</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_height'>height</a>
+
+<a name='SkImageInfo_colorType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkImageInfo_colorType'>colorType</a>()const
+</pre>
+
+Returns <a href='#Image_Info_Color_Type'>Color_Type</a>, one of: <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+.
+
+### Return Value
+
+<a href='#Image_Info_Color_Type'>Color_Type</a>
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_colorType">
+
+#### Example Output
+
+~~~~
+color type: kAlpha_8_SkColorType
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_alphaType'>alphaType</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_colorType'>colorType</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_colorType'>colorType</a>
+
+<a name='SkImageInfo_alphaType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImageInfo_alphaType'>alphaType</a>()const
+</pre>
+
+Returns <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, one of: <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+.
+
+### Return Value
+
+<a href='#Image_Info_Alpha_Type'>Alpha_Type</a>
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_alphaType">
+
+#### Example Output
+
+~~~~
+alpha type: kPremul_SkAlphaType
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_colorType'>colorType</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_alphaType'>alphaType</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_alphaType'>alphaType</a>
+
+<a name='SkImageInfo_colorSpace'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkColorSpace'>SkColorSpace</a>* <a href='#SkImageInfo_colorSpace'>colorSpace</a>()const
+</pre>
+
+Returns <a href='undocumented#SkColorSpace'>SkColorSpace</a>, the range of colors. The reference count of
+<a href='undocumented#SkColorSpace'>SkColorSpace</a> is unchanged. The returned <a href='undocumented#SkColorSpace'>SkColorSpace</a> is immutable.
+
+### Return Value
+
+<a href='undocumented#SkColorSpace'>SkColorSpace</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_colorSpace"><div><a href='undocumented#SkColorSpace'>SkColorSpace</a>::<a href='#SkColorSpace_MakeSRGBLinear'>MakeSRGBLinear</a> creates <a href='#Color_Space'>Color_Space</a> with linear gamma
+and an sRGB gamut. This <a href='#Color_Space'>Color_Space</a> gamma is not close to sRGB gamma.
+</div>
+
+#### Example Output
+
+~~~~
+gammaCloseToSRGB: false  gammaIsLinear: true  isSRGB: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Color_Space'>Color_Space</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_colorSpace'>colorSpace</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_colorSpace'>colorSpace</a>
+
+<a name='SkImageInfo_refColorSpace'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; <a href='#SkImageInfo_refColorSpace'>refColorSpace</a>()const
+</pre>
+
+Returns smart pointer to <a href='undocumented#SkColorSpace'>SkColorSpace</a>, the range of colors. The smart pointer
+tracks the number of objects sharing this <a href='undocumented#SkColorSpace'>SkColorSpace</a> reference so the memory
+is released when the owners destruct.
+
+The returned <a href='undocumented#SkColorSpace'>SkColorSpace</a> is immutable.
+
+### Return Value
+
+<a href='undocumented#SkColorSpace'>SkColorSpace</a> wrapped in a smart pointer
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_refColorSpace"></fiddle-embed></div>
+
+### See Also
+
+<a href='#Color_Space'>Color_Space</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_refColorSpace'>refColorSpace</a>
+
+<a name='SkImageInfo_isEmpty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkImageInfo_isEmpty'>isEmpty</a>()const
+</pre>
+
+Returns if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> describes an empty area of pixels by checking if either
+width or height is zero or smaller.
+
+### Return Value
+
+true if either dimension is zero or smaller
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_isEmpty">
+
+#### Example Output
+
+~~~~
+width: 0 height: 0 empty: true
+width: 0 height: 2 empty: true
+width: 2 height: 0 empty: true
+width: 2 height: 2 empty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_dimensions'>dimensions</a> <a href='#SkImageInfo_bounds'>bounds</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_empty'>empty</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_bounds'>bounds</a>
+
+<a name='SkImageInfo_isOpaque'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkImageInfo_isOpaque'>isOpaque</a>()const
+</pre>
+
+Returns true if <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is set to hint that all pixels are opaque; their
+<a href='SkColor_Reference#Alpha'>alpha</a> value is implicitly or explicitly 1.0. If true, and all pixels are
+not opaque, Skia may draw incorrectly.
+
+Does not check if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> allows <a href='SkColor_Reference#Alpha'>alpha</a>, or if any <a href='undocumented#Pixel'>pixel</a> value has
+transparency.
+
+### Return Value
+
+true if <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_isOpaque">
+
+#### Example Output
+
+~~~~
+isOpaque: false
+isOpaque: false
+isOpaque: true
+isOpaque: true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Color_Alpha'>Color_Alpha</a> <a href='SkImageInfo_Reference#SkColorTypeValidateAlphaType'>SkColorTypeValidateAlphaType</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_isOpaque'>isOpaque</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_isOpaque'>isOpaque</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_isOpaque'>isOpaque</a>
+
+<a name='SkImageInfo_dimensions'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkISize'>SkISize</a> <a href='#SkImageInfo_dimensions'>dimensions()</a>const
+</pre>
+
+Returns <a href='undocumented#SkISize'>SkISize</a> { <a href='#SkImageInfo_width'>width()</a>, <a href='#SkImageInfo_height'>height()</a> }.
+
+### Return Value
+
+integral <a href='undocumented#Size'>size</a> of <a href='#SkImageInfo_width'>width()</a> and <a href='#SkImageInfo_height'>height()</a>
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_dimensions">
+
+#### Example Output
+
+~~~~
+dimensionsAsBounds == bounds
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_width'>width</a> <a href='#SkImageInfo_height'>height</a> <a href='#SkImageInfo_bounds'>bounds</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_dimensions'>dimensions</a>
+
+<a name='SkImageInfo_bounds'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkImageInfo_bounds'>bounds()</a>const
+</pre>
+
+Returns <a href='SkIRect_Reference#SkIRect'>SkIRect</a> { 0, 0, <a href='#SkImageInfo_width'>width()</a>, <a href='#SkImageInfo_height'>height()</a> }.
+
+### Return Value
+
+integral rectangle from origin to <a href='#SkImageInfo_width'>width()</a> and <a href='#SkImageInfo_height'>height()</a>
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_bounds"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_width'>width</a> <a href='#SkImageInfo_height'>height</a> <a href='#SkImageInfo_dimensions'>dimensions</a>
+
+<a name='SkImageInfo_gammaCloseToSRGB'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkImageInfo_gammaCloseToSRGB'>gammaCloseToSRGB</a>()const
+</pre>
+
+Returns true if associated <a href='#Color_Space'>Color_Space</a> is not nullptr, and <a href='#Color_Space'>Color_Space</a> gamma
+is approximately the same as sRGB.
+This includes the
+<a href='https://en.wikipedia.org/wiki/SRGB#The_sRGB_transfer_function_(%22gamma%22)'>sRGB transfer function</a></a> as well as a gamma <a href='undocumented#Curve'>curve</a> described by a 2.2 exponent.
+
+### Return Value
+
+true if <a href='#Color_Space'>Color_Space</a> gamma is approximately the same as sRGB
+
+### Example
+
+<div><fiddle-embed name="22df72732e898a11773fbfe07388a546"></fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#SkColorSpace'>SkColorSpace</a>::<a href='#SkColorSpace_gammaCloseToSRGB'>gammaCloseToSRGB</a>
+
+<a name='SkImageInfo_makeWH'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_makeWH'>makeWH</a>(int newWidth, int newHeight)const
+</pre>
+
+Creates <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> with the same <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a>, and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>,
+with dimensions set to width and height.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_makeWH_newWidth'><code><strong>newWidth</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> column count; must be zero or greater</td>
+  </tr>
+  <tr>    <td><a name='SkImageInfo_makeWH_newHeight'><code><strong>newHeight</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> row count; must be zero or greater</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_makeWH"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_Make'>Make</a> <a href='#SkImageInfo_makeAlphaType'>makeAlphaType</a> <a href='#SkImageInfo_makeColorSpace'>makeColorSpace</a> <a href='#SkImageInfo_makeColorType'>makeColorType</a>
+
+<a name='SkImageInfo_makeAlphaType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_makeAlphaType'>makeAlphaType</a>(<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> newAlphaType)const
+</pre>
+
+Creates <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> with same <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a>, width, and height,
+with <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> set to <a href='#SkImageInfo_makeAlphaType_newAlphaType'>newAlphaType</a>.
+
+Created <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> contains <a href='#SkImageInfo_makeAlphaType_newAlphaType'>newAlphaType</a> even if it is incompatible with
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, in which case <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> in <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> is ignored.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_makeAlphaType_newAlphaType'><code><strong>newAlphaType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+
+### Return Value
+
+created <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_makeAlphaType"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_Make'>Make</a> <a href='#SkImageInfo_MakeA8'>MakeA8</a> <a href='#SkImageInfo_makeColorType'>makeColorType</a> <a href='#SkImageInfo_makeColorSpace'>makeColorSpace</a>
+
+<a name='SkImageInfo_makeColorType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_makeColorType'>makeColorType</a>(<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> newColorType)const
+</pre>
+
+Creates <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> with same <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a>, width, and height,
+with <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> set to <a href='#SkImageInfo_makeColorType_newColorType'>newColorType</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_makeColorType_newColorType'><code><strong>newColorType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>, <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+### Return Value
+
+created <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_makeColorType"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_Make'>Make</a> <a href='#SkImageInfo_makeAlphaType'>makeAlphaType</a> <a href='#SkImageInfo_makeColorSpace'>makeColorSpace</a>
+
+<a name='SkImageInfo_makeColorSpace'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> <a href='#SkImageInfo_makeColorSpace'>makeColorSpace</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; cs)const
+</pre>
+
+Creates <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> with same <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, width, and height,
+with <a href='undocumented#SkColorSpace'>SkColorSpace</a> set to <a href='#SkImageInfo_makeColorSpace_cs'>cs</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_makeColorSpace_cs'><code><strong>cs</strong></code></a></td>
+    <td>range of colors; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="fe3c5a755d3dde29bba058a583f18901"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_Make'>Make</a> <a href='#SkImageInfo_MakeS32'>MakeS32</a> <a href='#SkImageInfo_makeAlphaType'>makeAlphaType</a> <a href='#SkImageInfo_makeColorType'>makeColorType</a>
+
+<a name='SkImageInfo_bytesPerPixel'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>()const
+</pre>
+
+Returns number of bytes per <a href='undocumented#Pixel'>pixel</a> required by <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>.
+Returns zero if <a href='#SkImageInfo_colorType'>colorType</a>( is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
+
+### Return Value
+
+bytes in <a href='undocumented#Pixel'>pixel</a>
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_bytesPerPixel"><a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+#### Example Output
+
+~~~~
+color: kUnknown_SkColorType      bytesPerPixel: 0
+color: kAlpha_8_SkColorType      bytesPerPixel: 1
+color: kRGB_565_SkColorType      bytesPerPixel: 2
+color: kARGB_4444_SkColorType    bytesPerPixel: 2
+color: kRGBA_8888_SkColorType    bytesPerPixel: 4
+color: kRGB_888x_SkColorType     bytesPerPixel: 4
+color: kBGRA_8888_SkColorType    bytesPerPixel: 4
+color: kRGBA_1010102_SkColorType bytesPerPixel: 4
+color: kRGB_101010x_SkColorType  bytesPerPixel: 4
+color: kGray_8_SkColorType       bytesPerPixel: 1
+color: kRGBA_F16_SkColorType     bytesPerPixel: 8
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_width'>width</a> <a href='#SkImageInfo_shiftPerPixel'>shiftPerPixel</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_bytesPerPixel'>bytesPerPixel</a>
+
+<a name='SkImageInfo_shiftPerPixel'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkImageInfo_shiftPerPixel'>shiftPerPixel</a>()const
+</pre>
+
+Returns bit shift converting row bytes to row pixels.
+Returns zero for <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
+
+### Return Value
+
+one of: 0, 1, 2, 3; left shift to convert pixels to bytes
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_shiftPerPixel"><a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+#### Example Output
+
+~~~~
+color: kUnknown_SkColorType       shiftPerPixel: 0
+color: kAlpha_8_SkColorType       shiftPerPixel: 0
+color: kRGB_565_SkColorType       shiftPerPixel: 1
+color: kARGB_4444_SkColorType     shiftPerPixel: 1
+color: kRGBA_8888_SkColorType     shiftPerPixel: 2
+color: kRGB_888x_SkColorType      shiftPerPixel: 2
+color: kBGRA_8888_SkColorType     shiftPerPixel: 2
+color: kRGBA_1010102_SkColorType  shiftPerPixel: 2
+color: kRGB_101010x_SkColorType   shiftPerPixel: 2
+color: kGray_8_SkColorType        shiftPerPixel: 0
+color: kRGBA_F16_SkColorType      shiftPerPixel: 3
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a> <a href='#SkImageInfo_minRowBytes'>minRowBytes</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_shiftPerPixel'>shiftPerPixel</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_shiftPerPixel'>shiftPerPixel</a>
+
+<a name='SkImageInfo_minRowBytes64'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint64_t <a href='#SkImageInfo_minRowBytes64'>minRowBytes64</a>()const
+</pre>
+
+Returns minimum bytes per row, computed from <a href='undocumented#Pixel'>pixel</a> <a href='#SkImageInfo_width'>width()</a> and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, which
+specifies <a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>(). <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> maximum value for row bytes must fit
+in 31 bits.
+
+### Return Value
+
+<a href='#SkImageInfo_width'>width()</a> times <a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>() as unsigned 64-bit integer
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_minRowBytes64">
+
+#### Example Output
+
+~~~~
+RGBA_F16 width 16777216 (0x01000000) OK
+RGBA_F16 width 33554432 (0x02000000) OK
+RGBA_F16 width 67108864 (0x04000000) OK
+RGBA_F16 width 134217728 (0x08000000) OK
+RGBA_F16 width 268435456 (0x10000000) too large
+RGBA_F16 width 536870912 (0x20000000) too large
+RGBA_F16 width 1073741824 (0x40000000) too large
+RGBA_F16 width -2147483648 (0x80000000) too large
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_minRowBytes'>minRowBytes</a> <a href='#SkImageInfo_computeByteSize'>computeByteSize</a> <a href='#SkImageInfo_computeMinByteSize'>computeMinByteSize</a> <a href='#SkImageInfo_validRowBytes'>validRowBytes</a>
+
+<a name='SkImageInfo_minRowBytes'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkImageInfo_minRowBytes'>minRowBytes</a>()const
+</pre>
+
+Returns minimum bytes per row, computed from <a href='undocumented#Pixel'>pixel</a> <a href='#SkImageInfo_width'>width()</a> and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, which
+specifies <a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>(). <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> maximum value for row bytes must fit
+in 31 bits.
+
+### Return Value
+
+<a href='#SkImageInfo_width'>width()</a> times <a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>() as signed 32-bit integer
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_minRowBytes">
+
+#### Example Output
+
+~~~~
+RGBA_F16 width 16777216 (0x01000000) OK
+RGBA_F16 width 33554432 (0x02000000) OK
+RGBA_F16 width 67108864 (0x04000000) OK
+RGBA_F16 width 134217728 (0x08000000) OK
+RGBA_F16 width 268435456 (0x10000000) too large
+RGBA_F16 width 536870912 (0x20000000) too large
+RGBA_F16 width 1073741824 (0x40000000) too large
+RGBA_F16 width -2147483648 (0x80000000) too large
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_minRowBytes64'>minRowBytes64</a> <a href='#SkImageInfo_computeByteSize'>computeByteSize</a> <a href='#SkImageInfo_computeMinByteSize'>computeMinByteSize</a> <a href='#SkImageInfo_validRowBytes'>validRowBytes</a>
+
+<a name='SkImageInfo_computeOffset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkImageInfo_computeOffset'>computeOffset</a>(int x, int y, size_t rowBytes)const
+</pre>
+
+Returns byte offset of <a href='undocumented#Pixel'>pixel</a> from <a href='undocumented#Pixel'>pixel</a> base address.
+
+Asserts in debug build if <a href='#SkImageInfo_computeOffset_x'>x</a> or <a href='#SkImageInfo_computeOffset_y'>y</a> is outside of bounds. Does not assert if
+<a href='#SkImageInfo_computeOffset_rowBytes'>rowBytes</a> is smaller than <a href='#SkImageInfo_minRowBytes'>minRowBytes</a>(), even though result may be incorrect.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_computeOffset_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkImageInfo_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkImageInfo_computeOffset_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkImageInfo_height'>height()</a></td>
+  </tr>
+  <tr>    <td><a name='SkImageInfo_computeOffset_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of <a href='undocumented#Pixel'>pixel</a> row or larger</td>
+  </tr>
+</table>
+
+### Return Value
+
+offset within <a href='undocumented#Pixel'>pixel</a> array
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_computeOffset"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_height'>height</a> <a href='#SkImageInfo_width'>width</a> <a href='#SkImageInfo_minRowBytes'>minRowBytes</a> <a href='#SkImageInfo_computeByteSize'>computeByteSize</a>
+
+<a name='SkImageInfo_equal1_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool operator==(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& other)const
+</pre>
+
+Compares <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> with <a href='#SkImageInfo_equal1_operator_other'>other</a>, and returns true if width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>,
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, and <a href='undocumented#SkColorSpace'>SkColorSpace</a> are equivalent.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_equal1_operator_other'><code><strong>other</strong></code></a></td>
+    <td><a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> equals <a href='#SkImageInfo_equal1_operator_other'>other</a>
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_equal1_operator">
+
+#### Example Output
+
+~~~~
+info1 != info2
+info1 != info2
+info1 != info2
+info1 == info2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_notequal1_operator'>operator!=</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& <a href='#SkImageInfo_equal1_operator_other'>other</a>) const <a href='undocumented#SkColorSpace'>SkColorSpace</a>::<a href='#SkColorSpace_Equals'>Equals</a>
+
+<a name='SkImageInfo_notequal1_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool operator!=(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& other)const
+</pre>
+
+Compares <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> with <a href='#SkImageInfo_notequal1_operator_other'>other</a>, and returns true if width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>,
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, and <a href='undocumented#SkColorSpace'>SkColorSpace</a> are not equivalent.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_notequal1_operator_other'><code><strong>other</strong></code></a></td>
+    <td><a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> is not equal to <a href='#SkImageInfo_notequal1_operator_other'>other</a>
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_notequal1_operator">
+
+#### Example Output
+
+~~~~
+info1 != info2
+info1 != info2
+info1 != info2
+info1 == info2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_equal1_operator'>operator==</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& <a href='#SkImageInfo_notequal1_operator_other'>other</a>) const <a href='undocumented#SkColorSpace'>SkColorSpace</a>::<a href='#SkColorSpace_Equals'>Equals</a>
+
+<a name='SkImageInfo_computeByteSize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkImageInfo_computeByteSize'>computeByteSize</a>(size_t rowBytes)const
+</pre>
+
+Returns storage required by <a href='undocumented#Pixel'>pixel</a> array, given <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> dimensions, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>,
+and <a href='#SkImageInfo_computeByteSize_rowBytes'>rowBytes</a>. <a href='#SkImageInfo_computeByteSize_rowBytes'>rowBytes</a> is assumed to be at least as large as <a href='#SkImageInfo_minRowBytes'>minRowBytes</a>().
+
+Returns zero if height is zero.
+Returns SIZE_MAX if answer exceeds the range of size_t.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_computeByteSize_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of <a href='undocumented#Pixel'>pixel</a> row or larger</td>
+  </tr>
+</table>
+
+### Return Value
+
+memory required by <a href='undocumented#Pixel'>pixel</a> buffer
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_computeByteSize"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_computeMinByteSize'>computeMinByteSize</a> <a href='#SkImageInfo_validRowBytes'>validRowBytes</a>
+
+<a name='SkImageInfo_computeMinByteSize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkImageInfo_computeMinByteSize'>computeMinByteSize</a>()const
+</pre>
+
+Returns storage required by <a href='undocumented#Pixel'>pixel</a> array, given <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> dimensions, and
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>. Uses <a href='#SkImageInfo_minRowBytes'>minRowBytes</a>() to compute bytes for <a href='undocumented#Pixel'>pixel</a> row.
+
+Returns zero if height is zero.
+Returns SIZE_MAX if answer exceeds the range of size_t.
+
+### Return Value
+
+least memory required by <a href='undocumented#Pixel'>pixel</a> buffer
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_computeMinByteSize"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_computeByteSize'>computeByteSize</a> <a href='#SkImageInfo_validRowBytes'>validRowBytes</a>
+
+<a name='SkImageInfo_ByteSizeOverflowed'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static bool <a href='#SkImageInfo_ByteSizeOverflowed'>ByteSizeOverflowed</a>(size_t byteSize)
+</pre>
+
+Returns true if <a href='#SkImageInfo_ByteSizeOverflowed_byteSize'>byteSize</a> equals SIZE_MAX. <a href='#SkImageInfo_computeByteSize'>computeByteSize</a>() and
+<a href='#SkImageInfo_computeMinByteSize'>computeMinByteSize</a>() return SIZE_MAX if size_t can not hold buffer <a href='undocumented#Size'>size</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_ByteSizeOverflowed_byteSize'><code><strong>byteSize</strong></code></a></td>
+    <td>result of <a href='#SkImageInfo_computeByteSize'>computeByteSize</a>() or <a href='#SkImageInfo_computeMinByteSize'>computeMinByteSize</a>()</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkImageInfo_computeByteSize'>computeByteSize</a>() or <a href='#SkImageInfo_computeMinByteSize'>computeMinByteSize</a>() result exceeds size_t
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_ByteSizeOverflowed">
+
+#### Example Output
+
+~~~~
+rowBytes:100000000 size:99999999900000008 overflowed:false
+rowBytes:1000000000 size:999999999000000008 overflowed:false
+rowBytes:10000000000 size:9999999990000000008 overflowed:false
+rowBytes:100000000000 size:18446744073709551615 overflowed:true
+rowBytes:1000000000000 size:18446744073709551615 overflowed:true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_computeByteSize'>computeByteSize</a> <a href='#SkImageInfo_computeMinByteSize'>computeMinByteSize</a> <a href='#SkImageInfo_validRowBytes'>validRowBytes</a>
+
+<a name='SkImageInfo_validRowBytes'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkImageInfo_validRowBytes'>validRowBytes</a>(size_t rowBytes)const
+</pre>
+
+Returns true if <a href='#SkImageInfo_validRowBytes_rowBytes'>rowBytes</a> is smaller than width times <a href='undocumented#Pixel'>pixel</a> <a href='undocumented#Size'>size</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImageInfo_validRowBytes_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of <a href='undocumented#Pixel'>pixel</a> row or larger</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkImageInfo_validRowBytes_rowBytes'>rowBytes</a> is large enough to contain <a href='undocumented#Pixel'>pixel</a> row
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_validRowBytes">
+
+#### Example Output
+
+~~~~
+validRowBytes(60): false
+validRowBytes(64): true
+validRowBytes(68): true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_ByteSizeOverflowed'>ByteSizeOverflowed</a> <a href='#SkImageInfo_computeByteSize'>computeByteSize</a> <a href='#SkImageInfo_computeMinByteSize'>computeMinByteSize</a>
+
+<a name='SkImageInfo_reset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkImageInfo_reset'>reset()</a>
+</pre>
+
+Creates an empty <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> with <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>,
+a width and height of zero, and no <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+
+### Example
+
+<div><fiddle-embed name="@ImageInfo_reset">
+
+#### Example Output
+
+~~~~
+info == copy
+info != reset copy
+SkImageInfo() == reset copy
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImageInfo_empty_constructor'>SkImageInfo()</a>
+
+<a name='Utility'></a>
+
+<a name='SkImageInfo_validate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkImageInfo_validate'>validate()</a>const
+</pre>
+
+### See Also
+
+<a href='#SkImageInfo_validRowBytes'>validRowBytes</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_validate'>validate</a>
+
diff --git a/src/third_party/skia/site/user/api/SkImage_Reference.md b/src/third_party/skia/site/user/api/SkImage_Reference.md
new file mode 100644
index 0000000..01d0bc5
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkImage_Reference.md
@@ -0,0 +1,2624 @@
+SkImage Reference
+===
+
+
+<a name='SkImage'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkImage_Reference#SkImage'>SkImage</a> : public <a href='undocumented#SkRefCnt'>SkRefCnt</a> {
+
+    typedef void* <a href='#SkImage_ReleaseContext'>ReleaseContext</a>;
+
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeRasterCopy'>MakeRasterCopy</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& <a href='SkPixmap_Reference#Pixmap'>pixmap</a>);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeRasterData'>MakeRasterData</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkData'>SkData</a>> pixels,
+                                         size_t rowBytes);
+
+    typedef void (*<a href='#SkImage_RasterReleaseProc'>RasterReleaseProc</a>)(const void* pixels, <a href='#SkImage_ReleaseContext'>ReleaseContext</a>);
+
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromRaster'>MakeFromRaster</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& <a href='SkPixmap_Reference#Pixmap'>pixmap</a>,
+                                         <a href='#SkImage_RasterReleaseProc'>RasterReleaseProc</a> rasterReleaseProc,
+                                         <a href='#SkImage_ReleaseContext'>ReleaseContext</a> releaseContext);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromBitmap'>MakeFromBitmap</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromGenerator'>MakeFromGenerator</a>(std::unique_ptr<<a href='undocumented#SkImageGenerator'>SkImageGenerator</a>> imageGenerator,
+                                            const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>* subset = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromEncoded'>MakeFromEncoded</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkData'>SkData</a>> encoded, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>* subset = nullptr);
+
+    typedef void (*<a href='#SkImage_TextureReleaseProc'>TextureReleaseProc</a>)(<a href='#SkImage_ReleaseContext'>ReleaseContext</a> releaseContext);
+
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromTexture'>MakeFromTexture</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                          const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+                                          <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> origin,
+                                          <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkImage_colorType'>colorType</a>,
+                                          <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImage_alphaType'>alphaType</a>,
+                                          <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> <a href='#SkImage_colorSpace'>colorSpace</a>);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromTexture'>MakeFromTexture</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                          const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+                                          <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> origin,
+                                          <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkImage_colorType'>colorType</a>,
+                                          <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImage_alphaType'>alphaType</a>,
+                                          <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> <a href='#SkImage_colorSpace'>colorSpace</a>,
+                                          <a href='#SkImage_TextureReleaseProc'>TextureReleaseProc</a> textureReleaseProc,
+                                          <a href='#SkImage_ReleaseContext'>ReleaseContext</a> releaseContext);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeCrossContextFromEncoded'>MakeCrossContextFromEncoded</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkData'>SkData</a>> <a href='undocumented#Data'>data</a>,
+                                                      bool buildMips, <a href='undocumented#SkColorSpace'>SkColorSpace</a>* dstColorSpace,
+                                                      bool limitToMaxTextureSize = false);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeCrossContextFromPixmap'>MakeCrossContextFromPixmap</a>(<a href='undocumented#GrContext'>GrContext</a>* context, const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& <a href='SkPixmap_Reference#Pixmap'>pixmap</a>,
+                                                     bool buildMips, <a href='undocumented#SkColorSpace'>SkColorSpace</a>* dstColorSpace,
+                                                     bool limitToMaxTextureSize = false);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromAdoptedTexture'>MakeFromAdoptedTexture</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                                 const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+                                                 <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> surfaceOrigin,
+                                                 <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkImage_colorType'>colorType</a>,
+                                                 <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImage_alphaType'>alphaType</a> = <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+                                                 <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> <a href='#SkImage_colorSpace'>colorSpace</a> = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromYUVATexturesCopy'>MakeFromYUVATexturesCopy</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                                   <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace,
+                                                   const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> yuvaTextures[],
+                                                   const <a href='undocumented#SkYUVAIndex'>SkYUVAIndex</a> yuvaIndices[4],
+                                                   <a href='undocumented#SkISize'>SkISize</a> imageSize,
+                                                   <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin,
+                                                   <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> imageColorSpace = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromYUVATexturesCopyWithExternalBackend'>MakeFromYUVATexturesCopyWithExternalBackend</a>(
+            <a href='undocumented#GrContext'>GrContext</a>* context,
+            <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace,
+            const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> yuvaTextures[],
+            const <a href='undocumented#SkYUVAIndex'>SkYUVAIndex</a> yuvaIndices[4],
+            <a href='undocumented#SkISize'>SkISize</a> imageSize,
+            <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin,
+            const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+            <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> imageColorSpace = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromYUVATextures'>MakeFromYUVATextures</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                               <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace,
+                                               const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> yuvaTextures[],
+                                               const <a href='undocumented#SkYUVAIndex'>SkYUVAIndex</a> yuvaIndices[4],
+                                               <a href='undocumented#SkISize'>SkISize</a> imageSize,
+                                               <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin,
+                                               <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> imageColorSpace = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromYUVAPixmaps'>MakeFromYUVAPixmaps</a>(
+            <a href='undocumented#GrContext'>GrContext</a>* context, <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace, const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> yuvaPixmaps[],
+            const <a href='undocumented#SkYUVAIndex'>SkYUVAIndex</a> yuvaIndices[4], <a href='undocumented#SkISize'>SkISize</a> imageSize, <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin,
+            bool buildMips, bool limitToMaxTextureSize = false,
+            <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> imageColorSpace = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromYUVTexturesCopy'>MakeFromYUVTexturesCopy</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace,
+                                                  const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> yuvTextures[3],
+                                                  <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin,
+                                                  <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> imageColorSpace = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromYUVTexturesCopyWithExternalBackend'>MakeFromYUVTexturesCopyWithExternalBackend</a>(
+            <a href='undocumented#GrContext'>GrContext</a>* context, <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace,
+            const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> yuvTextures[3], <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin,
+            const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture, <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> imageColorSpace = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromNV12TexturesCopy'>MakeFromNV12TexturesCopy</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                                   <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace,
+                                                   const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> nv12Textures[2],
+                                                   <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin,
+                                                   <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> imageColorSpace = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromNV12TexturesCopyWithExternalBackend'>MakeFromNV12TexturesCopyWithExternalBackend</a>(
+            <a href='undocumented#GrContext'>GrContext</a>* context,
+            <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace,
+            const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> nv12Textures[2],
+            <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin,
+            const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+            <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> imageColorSpace = nullptr);
+
+    enum class <a href='#SkImage_BitDepth'>BitDepth</a> {
+        kU8,
+        kF16,
+    };
+
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromPicture'>MakeFromPicture</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='SkPicture_Reference#SkPicture'>SkPicture</a>> <a href='SkPicture_Reference#Picture'>picture</a>, const <a href='undocumented#SkISize'>SkISize</a>& dimensions,
+                                          const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* <a href='SkMatrix_Reference#Matrix'>matrix</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>,
+                                          <a href='#SkImage_BitDepth'>BitDepth</a> bitDepth,
+                                          <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> <a href='#SkImage_colorSpace'>colorSpace</a>);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_MakeFromAHardwareBuffer'>MakeFromAHardwareBuffer</a>(
+            AHardwareBuffer* hardwareBuffer,
+            <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImage_alphaType'>alphaType</a> = <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+            <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> <a href='#SkImage_colorSpace'>colorSpace</a> = nullptr,
+            <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> surfaceOrigin = <a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a>);
+    int <a href='#SkImage_width'>width()</a> const;
+    int <a href='#SkImage_height'>height()</a> const;
+    <a href='undocumented#SkISize'>SkISize</a> <a href='#SkImage_dimensions'>dimensions()</a> const;
+    <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkImage_bounds'>bounds()</a> const;
+    uint32_t <a href='#SkImage_uniqueID'>uniqueID</a>() const;
+    <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImage_alphaType'>alphaType</a>() const;
+    <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkImage_colorType'>colorType</a>() const;
+    <a href='undocumented#SkColorSpace'>SkColorSpace</a>* <a href='#SkImage_colorSpace'>colorSpace</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> <a href='#SkImage_refColorSpace'>refColorSpace</a>() const;
+    bool <a href='#SkImage_isAlphaOnly'>isAlphaOnly</a>() const;
+    bool <a href='#SkImage_isOpaque'>isOpaque</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkShader'>SkShader</a>> <a href='#SkImage_makeShader'>makeShader</a>(<a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_TileMode'>TileMode</a> tileMode1, <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_TileMode'>TileMode</a> tileMode2,
+                               const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* localMatrix = nullptr) const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkShader'>SkShader</a>> <a href='#SkImage_makeShader'>makeShader</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* localMatrix = nullptr) const;
+    bool <a href='#SkImage_peekPixels'>peekPixels</a>(<a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>* <a href='SkPixmap_Reference#Pixmap'>pixmap</a>) const;
+    bool <a href='#SkImage_isTextureBacked'>isTextureBacked</a>() const;
+    bool <a href='#SkImage_isValid'>isValid</a>(<a href='undocumented#GrContext'>GrContext</a>* context) const;
+    <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> <a href='#SkImage_getBackendTexture'>getBackendTexture</a>(bool flushPendingGrContextIO,
+                                       <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a>* origin = nullptr) const;
+
+    enum <a href='#SkImage_CachingHint'>CachingHint</a> {
+        <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a>,
+        <a href='#SkImage_kDisallow_CachingHint'>kDisallow_CachingHint</a>,
+    };
+
+    bool <a href='#SkImage_readPixels'>readPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& dstInfo, void* dstPixels, size_t dstRowBytes,
+                    int srcX, int srcY, <a href='#SkImage_CachingHint'>CachingHint</a> cachingHint = <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a>) const;
+    bool <a href='#SkImage_readPixels'>readPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst, int srcX, int srcY,
+                    <a href='#SkImage_CachingHint'>CachingHint</a> cachingHint = <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a>) const;
+    bool <a href='#SkImage_scalePixels'>scalePixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst, <a href='undocumented#SkFilterQuality'>SkFilterQuality</a> filterQuality,
+                     <a href='#SkImage_CachingHint'>CachingHint</a> cachingHint = <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a>) const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkData'>SkData</a>> <a href='#SkImage_encodeToData'>encodeToData</a>(<a href='undocumented#SkEncodedImageFormat'>SkEncodedImageFormat</a> encodedImageFormat, int quality) const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkData'>SkData</a>> <a href='#SkImage_encodeToData'>encodeToData</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkData'>SkData</a>> <a href='#SkImage_refEncodedData'>refEncodedData</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_makeSubset'>makeSubset</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& subset) const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_makeTextureImage'>makeTextureImage</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='undocumented#SkColorSpace'>SkColorSpace</a>* dstColorSpace,
+                                    <a href='undocumented#GrMipMapped'>GrMipMapped</a> mipMapped = <a href='undocumented#GrMipMapped'>GrMipMapped</a>::<a href='#GrMipMapped_kNo'>kNo</a>) const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_makeNonTextureImage'>makeNonTextureImage</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_makeRasterImage'>makeRasterImage</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_makeWithFilter'>makeWithFilter</a>(const <a href='undocumented#SkImageFilter'>SkImageFilter</a>* filter, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& subset,
+                                  const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& clipBounds, <a href='SkIRect_Reference#SkIRect'>SkIRect</a>* outSubset,
+                                  <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>* offset) const;
+
+    typedef std::function<void(<a href='undocumented#GrBackendTexture'>GrBackendTexture</a>)> <a href='#SkImage_BackendTextureReleaseProc'>BackendTextureReleaseProc</a>;
+
+    static bool <a href='#SkImage_MakeBackendTextureFromSkImage'>MakeBackendTextureFromSkImage</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                              <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='SkImage_Reference#Image'>image</a>,
+                                              <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>* backendTexture,
+                                              <a href='#SkImage_BackendTextureReleaseProc'>BackendTextureReleaseProc</a>* backendTextureReleaseProc);
+    bool <a href='#SkImage_isLazyGenerated'>isLazyGenerated</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkImage_makeColorSpace'>makeColorSpace</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> target) const;
+};
+
+</pre>
+
+<a href='SkImage_Reference#Image'>Image</a> describes a two dimensional array of pixels to draw. The pixels may be
+decoded in a <a href='#Raster_Bitmap'>Raster_Bitmap</a>, encoded in a <a href='SkPicture_Reference#Picture'>Picture</a> or compressed <a href='undocumented#Data'>data</a> <a href='SkStream_Reference#Stream'>stream</a>,
+or located in GPU memory as a <a href='#GPU_Texture'>GPU_Texture</a>.
+
+<a href='SkImage_Reference#Image'>Image</a> cannot be modified after it is created. <a href='SkImage_Reference#Image'>Image</a> may allocate additional
+storage as needed; for instance, an encoded <a href='SkImage_Reference#Image'>Image</a> may decode when drawn.
+
+<a href='SkImage_Reference#Image'>Image</a> width and height are greater than zero. Creating an <a href='SkImage_Reference#Image'>Image</a> with zero width
+or height returns <a href='SkImage_Reference#Image'>Image</a> equal to nullptr.
+
+<a href='SkImage_Reference#Image'>Image</a> may be created from <a href='SkBitmap_Reference#Bitmap'>Bitmap</a>, <a href='SkPixmap_Reference#Pixmap'>Pixmap</a>, <a href='SkSurface_Reference#Surface'>Surface</a>, <a href='SkPicture_Reference#Picture'>Picture</a>, encoded streams,
+<a href='#GPU_Texture'>GPU_Texture</a>, <a href='#Image_Info_YUV_ColorSpace'>YUV_ColorSpace</a> <a href='undocumented#Data'>data</a>, or hardware buffer. Encoded streams supported
+include BMP, GIF, HEIF, ICO, JPEG, PNG, WBMP, WebP. Supported encoding details
+vary with platform.
+
+<a name='Raster_Image'></a>
+
+<a href='#Image_Raster_Image'>Raster_Image</a> pixels are decoded in a <a href='#Raster_Bitmap'>Raster_Bitmap</a>. These pixels may be read
+directly and in most cases written to, although edited pixels may not be drawn
+if <a href='SkImage_Reference#Image'>Image</a> has been copied internally.
+
+<a name='Texture_Image'></a>
+
+<a href='#Image_Texture_Image'>Texture_Image</a> are located on GPU and pixels are not accessible. <a href='#Image_Texture_Image'>Texture_Image</a>
+are allocated optimally for best performance. <a href='#Image_Raster_Image'>Raster_Image</a> may
+be drawn to <a href='#GPU_Surface'>GPU_Surface</a>, but pixels are uploaded from CPU to GPU downgrading
+performance.
+
+<a name='Lazy_Image'></a>
+
+<a href='#Image_Lazy_Image'>Lazy_Image</a> defer allocating buffer for <a href='SkImage_Reference#Image'>Image</a> pixels and decoding <a href='SkStream_Reference#Stream'>stream</a> until
+<a href='SkImage_Reference#Image'>Image</a> is drawn. <a href='#Image_Lazy_Image'>Lazy_Image</a> caches result if possible to speed up repeated
+drawing.
+
+<a name='SkImage_MakeRasterCopy'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeRasterCopy'>MakeRasterCopy</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& <a href='SkPixmap_Reference#Pixmap'>pixmap</a>)
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> and copy of pixels. Since pixels are copied, <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>
+pixels may be modified or deleted without affecting <a href='SkImage_Reference#SkImage'>SkImage</a>.
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> is returned if <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> is valid. Valid <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> parameters include:
+dimensions are greater than zero;
+each dimension fits in 29 bits;
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> are valid, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>;
+row bytes are large enough to hold one row of pixels;
+<a href='undocumented#Pixel'>pixel</a> address is not nullptr.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeRasterCopy_pixmap'><code><strong>pixmap</strong></code></a></td>
+    <td><a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, <a href='undocumented#Pixel'>pixel</a> address, and row bytes</td>
+  </tr>
+</table>
+
+### Return Value
+
+copy of <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> pixels, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Image_MakeRasterCopy"><div>Draw a five by five <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, and draw a copy in an <a href='SkImage_Reference#Image'>Image</a>. Editing the <a href='#SkImage_MakeRasterCopy_pixmap'>pixmap</a>
+alters the  <a href='SkBitmap_Reference#Bitmap_Draw'>bitmap draw</a>, but does not alter the <a href='SkImage_Reference#Image'>Image</a> draw since the <a href='SkImage_Reference#Image'>Image</a>
+contains a copy of the pixels.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeRasterData'>MakeRasterData</a> <a href='#SkImage_MakeFromGenerator'>MakeFromGenerator</a>
+
+<a name='SkImage_MakeRasterData'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeRasterData'>MakeRasterData</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkData'>SkData</a>&gt; pixels, size_t rowBytes)
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, sharing <a href='#SkImage_MakeRasterData_pixels'>pixels</a>.
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> is returned if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> is valid. Valid <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> parameters include:
+dimensions are greater than zero;
+each dimension fits in 29 bits;
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> are valid, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>;
+<a href='#SkImage_MakeRasterData_rowBytes'>rowBytes</a> are large enough to hold one row of <a href='#SkImage_MakeRasterData_pixels'>pixels</a>;
+<a href='#SkImage_MakeRasterData_pixels'>pixels</a> is not nullptr, and contains enough <a href='undocumented#Data'>data</a> for <a href='SkImage_Reference#SkImage'>SkImage</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeRasterData_info'><code><strong>info</strong></code></a></td>
+    <td>contains width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeRasterData_pixels'><code><strong>pixels</strong></code></a></td>
+    <td>address or  <a href='undocumented#Pixel_Storage'>pixel storage</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeRasterData_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of <a href='undocumented#Pixel'>pixel</a> row or larger</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> sharing <a href='#SkImage_MakeRasterData_pixels'>pixels</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Image_MakeRasterData"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeRasterCopy'>MakeRasterCopy</a> <a href='#SkImage_MakeFromGenerator'>MakeFromGenerator</a>
+
+<a name='SkImage_ReleaseContext'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    typedef void* <a href='#SkImage_ReleaseContext'>ReleaseContext</a>;
+</pre>
+
+Caller <a href='undocumented#Data'>data</a> passed to <a href='#SkImage_RasterReleaseProc'>RasterReleaseProc</a>; may be nullptr.
+
+### See Also
+
+<a href='#SkImage_MakeFromRaster'>MakeFromRaster</a> <a href='#SkImage_RasterReleaseProc'>RasterReleaseProc</a>
+
+<a name='SkImage_RasterReleaseProc'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    typedef void (*<a href='#SkImage_RasterReleaseProc'>RasterReleaseProc</a>)(const void* pixels, <a href='#SkImage_ReleaseContext'>ReleaseContext</a>);
+</pre>
+
+Function called when <a href='SkImage_Reference#Image'>Image</a> no longer shares pixels. <a href='#SkImage_ReleaseContext'>ReleaseContext</a> is
+provided by caller when <a href='SkImage_Reference#Image'>Image</a> is created, and may be nullptr.
+
+### See Also
+
+<a href='#SkImage_ReleaseContext'>ReleaseContext</a> <a href='#SkImage_MakeFromRaster'>MakeFromRaster</a>
+
+<a name='SkImage_MakeFromRaster'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromRaster'>MakeFromRaster</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& <a href='SkPixmap_Reference#Pixmap'>pixmap</a>, <a href='#SkImage_RasterReleaseProc'>RasterReleaseProc</a> rasterReleaseProc,
+                                     <a href='#SkImage_ReleaseContext'>ReleaseContext</a> releaseContext)
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from <a href='#SkImage_MakeFromRaster_pixmap'>pixmap</a>, sharing <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> pixels. Pixels must remain valid and
+unchanged until <a href='#SkImage_MakeFromRaster_rasterReleaseProc'>rasterReleaseProc</a> is called. <a href='#SkImage_MakeFromRaster_rasterReleaseProc'>rasterReleaseProc</a> is passed
+<a href='#SkImage_MakeFromRaster_releaseContext'>releaseContext</a> when <a href='SkImage_Reference#SkImage'>SkImage</a> is deleted or no longer refers to  <a href='SkPixmap_Reference#Pixmap_Pixels'>pixmap pixels</a>.
+
+Pass nullptr for <a href='#SkImage_MakeFromRaster_rasterReleaseProc'>rasterReleaseProc</a> to share <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> without requiring a callback
+when <a href='SkImage_Reference#SkImage'>SkImage</a> is released. Pass nullptr for <a href='#SkImage_MakeFromRaster_releaseContext'>releaseContext</a> if <a href='#SkImage_MakeFromRaster_rasterReleaseProc'>rasterReleaseProc</a>
+does not require state.
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> is returned if <a href='#SkImage_MakeFromRaster_pixmap'>pixmap</a> is valid. Valid <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> parameters include:
+dimensions are greater than zero;
+each dimension fits in 29 bits;
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> are valid, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>;
+row bytes are large enough to hold one row of pixels;
+<a href='undocumented#Pixel'>pixel</a> address is not nullptr.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromRaster_pixmap'><code><strong>pixmap</strong></code></a></td>
+    <td><a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, <a href='undocumented#Pixel'>pixel</a> address, and row bytes</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromRaster_rasterReleaseProc'><code><strong>rasterReleaseProc</strong></code></a></td>
+    <td>function called when pixels can be released; or nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromRaster_releaseContext'><code><strong>releaseContext</strong></code></a></td>
+    <td>state passed to <a href='#SkImage_MakeFromRaster_rasterReleaseProc'>rasterReleaseProc</a>; or nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> sharing <a href='#SkImage_MakeFromRaster_pixmap'>pixmap</a>
+
+### Example
+
+<div><fiddle-embed name="@Image_MakeFromRaster">
+
+#### Example Output
+
+~~~~
+before reset: 0
+after reset: 1
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeRasterCopy'>MakeRasterCopy</a> <a href='#SkImage_MakeRasterData'>MakeRasterData</a> <a href='#SkImage_MakeFromGenerator'>MakeFromGenerator</a> <a href='#SkImage_RasterReleaseProc'>RasterReleaseProc</a> <a href='#SkImage_ReleaseContext'>ReleaseContext</a>
+
+<a name='SkImage_MakeFromBitmap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromBitmap'>MakeFromBitmap</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& <a href='SkBitmap_Reference#Bitmap'>bitmap</a>)
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from <a href='#SkImage_MakeFromBitmap_bitmap'>bitmap</a>, sharing or copying  <a href='SkBitmap_Reference#Bitmap_Pixels'>bitmap pixels</a>. If the <a href='#SkImage_MakeFromBitmap_bitmap'>bitmap</a>
+is marked immutable, and its <a href='undocumented#Pixel'>pixel</a> memory is shareable, it may be shared
+instead of copied.
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> is returned if <a href='#SkImage_MakeFromBitmap_bitmap'>bitmap</a> is valid. Valid <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> parameters include:
+dimensions are greater than zero;
+each dimension fits in 29 bits;
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> are valid, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>;
+row bytes are large enough to hold one row of pixels;
+<a href='undocumented#Pixel'>pixel</a> address is not nullptr.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromBitmap_bitmap'><code><strong>bitmap</strong></code></a></td>
+    <td><a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, row bytes, and pixels</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Image_MakeFromBitmap"><div>The first <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> is shared; writing to the <a href='undocumented#Pixel'>pixel</a> memory changes the first
+<a href='SkImage_Reference#Image'>Image</a>.
+The second <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> is marked immutable, and is copied; writing to the <a href='undocumented#Pixel'>pixel</a>
+memory does not alter the second <a href='SkImage_Reference#Image'>Image</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeFromRaster'>MakeFromRaster</a> <a href='#SkImage_MakeRasterCopy'>MakeRasterCopy</a> <a href='#SkImage_MakeFromGenerator'>MakeFromGenerator</a> <a href='#SkImage_MakeRasterData'>MakeRasterData</a>
+
+<a name='SkImage_MakeFromGenerator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromGenerator'>MakeFromGenerator</a>(std::unique_ptr&lt;<a href='undocumented#SkImageGenerator'>SkImageGenerator</a>&gt; imageGenerator,
+                                 const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>* subset = nullptr)
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from <a href='undocumented#Data'>data</a> returned by <a href='#SkImage_MakeFromGenerator_imageGenerator'>imageGenerator</a>. Generated <a href='undocumented#Data'>data</a> is owned by <a href='SkImage_Reference#SkImage'>SkImage</a> and
+may not be shared or accessed.
+
+<a href='#SkImage_MakeFromGenerator_subset'>subset</a> allows selecting a portion of the full <a href='SkImage_Reference#Image'>image</a>. Pass nullptr to select the entire
+<a href='SkImage_Reference#Image'>image</a>; otherwise, <a href='#SkImage_MakeFromGenerator_subset'>subset</a> must be contained by <a href='SkImage_Reference#Image'>image</a> bounds.
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> is returned if generator <a href='undocumented#Data'>data</a> is valid. Valid <a href='undocumented#Data'>data</a> parameters vary by type of <a href='undocumented#Data'>data</a>
+and platform.
+
+<a href='#SkImage_MakeFromGenerator_imageGenerator'>imageGenerator</a> may wrap <a href='SkPicture_Reference#SkPicture'>SkPicture</a> <a href='undocumented#Data'>data</a>, codec <a href='undocumented#Data'>data</a>, or custom <a href='undocumented#Data'>data</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromGenerator_imageGenerator'><code><strong>imageGenerator</strong></code></a></td>
+    <td>stock or custom routines to retrieve <a href='SkImage_Reference#SkImage'>SkImage</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromGenerator_subset'><code><strong>subset</strong></code></a></td>
+    <td>bounds of returned <a href='SkImage_Reference#SkImage'>SkImage</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Image_MakeFromGenerator"><div>The generator returning <a href='SkPicture_Reference#Picture'>Picture</a> cannot be shared; std::move transfers ownership to generated <a href='SkImage_Reference#Image'>Image</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeFromEncoded'>MakeFromEncoded</a>
+
+<a name='SkImage_MakeFromEncoded'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromEncoded'>MakeFromEncoded</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkData'>SkData</a>&gt; encoded, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>* subset = nullptr)
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from <a href='#SkImage_MakeFromEncoded_encoded'>encoded</a> <a href='undocumented#Data'>data</a>.
+<a href='#SkImage_MakeFromEncoded_subset'>subset</a> allows selecting a portion of the full <a href='SkImage_Reference#Image'>image</a>. Pass nullptr to select the entire
+<a href='SkImage_Reference#Image'>image</a>; otherwise, <a href='#SkImage_MakeFromEncoded_subset'>subset</a> must be contained by <a href='SkImage_Reference#Image'>image</a> bounds.
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> is returned if format of the <a href='#SkImage_MakeFromEncoded_encoded'>encoded</a> <a href='undocumented#Data'>data</a> is recognized and supported.
+Recognized formats vary by platform.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromEncoded_encoded'><code><strong>encoded</strong></code></a></td>
+    <td><a href='undocumented#Data'>data</a> of <a href='SkImage_Reference#SkImage'>SkImage</a> to decode</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromEncoded_subset'><code><strong>subset</strong></code></a></td>
+    <td>bounds of returned <a href='SkImage_Reference#SkImage'>SkImage</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Image_MakeFromEncoded"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeFromGenerator'>MakeFromGenerator</a>
+
+<a name='SkImage_TextureReleaseProc'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    typedef void (*<a href='#SkImage_TextureReleaseProc'>TextureReleaseProc</a>)(<a href='#SkImage_ReleaseContext'>ReleaseContext</a> releaseContext);
+</pre>
+
+User function called when supplied <a href='undocumented#Texture'>texture</a> may be deleted.
+
+### See Also
+
+<a href='#SkImage_MakeFromTexture'>MakeFromTexture</a>
+
+<a name='SkImage_MakeFromTexture'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromTexture'>MakeFromTexture</a>(<a href='undocumented#GrContext'>GrContext</a>* context, const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+                                      <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> origin, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkImage_colorType'>colorType</a>,
+                                      <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImage_alphaType'>alphaType</a>, <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; <a href='#SkImage_colorSpace'>colorSpace</a>)
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from  <a href='undocumented#GPU_Texture'>GPU texture</a> associated with <a href='#SkImage_MakeFromTexture_context'>context</a>. Caller is responsible for
+managing the lifetime of  <a href='undocumented#GPU_Texture'>GPU texture</a>.
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> is returned if format of <a href='#SkImage_MakeFromTexture_backendTexture'>backendTexture</a> is recognized and supported.
+Recognized formats vary by GPU back-end.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromTexture_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromTexture_backendTexture'><code><strong>backendTexture</strong></code></a></td>
+    <td><a href='undocumented#Texture'>texture</a> residing on GPU</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromTexture_origin'><code><strong>origin</strong></code></a></td>
+    <td>one of: <a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>, <a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromTexture_colorType'><code><strong>colorType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>, <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromTexture_alphaType'><code><strong>alphaType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromTexture_colorSpace'><code><strong>colorSpace</strong></code></a></td>
+    <td>range of colors; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Image_MakeFromTexture" gpu="true"><div>A back-end <a href='undocumented#Texture'>texture</a> has been created and uploaded to the GPU outside of this example.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeFromAdoptedTexture'>MakeFromAdoptedTexture</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_MakeFromBackendTexture'>MakeFromBackendTexture</a>
+
+<a name='SkImage_MakeFromTexture_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromTexture'>MakeFromTexture</a>(<a href='undocumented#GrContext'>GrContext</a>* context, const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+                                      <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> origin, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkImage_colorType'>colorType</a>,
+                                      <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImage_alphaType'>alphaType</a>, <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; <a href='#SkImage_colorSpace'>colorSpace</a>,
+                                      <a href='#SkImage_TextureReleaseProc'>TextureReleaseProc</a> textureReleaseProc,
+                                      <a href='#SkImage_ReleaseContext'>ReleaseContext</a> releaseContext)
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from  <a href='undocumented#GPU_Texture'>GPU texture</a> associated with <a href='#SkImage_MakeFromTexture_2_context'>context</a>.  <a href='undocumented#GPU_Texture'>GPU texture</a> must stay
+valid and unchanged until <a href='#SkImage_MakeFromTexture_2_textureReleaseProc'>textureReleaseProc</a> is called. <a href='#SkImage_MakeFromTexture_2_textureReleaseProc'>textureReleaseProc</a> is
+passed <a href='#SkImage_MakeFromTexture_2_releaseContext'>releaseContext</a> when <a href='SkImage_Reference#SkImage'>SkImage</a> is deleted or no longer refers to <a href='undocumented#Texture'>texture</a>.
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> is returned if format of <a href='#SkImage_MakeFromTexture_2_backendTexture'>backendTexture</a> is recognized and supported.
+Recognized formats vary by GPU back-end.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromTexture_2_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromTexture_2_backendTexture'><code><strong>backendTexture</strong></code></a></td>
+    <td><a href='undocumented#Texture'>texture</a> residing on GPU</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromTexture_2_origin'><code><strong>origin</strong></code></a></td>
+    <td>one of: <a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>, <a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromTexture_2_colorType'><code><strong>colorType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>, <a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>, <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromTexture_2_alphaType'><code><strong>alphaType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromTexture_2_colorSpace'><code><strong>colorSpace</strong></code></a></td>
+    <td>range of colors; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromTexture_2_textureReleaseProc'><code><strong>textureReleaseProc</strong></code></a></td>
+    <td>function called when <a href='undocumented#Texture'>texture</a> can be released</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromTexture_2_releaseContext'><code><strong>releaseContext</strong></code></a></td>
+    <td>state passed to <a href='#SkImage_MakeFromTexture_2_textureReleaseProc'>textureReleaseProc</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Image_MakeFromTexture_2" gpu="true"><div><a href='#SkImage_MakeFromTexture_2_textureReleaseProc'>textureReleaseProc</a> may be called at some later <a href='SkPoint_Reference#Point'>point</a> in time. In this example,
+<a href='#SkImage_MakeFromTexture_2_textureReleaseProc'>textureReleaseProc</a> has no effect on the drawing.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeFromAdoptedTexture'>MakeFromAdoptedTexture</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_MakeFromBackendTexture'>MakeFromBackendTexture</a>
+
+<a name='SkImage_MakeCrossContextFromEncoded'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeCrossContextFromEncoded'>MakeCrossContextFromEncoded</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkData'>SkData</a>&gt; <a href='undocumented#Data'>data</a>,
+                                                  bool buildMips, <a href='undocumented#SkColorSpace'>SkColorSpace</a>* dstColorSpace,
+                                                  bool limitToMaxTextureSize = false)
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from encoded <a href='#SkImage_MakeCrossContextFromEncoded_data'>data</a>. <a href='SkImage_Reference#SkImage'>SkImage</a> is uploaded to GPU back-end using <a href='#SkImage_MakeCrossContextFromEncoded_context'>context</a>.
+
+Created <a href='SkImage_Reference#SkImage'>SkImage</a> is available to other GPU contexts, and is available across thread
+boundaries. All contexts must be in the same   <a href='undocumented#GPU_Share_Group'>GPU share group</a>, or otherwise
+share resources.
+
+When <a href='SkImage_Reference#SkImage'>SkImage</a> is no longer referenced, <a href='#SkImage_MakeCrossContextFromEncoded_context'>context</a> releases <a href='undocumented#Texture'>texture</a> memory
+asynchronously.
+
+<a href='undocumented#GrBackendTexture'>GrBackendTexture</a> decoded from <a href='#SkImage_MakeCrossContextFromEncoded_data'>data</a> is uploaded to match <a href='SkSurface_Reference#SkSurface'>SkSurface</a> created with
+<a href='#SkImage_MakeCrossContextFromEncoded_dstColorSpace'>dstColorSpace</a>. <a href='undocumented#SkColorSpace'>SkColorSpace</a> of <a href='SkImage_Reference#SkImage'>SkImage</a> is determined by encoded <a href='#SkImage_MakeCrossContextFromEncoded_data'>data</a>.
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> is returned if format of <a href='#SkImage_MakeCrossContextFromEncoded_data'>data</a> is recognized and supported, and if <a href='#SkImage_MakeCrossContextFromEncoded_context'>context</a>
+supports moving resources. Recognized formats vary by platform and GPU back-end.
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> is returned using <a href='#SkImage_MakeFromEncoded'>MakeFromEncoded</a>() if <a href='#SkImage_MakeCrossContextFromEncoded_context'>context</a> is nullptr or does not support
+moving resources between contexts.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeCrossContextFromEncoded_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeCrossContextFromEncoded_data'><code><strong>data</strong></code></a></td>
+    <td><a href='SkImage_Reference#SkImage'>SkImage</a> to decode</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeCrossContextFromEncoded_buildMips'><code><strong>buildMips</strong></code></a></td>
+    <td>create <a href='SkImage_Reference#SkImage'>SkImage</a> as  <a href='undocumented#Mip_Map'>mip map</a> if true</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeCrossContextFromEncoded_dstColorSpace'><code><strong>dstColorSpace</strong></code></a></td>
+    <td>range of colors of matching <a href='SkSurface_Reference#SkSurface'>SkSurface</a> on GPU</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeCrossContextFromEncoded_limitToMaxTextureSize'><code><strong>limitToMaxTextureSize</strong></code></a></td>
+    <td>downscale <a href='SkImage_Reference#Image'>image</a> to GPU maximum <a href='undocumented#Texture'>texture</a> <a href='undocumented#Size'>size</a>, if necessary</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="069c7b116479e3ca46f953f07dcbdd36"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeCrossContextFromPixmap'>MakeCrossContextFromPixmap</a>
+
+<a name='SkImage_MakeCrossContextFromPixmap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeCrossContextFromPixmap'>MakeCrossContextFromPixmap</a>(<a href='undocumented#GrContext'>GrContext</a>* context, const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& <a href='SkPixmap_Reference#Pixmap'>pixmap</a>,
+                                                 bool buildMips, <a href='undocumented#SkColorSpace'>SkColorSpace</a>* dstColorSpace,
+                                                 bool limitToMaxTextureSize = false)
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from <a href='#SkImage_MakeCrossContextFromPixmap_pixmap'>pixmap</a>. <a href='SkImage_Reference#SkImage'>SkImage</a> is uploaded to GPU back-end using <a href='#SkImage_MakeCrossContextFromPixmap_context'>context</a>.
+
+Created <a href='SkImage_Reference#SkImage'>SkImage</a> is available to other GPU contexts, and is available across thread
+boundaries. All contexts must be in the same   <a href='undocumented#GPU_Share_Group'>GPU share group</a>, or otherwise
+share resources.
+
+When <a href='SkImage_Reference#SkImage'>SkImage</a> is no longer referenced, <a href='#SkImage_MakeCrossContextFromPixmap_context'>context</a> releases <a href='undocumented#Texture'>texture</a> memory
+asynchronously.
+
+<a href='undocumented#GrBackendTexture'>GrBackendTexture</a> created from <a href='#SkImage_MakeCrossContextFromPixmap_pixmap'>pixmap</a> is uploaded to match <a href='SkSurface_Reference#SkSurface'>SkSurface</a> created with
+<a href='#SkImage_MakeCrossContextFromPixmap_dstColorSpace'>dstColorSpace</a>. <a href='undocumented#SkColorSpace'>SkColorSpace</a> of <a href='SkImage_Reference#SkImage'>SkImage</a> is determined by <a href='#SkImage_MakeCrossContextFromPixmap_pixmap'>pixmap</a>.<a href='#SkPixmap_colorSpace'>colorSpace</a>().
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> is returned referring to GPU back-end if <a href='#SkImage_MakeCrossContextFromPixmap_context'>context</a> is not nullptr,
+format of <a href='undocumented#Data'>data</a> is recognized and supported, and if <a href='#SkImage_MakeCrossContextFromPixmap_context'>context</a> supports moving
+resources between contexts. Otherwise, <a href='#SkImage_MakeCrossContextFromPixmap_pixmap'>pixmap</a> <a href='undocumented#Pixel'>pixel</a> <a href='undocumented#Data'>data</a> is copied and <a href='SkImage_Reference#SkImage'>SkImage</a>
+as returned in raster format if possible; nullptr may be returned.
+Recognized GPU formats vary by platform and GPU back-end.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeCrossContextFromPixmap_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeCrossContextFromPixmap_pixmap'><code><strong>pixmap</strong></code></a></td>
+    <td><a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, <a href='undocumented#Pixel'>pixel</a> address, and row bytes</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeCrossContextFromPixmap_buildMips'><code><strong>buildMips</strong></code></a></td>
+    <td>create <a href='SkImage_Reference#SkImage'>SkImage</a> as  <a href='undocumented#Mip_Map'>mip map</a> if true</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeCrossContextFromPixmap_dstColorSpace'><code><strong>dstColorSpace</strong></code></a></td>
+    <td>range of colors of matching <a href='SkSurface_Reference#SkSurface'>SkSurface</a> on GPU</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeCrossContextFromPixmap_limitToMaxTextureSize'><code><strong>limitToMaxTextureSize</strong></code></a></td>
+    <td>downscale <a href='SkImage_Reference#Image'>image</a> to GPU maximum <a href='undocumented#Texture'>texture</a> <a href='undocumented#Size'>size</a>, if necessary</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Image_MakeCrossContextFromPixmap"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeCrossContextFromEncoded'>MakeCrossContextFromEncoded</a>
+
+<a name='SkImage_MakeFromAdoptedTexture'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromAdoptedTexture'>MakeFromAdoptedTexture</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                             const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+                                             <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> surfaceOrigin, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkImage_colorType'>colorType</a>,
+                                             <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImage_alphaType'>alphaType</a> = <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+                                             <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; <a href='#SkImage_colorSpace'>colorSpace</a> = nullptr)
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from <a href='#SkImage_MakeFromAdoptedTexture_backendTexture'>backendTexture</a> associated with <a href='#SkImage_MakeFromAdoptedTexture_context'>context</a>. <a href='#SkImage_MakeFromAdoptedTexture_backendTexture'>backendTexture</a> and
+returned <a href='SkImage_Reference#SkImage'>SkImage</a> are managed internally, and are released when no longer needed.
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> is returned if format of <a href='#SkImage_MakeFromAdoptedTexture_backendTexture'>backendTexture</a> is recognized and supported.
+Recognized formats vary by GPU back-end.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromAdoptedTexture_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromAdoptedTexture_backendTexture'><code><strong>backendTexture</strong></code></a></td>
+    <td><a href='undocumented#Texture'>texture</a> residing on GPU</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromAdoptedTexture_surfaceOrigin'><code><strong>surfaceOrigin</strong></code></a></td>
+    <td>one of: <a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>, <a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromAdoptedTexture_colorType'><code><strong>colorType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>, <a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>, <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromAdoptedTexture_alphaType'><code><strong>alphaType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromAdoptedTexture_colorSpace'><code><strong>colorSpace</strong></code></a></td>
+    <td>range of colors; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Image_MakeFromAdoptedTexture" gpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeFromTexture'>MakeFromTexture</a> <a href='#SkImage_MakeFromYUVTexturesCopy'>MakeFromYUVTexturesCopy</a>
+
+<a name='SkImage_MakeFromYUVATexturesCopy'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromYUVATexturesCopy'>MakeFromYUVATexturesCopy</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace,
+                                               const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> yuvaTextures[],
+                                               const <a href='undocumented#SkYUVAIndex'>SkYUVAIndex</a> yuvaIndices[4], <a href='undocumented#SkISize'>SkISize</a> imageSize,
+                                               <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin,
+                                               <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; imageColorSpace = nullptr)
+</pre>
+
+Creates an <a href='SkImage_Reference#SkImage'>SkImage</a> by flattening the specified YUVA planes into a single, interleaved RGBA
+<a href='SkImage_Reference#Image'>image</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopy_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopy_yuvColorSpace'><code><strong>yuvColorSpace</strong></code></a></td>
+    <td>How the YUV values are converted to RGB. One of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kJPEG_SkYUVColorSpace'>kJPEG_SkYUVColorSpace</a>, <a href='SkImageInfo_Reference#kRec601_SkYUVColorSpace'>kRec601_SkYUVColorSpace</a>,
+<a href='SkImageInfo_Reference#kRec709_SkYUVColorSpace'>kRec709_SkYUVColorSpace</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopy_yuvaTextures'><code><strong>yuvaTextures</strong></code></a></td>
+    <td>array of (up to four) YUVA textures on GPU which contain the,</td>
+  </tr>
+</table>
+
+possibly interleaved, YUVA planes
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopy_yuvaIndices'><code><strong>yuvaIndices</strong></code></a></td>
+    <td>array indicating which <a href='undocumented#Texture'>texture</a> in <a href='#SkImage_MakeFromYUVATexturesCopy_yuvaTextures'>yuvaTextures</a>, and channel</td>
+  </tr>
+</table>
+
+in that <a href='undocumented#Texture'>texture</a>, maps to each component of YUVA.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopy_imageSize'><code><strong>imageSize</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of the resulting <a href='SkImage_Reference#Image'>image</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopy_imageOrigin'><code><strong>imageOrigin</strong></code></a></td>
+    <td>origin of the resulting <a href='SkImage_Reference#Image'>image</a>. One of: <a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopy_imageColorSpace'><code><strong>imageColorSpace</strong></code></a></td>
+    <td>range of colors of the resulting <a href='SkImage_Reference#Image'>image</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### See Also
+
+<a href='#SkImage_MakeFromYUVATexturesCopyWithExternalBackend'>MakeFromYUVATexturesCopyWithExternalBackend</a> <a href='#SkImage_MakeFromYUVATextures'>MakeFromYUVATextures</a>
+
+<a name='SkImage_MakeFromYUVATextures'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromYUVATextures'>MakeFromYUVATextures</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace,
+                                           const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> yuvaTextures[],
+                                           const <a href='undocumented#SkYUVAIndex'>SkYUVAIndex</a> yuvaIndices[4], <a href='undocumented#SkISize'>SkISize</a> imageSize,
+                                           <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin,
+                                           <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; imageColorSpace = nullptr) ;
+</pre>
+
+Creates an <a href='SkImage_Reference#SkImage'>SkImage</a> by storing the specified YUVA planes into an <a href='SkImage_Reference#Image'>image</a>, to be rendered
+via multitexturing.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATextures_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromYUVATextures_yuvColorSpace'><code><strong>yuvColorSpace</strong></code></a></td>
+    <td>How the YUV values are converted to RGB. One of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kJPEG_SkYUVColorSpace'>kJPEG_SkYUVColorSpace</a>, <a href='SkImageInfo_Reference#kRec601_SkYUVColorSpace'>kRec601_SkYUVColorSpace</a>,
+<a href='SkImageInfo_Reference#kRec709_SkYUVColorSpace'>kRec709_SkYUVColorSpace</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATextures_yuvaTextures'><code><strong>yuvaTextures</strong></code></a></td>
+    <td>array of (up to four) YUVA textures on GPU which contain the,</td>
+  </tr>
+</table>
+
+possibly interleaved, YUVA planes
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATextures_yuvaIndices'><code><strong>yuvaIndices</strong></code></a></td>
+    <td>array indicating which <a href='undocumented#Texture'>texture</a> in <a href='#SkImage_MakeFromYUVATextures_yuvaTextures'>yuvaTextures</a>, and channel</td>
+  </tr>
+</table>
+
+in that <a href='undocumented#Texture'>texture</a>, maps to each component of YUVA.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATextures_imageSize'><code><strong>imageSize</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of the resulting <a href='SkImage_Reference#Image'>image</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromYUVATextures_imageOrigin'><code><strong>imageOrigin</strong></code></a></td>
+    <td>origin of the resulting <a href='SkImage_Reference#Image'>image</a>. One of: <a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATextures_imageColorSpace'><code><strong>imageColorSpace</strong></code></a></td>
+    <td>range of colors of the resulting <a href='SkImage_Reference#Image'>image</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### See Also
+
+<a href='#SkImage_MakeFromYUVATexturesCopy'>MakeFromYUVATexturesCopy</a> <a href='#SkImage_MakeFromYUVATexturesCopyWithExternalBackend'>MakeFromYUVATexturesCopyWithExternalBackend</a>
+
+<a name='SkImage_MakeFromYUVAPixmaps'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; 
+             <a href='#SkImage_MakeFromYUVAPixmaps'>MakeFromYUVAPixmaps</a>(
+                                               <a href='undocumented#GrContext'>GrContext</a>* context,
+             <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace, const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> yuvaPixmaps[],
+             const <a href='undocumented#SkYUVAIndex'>SkYUVAIndex</a> yuvaIndices[4], <a href='undocumented#SkISize'>SkISize</a> imageSize, <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin,
+             bool buildMips, bool limitToMaxTextureSize = false,
+             <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; imageColorSpace = nullptr) ;
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from <a href='SkPixmap_Reference#Pixmap'>pixmap</a> array representing YUVA <a href='undocumented#Data'>data</a>.
+<a href='SkImage_Reference#SkImage'>SkImage</a> is uploaded to GPU back-end using <a href='#SkImage_MakeFromYUVAPixmaps_context'>context</a>.
+
+Each <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> created from <a href='#SkImage_MakeFromYUVAPixmaps_yuvaPixmaps'>yuvaPixmaps</a> array is uploaded to match <a href='SkSurface_Reference#SkSurface'>SkSurface</a>
+using <a href='undocumented#SkColorSpace'>SkColorSpace</a> of <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>. <a href='undocumented#SkColorSpace'>SkColorSpace</a> of <a href='SkImage_Reference#SkImage'>SkImage</a> is determined by <a href='#SkImage_MakeFromYUVAPixmaps_imageColorSpace'>imageColorSpace</a>.
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> is returned referring to GPU back-end if <a href='#SkImage_MakeFromYUVAPixmaps_context'>context</a> is not nullptr and
+format of <a href='undocumented#Data'>data</a> is recognized and supported. Otherwise, nullptr is returned.
+Recognized GPU formats vary by platform and GPU back-end.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVAPixmaps_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromYUVAPixmaps_yuvColorSpace'><code><strong>yuvColorSpace</strong></code></a></td>
+    <td>How the YUV values are converted to RGB. One of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kJPEG_SkYUVColorSpace'>kJPEG_SkYUVColorSpace</a>, <a href='SkImageInfo_Reference#kRec601_SkYUVColorSpace'>kRec601_SkYUVColorSpace</a>,
+<a href='SkImageInfo_Reference#kRec709_SkYUVColorSpace'>kRec709_SkYUVColorSpace</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVAPixmaps_yuvaPixmaps'><code><strong>yuvaPixmaps</strong></code></a></td>
+    <td>array of (up to four) <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> which contain the,</td>
+  </tr>
+</table>
+
+possibly interleaved, YUVA planes
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVAPixmaps_yuvaIndices'><code><strong>yuvaIndices</strong></code></a></td>
+    <td>array indicating which <a href='SkPixmap_Reference#Pixmap'>pixmap</a> in <a href='#SkImage_MakeFromYUVAPixmaps_yuvaPixmaps'>yuvaPixmaps</a>, and channel</td>
+  </tr>
+</table>
+
+in that <a href='SkPixmap_Reference#Pixmap'>pixmap</a>, maps to each component of YUVA.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVAPixmaps_imageSize'><code><strong>imageSize</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of the resulting <a href='SkImage_Reference#Image'>image</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromYUVAPixmaps_imageOrigin'><code><strong>imageOrigin</strong></code></a></td>
+    <td>origin of the resulting <a href='SkImage_Reference#Image'>image</a>. One of:</td>
+  </tr>
+</table>
+
+<a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>, <a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVAPixmaps_buildMips'><code><strong>buildMips</strong></code></a></td>
+    <td>create internal YUVA textures as  <a href='undocumented#Mip_Map'>mip map</a> if true</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromYUVAPixmaps_limitToMaxTextureSize'><code><strong>limitToMaxTextureSize</strong></code></a></td>
+    <td>downscale <a href='SkImage_Reference#Image'>image</a> to GPU maximum <a href='undocumented#Texture'>texture</a> <a href='undocumented#Size'>size</a>, if necessary</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromYUVAPixmaps_imageColorSpace'><code><strong>imageColorSpace</strong></code></a></td>
+    <td>range of colors of the resulting <a href='SkImage_Reference#Image'>image</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### See Also
+
+<a href='#SkImage_MakeFromYUVATextures'>MakeFromYUVATextures</a>
+
+<a name='SkImage_MakeFromYUVATexturesCopyWithExternalBackend'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromYUVATexturesCopyWithExternalBackend'>MakeFromYUVATexturesCopyWithExternalBackend</a>(
+            <a href='undocumented#GrContext'>GrContext</a>* context,
+                        <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace, const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> yuvaTextures[],
+                        const <a href='undocumented#SkYUVAIndex'>SkYUVAIndex</a> yuvaIndices[4], <a href='undocumented#SkISize'>SkISize</a> imageSize,
+                        <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin, const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+                        <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; imageColorSpace = nullptr)
+</pre>
+
+Creates an <a href='SkImage_Reference#SkImage'>SkImage</a> by flattening the specified YUVA planes into a single, interleaved RGBA
+<a href='SkImage_Reference#Image'>image</a>. '<a href='#SkImage_MakeFromYUVATexturesCopyWithExternalBackend_backendTexture'>backendTexture</a>' is used to store the result of the flattening.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopyWithExternalBackend_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopyWithExternalBackend_yuvColorSpace'><code><strong>yuvColorSpace</strong></code></a></td>
+    <td>How the YUV values are converted to RGB. One of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kJPEG_SkYUVColorSpace'>kJPEG_SkYUVColorSpace</a>, <a href='SkImageInfo_Reference#kRec601_SkYUVColorSpace'>kRec601_SkYUVColorSpace</a>,
+<a href='SkImageInfo_Reference#kRec709_SkYUVColorSpace'>kRec709_SkYUVColorSpace</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopyWithExternalBackend_yuvaTextures'><code><strong>yuvaTextures</strong></code></a></td>
+    <td>array of (up to four) YUVA textures on GPU which contain the,</td>
+  </tr>
+</table>
+
+possibly interleaved, YUVA planes
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopyWithExternalBackend_yuvaIndices'><code><strong>yuvaIndices</strong></code></a></td>
+    <td>array indicating which <a href='undocumented#Texture'>texture</a> in <a href='#SkImage_MakeFromYUVATexturesCopyWithExternalBackend_yuvaTextures'>yuvaTextures</a>, and channel</td>
+  </tr>
+</table>
+
+in that <a href='undocumented#Texture'>texture</a>, maps to each component of YUVA.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopyWithExternalBackend_imageSize'><code><strong>imageSize</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of the resulting <a href='SkImage_Reference#Image'>image</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopyWithExternalBackend_imageOrigin'><code><strong>imageOrigin</strong></code></a></td>
+    <td>origin of the resulting <a href='SkImage_Reference#Image'>image</a>. One of: <a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopyWithExternalBackend_backendTexture'><code><strong>backendTexture</strong></code></a></td>
+    <td>the resource that stores the final pixels</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromYUVATexturesCopyWithExternalBackend_imageColorSpace'><code><strong>imageColorSpace</strong></code></a></td>
+    <td>range of colors of the resulting <a href='SkImage_Reference#Image'>image</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### See Also
+
+<a href='#SkImage_MakeFromYUVATexturesCopy'>MakeFromYUVATexturesCopy</a> <a href='#SkImage_MakeFromYUVATextures'>MakeFromYUVATextures</a>
+
+<a name='SkImage_MakeFromYUVTexturesCopy'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromYUVTexturesCopy'>MakeFromYUVTexturesCopy</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace,
+                                              const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> yuvTextures[3],
+                                              <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin,
+                                              <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; imageColorSpace = nullptr)
+</pre>
+
+To be deprecated.
+
+### See Also
+
+<a href='#SkImage_MakeFromYUVTexturesCopyWithExternalBackend'>MakeFromYUVTexturesCopyWithExternalBackend</a> <a href='#SkImage_MakeFromNV12TexturesCopy'>MakeFromNV12TexturesCopy</a> <a href='#SkImage_MakeFromYUVATexturesCopy'>MakeFromYUVATexturesCopy</a>
+
+<a name='SkImage_MakeFromYUVTexturesCopyWithExternalBackend'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromYUVTexturesCopyWithExternalBackend'>MakeFromYUVTexturesCopyWithExternalBackend</a>(
+        <a href='undocumented#GrContext'>GrContext</a>* context,
+                             <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace, const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> yuvTextures[3],
+                             <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin, const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+                             <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; imageColorSpace = nullptr) ;
+</pre>
+
+To be deprecated.
+
+### See Also
+
+<a href='#SkImage_MakeFromYUVTexturesCopy'>MakeFromYUVTexturesCopy</a> <a href='#SkImage_MakeFromNV12TexturesCopy'>MakeFromNV12TexturesCopy</a> <a href='#SkImage_MakeFromYUVATexturesCopyWithExternalBackend'>MakeFromYUVATexturesCopyWithExternalBackend</a>
+
+<a name='SkImage_MakeFromNV12TexturesCopy'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromNV12TexturesCopy'>MakeFromNV12TexturesCopy</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace,
+                                               const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> nv12Textures[2],
+                                               <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin,
+                                               <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; imageColorSpace = nullptr)
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from copy of <a href='#SkImage_MakeFromNV12TexturesCopy_nv12Textures'>nv12Textures</a>, an array of textures on GPU.
+<a href='#SkImage_MakeFromNV12TexturesCopy_nv12Textures'>nv12Textures</a>[0] contains pixels for   <a href='undocumented#YUV_Component_Y'>YUV component y</a> plane.
+<a href='#SkImage_MakeFromNV12TexturesCopy_nv12Textures'>nv12Textures</a>[1] contains pixels for   <a href='undocumented#YUV_Component_U'>YUV component u</a> plane,
+followed by pixels for   <a href='undocumented#YUV_Component_V'>YUV component v</a> plane.
+Returned <a href='SkImage_Reference#SkImage'>SkImage</a> has the dimensions <a href='#SkImage_MakeFromNV12TexturesCopy_nv12Textures'>nv12Textures</a>[2].
+<a href='#SkImage_MakeFromNV12TexturesCopy_yuvColorSpace'>yuvColorSpace</a> describes how YUV colors convert to RGB colors.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromNV12TexturesCopy_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromNV12TexturesCopy_yuvColorSpace'><code><strong>yuvColorSpace</strong></code></a></td>
+    <td>one of: <a href='SkImageInfo_Reference#kJPEG_SkYUVColorSpace'>kJPEG_SkYUVColorSpace</a>, <a href='SkImageInfo_Reference#kRec601_SkYUVColorSpace'>kRec601_SkYUVColorSpace</a>,</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kRec709_SkYUVColorSpace'>kRec709_SkYUVColorSpace</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromNV12TexturesCopy_nv12Textures'><code><strong>nv12Textures</strong></code></a></td>
+    <td>array of YUV textures on GPU</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromNV12TexturesCopy_imageOrigin'><code><strong>imageOrigin</strong></code></a></td>
+    <td>one of: <a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>, <a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromNV12TexturesCopy_imageColorSpace'><code><strong>imageColorSpace</strong></code></a></td>
+    <td>range of colors; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### See Also
+
+<a href='#SkImage_MakeFromNV12TexturesCopyWithExternalBackend'>MakeFromNV12TexturesCopyWithExternalBackend</a> <a href='#SkImage_MakeFromYUVTexturesCopy'>MakeFromYUVTexturesCopy</a> <a href='#SkImage_MakeFromYUVATexturesCopy'>MakeFromYUVATexturesCopy</a>
+
+<a name='SkImage_MakeFromNV12TexturesCopyWithExternalBackend'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromNV12TexturesCopyWithExternalBackend'>MakeFromNV12TexturesCopyWithExternalBackend</a>(
+            <a href='undocumented#GrContext'>GrContext</a>* context,
+                        <a href='SkImageInfo_Reference#SkYUVColorSpace'>SkYUVColorSpace</a> yuvColorSpace, const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> nv12Textures[2],
+                        <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> imageOrigin, const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+                        <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; imageColorSpace = nullptr) ;
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from copy of <a href='#SkImage_MakeFromNV12TexturesCopyWithExternalBackend_nv12Textures'>nv12Textures</a>, an array of textures on GPU.
+<a href='#SkImage_MakeFromNV12TexturesCopyWithExternalBackend_nv12Textures'>nv12Textures</a>[0] contains pixels for   <a href='undocumented#YUV_Component_Y'>YUV component y</a> plane.
+<a href='#SkImage_MakeFromNV12TexturesCopyWithExternalBackend_nv12Textures'>nv12Textures</a>[1] contains pixels for   <a href='undocumented#YUV_Component_U'>YUV component u</a> plane,
+followed by pixels for   <a href='undocumented#YUV_Component_V'>YUV component v</a> plane.
+Returned <a href='SkImage_Reference#SkImage'>SkImage</a> has the dimensions <a href='#SkImage_MakeFromNV12TexturesCopyWithExternalBackend_nv12Textures'>nv12Textures</a>[2] and stores pixels in <a href='#SkImage_MakeFromNV12TexturesCopyWithExternalBackend_backendTexture'>backendTexture</a>.
+<a href='#SkImage_MakeFromNV12TexturesCopyWithExternalBackend_yuvColorSpace'>yuvColorSpace</a> describes how YUV colors convert to RGB colors.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromNV12TexturesCopyWithExternalBackend_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromNV12TexturesCopyWithExternalBackend_yuvColorSpace'><code><strong>yuvColorSpace</strong></code></a></td>
+    <td>one of: <a href='SkImageInfo_Reference#kJPEG_SkYUVColorSpace'>kJPEG_SkYUVColorSpace</a>, <a href='SkImageInfo_Reference#kRec601_SkYUVColorSpace'>kRec601_SkYUVColorSpace</a>,</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kRec709_SkYUVColorSpace'>kRec709_SkYUVColorSpace</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromNV12TexturesCopyWithExternalBackend_nv12Textures'><code><strong>nv12Textures</strong></code></a></td>
+    <td>array of YUV textures on GPU</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromNV12TexturesCopyWithExternalBackend_imageOrigin'><code><strong>imageOrigin</strong></code></a></td>
+    <td>one of: <a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>, <a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromNV12TexturesCopyWithExternalBackend_backendTexture'><code><strong>backendTexture</strong></code></a></td>
+    <td>the resource that stores the final pixels</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromNV12TexturesCopyWithExternalBackend_imageColorSpace'><code><strong>imageColorSpace</strong></code></a></td>
+    <td>range of colors; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### See Also
+
+<a href='#SkImage_MakeFromNV12TexturesCopy'>MakeFromNV12TexturesCopy</a> <a href='#SkImage_MakeFromYUVTexturesCopy'>MakeFromYUVTexturesCopy</a> <a href='#SkImage_MakeFromYUVATexturesCopyWithExternalBackend'>MakeFromYUVATexturesCopyWithExternalBackend</a>
+
+<a name='SkImage_BitDepth'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum class <a href='#SkImage_BitDepth'>BitDepth</a> {
+        <a href='#SkImage_BitDepth_kU8'>kU8</a>,
+        <a href='#SkImage_BitDepth_kF16'>kF16</a>,
+    };
+
+</pre>
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkImage_BitDepth_kU8'><code>SkImage::BitDepth::kU8</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Use 8 bits per ARGB component using unsigned integer format.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkImage_BitDepth_kF16'><code>SkImage::BitDepth::kF16</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Use 16 bits per ARGB component using half-precision floating <a href='SkPoint_Reference#Point'>point</a> format.
+</td>
+  </tr>
+</table>
+
+### See Also
+
+<a href='#SkImage_MakeFromPicture'>MakeFromPicture</a>
+
+<a name='SkImage_MakeFromPicture'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromPicture'>MakeFromPicture</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkPicture_Reference#SkPicture'>SkPicture</a>&gt; <a href='SkPicture_Reference#Picture'>picture</a>, const <a href='undocumented#SkISize'>SkISize</a>& dimensions,
+                                      const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* <a href='SkMatrix_Reference#Matrix'>matrix</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>,
+                                      <a href='#SkImage_BitDepth'>BitDepth</a> bitDepth, <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; <a href='#SkImage_colorSpace'>colorSpace</a>)
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from <a href='#SkImage_MakeFromPicture_picture'>picture</a>. Returned <a href='SkImage_Reference#SkImage'>SkImage</a> width and height are set by <a href='#SkImage_MakeFromPicture_dimensions'>dimensions</a>.
+<a href='SkImage_Reference#SkImage'>SkImage</a> draws <a href='#SkImage_MakeFromPicture_picture'>picture</a> with <a href='#SkImage_MakeFromPicture_matrix'>matrix</a> and <a href='#SkImage_MakeFromPicture_paint'>paint</a>, set to <a href='#SkImage_MakeFromPicture_bitDepth'>bitDepth</a> and <a href='#SkImage_MakeFromPicture_colorSpace'>colorSpace</a>.
+
+If <a href='#SkImage_MakeFromPicture_matrix'>matrix</a> is nullptr, draws with identity <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. If <a href='#SkImage_MakeFromPicture_paint'>paint</a> is nullptr, draws
+with default <a href='SkPaint_Reference#SkPaint'>SkPaint</a>. <a href='#SkImage_MakeFromPicture_colorSpace'>colorSpace</a> may be nullptr.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromPicture_picture'><code><strong>picture</strong></code></a></td>
+    <td><a href='SkStream_Reference#Stream'>stream</a> of drawing commands</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromPicture_dimensions'><code><strong>dimensions</strong></code></a></td>
+    <td>width and height</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromPicture_matrix'><code><strong>matrix</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to rotate, scale, translate, and so on; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromPicture_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> to apply transparency, filtering, and so on; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromPicture_bitDepth'><code><strong>bitDepth</strong></code></a></td>
+    <td>8-bit integer or 16-bit float: per component</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromPicture_colorSpace'><code><strong>colorSpace</strong></code></a></td>
+    <td>range of colors; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Image_MakeFromPicture"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawPicture'>drawPicture</a>
+
+<a name='SkImage_MakeFromAHardwareBuffer'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_MakeFromAHardwareBuffer'>MakeFromAHardwareBuffer</a>(
+        AHardwareBuffer* hardwareBuffer,
+                                   <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImage_alphaType'>alphaType</a> = <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+                                   <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; <a href='#SkImage_colorSpace'>colorSpace</a> = nullptr,
+                                   <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> surfaceOrigin = <a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a>)
+</pre>
+
+(See Skia bug 7447)
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> from Android hardware buffer.
+Returned <a href='SkImage_Reference#SkImage'>SkImage</a> takes a reference on the buffer.
+
+Only available on Android, when __ANDROID_API__ is defined to be 26 or greater.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromAHardwareBuffer_hardwareBuffer'><code><strong>hardwareBuffer</strong></code></a></td>
+    <td>AHardwareBuffer Android hardware buffer</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromAHardwareBuffer_alphaType'><code><strong>alphaType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeFromAHardwareBuffer_colorSpace'><code><strong>colorSpace</strong></code></a></td>
+    <td>range of colors; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeFromAHardwareBuffer_surfaceOrigin'><code><strong>surfaceOrigin</strong></code></a></td>
+    <td>one of: <a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>, <a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### See Also
+
+<a href='#SkImage_MakeFromRaster'>MakeFromRaster</a>
+
+<a name='Property'></a>
+
+<a name='SkImage_width'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkImage_width'>width()</a>const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> count in each row.
+
+### Return Value
+
+<a href='undocumented#Pixel'>pixel</a> width in <a href='SkImage_Reference#SkImage'>SkImage</a>
+
+### Example
+
+<div><fiddle-embed name="9aec65fc252ffc9982fa8867433eca18"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_dimensions'>dimensions()</a> <a href='#SkImage_height'>height()</a>
+
+<a name='SkImage_height'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkImage_height'>height()</a>const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> row count.
+
+### Return Value
+
+<a href='undocumented#Pixel'>pixel</a> height in <a href='SkImage_Reference#SkImage'>SkImage</a>
+
+### Example
+
+<div><fiddle-embed name="a4f53a0b6ac85e7bc3887245b728530d"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_dimensions'>dimensions()</a> <a href='#SkImage_width'>width()</a>
+
+<a name='SkImage_dimensions'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkISize'>SkISize</a> <a href='#SkImage_dimensions'>dimensions()</a>const
+</pre>
+
+Returns <a href='undocumented#SkISize'>SkISize</a> { <a href='#SkImage_width'>width()</a>, <a href='#SkImage_height'>height()</a> }.
+
+### Return Value
+
+integral <a href='undocumented#Size'>size</a> of <a href='#SkImage_width'>width()</a> and <a href='#SkImage_height'>height()</a>
+
+### Example
+
+<div><fiddle-embed name="@Image_dimensions">
+
+#### Example Output
+
+~~~~
+dimensionsAsBounds == bounds
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_height'>height()</a> <a href='#SkImage_width'>width()</a> <a href='#SkImage_bounds'>bounds()</a>
+
+<a name='SkImage_bounds'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkImage_bounds'>bounds()</a>const
+</pre>
+
+Returns <a href='SkIRect_Reference#SkIRect'>SkIRect</a> { 0, 0, <a href='#SkImage_width'>width()</a>, <a href='#SkImage_height'>height()</a> }.
+
+### Return Value
+
+integral rectangle from origin to <a href='#SkImage_width'>width()</a> and <a href='#SkImage_height'>height()</a>
+
+### Example
+
+<div><fiddle-embed name="@Image_bounds"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_dimensions'>dimensions()</a>
+
+<a name='SkImage_uniqueID'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint32_t <a href='#SkImage_uniqueID'>uniqueID</a>()const
+</pre>
+
+Returns value unique to <a href='SkImage_Reference#Image'>image</a>. <a href='SkImage_Reference#SkImage'>SkImage</a> contents cannot change after <a href='SkImage_Reference#SkImage'>SkImage</a> is
+created. Any operation to create a new <a href='SkImage_Reference#SkImage'>SkImage</a> will receive generate a new
+unique number.
+
+### Return Value
+
+unique identifier
+
+### Example
+
+<div><fiddle-embed name="d70194c9c51e700335f95de91846d023"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_isLazyGenerated'>isLazyGenerated</a>
+
+<a name='SkImage_alphaType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkImage_alphaType'>alphaType</a>()const
+</pre>
+
+Returns <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, one of: <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+.
+
+<a href='#Image_Info_Alpha_Type'>Alpha_Type</a> returned was a parameter to an <a href='SkImage_Reference#Image'>Image</a> constructor,
+or was parsed from encoded <a href='undocumented#Data'>data</a>.
+
+### Return Value
+
+<a href='#Image_Info_Alpha_Type'>Alpha_Type</a> in <a href='SkImage_Reference#Image'>Image</a>
+
+### Example
+
+<div><fiddle-embed name="1b9f1f05026ceb14ccb6926a13cdaa83"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_alphaType'>alphaType</a>
+
+<a name='SkImage_colorType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkImage_colorType'>colorType</a>()const
+</pre>
+
+Returns <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> if known; otherwise, returns <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
+
+### Return Value
+
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> of <a href='SkImage_Reference#SkImage'>SkImage</a>
+
+### Example
+
+<div><fiddle-embed name="@Image_colorType"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_colorType'>colorType</a>
+
+<a name='SkImage_colorSpace'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkColorSpace'>SkColorSpace</a>* <a href='#SkImage_colorSpace'>colorSpace</a>()const
+</pre>
+
+Returns <a href='undocumented#SkColorSpace'>SkColorSpace</a>, the range of colors, associated with <a href='SkImage_Reference#SkImage'>SkImage</a>.  The
+reference count of <a href='undocumented#SkColorSpace'>SkColorSpace</a> is unchanged. The returned <a href='undocumented#SkColorSpace'>SkColorSpace</a> is
+immutable.
+
+<a href='undocumented#SkColorSpace'>SkColorSpace</a> returned was passed to an <a href='SkImage_Reference#SkImage'>SkImage</a> constructor,
+or was parsed from encoded <a href='undocumented#Data'>data</a>. <a href='undocumented#SkColorSpace'>SkColorSpace</a> returned may be ignored when <a href='SkImage_Reference#SkImage'>SkImage</a>
+is drawn, depending on the capabilities of the <a href='SkSurface_Reference#SkSurface'>SkSurface</a> receiving the drawing.
+
+### Return Value
+
+<a href='undocumented#SkColorSpace'>SkColorSpace</a> in <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="4468d573f42af6f5e234be10a5453bb2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_refColorSpace'>refColorSpace</a> <a href='#SkImage_makeColorSpace'>makeColorSpace</a>
+
+<a name='SkImage_refColorSpace'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; <a href='#SkImage_refColorSpace'>refColorSpace</a>()const
+</pre>
+
+Returns a smart pointer to <a href='undocumented#SkColorSpace'>SkColorSpace</a>, the range of colors, associated with
+<a href='SkImage_Reference#SkImage'>SkImage</a>.  The smart pointer tracks the number of objects sharing this
+<a href='undocumented#SkColorSpace'>SkColorSpace</a> reference so the memory is released when the owners destruct.
+
+The returned <a href='undocumented#SkColorSpace'>SkColorSpace</a> is immutable.
+
+<a href='undocumented#SkColorSpace'>SkColorSpace</a> returned was passed to an <a href='SkImage_Reference#SkImage'>SkImage</a> constructor,
+or was parsed from encoded <a href='undocumented#Data'>data</a>. <a href='undocumented#SkColorSpace'>SkColorSpace</a> returned may be ignored when <a href='SkImage_Reference#SkImage'>SkImage</a>
+is drawn, depending on the capabilities of the <a href='SkSurface_Reference#SkSurface'>SkSurface</a> receiving the drawing.
+
+### Return Value
+
+<a href='undocumented#SkColorSpace'>SkColorSpace</a> in <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr, wrapped in a smart pointer
+
+### Example
+
+<div><fiddle-embed name="59b2078ebfbda8736a57c0486ae33332"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_colorSpace'>colorSpace</a> <a href='#SkImage_makeColorSpace'>makeColorSpace</a>
+
+<a name='SkImage_isAlphaOnly'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkImage_isAlphaOnly'>isAlphaOnly</a>()const
+</pre>
+
+Returns true if <a href='SkImage_Reference#SkImage'>SkImage</a> pixels represent transparency only. If true, each <a href='undocumented#Pixel'>pixel</a>
+is packed in 8 bits as defined by <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>.
+
+### Return Value
+
+true if pixels represent a transparency mask
+
+### Example
+
+<div><fiddle-embed name="@Image_isAlphaOnly">
+
+#### Example Output
+
+~~~~
+alphaOnly = true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_alphaType'>alphaType</a> <a href='#SkImage_isOpaque'>isOpaque</a>
+
+<a name='SkImage_isOpaque'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkImage_isOpaque'>isOpaque</a>()const
+</pre>
+
+Returns true if pixels ignore their <a href='SkColor_Reference#Alpha'>alpha</a> value and are treated as fully opaque.
+
+### Return Value
+
+true if <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>
+
+### Example
+
+<div><fiddle-embed name="@Image_isOpaque">
+
+#### Example Output
+
+~~~~
+isOpaque = false
+isOpaque = true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_alphaType'>alphaType</a> <a href='#SkImage_isAlphaOnly'>isAlphaOnly</a>
+
+<a name='SkImage_makeShader'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkShader'>SkShader</a>&gt; <a href='#SkImage_makeShader'>makeShader</a>(<a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_TileMode'>TileMode</a> tileMode1, <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_TileMode'>TileMode</a> tileMode2,
+                           const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* localMatrix = nullptr)const
+</pre>
+
+Creates <a href='undocumented#SkShader'>SkShader</a> from <a href='SkImage_Reference#SkImage'>SkImage</a>. <a href='undocumented#SkShader'>SkShader</a> dimensions are taken from <a href='SkImage_Reference#SkImage'>SkImage</a>. <a href='undocumented#SkShader'>SkShader</a> uses
+<a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_TileMode'>TileMode</a> rules to fill drawn area outside <a href='SkImage_Reference#SkImage'>SkImage</a>. <a href='#SkImage_makeShader_localMatrix'>localMatrix</a> permits
+transforming <a href='SkImage_Reference#SkImage'>SkImage</a> before <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> <a href='SkMatrix_Reference#Matrix'>matrix</a> is applied.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_makeShader_tileMode1'><code><strong>tileMode1</strong></code></a></td>
+    <td>tiling on x-axis, one of: <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kRepeat_TileMode'>kRepeat_TileMode</a>, <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kMirror_TileMode'>kMirror_TileMode</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_makeShader_tileMode2'><code><strong>tileMode2</strong></code></a></td>
+    <td>tiling on y-axis, one of: <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kRepeat_TileMode'>kRepeat_TileMode</a>, <a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kMirror_TileMode'>kMirror_TileMode</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_makeShader_localMatrix'><code><strong>localMatrix</strong></code></a></td>
+    <td><a href='SkImage_Reference#SkImage'>SkImage</a> transformation, or nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='undocumented#SkShader'>SkShader</a> containing <a href='SkImage_Reference#SkImage'>SkImage</a>
+
+### Example
+
+<div><fiddle-embed name="@Image_makeShader"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_scalePixels'>scalePixels</a>
+
+<a name='SkImage_makeShader_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkShader'>SkShader</a>&gt; <a href='#SkImage_makeShader'>makeShader</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* localMatrix = nullptr)const
+</pre>
+
+Creates <a href='undocumented#SkShader'>SkShader</a> from <a href='SkImage_Reference#SkImage'>SkImage</a>. <a href='undocumented#SkShader'>SkShader</a> dimensions are taken from <a href='SkImage_Reference#SkImage'>SkImage</a>. <a href='undocumented#SkShader'>SkShader</a> uses
+<a href='undocumented#SkShader'>SkShader</a>::<a href='#SkShader_kClamp_TileMode'>kClamp_TileMode</a> to fill drawn area outside <a href='SkImage_Reference#SkImage'>SkImage</a>. <a href='#SkImage_makeShader_2_localMatrix'>localMatrix</a> permits
+transforming <a href='SkImage_Reference#SkImage'>SkImage</a> before <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> <a href='SkMatrix_Reference#Matrix'>matrix</a> is applied.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_makeShader_2_localMatrix'><code><strong>localMatrix</strong></code></a></td>
+    <td><a href='SkImage_Reference#SkImage'>SkImage</a> transformation, or nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='undocumented#SkShader'>SkShader</a> containing <a href='SkImage_Reference#SkImage'>SkImage</a>
+
+### Example
+
+<div><fiddle-embed name="@Image_makeShader_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_scalePixels'>scalePixels</a>
+
+<a name='Pixels'></a>
+
+<a name='SkImage_peekPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkImage_peekPixels'>peekPixels</a>(<a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>* <a href='SkPixmap_Reference#Pixmap'>pixmap</a>)const
+</pre>
+
+Copies <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='undocumented#Pixel'>pixel</a> address, row bytes, and <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='#SkImage_peekPixels_pixmap'>pixmap</a>, if address
+is available, and returns true. If <a href='undocumented#Pixel'>pixel</a> address is not available, return
+false and leave <a href='#SkImage_peekPixels_pixmap'>pixmap</a> unchanged.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_peekPixels_pixmap'><code><strong>pixmap</strong></code></a></td>
+    <td>storage for <a href='undocumented#Pixel'>pixel</a> state if pixels are readable; otherwise, ignored</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkImage_Reference#SkImage'>SkImage</a> has direct access to pixels
+
+### Example
+
+<div><fiddle-embed name="900c0eab8dfdecd8301ed5be95887f8e">
+
+#### Example Output
+
+~~~~
+------------
+--xx----x---
+-x--x--x----
+-x--x--x----
+-x--x-x-----
+--xx-xx-xx--
+-----x-x--x-
+----x--x--x-
+----x--x--x-
+---x----xx--
+------------
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_readPixels'>readPixels</a>
+
+<a name='SkImage_isTextureBacked'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkImage_isTextureBacked'>isTextureBacked</a>()const
+</pre>
+
+Returns true the contents of <a href='SkImage_Reference#SkImage'>SkImage</a> was created on or uploaded to GPU memory,
+and is available as a GPU <a href='undocumented#Texture'>texture</a>.
+
+### Return Value
+
+true if <a href='SkImage_Reference#SkImage'>SkImage</a> is a GPU <a href='undocumented#Texture'>texture</a>
+
+### Example
+
+<div><fiddle-embed name="9cf5c62a3d2243e6577ae563f360ea9d" gpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeFromTexture'>MakeFromTexture</a> <a href='#SkImage_isValid'>isValid</a>
+
+<a name='SkImage_isValid'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkImage_isValid'>isValid</a>(<a href='undocumented#GrContext'>GrContext</a>* context)const
+</pre>
+
+Returns true if <a href='SkImage_Reference#SkImage'>SkImage</a> can be drawn on either  <a href='undocumented#Raster_Surface'>raster surface</a> or  <a href='undocumented#GPU_Surface'>GPU surface</a>.
+If <a href='#SkImage_isValid_context'>context</a> is nullptr, tests if <a href='SkImage_Reference#SkImage'>SkImage</a> draws on  <a href='undocumented#Raster_Surface'>raster surface</a>;
+otherwise, tests if <a href='SkImage_Reference#SkImage'>SkImage</a> draws on  <a href='undocumented#GPU_Surface'>GPU surface</a> associated with <a href='#SkImage_isValid_context'>context</a>.
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> backed by  <a href='undocumented#GPU_Texture'>GPU texture</a> may become invalid if associated <a href='undocumented#GrContext'>GrContext</a> is
+invalid.  <a href='#Lazy_Image'>lazy image</a> may be invalid and may not draw to  <a href='undocumented#Raster_Surface'>raster surface</a> or
+<a href='undocumented#GPU_Surface'>GPU surface</a> or both.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_isValid_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkImage_Reference#SkImage'>SkImage</a> can be drawn
+
+### Example
+
+<div><fiddle-embed name="afc62f38aebc56af8e425297ec67dd37" gpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_isTextureBacked'>isTextureBacked</a> <a href='#SkImage_isLazyGenerated'>isLazyGenerated</a>
+
+<a name='SkImage_getBackendTexture'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#GrBackendTexture'>GrBackendTexture</a> <a href='#SkImage_getBackendTexture'>getBackendTexture</a>(bool flushPendingGrContextIO, <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a>* origin = nullptr)const
+</pre>
+
+Retrieves the back-end <a href='undocumented#Texture'>texture</a>. If <a href='SkImage_Reference#SkImage'>SkImage</a> has no back-end <a href='undocumented#Texture'>texture</a>, an invalid
+object is returned. Call <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>::<a href='#GrBackendTexture_isValid'>isValid</a> to determine if the result
+is valid.
+
+If <a href='#SkImage_getBackendTexture_flushPendingGrContextIO'>flushPendingGrContextIO</a> is true, completes deferred I/O operations.
+
+If <a href='#SkImage_getBackendTexture_origin'>origin</a> in not nullptr, copies location of content drawn into <a href='SkImage_Reference#SkImage'>SkImage</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_getBackendTexture_flushPendingGrContextIO'><code><strong>flushPendingGrContextIO</strong></code></a></td>
+    <td>flag to flush outstanding requests</td>
+  </tr>
+  <tr>    <td><a name='SkImage_getBackendTexture_origin'><code><strong>origin</strong></code></a></td>
+    <td>storage for one of: <a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>; or nullptr
+
+### Return Value
+
+back-end API <a href='undocumented#Texture'>texture</a> handle; invalid on failure
+
+### Example
+
+<div><fiddle-embed name="d093aad721261f421c4bef4a296aab48" gpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeFromTexture'>MakeFromTexture</a> <a href='#SkImage_isTextureBacked'>isTextureBacked</a>
+
+<a name='SkImage_CachingHint'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkImage_CachingHint'>CachingHint</a> {
+        <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a>,
+        <a href='#SkImage_kDisallow_CachingHint'>kDisallow_CachingHint</a>,
+    };
+
+</pre>
+
+<a href='#SkImage_CachingHint'>CachingHint</a> selects whether Skia may internally cache <a href='SkBitmap_Reference#Bitmap'>Bitmaps</a> generated by
+decoding <a href='SkImage_Reference#Image'>Image</a>, or by copying <a href='SkImage_Reference#Image'>Image</a> from GPU to CPU. The default behavior
+allows caching <a href='SkBitmap_Reference#Bitmap'>Bitmaps</a>.
+
+Choose <a href='#SkImage_kDisallow_CachingHint'>kDisallow_CachingHint</a> if <a href='SkImage_Reference#Image'>Image</a> pixels are to be used only once, or
+if <a href='SkImage_Reference#Image'>Image</a> pixels reside in a cache outside of Skia, or to reduce memory pressure.
+
+Choosing <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a> does not ensure that pixels will be cached.
+<a href='SkImage_Reference#Image'>Image</a> pixels may not be cached if memory requirements are too large or
+pixels are not accessible.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkImage_kAllow_CachingHint'><code>SkImage::kAllow_CachingHint</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+allows internally caching decoded and copied pixels</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkImage_kDisallow_CachingHint'><code>SkImage::kDisallow_CachingHint</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+disallows internally caching decoded and copied pixels</td>
+  </tr>
+</table>
+
+### See Also
+
+<a href='#SkImage_readPixels'>readPixels</a> <a href='#SkImage_scalePixels'>scalePixels</a>
+
+<a name='SkImage_readPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkImage_readPixels'>readPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& dstInfo, void* dstPixels, size_t dstRowBytes, int srcX, int srcY,
+                <a href='#SkImage_CachingHint'>CachingHint</a> cachingHint = <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a>)const
+</pre>
+
+Copies <a href='SkRect_Reference#Rect'>Rect</a> of pixels from <a href='SkImage_Reference#Image'>Image</a> to <a href='#SkImage_readPixels_dstPixels'>dstPixels</a>. Copy starts at offset (<a href='#SkImage_readPixels_srcX'>srcX</a>, <a href='#SkImage_readPixels_srcY'>srcY</a>),
+and does not exceed <a href='SkImage_Reference#Image'>Image</a> (<a href='#SkImage_width'>width()</a>, <a href='#SkImage_height'>height()</a>).
+
+<a href='#SkImage_readPixels_dstInfo'>dstInfo</a> specifies width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>, <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, and <a href='#Color_Space'>Color_Space</a> of
+destination. <a href='#SkImage_readPixels_dstRowBytes'>dstRowBytes</a> specifics the gap from one destination row to the next.
+Returns true if pixels are copied. Returns false if:
+
+<table>  <tr>
+    <td><a href='#SkImage_readPixels_dstInfo'>dstInfo</a> has no address</td>
+  </tr>  <tr>
+    <td><a href='#SkImage_readPixels_dstRowBytes'>dstRowBytes</a> is less than <a href='#SkImage_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>()</td>
+  </tr>  <tr>
+    <td><a href='#Pixel_Ref'>Pixel_Ref</a> is nullptr</td>
+  </tr>
+</table>
+
+Pixels are copied only if <a href='undocumented#Pixel'>pixel</a> conversion is possible. If <a href='SkImage_Reference#Image'>Image</a> <a href='#Image_Info_Color_Type'>Color_Type</a> is
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, or <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>; <a href='#SkImage_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorType'>colorType</a>() must match.
+If <a href='SkImage_Reference#Image'>Image</a> <a href='#Image_Info_Color_Type'>Color_Type</a> is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='#SkImage_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorSpace'>colorSpace</a>() must match.
+If <a href='SkImage_Reference#Image'>Image</a> <a href='#Image_Info_Alpha_Type'>Alpha_Type</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='#SkImage_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>() must
+match. If <a href='SkImage_Reference#Image'>Image</a> <a href='#Color_Space'>Color_Space</a> is nullptr, <a href='#SkImage_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorSpace'>colorSpace</a>() must match. Returns
+false if <a href='undocumented#Pixel'>pixel</a> conversion is not possible.
+
+<a href='#SkImage_readPixels_srcX'>srcX</a> and <a href='#SkImage_readPixels_srcY'>srcY</a> may be negative to copy only top or left of source. Returns
+false if <a href='#SkImage_width'>width()</a> or <a href='#SkImage_height'>height()</a> is zero or negative.
+Returns false if <code><a href='undocumented#abs()'>abs</a>(<a href='#SkImage_readPixels_srcX'>srcX</a>) >= <a href='SkImage_Reference#Image'>Image</a> <a href='#SkImage_width'>width()</a></code>, or if <code><a href='undocumented#abs()'>abs</a>(<a href='#SkImage_readPixels_srcY'>srcY</a>) >= <a href='SkImage_Reference#Image'>Image</a> <a href='#SkImage_height'>height()</a></code>.
+
+If <a href='#SkImage_readPixels_cachingHint'>cachingHint</a> is <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a>, pixels may be retained locally.
+If <a href='#SkImage_readPixels_cachingHint'>cachingHint</a> is <a href='#SkImage_kDisallow_CachingHint'>kDisallow_CachingHint</a>, pixels are not added to the local cache.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_readPixels_dstInfo'><code><strong>dstInfo</strong></code></a></td>
+    <td>destination width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>, <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, <a href='#Color_Space'>Color_Space</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_readPixels_dstPixels'><code><strong>dstPixels</strong></code></a></td>
+    <td>destination  <a href='undocumented#Pixel_Storage'>pixel storage</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_readPixels_dstRowBytes'><code><strong>dstRowBytes</strong></code></a></td>
+    <td>destination row length</td>
+  </tr>
+  <tr>    <td><a name='SkImage_readPixels_srcX'><code><strong>srcX</strong></code></a></td>
+    <td>column index whose absolute value is less than <a href='#SkImage_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_readPixels_srcY'><code><strong>srcY</strong></code></a></td>
+    <td>row index whose absolute value is less than <a href='#SkImage_height'>height()</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_readPixels_cachingHint'><code><strong>cachingHint</strong></code></a></td>
+    <td>one of: <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a>, <a href='#SkImage_kDisallow_CachingHint'>kDisallow_CachingHint</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels are copied to <a href='#SkImage_readPixels_dstPixels'>dstPixels</a>
+
+### Example
+
+<div><fiddle-embed name="@Image_readPixels"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_scalePixels'>scalePixels</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_readPixels'>readPixels</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_readPixels'>readPixels</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_readPixels'>readPixels</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_readPixels'>readPixels</a>
+
+<a name='SkImage_readPixels_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkImage_readPixels'>readPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst, int srcX, int srcY, <a href='#SkImage_CachingHint'>CachingHint</a> cachingHint = <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a>)const
+</pre>
+
+Copies a <a href='SkRect_Reference#Rect'>Rect</a> of pixels from <a href='SkImage_Reference#Image'>Image</a> to <a href='#SkImage_readPixels_2_dst'>dst</a>. Copy starts at (<a href='#SkImage_readPixels_2_srcX'>srcX</a>, <a href='#SkImage_readPixels_2_srcY'>srcY</a>), and
+does not exceed <a href='SkImage_Reference#Image'>Image</a> (<a href='#SkImage_width'>width()</a>, <a href='#SkImage_height'>height()</a>).
+
+<a href='#SkImage_readPixels_2_dst'>dst</a> specifies width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>, <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, <a href='#Color_Space'>Color_Space</a>,  <a href='undocumented#Pixel_Storage'>pixel storage</a>,
+and row bytes of destination. <a href='#SkImage_readPixels_2_dst'>dst</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() specifics the gap from one destination
+row to the next. Returns true if pixels are copied. Returns false if:
+
+<table>  <tr>
+    <td><a href='#SkImage_readPixels_2_dst'>dst</a>  <a href='undocumented#Pixel_Storage'>pixel storage</a> equals nullptr</td>
+  </tr>  <tr>
+    <td><a href='#SkImage_readPixels_2_dst'>dst</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() is less than <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_minRowBytes'>minRowBytes</a></td>
+  </tr>  <tr>
+    <td><a href='#Pixel_Ref'>Pixel_Ref</a> is nullptr</td>
+  </tr>
+</table>
+
+Pixels are copied only if <a href='undocumented#Pixel'>pixel</a> conversion is possible. If <a href='SkImage_Reference#Image'>Image</a> <a href='#Image_Info_Color_Type'>Color_Type</a> is
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, or <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>; <a href='#SkImage_readPixels_2_dst'>dst</a>.<a href='#SkPixmap_colorType'>colorType</a>() must match.
+If <a href='SkImage_Reference#Image'>Image</a> <a href='#Image_Info_Color_Type'>Color_Type</a> is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='#SkImage_readPixels_2_dst'>dst</a>.<a href='#SkPixmap_colorSpace'>colorSpace</a>() must match.
+If <a href='SkImage_Reference#Image'>Image</a> <a href='#Image_Info_Alpha_Type'>Alpha_Type</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='#SkImage_readPixels_2_dst'>dst</a>.<a href='#SkPixmap_alphaType'>alphaType</a>() must
+match. If <a href='SkImage_Reference#Image'>Image</a> <a href='#Color_Space'>Color_Space</a> is nullptr, <a href='#SkImage_readPixels_2_dst'>dst</a>.<a href='#SkPixmap_colorSpace'>colorSpace</a>() must match. Returns
+false if <a href='undocumented#Pixel'>pixel</a> conversion is not possible.
+
+<a href='#SkImage_readPixels_2_srcX'>srcX</a> and <a href='#SkImage_readPixels_2_srcY'>srcY</a> may be negative to copy only top or left of source. Returns
+false if <a href='#SkImage_width'>width()</a> or <a href='#SkImage_height'>height()</a> is zero or negative.
+Returns false if <code><a href='undocumented#abs()'>abs</a>(<a href='#SkImage_readPixels_2_srcX'>srcX</a>) >= <a href='SkImage_Reference#Image'>Image</a> <a href='#SkImage_width'>width()</a></code>, or if <code><a href='undocumented#abs()'>abs</a>(<a href='#SkImage_readPixels_2_srcY'>srcY</a>) >= <a href='SkImage_Reference#Image'>Image</a> <a href='#SkImage_height'>height()</a></code>.
+
+If <a href='#SkImage_readPixels_2_cachingHint'>cachingHint</a> is <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a>, pixels may be retained locally.
+If <a href='#SkImage_readPixels_2_cachingHint'>cachingHint</a> is <a href='#SkImage_kDisallow_CachingHint'>kDisallow_CachingHint</a>, pixels are not added to the local cache.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_readPixels_2_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkPixmap_Reference#Pixmap'>Pixmap</a>: <a href='#Image_Info'>Image_Info</a>, pixels, row bytes</td>
+  </tr>
+  <tr>    <td><a name='SkImage_readPixels_2_srcX'><code><strong>srcX</strong></code></a></td>
+    <td>column index whose absolute value is less than <a href='#SkImage_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_readPixels_2_srcY'><code><strong>srcY</strong></code></a></td>
+    <td>row index whose absolute value is less than <a href='#SkImage_height'>height()</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_readPixels_2_cachingHint'><code><strong>cachingHint</strong></code></a></td>
+    <td>one of: <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a>, <a href='#SkImage_kDisallow_CachingHint'>kDisallow_CachingHint</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels are copied to <a href='#SkImage_readPixels_2_dst'>dst</a>
+
+### Example
+
+<div><fiddle-embed name="@Image_readPixels_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_scalePixels'>scalePixels</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_readPixels'>readPixels</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_readPixels'>readPixels</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_readPixels'>readPixels</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_readPixels'>readPixels</a>
+
+<a name='SkImage_scalePixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkImage_scalePixels'>scalePixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst, <a href='undocumented#SkFilterQuality'>SkFilterQuality</a> filterQuality,
+                 <a href='#SkImage_CachingHint'>CachingHint</a> cachingHint = <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a>)const
+</pre>
+
+Copies <a href='SkImage_Reference#SkImage'>SkImage</a> to <a href='#SkImage_scalePixels_dst'>dst</a>, scaling pixels to fit <a href='#SkImage_scalePixels_dst'>dst</a>.<a href='#SkPixmap_width'>width()</a> and <a href='#SkImage_scalePixels_dst'>dst</a>.<a href='#SkPixmap_height'>height()</a>, and
+converting pixels to match <a href='#SkImage_scalePixels_dst'>dst</a>.<a href='#SkPixmap_colorType'>colorType</a>() and <a href='#SkImage_scalePixels_dst'>dst</a>.<a href='#SkPixmap_alphaType'>alphaType</a>(). Returns true if
+pixels are copied. Returns false if <a href='#SkImage_scalePixels_dst'>dst</a>.<a href='#SkPixmap_addr'>addr()</a> is nullptr, or <a href='#SkImage_scalePixels_dst'>dst</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() is
+less than <a href='#SkImage_scalePixels_dst'>dst</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>.
+
+Pixels are copied only if <a href='undocumented#Pixel'>pixel</a> conversion is possible. If <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, or <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>; <a href='#SkImage_scalePixels_dst'>dst</a>.<a href='#SkPixmap_colorType'>colorType</a>() must match.
+If <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='#SkImage_scalePixels_dst'>dst</a>.<a href='#SkPixmap_colorSpace'>colorSpace</a>() must match.
+If <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='#SkImage_scalePixels_dst'>dst</a>.<a href='#SkPixmap_alphaType'>alphaType</a>() must
+match. If <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a> is nullptr, <a href='#SkImage_scalePixels_dst'>dst</a>.<a href='#SkPixmap_colorSpace'>colorSpace</a>() must match. Returns
+false if <a href='undocumented#Pixel'>pixel</a> conversion is not possible.
+
+Scales the <a href='SkImage_Reference#Image'>image</a>, with <a href='#SkImage_scalePixels_filterQuality'>filterQuality</a>, to match <a href='#SkImage_scalePixels_dst'>dst</a>.<a href='#SkPixmap_width'>width()</a> and <a href='#SkImage_scalePixels_dst'>dst</a>.<a href='#SkPixmap_height'>height()</a>.
+<a href='#SkImage_scalePixels_filterQuality'>filterQuality</a> <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a> is fastest, typically implemented with
+<a href='undocumented#Nearest_Neighbor'>nearest neighbor filter</a>. <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> is typically implemented with
+<a href='undocumented#Bilerp'>bilerp filter</a>. <a href='undocumented#kMedium_SkFilterQuality'>kMedium_SkFilterQuality</a> is typically implemented with
+<a href='undocumented#Bilerp'>bilerp filter</a>, and  <a href='undocumented#MipMap'>mip-map filter</a> when <a href='undocumented#Size'>size</a> is reduced.
+<a href='undocumented#kHigh_SkFilterQuality'>kHigh_SkFilterQuality</a> is slowest, typically implemented with  <a href='undocumented#BiCubic'>bicubic filter</a>.
+
+If <a href='#SkImage_scalePixels_cachingHint'>cachingHint</a> is <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a>, pixels may be retained locally.
+If <a href='#SkImage_scalePixels_cachingHint'>cachingHint</a> is <a href='#SkImage_kDisallow_CachingHint'>kDisallow_CachingHint</a>, pixels are not added to the local cache.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_scalePixels_dst'><code><strong>dst</strong></code></a></td>
+    <td>destination <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>: <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, pixels, row bytes</td>
+  </tr>
+  <tr>    <td><a name='SkImage_scalePixels_filterQuality'><code><strong>filterQuality</strong></code></a></td>
+    <td>one of: <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#kMedium_SkFilterQuality'>kMedium_SkFilterQuality</a>, <a href='undocumented#kHigh_SkFilterQuality'>kHigh_SkFilterQuality</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_scalePixels_cachingHint'><code><strong>cachingHint</strong></code></a></td>
+    <td>one of: <a href='#SkImage_kAllow_CachingHint'>kAllow_CachingHint</a>, <a href='#SkImage_kDisallow_CachingHint'>kDisallow_CachingHint</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels are scaled to fit <a href='#SkImage_scalePixels_dst'>dst</a>
+
+### Example
+
+<div><fiddle-embed name="@Image_scalePixels"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawImage'>drawImage</a> <a href='#SkImage_readPixels'>readPixels</a> <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>::<a href='#SkPixmap_scalePixels'>scalePixels</a>
+
+<a name='SkImage_encodeToData'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkData'>SkData</a>&gt; <a href='#SkImage_encodeToData'>encodeToData</a>(<a href='undocumented#SkEncodedImageFormat'>SkEncodedImageFormat</a> encodedImageFormat, int quality)const
+</pre>
+
+Encodes <a href='SkImage_Reference#SkImage'>SkImage</a> pixels, returning result as <a href='undocumented#SkData'>SkData</a>.
+
+Returns nullptr if encoding fails, or if <a href='#SkImage_encodeToData_encodedImageFormat'>encodedImageFormat</a> is not supported.
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> encoding in a format requires both building with one or more of:
+SK_HAS_JPEG_LIBRARY, SK_HAS_PNG_LIBRARY, SK_HAS_WEBP_LIBRARY; and platform support
+for the encoded format.
+
+If SK_BUILD_FOR_MAC or SK_BUILD_FOR_IOS is defined, <a href='#SkImage_encodeToData_encodedImageFormat'>encodedImageFormat</a> can
+additionally be one of: <a href='undocumented#SkEncodedImageFormat'>SkEncodedImageFormat</a>::<a href='#SkEncodedImageFormat_kICO'>kICO</a>, <a href='undocumented#SkEncodedImageFormat'>SkEncodedImageFormat</a>::<a href='#SkEncodedImageFormat_kBMP'>kBMP</a>,
+<a href='undocumented#SkEncodedImageFormat'>SkEncodedImageFormat</a>::<a href='#SkEncodedImageFormat_kGIF'>kGIF</a>.
+
+<a href='#SkImage_encodeToData_quality'>quality</a> is a platform and format specific metric trading off <a href='undocumented#Size'>size</a> and encoding
+error. When used, <a href='#SkImage_encodeToData_quality'>quality</a> equaling 100 encodes with the least error. <a href='#SkImage_encodeToData_quality'>quality</a> may
+be ignored by the encoder.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_encodeToData_encodedImageFormat'><code><strong>encodedImageFormat</strong></code></a></td>
+    <td>one of: <a href='undocumented#SkEncodedImageFormat'>SkEncodedImageFormat</a>::<a href='#SkEncodedImageFormat_kJPEG'>kJPEG</a>, <a href='undocumented#SkEncodedImageFormat'>SkEncodedImageFormat</a>::<a href='#SkEncodedImageFormat_kPNG'>kPNG</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#SkEncodedImageFormat'>SkEncodedImageFormat</a>::<a href='#SkEncodedImageFormat_kWEBP'>kWEBP</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_encodeToData_quality'><code><strong>quality</strong></code></a></td>
+    <td>encoder specific metric with 100 equaling best</td>
+  </tr>
+</table>
+
+### Return Value
+
+encoded <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Image_encodeToData"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_refEncodedData'>refEncodedData</a> <a href='#SkImage_MakeFromEncoded'>MakeFromEncoded</a>
+
+<a name='SkImage_encodeToData_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkData'>SkData</a>&gt; <a href='#SkImage_encodeToData'>encodeToData</a>()const
+</pre>
+
+Encodes <a href='SkImage_Reference#SkImage'>SkImage</a> pixels, returning result as <a href='undocumented#SkData'>SkData</a>. Returns existing encoded <a href='undocumented#Data'>data</a>
+if present; otherwise, <a href='SkImage_Reference#SkImage'>SkImage</a> is encoded with <a href='undocumented#SkEncodedImageFormat'>SkEncodedImageFormat</a>::<a href='#SkEncodedImageFormat_kPNG'>kPNG</a>. Skia
+must be built with SK_HAS_PNG_LIBRARY to encode <a href='SkImage_Reference#SkImage'>SkImage</a>.
+
+Returns nullptr if existing encoded <a href='undocumented#Data'>data</a> is missing or invalid, and
+encoding fails.
+
+### Return Value
+
+encoded <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Image_encodeToData_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_refEncodedData'>refEncodedData</a> <a href='#SkImage_MakeFromEncoded'>MakeFromEncoded</a>
+
+<a name='SkImage_refEncodedData'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkData'>SkData</a>&gt; <a href='#SkImage_refEncodedData'>refEncodedData</a>()const
+</pre>
+
+Returns encoded <a href='SkImage_Reference#SkImage'>SkImage</a> pixels as <a href='undocumented#SkData'>SkData</a>, if <a href='SkImage_Reference#SkImage'>SkImage</a> was created from supported
+encoded <a href='SkStream_Reference#Stream'>stream</a> format. Platform support for formats vary and may require building
+with one or more of: SK_HAS_JPEG_LIBRARY, SK_HAS_PNG_LIBRARY, SK_HAS_WEBP_LIBRARY.
+
+Returns nullptr if <a href='SkImage_Reference#SkImage'>SkImage</a> contents are not encoded.
+
+### Return Value
+
+encoded <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="80856fe921ce36f8d5a32d8672bccbfc" gpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_encodeToData'>encodeToData</a> <a href='#SkImage_MakeFromEncoded'>MakeFromEncoded</a>
+
+<a name='Utility'></a>
+
+<a name='SkImage_makeSubset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_makeSubset'>makeSubset</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& subset)const
+</pre>
+
+Returns <a href='#SkImage_makeSubset_subset'>subset</a> of <a href='SkImage_Reference#SkImage'>SkImage</a>. <a href='#SkImage_makeSubset_subset'>subset</a> must be fully contained by <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='#SkImage_dimensions'>dimensions()</a>.
+The implementation may share pixels, or may copy them.
+
+Returns nullptr if <a href='#SkImage_makeSubset_subset'>subset</a> is empty, or <a href='#SkImage_makeSubset_subset'>subset</a> is not contained by bounds, or
+pixels in <a href='SkImage_Reference#SkImage'>SkImage</a> could not be read or copied.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_makeSubset_subset'><code><strong>subset</strong></code></a></td>
+    <td>bounds of returned <a href='SkImage_Reference#SkImage'>SkImage</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+partial or full <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Image_makeSubset"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeFromEncoded'>MakeFromEncoded</a>
+
+<a name='SkImage_makeTextureImage'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_makeTextureImage'>makeTextureImage</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='undocumented#SkColorSpace'>SkColorSpace</a>* dstColorSpace,
+                                <a href='undocumented#GrMipMapped'>GrMipMapped</a> mipMapped = <a href='undocumented#GrMipMapped'>GrMipMapped</a>::<a href='#GrMipMapped_kNo'>kNo</a>)const
+</pre>
+
+Returns <a href='SkImage_Reference#SkImage'>SkImage</a> backed by  <a href='undocumented#GPU_Texture'>GPU texture</a> associated with <a href='#SkImage_makeTextureImage_context'>context</a>. Returned <a href='SkImage_Reference#SkImage'>SkImage</a> is
+compatible with <a href='SkSurface_Reference#SkSurface'>SkSurface</a> created with <a href='#SkImage_makeTextureImage_dstColorSpace'>dstColorSpace</a>. The returned <a href='SkImage_Reference#SkImage'>SkImage</a> respects
+<a href='#SkImage_makeTextureImage_mipMapped'>mipMapped</a> setting; if <a href='#SkImage_makeTextureImage_mipMapped'>mipMapped</a> equals <a href='undocumented#GrMipMapped'>GrMipMapped</a>::<a href='#GrMipMapped_kYes'>kYes</a>, the backing <a href='undocumented#Texture'>texture</a>
+allocates  <a href='undocumented#Mip_Map'>mip map</a> levels. Returns original <a href='SkImage_Reference#SkImage'>SkImage</a> if <a href='#SkImage_makeTextureImage_context'>context</a>
+and <a href='#SkImage_makeTextureImage_dstColorSpace'>dstColorSpace</a> match and <a href='#SkImage_makeTextureImage_mipMapped'>mipMapped</a> is compatible with backing  <a href='undocumented#GPU_Texture'>GPU texture</a>.
+
+Returns nullptr if <a href='#SkImage_makeTextureImage_context'>context</a> is nullptr, or if <a href='SkImage_Reference#SkImage'>SkImage</a> was created with another
+<a href='undocumented#GrContext'>GrContext</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_makeTextureImage_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_makeTextureImage_dstColorSpace'><code><strong>dstColorSpace</strong></code></a></td>
+    <td>range of colors of matching <a href='SkSurface_Reference#SkSurface'>SkSurface</a> on GPU</td>
+  </tr>
+  <tr>    <td><a name='SkImage_makeTextureImage_mipMapped'><code><strong>mipMapped</strong></code></a></td>
+    <td>whether created <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='undocumented#Texture'>texture</a> must allocate  <a href='undocumented#Mip_Map'>mip map</a> levels</td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="eeec9e07e604b44d0208899a2fe5bef5" gpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeFromTexture'>MakeFromTexture</a>
+
+<a name='SkImage_makeNonTextureImage'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_makeNonTextureImage'>makeNonTextureImage</a>()const
+</pre>
+
+Returns raster <a href='SkImage_Reference#Image'>image</a> or lazy <a href='SkImage_Reference#Image'>image</a>. Copies <a href='SkImage_Reference#SkImage'>SkImage</a> backed by GPU <a href='undocumented#Texture'>texture</a> into
+CPU memory if needed. Returns original <a href='SkImage_Reference#SkImage'>SkImage</a> if decoded in raster <a href='SkBitmap_Reference#Bitmap'>bitmap</a>,
+or if encoded in a <a href='SkStream_Reference#Stream'>stream</a>.
+
+Returns nullptr if backed by GPU <a href='undocumented#Texture'>texture</a> and copy fails.
+
+### Return Value
+
+raster <a href='SkImage_Reference#Image'>image</a>, lazy <a href='SkImage_Reference#Image'>image</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="ecdbaff44a02c310ef672b7d393c6dea" gpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_makeTextureImage'>makeTextureImage</a> <a href='#SkImage_makeRasterImage'>makeRasterImage</a> <a href='#SkImage_MakeBackendTextureFromSkImage'>MakeBackendTextureFromSkImage</a>
+
+<a name='SkImage_makeRasterImage'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_makeRasterImage'>makeRasterImage</a>()const
+</pre>
+
+Returns raster <a href='SkImage_Reference#Image'>image</a>. Copies <a href='SkImage_Reference#SkImage'>SkImage</a> backed by GPU <a href='undocumented#Texture'>texture</a> into CPU memory,
+or decodes <a href='SkImage_Reference#SkImage'>SkImage</a> from lazy <a href='SkImage_Reference#Image'>image</a>. Returns original <a href='SkImage_Reference#SkImage'>SkImage</a> if decoded in
+raster <a href='SkBitmap_Reference#Bitmap'>bitmap</a>.
+
+Returns nullptr if copy, decode, or <a href='undocumented#Pixel'>pixel</a> read fails.
+
+### Return Value
+
+raster <a href='SkImage_Reference#Image'>image</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="aed5f399915d40bb5d133ab586e5bac3" gpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_isTextureBacked'>isTextureBacked</a> <a href='#SkImage_isLazyGenerated'>isLazyGenerated</a> <a href='#SkImage_MakeFromRaster'>MakeFromRaster</a>
+
+<a name='SkImage_makeWithFilter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_makeWithFilter'>makeWithFilter</a>(const <a href='undocumented#SkImageFilter'>SkImageFilter</a>* filter, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& subset,
+                              const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& clipBounds, <a href='SkIRect_Reference#SkIRect'>SkIRect</a>* outSubset, <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>* offset)const
+</pre>
+
+Creates filtered <a href='SkImage_Reference#SkImage'>SkImage</a>. <a href='#SkImage_makeWithFilter_filter'>filter</a> processes original <a href='SkImage_Reference#SkImage'>SkImage</a>, potentially changing
+<a href='SkColor_Reference#Color'>color</a>, position, and <a href='undocumented#Size'>size</a>. <a href='#SkImage_makeWithFilter_subset'>subset</a> is the bounds of original <a href='SkImage_Reference#SkImage'>SkImage</a> processed
+by <a href='#SkImage_makeWithFilter_filter'>filter</a>. <a href='#SkImage_makeWithFilter_clipBounds'>clipBounds</a> is the expected bounds of the filtered <a href='SkImage_Reference#SkImage'>SkImage</a>. <a href='#SkImage_makeWithFilter_outSubset'>outSubset</a>
+is required storage for the actual bounds of the filtered <a href='SkImage_Reference#SkImage'>SkImage</a>. <a href='#SkImage_makeWithFilter_offset'>offset</a> is
+required storage for translation of returned <a href='SkImage_Reference#SkImage'>SkImage</a>.
+
+Returns nullptr if <a href='SkImage_Reference#SkImage'>SkImage</a> could not be created. If nullptr is returned, <a href='#SkImage_makeWithFilter_outSubset'>outSubset</a>
+and <a href='#SkImage_makeWithFilter_offset'>offset</a> are undefined.
+
+Useful for animation of <a href='undocumented#SkImageFilter'>SkImageFilter</a> that varies <a href='undocumented#Size'>size</a> from frame to frame.
+Returned <a href='SkImage_Reference#SkImage'>SkImage</a> is created larger than required by <a href='#SkImage_makeWithFilter_filter'>filter</a> so that  <a href='undocumented#GPU_Texture'>GPU texture</a>
+can be reused with different sized effects. <a href='#SkImage_makeWithFilter_outSubset'>outSubset</a> describes the valid bounds
+of  <a href='undocumented#GPU_Texture'>GPU texture</a> returned. <a href='#SkImage_makeWithFilter_offset'>offset</a> translates the returned <a href='SkImage_Reference#SkImage'>SkImage</a> to keep subsequent
+animation frames aligned with respect to each other.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_makeWithFilter_filter'><code><strong>filter</strong></code></a></td>
+    <td>how <a href='SkImage_Reference#SkImage'>SkImage</a> is sampled when transformed</td>
+  </tr>
+  <tr>    <td><a name='SkImage_makeWithFilter_subset'><code><strong>subset</strong></code></a></td>
+    <td>bounds of <a href='SkImage_Reference#SkImage'>SkImage</a> processed by <a href='#SkImage_makeWithFilter_filter'>filter</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_makeWithFilter_clipBounds'><code><strong>clipBounds</strong></code></a></td>
+    <td>expected bounds of filtered <a href='SkImage_Reference#SkImage'>SkImage</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_makeWithFilter_outSubset'><code><strong>outSubset</strong></code></a></td>
+    <td>storage for returned <a href='SkImage_Reference#SkImage'>SkImage</a> bounds</td>
+  </tr>
+  <tr>    <td><a name='SkImage_makeWithFilter_offset'><code><strong>offset</strong></code></a></td>
+    <td>storage for returned <a href='SkImage_Reference#SkImage'>SkImage</a> translation</td>
+  </tr>
+</table>
+
+### Return Value
+
+filtered <a href='SkImage_Reference#SkImage'>SkImage</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Image_makeWithFilter" gpu="true"><div>In each frame of the animation, filtered <a href='SkImage_Reference#Image'>Image</a> is drawn in a different location.
+By translating <a href='SkCanvas_Reference#Canvas'>canvas</a> by returned <a href='#SkImage_makeWithFilter_offset'>offset</a>, <a href='SkImage_Reference#Image'>Image</a> appears stationary.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_makeShader'>makeShader</a> <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_setImageFilter'>setImageFilter</a>
+
+<a name='SkImage_BackendTextureReleaseProc'></a>
+
+---
+
+<a href='#SkImage_BackendTextureReleaseProc'>BackendTextureReleaseProc</a>
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    typedef std::function<void(<a href='undocumented#GrBackendTexture'>GrBackendTexture</a>)> <a href='#SkImage_BackendTextureReleaseProc'>BackendTextureReleaseProc</a>;
+</pre>
+
+Defines a callback function, taking one parameter of type <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> with
+no return value. Function is called when back-end <a href='undocumented#Texture'>texture</a> is to be released.
+
+<a name='SkImage_MakeBackendTextureFromSkImage'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static bool <a href='#SkImage_MakeBackendTextureFromSkImage'>MakeBackendTextureFromSkImage</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='SkImage_Reference#Image'>image</a>,
+                                          <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>* backendTexture,
+                                          <a href='#SkImage_BackendTextureReleaseProc'>BackendTextureReleaseProc</a>* backendTextureReleaseProc)
+</pre>
+
+Creates a <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> from the provided <a href='SkImage_Reference#SkImage'>SkImage</a>. Returns true and
+stores result in <a href='#SkImage_MakeBackendTextureFromSkImage_backendTexture'>backendTexture</a> and <a href='#SkImage_MakeBackendTextureFromSkImage_backendTextureReleaseProc'>backendTextureReleaseProc</a> if
+<a href='undocumented#Texture'>texture</a> is created; otherwise, returns false and leaves
+<a href='#SkImage_MakeBackendTextureFromSkImage_backendTexture'>backendTexture</a> and <a href='#SkImage_MakeBackendTextureFromSkImage_backendTextureReleaseProc'>backendTextureReleaseProc</a> unmodified.
+
+Call <a href='#SkImage_MakeBackendTextureFromSkImage_backendTextureReleaseProc'>backendTextureReleaseProc</a> after deleting <a href='#SkImage_MakeBackendTextureFromSkImage_backendTexture'>backendTexture</a>.
+<a href='#SkImage_MakeBackendTextureFromSkImage_backendTextureReleaseProc'>backendTextureReleaseProc</a> cleans up auxiliary <a href='undocumented#Data'>data</a> related to returned
+<a href='#SkImage_MakeBackendTextureFromSkImage_backendTexture'>backendTexture</a>. The caller must delete returned <a href='#SkImage_MakeBackendTextureFromSkImage_backendTexture'>backendTexture</a> after use.
+
+If <a href='SkImage_Reference#SkImage'>SkImage</a> is both <a href='undocumented#Texture'>texture</a> backed and singly referenced, <a href='#SkImage_MakeBackendTextureFromSkImage_image'>image</a> is returned in
+<a href='#SkImage_MakeBackendTextureFromSkImage_backendTexture'>backendTexture</a> without conversion or making a copy. <a href='SkImage_Reference#SkImage'>SkImage</a> is singly referenced
+if its was transferred solely using std::move().
+
+If <a href='SkImage_Reference#SkImage'>SkImage</a> is not <a href='undocumented#Texture'>texture</a> backed, returns <a href='undocumented#Texture'>texture</a> with <a href='SkImage_Reference#SkImage'>SkImage</a> contents.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_MakeBackendTextureFromSkImage_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeBackendTextureFromSkImage_image'><code><strong>image</strong></code></a></td>
+    <td><a href='SkImage_Reference#SkImage'>SkImage</a> used for <a href='undocumented#Texture'>texture</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeBackendTextureFromSkImage_backendTexture'><code><strong>backendTexture</strong></code></a></td>
+    <td>storage for back-end <a href='undocumented#Texture'>texture</a></td>
+  </tr>
+  <tr>    <td><a name='SkImage_MakeBackendTextureFromSkImage_backendTextureReleaseProc'><code><strong>backendTextureReleaseProc</strong></code></a></td>
+    <td>storage for clean up function</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if back-end <a href='undocumented#Texture'>texture</a> was created
+
+### Example
+
+<div><fiddle-embed name="@Image_MakeBackendTextureFromSkImage" gpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeFromTexture'>MakeFromTexture</a> <a href='#SkImage_makeTextureImage'>makeTextureImage</a>
+
+<a name='SkImage_isLazyGenerated'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkImage_isLazyGenerated'>isLazyGenerated</a>()const
+</pre>
+
+Returns true if <a href='SkImage_Reference#SkImage'>SkImage</a> is backed by an image-generator or other service that creates
+and caches its pixels or <a href='undocumented#Texture'>texture</a> on-demand.
+
+### Return Value
+
+true if <a href='SkImage_Reference#SkImage'>SkImage</a> is created as needed
+
+### Example
+
+<div><fiddle-embed name="a8b8bd4bfe968e2c63085f867665227f"></fiddle-embed></div>
+
+### Example
+
+<div><fiddle-embed name="f031c2a53f6a57833dc0127e674553da" gpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_isTextureBacked'>isTextureBacked</a> <a href='#SkImage_makeNonTextureImage'>makeNonTextureImage</a>
+
+<a name='SkImage_makeColorSpace'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkImage_makeColorSpace'>makeColorSpace</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; target)const
+</pre>
+
+Creates <a href='SkImage_Reference#SkImage'>SkImage</a> in <a href='#SkImage_makeColorSpace_target'>target</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+Returns nullptr if <a href='SkImage_Reference#SkImage'>SkImage</a> could not be created.
+
+Returns original <a href='SkImage_Reference#SkImage'>SkImage</a> if it is in <a href='#SkImage_makeColorSpace_target'>target</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+Otherwise, converts pixels from <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a> to <a href='#SkImage_makeColorSpace_target'>target</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+If <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='#SkImage_colorSpace'>colorSpace</a>() returns nullptr, <a href='SkImage_Reference#SkImage'>SkImage</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a> is assumed to be sRGB.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkImage_makeColorSpace_target'><code><strong>target</strong></code></a></td>
+    <td><a href='undocumented#SkColorSpace'>SkColorSpace</a> describing <a href='SkColor_Reference#Color'>color</a> range of returned <a href='SkImage_Reference#SkImage'>SkImage</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+created <a href='SkImage_Reference#SkImage'>SkImage</a> in <a href='#SkImage_makeColorSpace_target'>target</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a>
+
+### Example
+
+<div><fiddle-embed name="dbf5f75c1275a3013672f896767140fb"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkImage_MakeFromPicture'>MakeFromPicture</a> <a href='#SkImage_MakeFromTexture'>MakeFromTexture</a>
+
diff --git a/src/third_party/skia/site/user/api/SkMatrix_Reference.md b/src/third_party/skia/site/user/api/SkMatrix_Reference.md
new file mode 100644
index 0000000..c69e188
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkMatrix_Reference.md
@@ -0,0 +1,4477 @@
+SkMatrix Reference
+===
+
+
+<a name='SkMatrix'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> {
+
+    static <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_MakeScale'>MakeScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy);
+    static <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_MakeScale'>MakeScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> scale);
+    static <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_MakeTrans'>MakeTrans</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    static <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_MakeAll'>MakeAll</a>(<a href='undocumented#SkScalar'>SkScalar</a> scaleX, <a href='undocumented#SkScalar'>SkScalar</a> skewX, <a href='undocumented#SkScalar'>SkScalar</a> transX,
+                            <a href='undocumented#SkScalar'>SkScalar</a> skewY, <a href='undocumented#SkScalar'>SkScalar</a> scaleY, <a href='undocumented#SkScalar'>SkScalar</a> transY,
+                            <a href='undocumented#SkScalar'>SkScalar</a> pers0, <a href='undocumented#SkScalar'>SkScalar</a> pers1, <a href='undocumented#SkScalar'>SkScalar</a> pers2);
+
+    enum <a href='#SkMatrix_TypeMask'>TypeMask</a> {
+        <a href='#SkMatrix_kIdentity_Mask'>kIdentity_Mask</a> = 0,
+        <a href='#SkMatrix_kTranslate_Mask'>kTranslate_Mask</a> = 0x01,
+        <a href='#SkMatrix_kScale_Mask'>kScale_Mask</a> = 0x02,
+        <a href='#SkMatrix_kAffine_Mask'>kAffine_Mask</a> = 0x04,
+        <a href='#SkMatrix_kPerspective_Mask'>kPerspective_Mask</a> = 0x08,
+    };
+
+    <a href='#SkMatrix_TypeMask'>TypeMask</a> <a href='#SkMatrix_getType'>getType</a>() const;
+    bool <a href='#SkMatrix_isIdentity'>isIdentity</a>() const;
+    bool <a href='#SkMatrix_isScaleTranslate'>isScaleTranslate</a>() const;
+    bool <a href='#SkMatrix_isTranslate'>isTranslate</a>() const;
+    bool <a href='#SkMatrix_rectStaysRect'>rectStaysRect</a>() const;
+    bool <a href='#SkMatrix_preservesAxisAlignment'>preservesAxisAlignment</a>() const;
+    bool <a href='#SkMatrix_hasPerspective'>hasPerspective</a>() const;
+    bool <a href='#SkMatrix_isSimilarity'>isSimilarity</a>(<a href='undocumented#SkScalar'>SkScalar</a> tol = <a href='undocumented#SK_ScalarNearlyZero'>SK_ScalarNearlyZero</a>) const;
+    bool <a href='#SkMatrix_preservesRightAngles'>preservesRightAngles</a>(<a href='undocumented#SkScalar'>SkScalar</a> tol = <a href='undocumented#SK_ScalarNearlyZero'>SK_ScalarNearlyZero</a>) const;
+
+    static constexpr int <a href='#SkMatrix_kMScaleX'>kMScaleX</a> = 0    static constexpr int <a href='#SkMatrix_kMSkewX'>kMSkewX</a> = 1    static constexpr int <a href='#SkMatrix_kMTransX'>kMTransX</a> = 2    static constexpr int <a href='#SkMatrix_kMSkewY'>kMSkewY</a> = 3    static constexpr int <a href='#SkMatrix_kMScaleY'>kMScaleY</a> = 4    static constexpr int <a href='#SkMatrix_kMTransY'>kMTransY</a> = 5    static constexpr int <a href='#SkMatrix_kMPersp0'>kMPersp0</a> = 6    static constexpr int <a href='#SkMatrix_kMPersp1'>kMPersp1</a> = 7    static constexpr int <a href='#SkMatrix_kMPersp2'>kMPersp2</a> = 8    static constexpr int <a href='#SkMatrix_kAScaleX'>kAScaleX</a> = 0    static constexpr int <a href='#SkMatrix_kASkewY'>kASkewY</a> = 1    static constexpr int <a href='#SkMatrix_kASkewX'>kASkewX</a> = 2    static constexpr int <a href='#SkMatrix_kAScaleY'>kAScaleY</a> = 3    static constexpr int <a href='#SkMatrix_kATransX'>kATransX</a> = 4    static constexpr int <a href='#SkMatrix_kATransY'>kATransY</a> = 5
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_array_operator'>operator[]</a>(int index) const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_get'>get</a>(int index) const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getScaleX'>getScaleX</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getScaleY'>getScaleY</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getSkewY'>getSkewY</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getSkewX'>getSkewX</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getTranslateX'>getTranslateX</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getTranslateY'>getTranslateY</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getPerspX'>getPerspX</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getPerspY'>getPerspY</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a>& <a href='#SkMatrix_array1_operator'>operator[]</a>(int index);
+    void <a href='#SkMatrix_set'>set</a>(int index, <a href='undocumented#SkScalar'>SkScalar</a> value);
+    void <a href='#SkMatrix_setScaleX'>setScaleX</a>(<a href='undocumented#SkScalar'>SkScalar</a> v);
+    void <a href='#SkMatrix_setScaleY'>setScaleY</a>(<a href='undocumented#SkScalar'>SkScalar</a> v);
+    void <a href='#SkMatrix_setSkewY'>setSkewY</a>(<a href='undocumented#SkScalar'>SkScalar</a> v);
+    void <a href='#SkMatrix_setSkewX'>setSkewX</a>(<a href='undocumented#SkScalar'>SkScalar</a> v);
+    void <a href='#SkMatrix_setTranslateX'>setTranslateX</a>(<a href='undocumented#SkScalar'>SkScalar</a> v);
+    void <a href='#SkMatrix_setTranslateY'>setTranslateY</a>(<a href='undocumented#SkScalar'>SkScalar</a> v);
+    void <a href='#SkMatrix_setPerspX'>setPerspX</a>(<a href='undocumented#SkScalar'>SkScalar</a> v);
+    void <a href='#SkMatrix_setPerspY'>setPerspY</a>(<a href='undocumented#SkScalar'>SkScalar</a> v);
+    void <a href='#SkMatrix_setAll'>setAll</a>(<a href='undocumented#SkScalar'>SkScalar</a> scaleX, <a href='undocumented#SkScalar'>SkScalar</a> skewX, <a href='undocumented#SkScalar'>SkScalar</a> transX,
+                <a href='undocumented#SkScalar'>SkScalar</a> skewY, <a href='undocumented#SkScalar'>SkScalar</a> scaleY, <a href='undocumented#SkScalar'>SkScalar</a> transY,
+                <a href='undocumented#SkScalar'>SkScalar</a> persp0, <a href='undocumented#SkScalar'>SkScalar</a> persp1, <a href='undocumented#SkScalar'>SkScalar</a> persp2);
+    void <a href='#SkMatrix_get9'>get9</a>(<a href='undocumented#SkScalar'>SkScalar</a> buffer[9]) const;
+    void <a href='#SkMatrix_set9'>set9</a>(const <a href='undocumented#SkScalar'>SkScalar</a> buffer[9]);
+    void <a href='#SkMatrix_reset'>reset()</a>;
+    void <a href='#SkMatrix_setIdentity'>setIdentity</a>();
+    void <a href='#SkMatrix_setTranslate'>setTranslate</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    void <a href='#SkMatrix_setTranslate'>setTranslate</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& v);
+    void <a href='#SkMatrix_setScale'>setScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py);
+    void <a href='#SkMatrix_setScale'>setScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy);
+    void <a href='#SkMatrix_setRotate'>setRotate</a>(<a href='undocumented#SkScalar'>SkScalar</a> degrees, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py);
+    void <a href='#SkMatrix_setRotate'>setRotate</a>(<a href='undocumented#SkScalar'>SkScalar</a> degrees);
+    void <a href='#SkMatrix_setSinCos'>setSinCos</a>(<a href='undocumented#SkScalar'>SkScalar</a> sinValue, <a href='undocumented#SkScalar'>SkScalar</a> cosValue,
+                   <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py);
+    void <a href='#SkMatrix_setSinCos'>setSinCos</a>(<a href='undocumented#SkScalar'>SkScalar</a> sinValue, <a href='undocumented#SkScalar'>SkScalar</a> cosValue);
+    <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='#SkMatrix_setRSXform'>setRSXform</a>(const <a href='undocumented#SkRSXform'>SkRSXform</a>& rsxForm);
+    void <a href='#SkMatrix_setSkew'>setSkew</a>(<a href='undocumented#SkScalar'>SkScalar</a> kx, <a href='undocumented#SkScalar'>SkScalar</a> ky, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py);
+    void <a href='#SkMatrix_setSkew'>setSkew</a>(<a href='undocumented#SkScalar'>SkScalar</a> kx, <a href='undocumented#SkScalar'>SkScalar</a> ky);
+    void <a href='#SkMatrix_setConcat'>setConcat</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& a, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& b);
+    void <a href='#SkMatrix_preTranslate'>preTranslate</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    void <a href='#SkMatrix_preScale'>preScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py);
+    void <a href='#SkMatrix_preScale'>preScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy);
+    void <a href='#SkMatrix_preRotate'>preRotate</a>(<a href='undocumented#SkScalar'>SkScalar</a> degrees, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py);
+    void <a href='#SkMatrix_preRotate'>preRotate</a>(<a href='undocumented#SkScalar'>SkScalar</a> degrees);
+    void <a href='#SkMatrix_preSkew'>preSkew</a>(<a href='undocumented#SkScalar'>SkScalar</a> kx, <a href='undocumented#SkScalar'>SkScalar</a> ky, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py);
+    void <a href='#SkMatrix_preSkew'>preSkew</a>(<a href='undocumented#SkScalar'>SkScalar</a> kx, <a href='undocumented#SkScalar'>SkScalar</a> ky);
+    void <a href='#SkMatrix_preConcat'>preConcat</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& other);
+    void <a href='#SkMatrix_postTranslate'>postTranslate</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    void <a href='#SkMatrix_postScale'>postScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py);
+    void <a href='#SkMatrix_postScale'>postScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy);
+    bool <a href='#SkMatrix_postIDiv'>postIDiv</a>(int divx, int divy);
+    void <a href='#SkMatrix_postRotate'>postRotate</a>(<a href='undocumented#SkScalar'>SkScalar</a> degrees, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py);
+    void <a href='#SkMatrix_postRotate'>postRotate</a>(<a href='undocumented#SkScalar'>SkScalar</a> degrees);
+    void <a href='#SkMatrix_postSkew'>postSkew</a>(<a href='undocumented#SkScalar'>SkScalar</a> kx, <a href='undocumented#SkScalar'>SkScalar</a> ky, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py);
+    void <a href='#SkMatrix_postSkew'>postSkew</a>(<a href='undocumented#SkScalar'>SkScalar</a> kx, <a href='undocumented#SkScalar'>SkScalar</a> ky);
+    void <a href='#SkMatrix_postConcat'>postConcat</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& other);
+
+    enum <a href='#SkMatrix_ScaleToFit'>ScaleToFit</a> {
+        <a href='#SkMatrix_kFill_ScaleToFit'>kFill_ScaleToFit</a>,
+        <a href='#SkMatrix_kStart_ScaleToFit'>kStart_ScaleToFit</a>,
+        <a href='#SkMatrix_kCenter_ScaleToFit'>kCenter_ScaleToFit</a>,
+        <a href='#SkMatrix_kEnd_ScaleToFit'>kEnd_ScaleToFit</a>,
+    };
+
+    bool <a href='#SkMatrix_setRectToRect'>setRectToRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& src, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst, <a href='#SkMatrix_ScaleToFit'>ScaleToFit</a> stf);
+    static <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_MakeRectToRect'>MakeRectToRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& src, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst, <a href='#SkMatrix_ScaleToFit'>ScaleToFit</a> stf);
+    bool <a href='#SkMatrix_setPolyToPoly'>setPolyToPoly</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> src[], const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> dst[], int count);
+    bool <a href='#SkMatrix_invert'>invert</a>(<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* inverse) const;
+    static void <a href='#SkMatrix_SetAffineIdentity'>SetAffineIdentity</a>(<a href='undocumented#SkScalar'>SkScalar</a> affine[6]);
+    bool <a href='#SkMatrix_asAffine'>asAffine</a>(<a href='undocumented#SkScalar'>SkScalar</a> affine[6]) const;
+    void <a href='#SkMatrix_setAffine'>setAffine</a>(const <a href='undocumented#SkScalar'>SkScalar</a> affine[6]);
+    void <a href='#SkMatrix_mapPoints'>mapPoints</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> dst[], const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> src[], int count) const;
+    void <a href='#SkMatrix_mapPoints'>mapPoints</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], int count) const;
+    void <a href='#SkMatrix_mapHomogeneousPoints'>mapHomogeneousPoints</a>(<a href='undocumented#SkPoint3'>SkPoint3</a> dst[], const <a href='undocumented#SkPoint3'>SkPoint3</a> src[], int count) const;
+    void <a href='#SkMatrix_mapXY'>mapXY</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, <a href='SkPoint_Reference#SkPoint'>SkPoint</a>* result) const;
+    <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkMatrix_mapXY'>mapXY</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y) const;
+    void <a href='#SkMatrix_mapVectors'>mapVectors</a>(<a href='SkPoint_Reference#SkVector'>SkVector</a> dst[], const <a href='SkPoint_Reference#SkVector'>SkVector</a> src[], int count) const;
+    void <a href='#SkMatrix_mapVectors'>mapVectors</a>(<a href='SkPoint_Reference#SkVector'>SkVector</a> vecs[], int count) const;
+    void <a href='#SkMatrix_mapVector'>mapVector</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy, <a href='SkPoint_Reference#SkVector'>SkVector</a>* result) const;
+    <a href='SkPoint_Reference#SkVector'>SkVector</a> <a href='#SkMatrix_mapVector'>mapVector</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy) const;
+    bool <a href='#SkMatrix_mapRect'>mapRect</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* dst, const <a href='SkRect_Reference#SkRect'>SkRect</a>& src) const;
+    bool <a href='#SkMatrix_mapRect'>mapRect</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* <a href='SkRect_Reference#Rect'>rect</a>) const;
+    <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkMatrix_mapRect'>mapRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& src) const;
+    void <a href='#SkMatrix_mapRectToQuad'>mapRectToQuad</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> dst[4], const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>) const;
+    void <a href='#SkMatrix_mapRectScaleTranslate'>mapRectScaleTranslate</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* dst, const <a href='SkRect_Reference#SkRect'>SkRect</a>& src) const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_mapRadius'>mapRadius</a>(<a href='undocumented#SkScalar'>SkScalar</a> radius) const;
+    bool <a href='#SkMatrix_isFixedStepInX'>isFixedStepInX</a>() const;
+    <a href='SkPoint_Reference#SkVector'>SkVector</a> <a href='#SkMatrix_fixedStepInX'>fixedStepInX</a>(<a href='undocumented#SkScalar'>SkScalar</a> y) const;
+    bool <a href='#SkMatrix_cheapEqualTo'>cheapEqualTo</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& m) const;
+    friend bool <a href='#SkMatrix_equal_operator'>operator==</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& a, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& b);
+    friend bool <a href='#SkMatrix_notequal_operator'>operator!=</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& a, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& b);
+    void <a href='#SkMatrix_dump'>dump()</a> const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getMinScale'>getMinScale</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getMaxScale'>getMaxScale</a>() const;
+    bool <a href='#SkMatrix_getMinMaxScales'>getMinMaxScales</a>(<a href='undocumented#SkScalar'>SkScalar</a> scaleFactors[2]) const;
+    bool <a href='#SkMatrix_decomposeScale'>decomposeScale</a>(<a href='undocumented#SkSize'>SkSize</a>* scale, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* remaining = nullptr) const;
+    static const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='#SkMatrix_I'>I</a>();
+    static const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='#SkMatrix_InvalidMatrix'>InvalidMatrix</a>();
+    static <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_Concat'>Concat</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& a, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& b);
+    void <a href='#SkMatrix_dirtyMatrixTypeCache'>dirtyMatrixTypeCache</a>();
+    void <a href='#SkMatrix_setScaleTranslate'>setScaleTranslate</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy, <a href='undocumented#SkScalar'>SkScalar</a> tx, <a href='undocumented#SkScalar'>SkScalar</a> ty);
+    bool <a href='#SkMatrix_isFinite'>isFinite</a>() const;
+};
+
+</pre>
+
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> holds a 3 by 3 <a href='SkMatrix_Reference#Matrix'>matrix</a> for transforming coordinates. This allows mapping
+<a href='SkPoint_Reference#Point'>Points</a> and <a href='SkPoint_Reference#Vector'>Vectors</a> with translation, scaling, skewing, rotation, and
+perspective.
+
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> elements are in row major order. <a href='SkMatrix_Reference#Matrix'>Matrix</a> does not have a constructor,
+so it must be explicitly initialized. <a href='#SkMatrix_setIdentity'>setIdentity</a> initializes <a href='SkMatrix_Reference#Matrix'>Matrix</a>
+so it has no effect. <a href='#SkMatrix_setTranslate'>setTranslate</a>, <a href='#SkMatrix_setScale'>setScale</a>, <a href='#SkMatrix_setSkew'>setSkew</a>, <a href='#SkMatrix_setRotate'>setRotate</a>, <a href='#SkMatrix_set9'>set9</a> and <a href='#SkMatrix_setAll'>setAll</a>
+initializes all <a href='SkMatrix_Reference#Matrix'>Matrix</a> elements with the corresponding mapping.
+
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> includes a hidden variable that classifies the type of <a href='SkMatrix_Reference#Matrix'>matrix</a> to
+improve performance. <a href='SkMatrix_Reference#Matrix'>Matrix</a> is not thread safe unless <a href='#SkMatrix_getType'>getType</a> is called first.
+
+<a name='SkMatrix_MakeScale'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_MakeScale'>MakeScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to scale by (<a href='#SkMatrix_MakeScale_sx'>sx</a>, <a href='#SkMatrix_MakeScale_sy'>sy</a>). Returned <a href='SkMatrix_Reference#Matrix'>matrix</a> is:
+
+| <a href='#SkMatrix_MakeScale_sx'>sx</a>  0  0 |
+|  0 <a href='#SkMatrix_MakeScale_sy'>sy</a>  0 |
+|  0  0  1 |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_MakeScale_sx'><code><strong>sx</strong></code></a></td>
+    <td>horizontal scale factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_MakeScale_sy'><code><strong>sy</strong></code></a></td>
+    <td>vertical scale factor</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> with scale
+
+### Example
+
+<div><fiddle-embed name="@Matrix_MakeScale"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setScale'>setScale</a> <a href='#SkMatrix_postScale'>postScale</a> <a href='#SkMatrix_preScale'>preScale</a>
+
+<a name='SkMatrix_MakeScale_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_MakeScale'>MakeScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> scale)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='#SkMatrix_MakeScale_2_scale'>scale</a> by (<a href='#SkMatrix_MakeScale_2_scale'>scale</a>, <a href='#SkMatrix_MakeScale_2_scale'>scale</a>). Returned <a href='SkMatrix_Reference#Matrix'>matrix</a> is:
+
+| <a href='#SkMatrix_MakeScale_2_scale'>scale</a>   0   0 |
+|   0   <a href='#SkMatrix_MakeScale_2_scale'>scale</a> 0 |
+|   0     0   1 |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_MakeScale_2_scale'><code><strong>scale</strong></code></a></td>
+    <td>horizontal and vertical <a href='#SkMatrix_MakeScale_2_scale'>scale</a> factor</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> with <a href='#SkMatrix_MakeScale_2_scale'>scale</a>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_MakeScale_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setScale'>setScale</a> <a href='#SkMatrix_postScale'>postScale</a> <a href='#SkMatrix_preScale'>preScale</a>
+
+<a name='SkMatrix_MakeTrans'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_MakeTrans'>MakeTrans</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to translate by (<a href='#SkMatrix_MakeTrans_dx'>dx</a>, <a href='#SkMatrix_MakeTrans_dy'>dy</a>). Returned <a href='SkMatrix_Reference#Matrix'>matrix</a> is:
+
+| 1 0 <a href='#SkMatrix_MakeTrans_dx'>dx</a> |
+| 0 1 <a href='#SkMatrix_MakeTrans_dy'>dy</a> |
+| 0 0  1 |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_MakeTrans_dx'><code><strong>dx</strong></code></a></td>
+    <td>horizontal translation</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_MakeTrans_dy'><code><strong>dy</strong></code></a></td>
+    <td>vertical translation</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> with translation
+
+### Example
+
+<div><fiddle-embed name="@Matrix_MakeTrans"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setTranslate'>setTranslate</a> <a href='#SkMatrix_postTranslate'>postTranslate</a> <a href='#SkMatrix_preTranslate'>preTranslate</a>
+
+<a name='SkMatrix_MakeAll'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_MakeAll'>MakeAll</a>(<a href='undocumented#SkScalar'>SkScalar</a> scaleX, <a href='undocumented#SkScalar'>SkScalar</a> skewX, <a href='undocumented#SkScalar'>SkScalar</a> transX, <a href='undocumented#SkScalar'>SkScalar</a> skewY,
+                        <a href='undocumented#SkScalar'>SkScalar</a> scaleY, <a href='undocumented#SkScalar'>SkScalar</a> transY, <a href='undocumented#SkScalar'>SkScalar</a> pers0, <a href='undocumented#SkScalar'>SkScalar</a> pers1,
+                        <a href='undocumented#SkScalar'>SkScalar</a> pers2)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| <a href='#SkMatrix_MakeAll_scaleX'>scaleX</a>  <a href='#SkMatrix_MakeAll_skewX'>skewX</a> <a href='#SkMatrix_MakeAll_transX'>transX</a> |
+|  <a href='#SkMatrix_MakeAll_skewY'>skewY</a> <a href='#SkMatrix_MakeAll_scaleY'>scaleY</a> <a href='#SkMatrix_MakeAll_transY'>transY</a> |
+|  <a href='#SkMatrix_MakeAll_pers0'>pers0</a>  <a href='#SkMatrix_MakeAll_pers1'>pers1</a>  <a href='#SkMatrix_MakeAll_pers2'>pers2</a> |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_MakeAll_scaleX'><code><strong>scaleX</strong></code></a></td>
+    <td>horizontal scale factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_MakeAll_skewX'><code><strong>skewX</strong></code></a></td>
+    <td>horizontal skew factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_MakeAll_transX'><code><strong>transX</strong></code></a></td>
+    <td>horizontal translation</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_MakeAll_skewY'><code><strong>skewY</strong></code></a></td>
+    <td>vertical skew factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_MakeAll_scaleY'><code><strong>scaleY</strong></code></a></td>
+    <td>vertical scale factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_MakeAll_transY'><code><strong>transY</strong></code></a></td>
+    <td>vertical translation</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_MakeAll_pers0'><code><strong>pers0</strong></code></a></td>
+    <td>input x-axis perspective factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_MakeAll_pers1'><code><strong>pers1</strong></code></a></td>
+    <td>input y-axis perspective factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_MakeAll_pers2'><code><strong>pers2</strong></code></a></td>
+    <td>perspective scale factor</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from parameters
+
+### Example
+
+<div><fiddle-embed name="6bad83b64de9266e323c29d550e04188"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setAll'>setAll</a> <a href='#SkMatrix_set9'>set9</a> <a href='#SkMatrix_postConcat'>postConcat</a> <a href='#SkMatrix_preConcat'>preConcat</a>
+
+<a name='SkMatrix_TypeMask'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkMatrix_TypeMask'>TypeMask</a> {
+        <a href='#SkMatrix_kIdentity_Mask'>kIdentity_Mask</a> = 0,
+        <a href='#SkMatrix_kTranslate_Mask'>kTranslate_Mask</a> = 0x01,
+        <a href='#SkMatrix_kScale_Mask'>kScale_Mask</a> = 0x02,
+        <a href='#SkMatrix_kAffine_Mask'>kAffine_Mask</a> = 0x04,
+        <a href='#SkMatrix_kPerspective_Mask'>kPerspective_Mask</a> = 0x08,
+    };
+
+</pre>
+
+Enumeration of bit fields for mask returned by <a href='#SkMatrix_getType'>getType</a>.
+Used to identify the complexity of <a href='SkMatrix_Reference#Matrix'>Matrix</a>, to optimize performance.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kIdentity_Mask'><code>SkMatrix::kIdentity_Mask</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+all bits clear if <a href='SkMatrix_Reference#Matrix'>Matrix</a> is identity
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kTranslate_Mask'><code>SkMatrix::kTranslate_Mask</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+set if <a href='SkMatrix_Reference#Matrix'>Matrix</a> has translation
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kScale_Mask'><code>SkMatrix::kScale_Mask</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+set if <a href='SkMatrix_Reference#Matrix'>Matrix</a> scales x-axis or y-axis
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kAffine_Mask'><code>SkMatrix::kAffine_Mask</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>4</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+set if <a href='SkMatrix_Reference#Matrix'>Matrix</a> skews or rotates
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kPerspective_Mask'><code>SkMatrix::kPerspective_Mask</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>8</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+set if <a href='SkMatrix_Reference#Matrix'>Matrix</a> has perspective
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_TypeMask">
+
+#### Example Output
+
+~~~~
+after reset: kIdentity_Mask
+after postTranslate: kTranslate_Mask
+after postScale: kTranslate_Mask kScale_Mask
+after postScale: kTranslate_Mask kScale_Mask kAffine_Mask
+after setPolyToPoly: kTranslate_Mask kScale_Mask kAffine_Mask kPerspective_Mask
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_getType'>getType</a>
+
+<a name='Property'></a>
+
+<a name='SkMatrix_getType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkMatrix_TypeMask'>TypeMask</a> <a href='#SkMatrix_getType'>getType</a>()const
+</pre>
+
+Returns a bit field describing the transformations the <a href='SkMatrix_Reference#Matrix'>matrix</a> may
+perform. The bit field is computed conservatively, so it may include
+false positives. For example, when <a href='#SkMatrix_kPerspective_Mask'>kPerspective_Mask</a> is set, all
+other bits are set.
+
+### Return Value
+
+<a href='#SkMatrix_kIdentity_Mask'>kIdentity_Mask</a>, or combinations of: <a href='#SkMatrix_kTranslate_Mask'>kTranslate_Mask</a>, <a href='#SkMatrix_kScale_Mask'>kScale_Mask</a>,
+
+<a href='#SkMatrix_kAffine_Mask'>kAffine_Mask</a>, <a href='#SkMatrix_kPerspective_Mask'>kPerspective_Mask</a>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_getType">
+
+#### Example Output
+
+~~~~
+identity flags hex: 0 decimal: 0
+set all  flags hex: f decimal: 15
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_TypeMask'>TypeMask</a>
+
+<a name='SkMatrix_isIdentity'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_isIdentity'>isIdentity</a>()const
+</pre>
+
+Returns true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> is identity.  Identity <a href='SkMatrix_Reference#Matrix'>matrix</a> is:
+
+| 1 0 0 |
+| 0 1 0 |
+| 0 0 1 |
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> has no effect
+
+### Example
+
+<div><fiddle-embed name="@Matrix_isIdentity">
+
+#### Example Output
+
+~~~~
+is identity: true
+is identity: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_reset'>reset()</a> <a href='#SkMatrix_setIdentity'>setIdentity</a> <a href='#SkMatrix_getType'>getType</a>
+
+<a name='SkMatrix_isScaleTranslate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_isScaleTranslate'>isScaleTranslate</a>()const
+</pre>
+
+Returns true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> at most scales and translates. <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> may be identity,
+contain only scale elements, only translate elements, or both. <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> form is:
+
+| scale-x    0    translate-x |
+|    0    scale-y translate-y |
+|    0       0         1      |
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> is identity; or scales, translates, or both
+
+### Example
+
+<div><fiddle-embed name="@Matrix_isScaleTranslate">
+
+#### Example Output
+
+~~~~
+is scale-translate: true
+is scale-translate: true
+is scale-translate: true
+is scale-translate: true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setScale'>setScale</a> <a href='#SkMatrix_isTranslate'>isTranslate</a> <a href='#SkMatrix_setTranslate'>setTranslate</a> <a href='#SkMatrix_getType'>getType</a>
+
+<a name='SkMatrix_isTranslate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_isTranslate'>isTranslate</a>()const
+</pre>
+
+Returns true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> is identity, or translates. <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> form is:
+
+| 1 0 translate-x |
+| 0 1 translate-y |
+| 0 0      1      |
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> is identity, or translates
+
+### Example
+
+<div><fiddle-embed name="@Matrix_isTranslate">
+
+#### Example Output
+
+~~~~
+is translate: true
+is translate: true
+is translate: false
+is translate: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setTranslate'>setTranslate</a> <a href='#SkMatrix_getType'>getType</a>
+
+<a name='SkMatrix_rectStaysRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_rectStaysRect'>rectStaysRect</a>()const
+</pre>
+
+Returns true <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> maps <a href='SkRect_Reference#SkRect'>SkRect</a> to another <a href='SkRect_Reference#SkRect'>SkRect</a>. If true, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> is identity,
+or scales, or rotates a multiple of 90 degrees, or mirrors on axes. In all
+cases, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> may also have translation. <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> form is either:
+
+| scale-x    0    translate-x |
+|    0    scale-y translate-y |
+|    0       0         1      |
+
+or
+
+|    0     rotate-x translate-x |
+| rotate-y    0     translate-y |
+|    0        0          1      |
+
+for non-zero values of scale-x, scale-y, rotate-x, and rotate-y.
+
+Also called <a href='#SkMatrix_preservesAxisAlignment'>preservesAxisAlignment</a>(); use the one that provides better inline
+documentation.
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> maps one <a href='SkRect_Reference#SkRect'>SkRect</a> into another
+
+### Example
+
+<div><fiddle-embed name="@Matrix_rectStaysRect">
+
+#### Example Output
+
+~~~~
+rectStaysRect: true
+rectStaysRect: true
+rectStaysRect: true
+rectStaysRect: true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_preservesAxisAlignment'>preservesAxisAlignment</a> <a href='#SkMatrix_preservesRightAngles'>preservesRightAngles</a>
+
+<a name='SkMatrix_preservesAxisAlignment'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_preservesAxisAlignment'>preservesAxisAlignment</a>()const
+</pre>
+
+Returns true <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> maps <a href='SkRect_Reference#SkRect'>SkRect</a> to another <a href='SkRect_Reference#SkRect'>SkRect</a>. If true, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> is identity,
+or scales, or rotates a multiple of 90 degrees, or mirrors on axes. In all
+cases, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> may also have translation. <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> form is either:
+
+| scale-x    0    translate-x |
+|    0    scale-y translate-y |
+|    0       0         1      |
+
+or
+
+|    0     rotate-x translate-x |
+| rotate-y    0     translate-y |
+|    0        0          1      |
+
+for non-zero values of scale-x, scale-y, rotate-x, and rotate-y.
+
+Also called <a href='#SkMatrix_rectStaysRect'>rectStaysRect</a>(); use the one that provides better inline
+documentation.
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> maps one <a href='SkRect_Reference#SkRect'>SkRect</a> into another
+
+### Example
+
+<div><fiddle-embed name="@Matrix_preservesAxisAlignment">
+
+#### Example Output
+
+~~~~
+preservesAxisAlignment: true
+preservesAxisAlignment: true
+preservesAxisAlignment: true
+preservesAxisAlignment: true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_rectStaysRect'>rectStaysRect</a> <a href='#SkMatrix_preservesRightAngles'>preservesRightAngles</a>
+
+<a name='SkMatrix_hasPerspective'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_hasPerspective'>hasPerspective</a>()const
+</pre>
+
+Returns true if the <a href='SkMatrix_Reference#Matrix'>matrix</a> contains perspective elements. <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> form is:
+
+|       --            --              --          |
+|       --            --              --          |
+| perspective-x  perspective-y  perspective-scale |
+
+where perspective-x or perspective-y is non-zero, or perspective-scale is
+not one. All other elements may have any value.
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> is in most general form
+
+### Example
+
+<div><fiddle-embed name="688123908c733169bbbfaf11f41ecff6"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setAll'>setAll</a> <a href='#SkMatrix_set9'>set9</a> <a href='#SkMatrix_MakeAll'>MakeAll</a>
+
+<a name='SkMatrix_isSimilarity'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_isSimilarity'>isSimilarity</a>(<a href='undocumented#SkScalar'>SkScalar</a> tol = <a href='undocumented#SK_ScalarNearlyZero'>SK_ScalarNearlyZero</a>)const
+</pre>
+
+Returns true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> contains only translation, rotation, reflection, and
+uniform scale.
+Returns false if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> contains different scales, skewing, perspective, or
+degenerate forms that collapse to a <a href='undocumented#Line'>line</a> or <a href='SkPoint_Reference#Point'>point</a>.
+
+Describes that the <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> makes rendering with and without the <a href='SkMatrix_Reference#Matrix'>matrix</a> are
+visually alike; a transformed <a href='undocumented#Circle'>circle</a> remains a <a href='undocumented#Circle'>circle</a>. Mathematically, this is
+referred to as similarity of a  <a href='undocumented#Euclidean_Space'>Euclidean space</a>, or a similarity transformation.
+
+Preserves right angles, keeping the arms of the angle equal lengths.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_isSimilarity_tol'><code><strong>tol</strong></code></a></td>
+    <td>to be deprecated</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> only rotates, uniformly scales, translates
+
+### Example
+
+<div><fiddle-embed name="8b37f4ae7fec1756433c0f984175fb14"><div><a href='undocumented#String'>String</a> is drawn four times through but only two are visible. Drawing the pair
+with <a href='#SkMatrix_isSimilarity'>isSimilarity</a> false reveals the pair not visible through the <a href='SkMatrix_Reference#Matrix'>matrix</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_isScaleTranslate'>isScaleTranslate</a> <a href='#SkMatrix_preservesRightAngles'>preservesRightAngles</a> <a href='#SkMatrix_rectStaysRect'>rectStaysRect</a> <a href='#SkMatrix_isFixedStepInX'>isFixedStepInX</a>
+
+<a name='SkMatrix_preservesRightAngles'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_preservesRightAngles'>preservesRightAngles</a>(<a href='undocumented#SkScalar'>SkScalar</a> tol = <a href='undocumented#SK_ScalarNearlyZero'>SK_ScalarNearlyZero</a>)const
+</pre>
+
+Returns true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> contains only translation, rotation, reflection, and
+scale. Scale may differ along rotated axes.
+Returns false if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> skewing, perspective, or degenerate forms that collapse
+to a <a href='undocumented#Line'>line</a> or <a href='SkPoint_Reference#Point'>point</a>.
+
+Preserves right angles, but not requiring that the arms of the angle
+retain equal lengths.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_preservesRightAngles_tol'><code><strong>tol</strong></code></a></td>
+    <td>to be deprecated</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> only rotates, scales, translates
+
+### Example
+
+<div><fiddle-embed name="b9becf0dc24a9f00726e24a81fb72f16"><div>Equal scale is both similar and preserves right angles.
+Unequal scale is not similar but preserves right angles.
+Skews are not similar and do not preserve right angles.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_isScaleTranslate'>isScaleTranslate</a> <a href='#SkMatrix_isSimilarity'>isSimilarity</a> <a href='#SkMatrix_rectStaysRect'>rectStaysRect</a> <a href='#SkMatrix_isFixedStepInX'>isFixedStepInX</a>
+
+<a name='MemberIndex'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    static constexpr int <a href='#SkMatrix_kMScaleX'>kMScaleX</a> = 0;
+    static constexpr int <a href='#SkMatrix_kMSkewX'>kMSkewX</a> = 1;
+    static constexpr int <a href='#SkMatrix_kMTransX'>kMTransX</a> = 2;
+    static constexpr int <a href='#SkMatrix_kMSkewY'>kMSkewY</a> = 3;
+    static constexpr int <a href='#SkMatrix_kMScaleY'>kMScaleY</a> = 4;
+    static constexpr int <a href='#SkMatrix_kMTransY'>kMTransY</a> = 5;
+    static constexpr int <a href='#SkMatrix_kMPersp0'>kMPersp0</a> = 6;
+    static constexpr int <a href='#SkMatrix_kMPersp1'>kMPersp1</a> = 7;
+    static constexpr int <a href='#SkMatrix_kMPersp2'>kMPersp2</a> = 8;
+</pre>
+
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> organizes its values in row order. These members correspond to
+each value in <a href='SkMatrix_Reference#Matrix'>Matrix</a>.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kMScaleX'><code>SkMatrix::kMScaleX</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+horizontal scale factor</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kMSkewX'><code>SkMatrix::kMSkewX</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+horizontal skew factor</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kMTransX'><code>SkMatrix::kMTransX</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+horizontal translation</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kMSkewY'><code>SkMatrix::kMSkewY</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+vertical skew factor</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kMScaleY'><code>SkMatrix::kMScaleY</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>4</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+vertical scale factor</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kMTransY'><code>SkMatrix::kMTransY</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>5</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+vertical translation</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kMPersp0'><code>SkMatrix::kMPersp0</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>6</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+input x perspective factor</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kMPersp1'><code>SkMatrix::kMPersp1</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>7</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+input y perspective factor</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kMPersp2'><code>SkMatrix::kMPersp2</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>8</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+perspective bias</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="3bbf75f4748420810aa2586e3c8548d9"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_get'>get()</a> <a href='#SkMatrix_set'>set()</a>
+
+<a name='AffineIndex'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+</pre>
+
+Affine arrays are in column major order to match the <a href='SkMatrix_Reference#Matrix'>matrix</a> used by
+PDF and XPS.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kAScaleX'><code>SkMatrix::kAScaleX</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+horizontal scale factor</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kASkewY'><code>SkMatrix::kASkewY</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+vertical skew factor</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kASkewX'><code>SkMatrix::kASkewX</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+horizontal skew factor</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kAScaleY'><code>SkMatrix::kAScaleY</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+vertical scale factor</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kATransX'><code>SkMatrix::kATransX</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>4</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+horizontal translation</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kATransY'><code>SkMatrix::kATransY</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>5</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+vertical translation</td>
+  </tr>
+</table>
+
+### See Also
+
+<a href='#SkMatrix_SetAffineIdentity'>SetAffineIdentity</a> <a href='#SkMatrix_asAffine'>asAffine</a> <a href='#SkMatrix_setAffine'>setAffine</a>
+
+<a name='SkMatrix_array_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_array1_operator'>operator[]</a>(int index)const
+</pre>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_array_operator">
+
+#### Example Output
+
+~~~~
+matrix[SkMatrix::kMScaleX] == 42
+matrix[SkMatrix::kMScaleY] == 24
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_get'>get</a> <a href='#SkMatrix_set'>set</a>
+
+<a name='SkMatrix_get'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> get(int index)const
+</pre>
+
+Returns one <a href='SkMatrix_Reference#Matrix'>matrix</a> value. Asserts if <a href='#SkMatrix_get_index'>index</a> is out of range and SK_DEBUG is
+defined.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_get_index'><code><strong>index</strong></code></a></td>
+    <td>one of: <a href='#SkMatrix_kMScaleX'>kMScaleX</a>, <a href='#SkMatrix_kMSkewX'>kMSkewX</a>, <a href='#SkMatrix_kMTransX'>kMTransX</a>, <a href='#SkMatrix_kMSkewY'>kMSkewY</a>, <a href='#SkMatrix_kMScaleY'>kMScaleY</a>, <a href='#SkMatrix_kMTransY'>kMTransY</a>,</td>
+  </tr>
+</table>
+
+<a href='#SkMatrix_kMPersp0'>kMPersp0</a>, <a href='#SkMatrix_kMPersp1'>kMPersp1</a>, <a href='#SkMatrix_kMPersp2'>kMPersp2</a>
+
+### Return Value
+
+value corresponding to <a href='#SkMatrix_get_index'>index</a>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_get">
+
+#### Example Output
+
+~~~~
+matrix.get(SkMatrix::kMSkewX) == 42
+matrix.get(SkMatrix::kMSkewY) == 24
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_array1_operator'>operator[]</a>(int <a href='#SkMatrix_get_index'>index</a>) <a href='#SkMatrix_set'>set</a>
+
+<a name='SkMatrix_getScaleX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getScaleX'>getScaleX</a>()const
+</pre>
+
+Returns scale factor multiplied by x-axis input, contributing to x-axis output.
+With <a href='#SkMatrix_mapPoints'>mapPoints</a>(), scales <a href='SkPoint_Reference#SkPoint'>SkPoint</a> along the x-axis.
+
+### Return Value
+
+horizontal scale factor
+
+### Example
+
+<div><fiddle-embed name="@Matrix_getScaleX">
+
+#### Example Output
+
+~~~~
+matrix.getScaleX() == 42
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_get'>get</a> <a href='#SkMatrix_getScaleY'>getScaleY</a> <a href='#SkMatrix_setScaleX'>setScaleX</a> <a href='#SkMatrix_setScale'>setScale</a>
+
+<a name='SkMatrix_getScaleY'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getScaleY'>getScaleY</a>()const
+</pre>
+
+Returns scale factor multiplied by y-axis input, contributing to y-axis output.
+With <a href='#SkMatrix_mapPoints'>mapPoints</a>(), scales <a href='SkPoint_Reference#SkPoint'>SkPoint</a> along the y-axis.
+
+### Return Value
+
+vertical scale factor
+
+### Example
+
+<div><fiddle-embed name="@Matrix_getScaleY">
+
+#### Example Output
+
+~~~~
+matrix.getScaleY() == 24
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_get'>get</a> <a href='#SkMatrix_getScaleX'>getScaleX</a> <a href='#SkMatrix_setScaleY'>setScaleY</a> <a href='#SkMatrix_setScale'>setScale</a>
+
+<a name='SkMatrix_getSkewY'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getSkewY'>getSkewY</a>()const
+</pre>
+
+Returns scale factor multiplied by x-axis input, contributing to y-axis output.
+With <a href='#SkMatrix_mapPoints'>mapPoints</a>(), skews <a href='SkPoint_Reference#SkPoint'>SkPoint</a> along the y-axis.
+Skewing both axes can rotate <a href='SkPoint_Reference#SkPoint'>SkPoint</a>.
+
+### Return Value
+
+vertical skew factor
+
+### Example
+
+<div><fiddle-embed name="@Matrix_getSkewY">
+
+#### Example Output
+
+~~~~
+matrix.getSkewY() == 24
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_get'>get</a> <a href='#SkMatrix_getSkewX'>getSkewX</a> <a href='#SkMatrix_setSkewY'>setSkewY</a> <a href='#SkMatrix_setSkew'>setSkew</a>
+
+<a name='SkMatrix_getSkewX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getSkewX'>getSkewX</a>()const
+</pre>
+
+Returns scale factor multiplied by y-axis input, contributing to x-axis output.
+With <a href='#SkMatrix_mapPoints'>mapPoints</a>(), skews <a href='SkPoint_Reference#SkPoint'>SkPoint</a> along the x-axis.
+Skewing both axes can rotate <a href='SkPoint_Reference#SkPoint'>SkPoint</a>.
+
+### Return Value
+
+horizontal scale factor
+
+### Example
+
+<div><fiddle-embed name="@Matrix_getSkewX">
+
+#### Example Output
+
+~~~~
+matrix.getSkewX() == 42
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_get'>get</a> <a href='#SkMatrix_getSkewY'>getSkewY</a> <a href='#SkMatrix_setSkewX'>setSkewX</a> <a href='#SkMatrix_setSkew'>setSkew</a>
+
+<a name='SkMatrix_getTranslateX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getTranslateX'>getTranslateX</a>()const
+</pre>
+
+Returns translation contributing to x-axis output.
+With <a href='#SkMatrix_mapPoints'>mapPoints</a>(), moves <a href='SkPoint_Reference#SkPoint'>SkPoint</a> along the x-axis.
+
+### Return Value
+
+horizontal translation factor
+
+### Example
+
+<div><fiddle-embed name="@Matrix_getTranslateX">
+
+#### Example Output
+
+~~~~
+matrix.getTranslateX() == 42
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_get'>get</a> <a href='#SkMatrix_getTranslateY'>getTranslateY</a> <a href='#SkMatrix_setTranslateX'>setTranslateX</a> <a href='#SkMatrix_setTranslate'>setTranslate</a>
+
+<a name='SkMatrix_getTranslateY'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getTranslateY'>getTranslateY</a>()const
+</pre>
+
+Returns translation contributing to y-axis output.
+With <a href='#SkMatrix_mapPoints'>mapPoints</a>(), moves <a href='SkPoint_Reference#SkPoint'>SkPoint</a> along the y-axis.
+
+### Return Value
+
+vertical translation factor
+
+### Example
+
+<div><fiddle-embed name="@Matrix_getTranslateY">
+
+#### Example Output
+
+~~~~
+matrix.getTranslateY() == 24
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_get'>get</a> <a href='#SkMatrix_getTranslateX'>getTranslateX</a> <a href='#SkMatrix_setTranslateY'>setTranslateY</a> <a href='#SkMatrix_setTranslate'>setTranslate</a>
+
+<a name='SkMatrix_getPerspX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getPerspX'>getPerspX</a>()const
+</pre>
+
+Returns factor scaling input x-axis relative to input y-axis.
+
+### Return Value
+
+input x-axis perspective factor
+
+### Example
+
+<div><fiddle-embed name="a0f5bf4b55e8c33bfda29bf67e34306f"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_kMPersp0'>kMPersp0</a> <a href='#SkMatrix_getPerspY'>getPerspY</a>
+
+<a name='SkMatrix_getPerspY'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getPerspY'>getPerspY</a>()const
+</pre>
+
+Returns factor scaling input y-axis relative to input x-axis.
+
+### Return Value
+
+input y-axis perspective factor
+
+### Example
+
+<div><fiddle-embed name="424a00a73675dbd99ad20feb0267442b"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_kMPersp1'>kMPersp1</a> <a href='#SkMatrix_getPerspX'>getPerspX</a>
+
+<a name='SkMatrix_array1_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a>& <a href='#SkMatrix_array1_operator'>operator[]</a>(int index)
+</pre>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_dirtyMatrixTypeCache">
+
+#### Example Output
+
+~~~~
+with identity matrix: x = 24
+after skew x mod:     x = 24
+after 2nd skew x mod: x = 24
+after dirty cache:    x = 66
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_get'>get</a> <a href='#SkMatrix_dirtyMatrixTypeCache'>dirtyMatrixTypeCache</a> <a href='#SkMatrix_set'>set</a>
+
+<a name='Set'></a>
+
+<a name='SkMatrix_set'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void set(int index, <a href='undocumented#SkScalar'>SkScalar</a> value)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_set_value'>value</a>. Asserts if <a href='#SkMatrix_set_index'>index</a> is out of range and SK_DEBUG is
+defined. Safer than operator[]; internal cache is always maintained.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_set_index'><code><strong>index</strong></code></a></td>
+    <td>one of: <a href='#SkMatrix_kMScaleX'>kMScaleX</a>, <a href='#SkMatrix_kMSkewX'>kMSkewX</a>, <a href='#SkMatrix_kMTransX'>kMTransX</a>, <a href='#SkMatrix_kMSkewY'>kMSkewY</a>, <a href='#SkMatrix_kMScaleY'>kMScaleY</a>, <a href='#SkMatrix_kMTransY'>kMTransY</a>,</td>
+  </tr>
+</table>
+
+<a href='#SkMatrix_kMPersp0'>kMPersp0</a>, <a href='#SkMatrix_kMPersp1'>kMPersp1</a>, <a href='#SkMatrix_kMPersp2'>kMPersp2</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_set_value'><code><strong>value</strong></code></a></td>
+    <td><a href='undocumented#Scalar'>scalar</a> to store in <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_set">
+
+#### Example Output
+
+~~~~
+with identity matrix: x = 24
+after skew x mod:     x = 24
+after 2nd skew x mod: x = 66
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+operator[] <a href='#SkMatrix_get'>get</a>
+
+<a name='SkMatrix_setScaleX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setScaleX'>setScaleX</a>(<a href='undocumented#SkScalar'>SkScalar</a> v)
+</pre>
+
+Sets horizontal scale factor.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setScaleX_v'><code><strong>v</strong></code></a></td>
+    <td>horizontal scale factor to store</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="a39dfed98c3c3c3a56be9ad59fe4e21e"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_set'>set</a> <a href='#SkMatrix_setScale'>setScale</a> <a href='#SkMatrix_setScaleY'>setScaleY</a>
+
+<a name='SkMatrix_setScaleY'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setScaleY'>setScaleY</a>(<a href='undocumented#SkScalar'>SkScalar</a> v)
+</pre>
+
+Sets vertical scale factor.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setScaleY_v'><code><strong>v</strong></code></a></td>
+    <td>vertical scale factor to store</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="f040c6dd85a02e94eaca00d5c2832604"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_set'>set</a> <a href='#SkMatrix_setScale'>setScale</a> <a href='#SkMatrix_setScaleX'>setScaleX</a>
+
+<a name='SkMatrix_setSkewY'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setSkewY'>setSkewY</a>(<a href='undocumented#SkScalar'>SkScalar</a> v)
+</pre>
+
+Sets vertical skew factor.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setSkewY_v'><code><strong>v</strong></code></a></td>
+    <td>vertical skew factor to store</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="b418d15df9829aefcc6aca93a37428bb"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_set'>set</a> <a href='#SkMatrix_setSkew'>setSkew</a> <a href='#SkMatrix_setSkewX'>setSkewX</a>
+
+<a name='SkMatrix_setSkewX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setSkewX'>setSkewX</a>(<a href='undocumented#SkScalar'>SkScalar</a> v)
+</pre>
+
+Sets horizontal skew factor.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setSkewX_v'><code><strong>v</strong></code></a></td>
+    <td>horizontal skew factor to store</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="c7177a6fbc1545be95a5ebca87e0cd0d"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_set'>set</a> <a href='#SkMatrix_setSkew'>setSkew</a> <a href='#SkMatrix_setSkewX'>setSkewX</a>
+
+<a name='SkMatrix_setTranslateX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setTranslateX'>setTranslateX</a>(<a href='undocumented#SkScalar'>SkScalar</a> v)
+</pre>
+
+Sets horizontal translation.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setTranslateX_v'><code><strong>v</strong></code></a></td>
+    <td>horizontal translation to store</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="a18bc2e3607ac3a8e438bcb61fb13130"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_set'>set</a> <a href='#SkMatrix_setTranslate'>setTranslate</a> <a href='#SkMatrix_setTranslateY'>setTranslateY</a>
+
+<a name='SkMatrix_setTranslateY'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setTranslateY'>setTranslateY</a>(<a href='undocumented#SkScalar'>SkScalar</a> v)
+</pre>
+
+Sets vertical translation.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setTranslateY_v'><code><strong>v</strong></code></a></td>
+    <td>vertical translation to store</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="34e3c70a72b836abf7f4858d35eecc98"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_set'>set</a> <a href='#SkMatrix_setTranslate'>setTranslate</a> <a href='#SkMatrix_setTranslateX'>setTranslateX</a>
+
+<a name='SkMatrix_setPerspX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setPerspX'>setPerspX</a>(<a href='undocumented#SkScalar'>SkScalar</a> v)
+</pre>
+
+Sets input x-axis perspective factor, which causes <a href='#SkMatrix_mapXY'>mapXY</a>() to vary input x-axis values
+inversely proportional to input y-axis values.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setPerspX_v'><code><strong>v</strong></code></a></td>
+    <td>perspective factor</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_setPerspX"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_getPerspX'>getPerspX</a> <a href='#SkMatrix_set'>set</a> <a href='#SkMatrix_setAll'>setAll</a> <a href='#SkMatrix_set9'>set9</a> <a href='#SkMatrix_MakeAll'>MakeAll</a>
+
+<a name='SkMatrix_setPerspY'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setPerspY'>setPerspY</a>(<a href='undocumented#SkScalar'>SkScalar</a> v)
+</pre>
+
+Sets input y-axis perspective factor, which causes <a href='#SkMatrix_mapXY'>mapXY</a>() to vary input y-axis values
+inversely proportional to input x-axis values.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setPerspY_v'><code><strong>v</strong></code></a></td>
+    <td>perspective factor</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_setPerspY"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_getPerspY'>getPerspY</a> <a href='#SkMatrix_set'>set</a> <a href='#SkMatrix_setAll'>setAll</a> <a href='#SkMatrix_set9'>set9</a> <a href='#SkMatrix_MakeAll'>MakeAll</a>
+
+<a name='SkMatrix_setAll'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setAll'>setAll</a>(<a href='undocumented#SkScalar'>SkScalar</a> scaleX, <a href='undocumented#SkScalar'>SkScalar</a> skewX, <a href='undocumented#SkScalar'>SkScalar</a> transX, <a href='undocumented#SkScalar'>SkScalar</a> skewY, <a href='undocumented#SkScalar'>SkScalar</a> scaleY,
+            <a href='undocumented#SkScalar'>SkScalar</a> transY, <a href='undocumented#SkScalar'>SkScalar</a> persp0, <a href='undocumented#SkScalar'>SkScalar</a> persp1, <a href='undocumented#SkScalar'>SkScalar</a> persp2)
+</pre>
+
+Sets all values from parameters. Sets <a href='SkMatrix_Reference#Matrix'>matrix</a> to:
+
+| <a href='#SkMatrix_setAll_scaleX'>scaleX</a>  <a href='#SkMatrix_setAll_skewX'>skewX</a> <a href='#SkMatrix_setAll_transX'>transX</a> |
+|  <a href='#SkMatrix_setAll_skewY'>skewY</a> <a href='#SkMatrix_setAll_scaleY'>scaleY</a> <a href='#SkMatrix_setAll_transY'>transY</a> |
+| <a href='#SkMatrix_setAll_persp0'>persp0</a> <a href='#SkMatrix_setAll_persp1'>persp1</a> <a href='#SkMatrix_setAll_persp2'>persp2</a> |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setAll_scaleX'><code><strong>scaleX</strong></code></a></td>
+    <td>horizontal scale factor to store</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setAll_skewX'><code><strong>skewX</strong></code></a></td>
+    <td>horizontal skew factor to store</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setAll_transX'><code><strong>transX</strong></code></a></td>
+    <td>horizontal translation to store</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setAll_skewY'><code><strong>skewY</strong></code></a></td>
+    <td>vertical skew factor to store</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setAll_scaleY'><code><strong>scaleY</strong></code></a></td>
+    <td>vertical scale factor to store</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setAll_transY'><code><strong>transY</strong></code></a></td>
+    <td>vertical translation to store</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setAll_persp0'><code><strong>persp0</strong></code></a></td>
+    <td>input x-axis values perspective factor to store</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setAll_persp1'><code><strong>persp1</strong></code></a></td>
+    <td>input y-axis values perspective factor to store</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setAll_persp2'><code><strong>persp2</strong></code></a></td>
+    <td>perspective scale factor to store</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="95ccfc2a89ce593e6b7a9f992a844bc0"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_set9'>set9</a> <a href='#SkMatrix_MakeAll'>MakeAll</a>
+
+<a name='SkMatrix_get9'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_get9'>get9</a>(<a href='undocumented#SkScalar'>SkScalar</a> buffer[9])const
+</pre>
+
+Copies nine <a href='undocumented#Scalar'>scalar</a> values contained by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> into <a href='#SkMatrix_get9_buffer'>buffer</a>, in member value
+ascending order: <a href='#SkMatrix_kMScaleX'>kMScaleX</a>, <a href='#SkMatrix_kMSkewX'>kMSkewX</a>, <a href='#SkMatrix_kMTransX'>kMTransX</a>, <a href='#SkMatrix_kMSkewY'>kMSkewY</a>, <a href='#SkMatrix_kMScaleY'>kMScaleY</a>, <a href='#SkMatrix_kMTransY'>kMTransY</a>,
+<a href='#SkMatrix_kMPersp0'>kMPersp0</a>, <a href='#SkMatrix_kMPersp1'>kMPersp1</a>, <a href='#SkMatrix_kMPersp2'>kMPersp2</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_get9_buffer'><code><strong>buffer</strong></code></a></td>
+    <td>storage for nine <a href='undocumented#Scalar'>scalar</a> values</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_get9">
+
+#### Example Output
+
+~~~~
+{4, 0, 3},
+{0, 5, 4},
+{0, 0, 1}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_set9'>set9</a>
+
+<a name='SkMatrix_set9'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_set9'>set9</a>(const <a href='undocumented#SkScalar'>SkScalar</a> buffer[9])
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to nine <a href='undocumented#Scalar'>scalar</a> values in <a href='#SkMatrix_set9_buffer'>buffer</a>, in member value ascending order:
+<a href='#SkMatrix_kMScaleX'>kMScaleX</a>, <a href='#SkMatrix_kMSkewX'>kMSkewX</a>, <a href='#SkMatrix_kMTransX'>kMTransX</a>, <a href='#SkMatrix_kMSkewY'>kMSkewY</a>, <a href='#SkMatrix_kMScaleY'>kMScaleY</a>, <a href='#SkMatrix_kMTransY'>kMTransY</a>, <a href='#SkMatrix_kMPersp0'>kMPersp0</a>, <a href='#SkMatrix_kMPersp1'>kMPersp1</a>,
+<a href='#SkMatrix_kMPersp2'>kMPersp2</a>.
+
+Sets <a href='SkMatrix_Reference#Matrix'>matrix</a> to:
+
+| <a href='#SkMatrix_set9_buffer'>buffer</a>[0] <a href='#SkMatrix_set9_buffer'>buffer</a>[1] <a href='#SkMatrix_set9_buffer'>buffer</a>[2] |
+| <a href='#SkMatrix_set9_buffer'>buffer</a>[3] <a href='#SkMatrix_set9_buffer'>buffer</a>[4] <a href='#SkMatrix_set9_buffer'>buffer</a>[5] |
+| <a href='#SkMatrix_set9_buffer'>buffer</a>[6] <a href='#SkMatrix_set9_buffer'>buffer</a>[7] <a href='#SkMatrix_set9_buffer'>buffer</a>[8] |
+
+In the future, <a href='#SkMatrix_set9'>set9</a> followed by <a href='#SkMatrix_get9'>get9</a> may not return the same values. Since <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+maps non-homogeneous coordinates, scaling all nine values produces an equivalent
+transformation, possibly improving precision.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_set9_buffer'><code><strong>buffer</strong></code></a></td>
+    <td>nine <a href='undocumented#Scalar'>scalar</a> values</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_set9"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setAll'>setAll</a> <a href='#SkMatrix_get9'>get9</a> <a href='#SkMatrix_MakeAll'>MakeAll</a>
+
+<a name='SkMatrix_reset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_reset'>reset()</a>
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to identity; which has no effect on mapped <a href='SkPoint_Reference#SkPoint'>SkPoint</a>. Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| 1 0 0 |
+| 0 1 0 |
+| 0 0 1 |
+
+Also called <a href='#SkMatrix_setIdentity'>setIdentity</a>(); use the one that provides better inline
+documentation.
+
+### Example
+
+<div><fiddle-embed name="@Matrix_reset">
+
+#### Example Output
+
+~~~~
+m.isIdentity(): true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_isIdentity'>isIdentity</a> <a href='#SkMatrix_setIdentity'>setIdentity</a>
+
+<a name='SkMatrix_setIdentity'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setIdentity'>setIdentity</a>()
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to identity; which has no effect on mapped <a href='SkPoint_Reference#SkPoint'>SkPoint</a>. Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| 1 0 0 |
+| 0 1 0 |
+| 0 0 1 |
+
+Also called <a href='#SkMatrix_reset'>reset()</a>; use the one that provides better inline
+documentation.
+
+### Example
+
+<div><fiddle-embed name="@Matrix_setIdentity">
+
+#### Example Output
+
+~~~~
+m.isIdentity(): true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_isIdentity'>isIdentity</a> <a href='#SkMatrix_reset'>reset</a>
+
+<a name='SkMatrix_setTranslate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setTranslate'>setTranslate</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to translate by (<a href='#SkMatrix_setTranslate_dx'>dx</a>, <a href='#SkMatrix_setTranslate_dy'>dy</a>).
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setTranslate_dx'><code><strong>dx</strong></code></a></td>
+    <td>horizontal translation</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setTranslate_dy'><code><strong>dy</strong></code></a></td>
+    <td>vertical translation</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="63ca62985741b1bccb5e8b9cf734874e"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setTranslateX'>setTranslateX</a> <a href='#SkMatrix_setTranslateY'>setTranslateY</a>
+
+<a name='SkMatrix_setTranslate_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setTranslate'>setTranslate</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& v)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to translate by (<a href='#SkMatrix_setTranslate_2_v'>v</a>.<a href='#SkPoint_fX'>fX</a>, <a href='#SkMatrix_setTranslate_2_v'>v</a>.<a href='#SkPoint_fY'>fY</a>).
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setTranslate_2_v'><code><strong>v</strong></code></a></td>
+    <td><a href='SkPoint_Reference#Vector'>vector</a> containing horizontal and vertical translation</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="ccfc734aff2ddea0b097c83f5621de5e"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setTranslateX'>setTranslateX</a> <a href='#SkMatrix_setTranslateY'>setTranslateY</a> <a href='#SkMatrix_MakeTrans'>MakeTrans</a>
+
+<a name='SkMatrix_setScale'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setScale'>setScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to scale by <a href='#SkMatrix_setScale_sx'>sx</a> and <a href='#SkMatrix_setScale_sy'>sy</a>, about a pivot <a href='SkPoint_Reference#Point'>point</a> at (<a href='#SkMatrix_setScale_px'>px</a>, <a href='#SkMatrix_setScale_py'>py</a>).
+The pivot <a href='SkPoint_Reference#Point'>point</a> is unchanged when mapped with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setScale_sx'><code><strong>sx</strong></code></a></td>
+    <td>horizontal scale factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setScale_sy'><code><strong>sy</strong></code></a></td>
+    <td>vertical scale factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setScale_px'><code><strong>px</strong></code></a></td>
+    <td>pivot on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setScale_py'><code><strong>py</strong></code></a></td>
+    <td>pivot on y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="4565a0792058178c88e0a129a87272d6"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setScaleX'>setScaleX</a> <a href='#SkMatrix_setScaleY'>setScaleY</a> <a href='#SkMatrix_MakeScale'>MakeScale</a> <a href='#SkMatrix_preScale'>preScale</a> <a href='#SkMatrix_postScale'>postScale</a>
+
+<a name='SkMatrix_setScale_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setScale'>setScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to scale by <a href='#SkMatrix_setScale_2_sx'>sx</a> and <a href='#SkMatrix_setScale_2_sy'>sy</a> about at pivot <a href='SkPoint_Reference#Point'>point</a> at (0, 0).
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setScale_2_sx'><code><strong>sx</strong></code></a></td>
+    <td>horizontal scale factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setScale_2_sy'><code><strong>sy</strong></code></a></td>
+    <td>vertical scale factor</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="1579d0cc109c26e69f66f73abd35fb0e"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setScaleX'>setScaleX</a> <a href='#SkMatrix_setScaleY'>setScaleY</a> <a href='#SkMatrix_MakeScale'>MakeScale</a> <a href='#SkMatrix_preScale'>preScale</a> <a href='#SkMatrix_postScale'>postScale</a>
+
+<a name='SkMatrix_setRotate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setRotate'>setRotate</a>(<a href='undocumented#SkScalar'>SkScalar</a> degrees, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to rotate by <a href='#SkMatrix_setRotate_degrees'>degrees</a> about a pivot <a href='SkPoint_Reference#Point'>point</a> at (<a href='#SkMatrix_setRotate_px'>px</a>, <a href='#SkMatrix_setRotate_py'>py</a>).
+The pivot <a href='SkPoint_Reference#Point'>point</a> is unchanged when mapped with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Positive <a href='#SkMatrix_setRotate_degrees'>degrees</a> rotates clockwise.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setRotate_degrees'><code><strong>degrees</strong></code></a></td>
+    <td>angle of axes relative to upright axes</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setRotate_px'><code><strong>px</strong></code></a></td>
+    <td>pivot on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setRotate_py'><code><strong>py</strong></code></a></td>
+    <td>pivot on y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_setRotate"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setSinCos'>setSinCos</a> <a href='#SkMatrix_preRotate'>preRotate</a> <a href='#SkMatrix_postRotate'>postRotate</a>
+
+<a name='SkMatrix_setRotate_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setRotate'>setRotate</a>(<a href='undocumented#SkScalar'>SkScalar</a> degrees)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to rotate by <a href='#SkMatrix_setRotate_2_degrees'>degrees</a> about a pivot <a href='SkPoint_Reference#Point'>point</a> at (0, 0).
+Positive <a href='#SkMatrix_setRotate_2_degrees'>degrees</a> rotates clockwise.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setRotate_2_degrees'><code><strong>degrees</strong></code></a></td>
+    <td>angle of axes relative to upright axes</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_setRotate_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setSinCos'>setSinCos</a> <a href='#SkMatrix_preRotate'>preRotate</a> <a href='#SkMatrix_postRotate'>postRotate</a>
+
+<a name='SkMatrix_setSinCos'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setSinCos'>setSinCos</a>(<a href='undocumented#SkScalar'>SkScalar</a> sinValue, <a href='undocumented#SkScalar'>SkScalar</a> cosValue, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to rotate by <a href='#SkMatrix_setSinCos_sinValue'>sinValue</a> and <a href='#SkMatrix_setSinCos_cosValue'>cosValue</a>, about a pivot <a href='SkPoint_Reference#Point'>point</a> at (<a href='#SkMatrix_setSinCos_px'>px</a>, <a href='#SkMatrix_setSinCos_py'>py</a>).
+The pivot <a href='SkPoint_Reference#Point'>point</a> is unchanged when mapped with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+<a href='SkPoint_Reference#Vector'>Vector</a> (<a href='#SkMatrix_setSinCos_sinValue'>sinValue</a>, <a href='#SkMatrix_setSinCos_cosValue'>cosValue</a>) describes the angle of rotation relative to (0, 1).
+<a href='SkPoint_Reference#Vector'>Vector</a> length specifies scale.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setSinCos_sinValue'><code><strong>sinValue</strong></code></a></td>
+    <td>rotation <a href='SkPoint_Reference#Vector'>vector</a> x-axis component</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setSinCos_cosValue'><code><strong>cosValue</strong></code></a></td>
+    <td>rotation <a href='SkPoint_Reference#Vector'>vector</a> y-axis component</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setSinCos_px'><code><strong>px</strong></code></a></td>
+    <td>pivot on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setSinCos_py'><code><strong>py</strong></code></a></td>
+    <td>pivot on y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_setSinCos"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setRotate'>setRotate</a> <a href='#SkMatrix_setScale'>setScale</a> <a href='#SkMatrix_setRSXform'>setRSXform</a>
+
+<a name='SkMatrix_setSinCos_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setSinCos'>setSinCos</a>(<a href='undocumented#SkScalar'>SkScalar</a> sinValue, <a href='undocumented#SkScalar'>SkScalar</a> cosValue)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to rotate by <a href='#SkMatrix_setSinCos_2_sinValue'>sinValue</a> and <a href='#SkMatrix_setSinCos_2_cosValue'>cosValue</a>, about a pivot <a href='SkPoint_Reference#Point'>point</a> at (0, 0).
+
+<a href='SkPoint_Reference#Vector'>Vector</a> (<a href='#SkMatrix_setSinCos_2_sinValue'>sinValue</a>, <a href='#SkMatrix_setSinCos_2_cosValue'>cosValue</a>) describes the angle of rotation relative to (0, 1).
+<a href='SkPoint_Reference#Vector'>Vector</a> length specifies scale.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setSinCos_2_sinValue'><code><strong>sinValue</strong></code></a></td>
+    <td>rotation <a href='SkPoint_Reference#Vector'>vector</a> x-axis component</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setSinCos_2_cosValue'><code><strong>cosValue</strong></code></a></td>
+    <td>rotation <a href='SkPoint_Reference#Vector'>vector</a> y-axis component</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_setSinCos_2"><div><a href='SkCanvas_Reference#Canvas'>Canvas</a> needs offset after applying <a href='SkMatrix_Reference#Matrix'>Matrix</a> to pivot about <a href='SkRect_Reference#Rect'>Rect</a> center.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setRotate'>setRotate</a> <a href='#SkMatrix_setScale'>setScale</a> <a href='#SkMatrix_setRSXform'>setRSXform</a>
+
+<a name='SkMatrix_setRSXform'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='#SkMatrix_setRSXform'>setRSXform</a>(const <a href='undocumented#SkRSXform'>SkRSXform</a>& rsxForm)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to rotate, scale, and translate using a compressed <a href='SkMatrix_Reference#Matrix'>matrix</a> form.
+
+<a href='SkPoint_Reference#Vector'>Vector</a> (<a href='#SkMatrix_setRSXform_rsxForm'>rsxForm</a>.<a href='#SkRSXform_fSSin'>fSSin</a>, <a href='#SkMatrix_setRSXform_rsxForm'>rsxForm</a>.<a href='#SkRSXform_fSCos'>fSCos</a>) describes the angle of rotation relative
+to (0, 1). <a href='SkPoint_Reference#Vector'>Vector</a> length specifies scale. Mapped <a href='SkPoint_Reference#Point'>point</a> is rotated and scaled
+by <a href='SkPoint_Reference#Vector'>vector</a>, then translated by (<a href='#SkMatrix_setRSXform_rsxForm'>rsxForm</a>.<a href='#SkRSXform_fTx'>fTx</a>, <a href='#SkMatrix_setRSXform_rsxForm'>rsxForm</a>.<a href='#SkRSXform_fTy'>fTy</a>).
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setRSXform_rsxForm'><code><strong>rsxForm</strong></code></a></td>
+    <td>compressed <a href='undocumented#SkRSXform'>SkRSXform</a> <a href='SkMatrix_Reference#Matrix'>matrix</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_setRSXform"><div><a href='SkCanvas_Reference#Canvas'>Canvas</a> needs offset after applying <a href='SkMatrix_Reference#Matrix'>Matrix</a> to pivot about <a href='SkRect_Reference#Rect'>Rect</a> center.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setSinCos'>setSinCos</a> <a href='#SkMatrix_setScale'>setScale</a> <a href='#SkMatrix_setTranslate'>setTranslate</a>
+
+<a name='SkMatrix_setSkew'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setSkew'>setSkew</a>(<a href='undocumented#SkScalar'>SkScalar</a> kx, <a href='undocumented#SkScalar'>SkScalar</a> ky, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to skew by <a href='#SkMatrix_setSkew_kx'>kx</a> and <a href='#SkMatrix_setSkew_ky'>ky</a>, about a pivot <a href='SkPoint_Reference#Point'>point</a> at (<a href='#SkMatrix_setSkew_px'>px</a>, <a href='#SkMatrix_setSkew_py'>py</a>).
+The pivot <a href='SkPoint_Reference#Point'>point</a> is unchanged when mapped with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setSkew_kx'><code><strong>kx</strong></code></a></td>
+    <td>horizontal skew factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setSkew_ky'><code><strong>ky</strong></code></a></td>
+    <td>vertical skew factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setSkew_px'><code><strong>px</strong></code></a></td>
+    <td>pivot on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setSkew_py'><code><strong>py</strong></code></a></td>
+    <td>pivot on y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="55e0431adc6c5b1987ebb8123cc10342"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setSkewX'>setSkewX</a> <a href='#SkMatrix_setSkewY'>setSkewY</a> <a href='#SkMatrix_preSkew'>preSkew</a> <a href='#SkMatrix_postSkew'>postSkew</a>
+
+<a name='SkMatrix_setSkew_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setSkew'>setSkew</a>(<a href='undocumented#SkScalar'>SkScalar</a> kx, <a href='undocumented#SkScalar'>SkScalar</a> ky)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to skew by <a href='#SkMatrix_setSkew_2_kx'>kx</a> and <a href='#SkMatrix_setSkew_2_ky'>ky</a>, about a pivot <a href='SkPoint_Reference#Point'>point</a> at (0, 0).
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setSkew_2_kx'><code><strong>kx</strong></code></a></td>
+    <td>horizontal skew factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setSkew_2_ky'><code><strong>ky</strong></code></a></td>
+    <td>vertical skew factor</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="05be7844e9afdd7b9bfc31c5423a70a2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setSkewX'>setSkewX</a> <a href='#SkMatrix_setSkewY'>setSkewY</a> <a href='#SkMatrix_preSkew'>preSkew</a> <a href='#SkMatrix_postSkew'>postSkew</a>
+
+<a name='SkMatrix_setConcat'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setConcat'>setConcat</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& a, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& b)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_setConcat_a'>a</a> multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_setConcat_b'>b</a>. Either <a href='#SkMatrix_setConcat_a'>a</a> or <a href='#SkMatrix_setConcat_b'>b</a> may be this.
+
+Given:
+
+| A B C |      | J K L |
+<a href='#SkMatrix_setConcat_a'>a</a> = | D E F |, <a href='#SkMatrix_setConcat_b'>b</a> = | M N O |
+| G H <a href='#SkMatrix_I'>I</a> |      | P Q R |
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| A B C |   | J K L |   | AJ+BM+CP AK+BN+CQ AL+BO+CR |
+<a href='#SkMatrix_setConcat_a'>a</a> * <a href='#SkMatrix_setConcat_b'>b</a> = | D E F | * | M N O | = | DJ+EM+FP DK+EN+FQ DL+EO+FR |
+| G H <a href='#SkMatrix_I'>I</a> |   | P Q R |   | GJ+HM+IP GK+HN+IQ GL+HO+IR |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setConcat_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> on  left side of multiply expression</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setConcat_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> on  right side of multiply expression</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_setConcat"><div><a href='#SkMatrix_setPolyToPoly'>setPolyToPoly</a> creates perspective <a href='SkMatrix_Reference#Matrix'>matrices</a>, one the inverse of the other.
+Multiplying the <a href='SkMatrix_Reference#Matrix'>matrix</a> by its inverse turns into an identity <a href='SkMatrix_Reference#Matrix'>matrix</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_Concat'>Concat</a> <a href='#SkMatrix_preConcat'>preConcat</a> <a href='#SkMatrix_postConcat'>postConcat</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_concat'>concat</a>
+
+<a name='SkMatrix_preTranslate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_preTranslate'>preTranslate</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from translation (<a href='#SkMatrix_preTranslate_dx'>dx</a>, <a href='#SkMatrix_preTranslate_dy'>dy</a>).
+This can be thought of as moving the <a href='SkPoint_Reference#Point'>point</a> to be mapped before applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Given:
+
+| A B C |               | 1 0 <a href='#SkMatrix_preTranslate_dx'>dx</a> |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F |,  T(<a href='#SkMatrix_preTranslate_dx'>dx</a>, <a href='#SkMatrix_preTranslate_dy'>dy</a>) = | 0 1 <a href='#SkMatrix_preTranslate_dy'>dy</a> |
+| G H <a href='#SkMatrix_I'>I</a> |               | 0 0  1 |
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| A B C | | 1 0 <a href='#SkMatrix_preTranslate_dx'>dx</a> |   | A B A*<a href='#SkMatrix_preTranslate_dx'>dx</a>+B*<a href='#SkMatrix_preTranslate_dy'>dy</a>+C |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * T(<a href='#SkMatrix_preTranslate_dx'>dx</a>, <a href='#SkMatrix_preTranslate_dy'>dy</a>) = | D E F | | 0 1 <a href='#SkMatrix_preTranslate_dy'>dy</a> | = | D E D*<a href='#SkMatrix_preTranslate_dx'>dx</a>+E*<a href='#SkMatrix_preTranslate_dy'>dy</a>+F |
+| G H <a href='#SkMatrix_I'>I</a> | | 0 0  1 |   | G H G*<a href='#SkMatrix_preTranslate_dx'>dx</a>+H*<a href='#SkMatrix_preTranslate_dy'>dy</a>+<a href='#SkMatrix_I'>I</a> |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_preTranslate_dx'><code><strong>dx</strong></code></a></td>
+    <td>x-axis translation before applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a></td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_preTranslate_dy'><code><strong>dy</strong></code></a></td>
+    <td>y-axis translation before applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_preTranslate"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_postTranslate'>postTranslate</a> <a href='#SkMatrix_setTranslate'>setTranslate</a> <a href='#SkMatrix_MakeTrans'>MakeTrans</a>
+
+<a name='SkMatrix_preScale'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_preScale'>preScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from scaling by (<a href='#SkMatrix_preScale_sx'>sx</a>, <a href='#SkMatrix_preScale_sy'>sy</a>)
+about pivot <a href='SkPoint_Reference#Point'>point</a> (<a href='#SkMatrix_preScale_px'>px</a>, <a href='#SkMatrix_preScale_py'>py</a>).
+This can be thought of as scaling about a pivot <a href='SkPoint_Reference#Point'>point</a> before applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Given:
+
+| A B C |                       | <a href='#SkMatrix_preScale_sx'>sx</a>  0 dx |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F |,  S(<a href='#SkMatrix_preScale_sx'>sx</a>, <a href='#SkMatrix_preScale_sy'>sy</a>, <a href='#SkMatrix_preScale_px'>px</a>, <a href='#SkMatrix_preScale_py'>py</a>) = |  0 <a href='#SkMatrix_preScale_sy'>sy</a> dy |
+| G H <a href='#SkMatrix_I'>I</a> |                       |  0  0  1 |
+
+where
+
+dx = <a href='#SkMatrix_preScale_px'>px</a> - <a href='#SkMatrix_preScale_sx'>sx</a> * <a href='#SkMatrix_preScale_px'>px</a>
+dy = <a href='#SkMatrix_preScale_py'>py</a> - <a href='#SkMatrix_preScale_sy'>sy</a> * <a href='#SkMatrix_preScale_py'>py</a>
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| A B C | | <a href='#SkMatrix_preScale_sx'>sx</a>  0 dx |   | A*<a href='#SkMatrix_preScale_sx'>sx</a> B*<a href='#SkMatrix_preScale_sy'>sy</a> A*dx+B*dy+C |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * S(<a href='#SkMatrix_preScale_sx'>sx</a>, <a href='#SkMatrix_preScale_sy'>sy</a>, <a href='#SkMatrix_preScale_px'>px</a>, <a href='#SkMatrix_preScale_py'>py</a>) = | D E F | |  0 <a href='#SkMatrix_preScale_sy'>sy</a> dy | = | D*<a href='#SkMatrix_preScale_sx'>sx</a> E*<a href='#SkMatrix_preScale_sy'>sy</a> D*dx+E*dy+F |
+| G H <a href='#SkMatrix_I'>I</a> | |  0  0  1 |   | G*<a href='#SkMatrix_preScale_sx'>sx</a> H*<a href='#SkMatrix_preScale_sy'>sy</a> G*dx+H*dy+<a href='#SkMatrix_I'>I</a> |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_preScale_sx'><code><strong>sx</strong></code></a></td>
+    <td>horizontal scale factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_preScale_sy'><code><strong>sy</strong></code></a></td>
+    <td>vertical scale factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_preScale_px'><code><strong>px</strong></code></a></td>
+    <td>pivot on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_preScale_py'><code><strong>py</strong></code></a></td>
+    <td>pivot on y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_preScale"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_postScale'>postScale</a> <a href='#SkMatrix_setScale'>setScale</a> <a href='#SkMatrix_MakeScale'>MakeScale</a>
+
+<a name='SkMatrix_preScale_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_preScale'>preScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from scaling by (<a href='#SkMatrix_preScale_2_sx'>sx</a>, <a href='#SkMatrix_preScale_2_sy'>sy</a>)
+about pivot <a href='SkPoint_Reference#Point'>point</a> (0, 0).
+This can be thought of as scaling about the origin before applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Given:
+
+| A B C |               | <a href='#SkMatrix_preScale_2_sx'>sx</a>  0  0 |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F |,  S(<a href='#SkMatrix_preScale_2_sx'>sx</a>, <a href='#SkMatrix_preScale_2_sy'>sy</a>) = |  0 <a href='#SkMatrix_preScale_2_sy'>sy</a>  0 |
+| G H <a href='#SkMatrix_I'>I</a> |               |  0  0  1 |
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| A B C | | <a href='#SkMatrix_preScale_2_sx'>sx</a>  0  0 |   | A*<a href='#SkMatrix_preScale_2_sx'>sx</a> B*<a href='#SkMatrix_preScale_2_sy'>sy</a> C |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * S(<a href='#SkMatrix_preScale_2_sx'>sx</a>, <a href='#SkMatrix_preScale_2_sy'>sy</a>) = | D E F | |  0 <a href='#SkMatrix_preScale_2_sy'>sy</a>  0 | = | D*<a href='#SkMatrix_preScale_2_sx'>sx</a> E*<a href='#SkMatrix_preScale_2_sy'>sy</a> F |
+| G H <a href='#SkMatrix_I'>I</a> | |  0  0  1 |   | G*<a href='#SkMatrix_preScale_2_sx'>sx</a> H*<a href='#SkMatrix_preScale_2_sy'>sy</a> <a href='#SkMatrix_I'>I</a> |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_preScale_2_sx'><code><strong>sx</strong></code></a></td>
+    <td>horizontal scale factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_preScale_2_sy'><code><strong>sy</strong></code></a></td>
+    <td>vertical scale factor</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_preScale_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_postScale'>postScale</a> <a href='#SkMatrix_setScale'>setScale</a> <a href='#SkMatrix_MakeScale'>MakeScale</a>
+
+<a name='SkMatrix_preRotate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_preRotate'>preRotate</a>(<a href='undocumented#SkScalar'>SkScalar</a> degrees, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from rotating by <a href='#SkMatrix_preRotate_degrees'>degrees</a>
+about pivot <a href='SkPoint_Reference#Point'>point</a> (<a href='#SkMatrix_preRotate_px'>px</a>, <a href='#SkMatrix_preRotate_py'>py</a>).
+This can be thought of as rotating about a pivot <a href='SkPoint_Reference#Point'>point</a> before applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Positive <a href='#SkMatrix_preRotate_degrees'>degrees</a> rotates clockwise.
+
+Given:
+
+| A B C |                        | c -s dx |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F |,  R(<a href='#SkMatrix_preRotate_degrees'>degrees</a>, <a href='#SkMatrix_preRotate_px'>px</a>, <a href='#SkMatrix_preRotate_py'>py</a>) = | s  c dy |
+| G H <a href='#SkMatrix_I'>I</a> |                        | 0  0  1 |
+
+where
+
+c  = cos(<a href='#SkMatrix_preRotate_degrees'>degrees</a>)
+s  = sin(<a href='#SkMatrix_preRotate_degrees'>degrees</a>)
+dx =  s * <a href='#SkMatrix_preRotate_py'>py</a> + (1 - c) * <a href='#SkMatrix_preRotate_px'>px</a>
+dy = -s * <a href='#SkMatrix_preRotate_px'>px</a> + (1 - c) * <a href='#SkMatrix_preRotate_py'>py</a>
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| A B C | | c -s dx |   | Ac+Bs -As+Bc A*dx+B*dy+C |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * R(<a href='#SkMatrix_preRotate_degrees'>degrees</a>, <a href='#SkMatrix_preRotate_px'>px</a>, <a href='#SkMatrix_preRotate_py'>py</a>) = | D E F | | s  c dy | = | Dc+Es -Ds+Ec D*dx+E*dy+F |
+| G H <a href='#SkMatrix_I'>I</a> | | 0  0  1 |   | Gc+Hs -Gs+Hc G*dx+H*dy+<a href='#SkMatrix_I'>I</a> |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_preRotate_degrees'><code><strong>degrees</strong></code></a></td>
+    <td>angle of axes relative to upright axes</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_preRotate_px'><code><strong>px</strong></code></a></td>
+    <td>pivot on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_preRotate_py'><code><strong>py</strong></code></a></td>
+    <td>pivot on y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_preRotate"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_postRotate'>postRotate</a> <a href='#SkMatrix_setRotate'>setRotate</a>
+
+<a name='SkMatrix_preRotate_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_preRotate'>preRotate</a>(<a href='undocumented#SkScalar'>SkScalar</a> degrees)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from rotating by <a href='#SkMatrix_preRotate_2_degrees'>degrees</a>
+about pivot <a href='SkPoint_Reference#Point'>point</a> (0, 0).
+This can be thought of as rotating about the origin before applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Positive <a href='#SkMatrix_preRotate_2_degrees'>degrees</a> rotates clockwise.
+
+Given:
+
+| A B C |                        | c -s 0 |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F |,  R(<a href='#SkMatrix_preRotate_2_degrees'>degrees</a>, px, py) = | s  c 0 |
+| G H <a href='#SkMatrix_I'>I</a> |                        | 0  0 1 |
+
+where
+
+c  = cos(<a href='#SkMatrix_preRotate_2_degrees'>degrees</a>)
+s  = sin(<a href='#SkMatrix_preRotate_2_degrees'>degrees</a>)
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| A B C | | c -s 0 |   | Ac+Bs -As+Bc C |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * R(<a href='#SkMatrix_preRotate_2_degrees'>degrees</a>, px, py) = | D E F | | s  c 0 | = | Dc+Es -Ds+Ec F |
+| G H <a href='#SkMatrix_I'>I</a> | | 0  0 1 |   | Gc+Hs -Gs+Hc <a href='#SkMatrix_I'>I</a> |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_preRotate_2_degrees'><code><strong>degrees</strong></code></a></td>
+    <td>angle of axes relative to upright axes</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_preRotate_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_postRotate'>postRotate</a> <a href='#SkMatrix_setRotate'>setRotate</a>
+
+<a name='SkMatrix_preSkew'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_preSkew'>preSkew</a>(<a href='undocumented#SkScalar'>SkScalar</a> kx, <a href='undocumented#SkScalar'>SkScalar</a> ky, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from skewing by (<a href='#SkMatrix_preSkew_kx'>kx</a>, <a href='#SkMatrix_preSkew_ky'>ky</a>)
+about pivot <a href='SkPoint_Reference#Point'>point</a> (<a href='#SkMatrix_preSkew_px'>px</a>, <a href='#SkMatrix_preSkew_py'>py</a>).
+This can be thought of as skewing about a pivot <a href='SkPoint_Reference#Point'>point</a> before applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Given:
+
+| A B C |                       |  1 <a href='#SkMatrix_preSkew_kx'>kx</a> dx |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F |,  K(<a href='#SkMatrix_preSkew_kx'>kx</a>, <a href='#SkMatrix_preSkew_ky'>ky</a>, <a href='#SkMatrix_preSkew_px'>px</a>, <a href='#SkMatrix_preSkew_py'>py</a>) = | <a href='#SkMatrix_preSkew_ky'>ky</a>  1 dy |
+| G H <a href='#SkMatrix_I'>I</a> |                       |  0  0  1 |
+
+where
+
+dx = -<a href='#SkMatrix_preSkew_kx'>kx</a> * <a href='#SkMatrix_preSkew_py'>py</a>
+dy = -<a href='#SkMatrix_preSkew_ky'>ky</a> * <a href='#SkMatrix_preSkew_px'>px</a>
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| A B C | |  1 <a href='#SkMatrix_preSkew_kx'>kx</a> dx |   | A+B*<a href='#SkMatrix_preSkew_ky'>ky</a> A*<a href='#SkMatrix_preSkew_kx'>kx</a>+B A*dx+B*dy+C |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * K(<a href='#SkMatrix_preSkew_kx'>kx</a>, <a href='#SkMatrix_preSkew_ky'>ky</a>, <a href='#SkMatrix_preSkew_px'>px</a>, <a href='#SkMatrix_preSkew_py'>py</a>) = | D E F | | <a href='#SkMatrix_preSkew_ky'>ky</a>  1 dy | = | D+E*<a href='#SkMatrix_preSkew_ky'>ky</a> D*<a href='#SkMatrix_preSkew_kx'>kx</a>+E D*dx+E*dy+F |
+| G H <a href='#SkMatrix_I'>I</a> | |  0  0  1 |   | G+H*<a href='#SkMatrix_preSkew_ky'>ky</a> G*<a href='#SkMatrix_preSkew_kx'>kx</a>+H G*dx+H*dy+<a href='#SkMatrix_I'>I</a> |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_preSkew_kx'><code><strong>kx</strong></code></a></td>
+    <td>horizontal skew factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_preSkew_ky'><code><strong>ky</strong></code></a></td>
+    <td>vertical skew factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_preSkew_px'><code><strong>px</strong></code></a></td>
+    <td>pivot on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_preSkew_py'><code><strong>py</strong></code></a></td>
+    <td>pivot on y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_preSkew"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_postSkew'>postSkew</a> <a href='#SkMatrix_setSkew'>setSkew</a>
+
+<a name='SkMatrix_preSkew_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_preSkew'>preSkew</a>(<a href='undocumented#SkScalar'>SkScalar</a> kx, <a href='undocumented#SkScalar'>SkScalar</a> ky)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from skewing by (<a href='#SkMatrix_preSkew_2_kx'>kx</a>, <a href='#SkMatrix_preSkew_2_ky'>ky</a>)
+about pivot <a href='SkPoint_Reference#Point'>point</a> (0, 0).
+This can be thought of as skewing about the origin before applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Given:
+
+| A B C |               |  1 <a href='#SkMatrix_preSkew_2_kx'>kx</a> 0 |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F |,  K(<a href='#SkMatrix_preSkew_2_kx'>kx</a>, <a href='#SkMatrix_preSkew_2_ky'>ky</a>) = | <a href='#SkMatrix_preSkew_2_ky'>ky</a>  1 0 |
+| G H <a href='#SkMatrix_I'>I</a> |               |  0  0 1 |
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| A B C | |  1 <a href='#SkMatrix_preSkew_2_kx'>kx</a> 0 |   | A+B*<a href='#SkMatrix_preSkew_2_ky'>ky</a> A*<a href='#SkMatrix_preSkew_2_kx'>kx</a>+B C |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * K(<a href='#SkMatrix_preSkew_2_kx'>kx</a>, <a href='#SkMatrix_preSkew_2_ky'>ky</a>) = | D E F | | <a href='#SkMatrix_preSkew_2_ky'>ky</a>  1 0 | = | D+E*<a href='#SkMatrix_preSkew_2_ky'>ky</a> D*<a href='#SkMatrix_preSkew_2_kx'>kx</a>+E F |
+| G H <a href='#SkMatrix_I'>I</a> | |  0  0 1 |   | G+H*<a href='#SkMatrix_preSkew_2_ky'>ky</a> G*<a href='#SkMatrix_preSkew_2_kx'>kx</a>+H <a href='#SkMatrix_I'>I</a> |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_preSkew_2_kx'><code><strong>kx</strong></code></a></td>
+    <td>horizontal skew factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_preSkew_2_ky'><code><strong>ky</strong></code></a></td>
+    <td>vertical skew factor</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_preSkew_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_postSkew'>postSkew</a> <a href='#SkMatrix_setSkew'>setSkew</a>
+
+<a name='SkMatrix_preConcat'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_preConcat'>preConcat</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& other)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_preConcat_other'>other</a>.
+This can be thought of mapping by <a href='#SkMatrix_preConcat_other'>other</a> before applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Given:
+
+| A B C |          | J K L |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F |, <a href='#SkMatrix_preConcat_other'>other</a> = | M N O |
+| G H <a href='#SkMatrix_I'>I</a> |          | P Q R |
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| A B C |   | J K L |   | AJ+BM+CP AK+BN+CQ AL+BO+CR |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * <a href='#SkMatrix_preConcat_other'>other</a> = | D E F | * | M N O | = | DJ+EM+FP DK+EN+FQ DL+EO+FR |
+| G H <a href='#SkMatrix_I'>I</a> |   | P Q R |   | GJ+HM+IP GK+HN+IQ GL+HO+IR |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_preConcat_other'><code><strong>other</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> on  right side of multiply expression</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_preConcat"><div><a href='#SkMatrix_setPolyToPoly'>setPolyToPoly</a> creates perspective <a href='SkMatrix_Reference#Matrix'>matrices</a>, one the inverse of the <a href='#SkMatrix_preConcat_other'>other</a>.
+Multiplying the <a href='SkMatrix_Reference#Matrix'>matrix</a> by its inverse turns into an identity <a href='SkMatrix_Reference#Matrix'>matrix</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_postConcat'>postConcat</a> <a href='#SkMatrix_setConcat'>setConcat</a> <a href='#SkMatrix_Concat'>Concat</a>
+
+<a name='SkMatrix_postTranslate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_postTranslate'>postTranslate</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from translation (<a href='#SkMatrix_postTranslate_dx'>dx</a>, <a href='#SkMatrix_postTranslate_dy'>dy</a>) multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+This can be thought of as moving the <a href='SkPoint_Reference#Point'>point</a> to be mapped after applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Given:
+
+| J K L |               | 1 0 <a href='#SkMatrix_postTranslate_dx'>dx</a> |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | M N O |,  T(<a href='#SkMatrix_postTranslate_dx'>dx</a>, <a href='#SkMatrix_postTranslate_dy'>dy</a>) = | 0 1 <a href='#SkMatrix_postTranslate_dy'>dy</a> |
+| P Q R |               | 0 0  1 |
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| 1 0 <a href='#SkMatrix_postTranslate_dx'>dx</a> | | J K L |   | J+<a href='#SkMatrix_postTranslate_dx'>dx</a>*P K+<a href='#SkMatrix_postTranslate_dx'>dx</a>*Q L+<a href='#SkMatrix_postTranslate_dx'>dx</a>*R |
+T(<a href='#SkMatrix_postTranslate_dx'>dx</a>, <a href='#SkMatrix_postTranslate_dy'>dy</a>) * <a href='SkMatrix_Reference#Matrix'>Matrix</a> = | 0 1 <a href='#SkMatrix_postTranslate_dy'>dy</a> | | M N O | = | M+<a href='#SkMatrix_postTranslate_dy'>dy</a>*P N+<a href='#SkMatrix_postTranslate_dy'>dy</a>*Q O+<a href='#SkMatrix_postTranslate_dy'>dy</a>*R |
+| 0 0  1 | | P Q R |   |      P      Q      R |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_postTranslate_dx'><code><strong>dx</strong></code></a></td>
+    <td>x-axis translation after applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a></td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_postTranslate_dy'><code><strong>dy</strong></code></a></td>
+    <td>y-axis translation after applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_postTranslate"><div>Compare with <a href='#SkMatrix_preTranslate'>preTranslate</a> example.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_preTranslate'>preTranslate</a> <a href='#SkMatrix_setTranslate'>setTranslate</a> <a href='#SkMatrix_MakeTrans'>MakeTrans</a>
+
+<a name='SkMatrix_postScale'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_postScale'>postScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from scaling by (<a href='#SkMatrix_postScale_sx'>sx</a>, <a href='#SkMatrix_postScale_sy'>sy</a>) about pivot <a href='SkPoint_Reference#Point'>point</a>
+(<a href='#SkMatrix_postScale_px'>px</a>, <a href='#SkMatrix_postScale_py'>py</a>), multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+This can be thought of as scaling about a pivot <a href='SkPoint_Reference#Point'>point</a> after applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Given:
+
+| J K L |                       | <a href='#SkMatrix_postScale_sx'>sx</a>  0 dx |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | M N O |,  S(<a href='#SkMatrix_postScale_sx'>sx</a>, <a href='#SkMatrix_postScale_sy'>sy</a>, <a href='#SkMatrix_postScale_px'>px</a>, <a href='#SkMatrix_postScale_py'>py</a>) = |  0 <a href='#SkMatrix_postScale_sy'>sy</a> dy |
+| P Q R |                       |  0  0  1 |
+
+where
+
+dx = <a href='#SkMatrix_postScale_px'>px</a> - <a href='#SkMatrix_postScale_sx'>sx</a> * <a href='#SkMatrix_postScale_px'>px</a>
+dy = <a href='#SkMatrix_postScale_py'>py</a> - <a href='#SkMatrix_postScale_sy'>sy</a> * <a href='#SkMatrix_postScale_py'>py</a>
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| <a href='#SkMatrix_postScale_sx'>sx</a>  0 dx | | J K L |   | <a href='#SkMatrix_postScale_sx'>sx</a>*J+dx*P <a href='#SkMatrix_postScale_sx'>sx</a>*K+dx*Q <a href='#SkMatrix_postScale_sx'>sx</a>*L+dx+R |
+S(<a href='#SkMatrix_postScale_sx'>sx</a>, <a href='#SkMatrix_postScale_sy'>sy</a>, <a href='#SkMatrix_postScale_px'>px</a>, <a href='#SkMatrix_postScale_py'>py</a>) * <a href='SkMatrix_Reference#Matrix'>Matrix</a> = |  0 <a href='#SkMatrix_postScale_sy'>sy</a> dy | | M N O | = | <a href='#SkMatrix_postScale_sy'>sy</a>*M+dy*P <a href='#SkMatrix_postScale_sy'>sy</a>*N+dy*Q <a href='#SkMatrix_postScale_sy'>sy</a>*O+dy*R |
+|  0  0  1 | | P Q R |   |         P         Q         R |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_postScale_sx'><code><strong>sx</strong></code></a></td>
+    <td>horizontal scale factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_postScale_sy'><code><strong>sy</strong></code></a></td>
+    <td>vertical scale factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_postScale_px'><code><strong>px</strong></code></a></td>
+    <td>pivot on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_postScale_py'><code><strong>py</strong></code></a></td>
+    <td>pivot on y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_postScale"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_preScale'>preScale</a> <a href='#SkMatrix_setScale'>setScale</a> <a href='#SkMatrix_MakeScale'>MakeScale</a>
+
+<a name='SkMatrix_postScale_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_postScale'>postScale</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from scaling by (<a href='#SkMatrix_postScale_2_sx'>sx</a>, <a href='#SkMatrix_postScale_2_sy'>sy</a>) about pivot <a href='SkPoint_Reference#Point'>point</a>
+(0, 0), multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+This can be thought of as scaling about the origin after applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Given:
+
+| J K L |               | <a href='#SkMatrix_postScale_2_sx'>sx</a>  0  0 |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | M N O |,  S(<a href='#SkMatrix_postScale_2_sx'>sx</a>, <a href='#SkMatrix_postScale_2_sy'>sy</a>) = |  0 <a href='#SkMatrix_postScale_2_sy'>sy</a>  0 |
+| P Q R |               |  0  0  1 |
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| <a href='#SkMatrix_postScale_2_sx'>sx</a>  0  0 | | J K L |   | <a href='#SkMatrix_postScale_2_sx'>sx</a>*J <a href='#SkMatrix_postScale_2_sx'>sx</a>*K <a href='#SkMatrix_postScale_2_sx'>sx</a>*L |
+S(<a href='#SkMatrix_postScale_2_sx'>sx</a>, <a href='#SkMatrix_postScale_2_sy'>sy</a>) * <a href='SkMatrix_Reference#Matrix'>Matrix</a> = |  0 <a href='#SkMatrix_postScale_2_sy'>sy</a>  0 | | M N O | = | <a href='#SkMatrix_postScale_2_sy'>sy</a>*M <a href='#SkMatrix_postScale_2_sy'>sy</a>*N <a href='#SkMatrix_postScale_2_sy'>sy</a>*O |
+|  0  0  1 | | P Q R |   |    P    Q    R |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_postScale_2_sx'><code><strong>sx</strong></code></a></td>
+    <td>horizontal scale factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_postScale_2_sy'><code><strong>sy</strong></code></a></td>
+    <td>vertical scale factor</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_postScale_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_preScale'>preScale</a> <a href='#SkMatrix_setScale'>setScale</a> <a href='#SkMatrix_MakeScale'>MakeScale</a>
+
+<a name='SkMatrix_postIDiv'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_postIDiv'>postIDiv</a>(int divx, int divy)
+</pre>
+
+Sets <a href='SkMatrix_Reference#Matrix'>Matrix</a> to <a href='SkMatrix_Reference#Matrix'>Matrix</a> constructed from scaling by (1/<a href='#SkMatrix_postIDiv_divx'>divx</a>, 1/<a href='#SkMatrix_postIDiv_divy'>divy</a>),
+multiplied by <a href='SkMatrix_Reference#Matrix'>Matrix</a>.
+
+Returns false if either <a href='#SkMatrix_postIDiv_divx'>divx</a> or <a href='#SkMatrix_postIDiv_divy'>divy</a> is zero.
+
+Given:
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+         | J K L |                   | sx  0  0 |
+Matrix = | M N O |,  I(divx, divy) = |  0 sy  0 |
+         | P Q R |                   |  0  0  1 |
+</pre>
+
+where
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+sx = 1 / divx
+sy = 1 / divy
+</pre>
+
+sets <a href='SkMatrix_Reference#Matrix'>Matrix</a> to:
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+                         | sx  0  0 | | J K L |   | sx*J sx*K sx*L |
+I(divx, divy) * Matrix = |  0 sy  0 | | M N O | = | sy*M sy*N sy*O |
+                         |  0  0  1 | | P Q R |   |    P    Q    R |
+</pre>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_postIDiv_divx'><code><strong>divx</strong></code></a></td>
+    <td>integer divisor for inverse scale on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_postIDiv_divy'><code><strong>divy</strong></code></a></td>
+    <td>integer divisor for inverse scale on y-axis</td>
+  </tr>
+</table>
+
+### Return Value
+
+true on successful scale
+
+### Example
+
+<div><fiddle-embed name="@Matrix_063"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_postScale'>postScale</a> <a href='#SkMatrix_MakeScale'>MakeScale</a>
+
+<a name='SkMatrix_postRotate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_postRotate'>postRotate</a>(<a href='undocumented#SkScalar'>SkScalar</a> degrees, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from rotating by <a href='#SkMatrix_postRotate_degrees'>degrees</a> about pivot <a href='SkPoint_Reference#Point'>point</a>
+(<a href='#SkMatrix_postRotate_px'>px</a>, <a href='#SkMatrix_postRotate_py'>py</a>), multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+This can be thought of as rotating about a pivot <a href='SkPoint_Reference#Point'>point</a> after applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Positive <a href='#SkMatrix_postRotate_degrees'>degrees</a> rotates clockwise.
+
+Given:
+
+| J K L |                        | c -s dx |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | M N O |,  R(<a href='#SkMatrix_postRotate_degrees'>degrees</a>, <a href='#SkMatrix_postRotate_px'>px</a>, <a href='#SkMatrix_postRotate_py'>py</a>) = | s  c dy |
+| P Q R |                        | 0  0  1 |
+
+where
+
+c  = cos(<a href='#SkMatrix_postRotate_degrees'>degrees</a>)
+s  = sin(<a href='#SkMatrix_postRotate_degrees'>degrees</a>)
+dx =  s * <a href='#SkMatrix_postRotate_py'>py</a> + (1 - c) * <a href='#SkMatrix_postRotate_px'>px</a>
+dy = -s * <a href='#SkMatrix_postRotate_px'>px</a> + (1 - c) * <a href='#SkMatrix_postRotate_py'>py</a>
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+|c -s dx| |J K L|   |cJ-sM+dx*P cK-sN+dx*Q cL-sO+dx+R|
+R(<a href='#SkMatrix_postRotate_degrees'>degrees</a>, <a href='#SkMatrix_postRotate_px'>px</a>, <a href='#SkMatrix_postRotate_py'>py</a>) * <a href='SkMatrix_Reference#Matrix'>Matrix</a> = |s  c dy| |M N O| = |sJ+cM+dy*P sK+cN+dy*Q sL+cO+dy*R|
+|0  0  1| |P Q R|   |         P          Q          R|
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_postRotate_degrees'><code><strong>degrees</strong></code></a></td>
+    <td>angle of axes relative to upright axes</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_postRotate_px'><code><strong>px</strong></code></a></td>
+    <td>pivot on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_postRotate_py'><code><strong>py</strong></code></a></td>
+    <td>pivot on y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_postRotate"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_preRotate'>preRotate</a> <a href='#SkMatrix_setRotate'>setRotate</a>
+
+<a name='SkMatrix_postRotate_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_postRotate'>postRotate</a>(<a href='undocumented#SkScalar'>SkScalar</a> degrees)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from rotating by <a href='#SkMatrix_postRotate_2_degrees'>degrees</a> about pivot <a href='SkPoint_Reference#Point'>point</a>
+(0, 0), multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+This can be thought of as rotating about the origin after applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Positive <a href='#SkMatrix_postRotate_2_degrees'>degrees</a> rotates clockwise.
+
+Given:
+
+| J K L |                        | c -s 0 |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | M N O |,  R(<a href='#SkMatrix_postRotate_2_degrees'>degrees</a>, px, py) = | s  c 0 |
+| P Q R |                        | 0  0 1 |
+
+where
+
+c  = cos(<a href='#SkMatrix_postRotate_2_degrees'>degrees</a>)
+s  = sin(<a href='#SkMatrix_postRotate_2_degrees'>degrees</a>)
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| c -s dx | | J K L |   | cJ-sM cK-sN cL-sO |
+R(<a href='#SkMatrix_postRotate_2_degrees'>degrees</a>, px, py) * <a href='SkMatrix_Reference#Matrix'>Matrix</a> = | s  c dy | | M N O | = | sJ+cM sK+cN sL+cO |
+| 0  0  1 | | P Q R |   |     P     Q     R |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_postRotate_2_degrees'><code><strong>degrees</strong></code></a></td>
+    <td>angle of axes relative to upright axes</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_postRotate_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_preRotate'>preRotate</a> <a href='#SkMatrix_setRotate'>setRotate</a>
+
+<a name='SkMatrix_postSkew'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_postSkew'>postSkew</a>(<a href='undocumented#SkScalar'>SkScalar</a> kx, <a href='undocumented#SkScalar'>SkScalar</a> ky, <a href='undocumented#SkScalar'>SkScalar</a> px, <a href='undocumented#SkScalar'>SkScalar</a> py)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from skewing by (<a href='#SkMatrix_postSkew_kx'>kx</a>, <a href='#SkMatrix_postSkew_ky'>ky</a>) about pivot <a href='SkPoint_Reference#Point'>point</a>
+(<a href='#SkMatrix_postSkew_px'>px</a>, <a href='#SkMatrix_postSkew_py'>py</a>), multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+This can be thought of as skewing about a pivot <a href='SkPoint_Reference#Point'>point</a> after applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Given:
+
+| J K L |                       |  1 <a href='#SkMatrix_postSkew_kx'>kx</a> dx |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | M N O |,  K(<a href='#SkMatrix_postSkew_kx'>kx</a>, <a href='#SkMatrix_postSkew_ky'>ky</a>, <a href='#SkMatrix_postSkew_px'>px</a>, <a href='#SkMatrix_postSkew_py'>py</a>) = | <a href='#SkMatrix_postSkew_ky'>ky</a>  1 dy |
+| P Q R |                       |  0  0  1 |
+
+where
+
+dx = -<a href='#SkMatrix_postSkew_kx'>kx</a> * <a href='#SkMatrix_postSkew_py'>py</a>
+dy = -<a href='#SkMatrix_postSkew_ky'>ky</a> * <a href='#SkMatrix_postSkew_px'>px</a>
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| 1 <a href='#SkMatrix_postSkew_kx'>kx</a> dx| |J K L|   |J+<a href='#SkMatrix_postSkew_kx'>kx</a>*M+dx*P K+<a href='#SkMatrix_postSkew_kx'>kx</a>*N+dx*Q L+<a href='#SkMatrix_postSkew_kx'>kx</a>*O+dx+R|
+K(<a href='#SkMatrix_postSkew_kx'>kx</a>, <a href='#SkMatrix_postSkew_ky'>ky</a>, <a href='#SkMatrix_postSkew_px'>px</a>, <a href='#SkMatrix_postSkew_py'>py</a>) * <a href='SkMatrix_Reference#Matrix'>Matrix</a> = |<a href='#SkMatrix_postSkew_ky'>ky</a>  1 dy| |M N O| = |<a href='#SkMatrix_postSkew_ky'>ky</a>*J+M+dy*P <a href='#SkMatrix_postSkew_ky'>ky</a>*K+N+dy*Q <a href='#SkMatrix_postSkew_ky'>ky</a>*L+O+dy*R|
+| 0  0  1| |P Q R|   |          P           Q           R|
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_postSkew_kx'><code><strong>kx</strong></code></a></td>
+    <td>horizontal skew factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_postSkew_ky'><code><strong>ky</strong></code></a></td>
+    <td>vertical skew factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_postSkew_px'><code><strong>px</strong></code></a></td>
+    <td>pivot on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_postSkew_py'><code><strong>py</strong></code></a></td>
+    <td>pivot on y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_postSkew"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_preSkew'>preSkew</a> <a href='#SkMatrix_setSkew'>setSkew</a>
+
+<a name='SkMatrix_postSkew_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_postSkew'>postSkew</a>(<a href='undocumented#SkScalar'>SkScalar</a> kx, <a href='undocumented#SkScalar'>SkScalar</a> ky)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> constructed from skewing by (<a href='#SkMatrix_postSkew_2_kx'>kx</a>, <a href='#SkMatrix_postSkew_2_ky'>ky</a>) about pivot <a href='SkPoint_Reference#Point'>point</a>
+(0, 0), multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+This can be thought of as skewing about the origin after applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Given:
+
+| J K L |               |  1 <a href='#SkMatrix_postSkew_2_kx'>kx</a> 0 |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | M N O |,  K(<a href='#SkMatrix_postSkew_2_kx'>kx</a>, <a href='#SkMatrix_postSkew_2_ky'>ky</a>) = | <a href='#SkMatrix_postSkew_2_ky'>ky</a>  1 0 |
+| P Q R |               |  0  0 1 |
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+|  1 <a href='#SkMatrix_postSkew_2_kx'>kx</a> 0 | | J K L |   | J+<a href='#SkMatrix_postSkew_2_kx'>kx</a>*M K+<a href='#SkMatrix_postSkew_2_kx'>kx</a>*N L+<a href='#SkMatrix_postSkew_2_kx'>kx</a>*O |
+K(<a href='#SkMatrix_postSkew_2_kx'>kx</a>, <a href='#SkMatrix_postSkew_2_ky'>ky</a>) * <a href='SkMatrix_Reference#Matrix'>Matrix</a> = | <a href='#SkMatrix_postSkew_2_ky'>ky</a>  1 0 | | M N O | = | <a href='#SkMatrix_postSkew_2_ky'>ky</a>*J+M <a href='#SkMatrix_postSkew_2_ky'>ky</a>*K+N <a href='#SkMatrix_postSkew_2_ky'>ky</a>*L+O |
+|  0  0 1 | | P Q R |   |      P      Q      R |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_postSkew_2_kx'><code><strong>kx</strong></code></a></td>
+    <td>horizontal skew factor</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_postSkew_2_ky'><code><strong>ky</strong></code></a></td>
+    <td>vertical skew factor</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_postSkew_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_preSkew'>preSkew</a> <a href='#SkMatrix_setSkew'>setSkew</a>
+
+<a name='SkMatrix_postConcat'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_postConcat'>postConcat</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& other)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_postConcat_other'>other</a> multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+This can be thought of mapping by <a href='#SkMatrix_postConcat_other'>other</a> after applying <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+Given:
+
+| J K L |           | A B C |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | M N O |,  <a href='#SkMatrix_postConcat_other'>other</a> = | D E F |
+| P Q R |           | G H <a href='#SkMatrix_I'>I</a> |
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| A B C |   | J K L |   | AJ+BM+CP AK+BN+CQ AL+BO+CR |
+<a href='#SkMatrix_postConcat_other'>other</a> * <a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F | * | M N O | = | DJ+EM+FP DK+EN+FQ DL+EO+FR |
+| G H <a href='#SkMatrix_I'>I</a> |   | P Q R |   | GJ+HM+IP GK+HN+IQ GL+HO+IR |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_postConcat_other'><code><strong>other</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> on  left side of multiply expression</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_postConcat"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_preConcat'>preConcat</a> <a href='#SkMatrix_setConcat'>setConcat</a> <a href='#SkMatrix_Concat'>Concat</a>
+
+<a name='SkMatrix_ScaleToFit'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkMatrix_ScaleToFit'>ScaleToFit</a> {
+        <a href='#SkMatrix_kFill_ScaleToFit'>kFill_ScaleToFit</a>,
+        <a href='#SkMatrix_kStart_ScaleToFit'>kStart_ScaleToFit</a>,
+        <a href='#SkMatrix_kCenter_ScaleToFit'>kCenter_ScaleToFit</a>,
+        <a href='#SkMatrix_kEnd_ScaleToFit'>kEnd_ScaleToFit</a>,
+    };
+</pre>
+
+<a href='#SkMatrix_ScaleToFit'>ScaleToFit</a> describes how <a href='SkMatrix_Reference#Matrix'>Matrix</a> is constructed to map one <a href='SkRect_Reference#Rect'>Rect</a> to another.
+<a href='#SkMatrix_ScaleToFit'>ScaleToFit</a> may allow <a href='SkMatrix_Reference#Matrix'>Matrix</a> to have unequal horizontal and vertical scaling,
+or may restrict <a href='SkMatrix_Reference#Matrix'>Matrix</a> to square scaling. If restricted, <a href='#SkMatrix_ScaleToFit'>ScaleToFit</a> specifies
+how <a href='SkMatrix_Reference#Matrix'>Matrix</a> maps to the side or center of the destination <a href='SkRect_Reference#Rect'>Rect</a>.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kFill_ScaleToFit'><code>SkMatrix::kFill_ScaleToFit</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Computes <a href='SkMatrix_Reference#Matrix'>Matrix</a> that scales about x-axis and y-axis independently, so that
+source <a href='SkRect_Reference#Rect'>Rect</a> is mapped to completely fill destination <a href='SkRect_Reference#Rect'>Rect</a>. The aspect ratio
+of source <a href='SkRect_Reference#Rect'>Rect</a> may change.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kStart_ScaleToFit'><code>SkMatrix::kStart_ScaleToFit</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Computes <a href='SkMatrix_Reference#Matrix'>Matrix</a> that maintains source <a href='SkRect_Reference#Rect'>Rect</a> aspect ratio, mapping source <a href='SkRect_Reference#Rect'>Rect</a>
+width or height to destination <a href='SkRect_Reference#Rect'>Rect</a>. Aligns mapping to left and top edges
+of destination <a href='SkRect_Reference#Rect'>Rect</a>.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kCenter_ScaleToFit'><code>SkMatrix::kCenter_ScaleToFit</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Computes <a href='SkMatrix_Reference#Matrix'>Matrix</a> that maintains source <a href='SkRect_Reference#Rect'>Rect</a> aspect ratio, mapping source <a href='SkRect_Reference#Rect'>Rect</a>
+width or height to destination <a href='SkRect_Reference#Rect'>Rect</a>. Aligns mapping to center of destination
+<a href='SkRect_Reference#Rect'>Rect</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkMatrix_kEnd_ScaleToFit'><code>SkMatrix::kEnd_ScaleToFit</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Computes <a href='SkMatrix_Reference#Matrix'>Matrix</a> that maintains source <a href='SkRect_Reference#Rect'>Rect</a> aspect ratio, mapping source <a href='SkRect_Reference#Rect'>Rect</a>
+width or height to destination <a href='SkRect_Reference#Rect'>Rect</a>. Aligns mapping to right and bottom
+edges of destination <a href='SkRect_Reference#Rect'>Rect</a>.
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="17c3070b31b700ea8f52e48af9a66b6e"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setRectToRect'>setRectToRect</a> <a href='#SkMatrix_MakeRectToRect'>MakeRectToRect</a> <a href='#SkMatrix_setPolyToPoly'>setPolyToPoly</a>
+
+<a name='SkMatrix_setRectToRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_setRectToRect'>setRectToRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& src, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst, <a href='#SkMatrix_ScaleToFit'>ScaleToFit</a> stf)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to scale and translate <a href='#SkMatrix_setRectToRect_src'>src</a> <a href='SkRect_Reference#SkRect'>SkRect</a> to <a href='#SkMatrix_setRectToRect_dst'>dst</a> <a href='SkRect_Reference#SkRect'>SkRect</a>. <a href='#SkMatrix_setRectToRect_stf'>stf</a> selects whether
+mapping completely fills <a href='#SkMatrix_setRectToRect_dst'>dst</a> or preserves the aspect ratio, and how to align
+<a href='#SkMatrix_setRectToRect_src'>src</a> within <a href='#SkMatrix_setRectToRect_dst'>dst</a>. Returns false if <a href='#SkMatrix_setRectToRect_src'>src</a> is empty, and sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to identity.
+Returns true if <a href='#SkMatrix_setRectToRect_dst'>dst</a> is empty, and sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| 0 0 0 |
+| 0 0 0 |
+| 0 0 1 |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setRectToRect_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to map from</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setRectToRect_dst'><code><strong>dst</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to map to</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setRectToRect_stf'><code><strong>stf</strong></code></a></td>
+    <td>one of: <a href='#SkMatrix_kFill_ScaleToFit'>kFill_ScaleToFit</a>, <a href='#SkMatrix_kStart_ScaleToFit'>kStart_ScaleToFit</a>,</td>
+  </tr>
+</table>
+
+<a href='#SkMatrix_kCenter_ScaleToFit'>kCenter_ScaleToFit</a>, <a href='#SkMatrix_kEnd_ScaleToFit'>kEnd_ScaleToFit</a>
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> can represent <a href='SkRect_Reference#SkRect'>SkRect</a> mapping
+
+### Example
+
+<div><fiddle-embed name="@Matrix_setRectToRect">
+
+#### Example Output
+
+~~~~
+src: 0, 0, 0, 0  dst: 0, 0, 0, 0  success: false
+[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]
+src: 0, 0, 0, 0  dst: 5, 6, 8, 9  success: false
+[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]
+src: 1, 2, 3, 4  dst: 0, 0, 0, 0  success: true
+[  0.0000   0.0000   0.0000][  0.0000   0.0000   0.0000][  0.0000   0.0000   1.0000]
+src: 1, 2, 3, 4  dst: 5, 6, 8, 9  success: true
+[  1.5000   0.0000   3.5000][  0.0000   1.5000   3.0000][  0.0000   0.0000   1.0000]
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_MakeRectToRect'>MakeRectToRect</a> <a href='#SkMatrix_ScaleToFit'>ScaleToFit</a> <a href='#SkMatrix_setPolyToPoly'>setPolyToPoly</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_isEmpty'>isEmpty</a>
+
+<a name='SkMatrix_MakeRectToRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_MakeRectToRect'>MakeRectToRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& src, const <a href='SkRect_Reference#SkRect'>SkRect</a>& dst, <a href='#SkMatrix_ScaleToFit'>ScaleToFit</a> stf)
+</pre>
+
+Returns <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> set to scale and translate <a href='#SkMatrix_MakeRectToRect_src'>src</a> <a href='SkRect_Reference#SkRect'>SkRect</a> to <a href='#SkMatrix_MakeRectToRect_dst'>dst</a> <a href='SkRect_Reference#SkRect'>SkRect</a>. <a href='#SkMatrix_MakeRectToRect_stf'>stf</a> selects
+whether mapping completely fills <a href='#SkMatrix_MakeRectToRect_dst'>dst</a> or preserves the aspect ratio, and how to
+align <a href='#SkMatrix_MakeRectToRect_src'>src</a> within <a href='#SkMatrix_MakeRectToRect_dst'>dst</a>. Returns the identity <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> if <a href='#SkMatrix_MakeRectToRect_src'>src</a> is empty. If <a href='#SkMatrix_MakeRectToRect_dst'>dst</a> is
+empty, returns <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> set to:
+
+| 0 0 0 |
+| 0 0 0 |
+| 0 0 1 |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_MakeRectToRect_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to map from</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_MakeRectToRect_dst'><code><strong>dst</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to map to</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_MakeRectToRect_stf'><code><strong>stf</strong></code></a></td>
+    <td>one of: <a href='#SkMatrix_kFill_ScaleToFit'>kFill_ScaleToFit</a>, <a href='#SkMatrix_kStart_ScaleToFit'>kStart_ScaleToFit</a>,</td>
+  </tr>
+</table>
+
+<a href='#SkMatrix_kCenter_ScaleToFit'>kCenter_ScaleToFit</a>, <a href='#SkMatrix_kEnd_ScaleToFit'>kEnd_ScaleToFit</a>
+
+### Return Value
+
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> mapping <a href='#SkMatrix_MakeRectToRect_src'>src</a> to <a href='#SkMatrix_MakeRectToRect_dst'>dst</a>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_MakeRectToRect">
+
+#### Example Output
+
+~~~~
+src: 0, 0, 0, 0  dst: 0, 0, 0, 0
+[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]
+src: 0, 0, 0, 0  dst: 5, 6, 8, 9
+[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]
+src: 1, 2, 3, 4  dst: 0, 0, 0, 0
+[  0.0000   0.0000   0.0000][  0.0000   0.0000   0.0000][  0.0000   0.0000   1.0000]
+src: 1, 2, 3, 4  dst: 5, 6, 8, 9
+[  1.5000   0.0000   3.5000][  0.0000   1.5000   3.0000][  0.0000   0.0000   1.0000]
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setRectToRect'>setRectToRect</a> <a href='#SkMatrix_ScaleToFit'>ScaleToFit</a> <a href='#SkMatrix_setPolyToPoly'>setPolyToPoly</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_isEmpty'>isEmpty</a>
+
+<a name='SkMatrix_setPolyToPoly'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_setPolyToPoly'>setPolyToPoly</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> src[], const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> dst[], int count)
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to map <a href='#SkMatrix_setPolyToPoly_src'>src</a> to <a href='#SkMatrix_setPolyToPoly_dst'>dst</a>. <a href='#SkMatrix_setPolyToPoly_count'>count</a> must be zero or greater, and four or less.
+
+If <a href='#SkMatrix_setPolyToPoly_count'>count</a> is zero, sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to identity and returns true.
+If <a href='#SkMatrix_setPolyToPoly_count'>count</a> is one, sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to translate and returns true.
+If <a href='#SkMatrix_setPolyToPoly_count'>count</a> is two or more, sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to map <a href='SkPoint_Reference#SkPoint'>SkPoint</a> if possible; returns false
+if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> cannot be constructed. If <a href='#SkMatrix_setPolyToPoly_count'>count</a> is four, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> may include
+perspective.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setPolyToPoly_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkPoint_Reference#SkPoint'>SkPoint</a> to map from</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setPolyToPoly_dst'><code><strong>dst</strong></code></a></td>
+    <td><a href='SkPoint_Reference#SkPoint'>SkPoint</a> to map to</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setPolyToPoly_count'><code><strong>count</strong></code></a></td>
+    <td>number of <a href='SkPoint_Reference#SkPoint'>SkPoint</a> in <a href='#SkMatrix_setPolyToPoly_src'>src</a> and <a href='#SkMatrix_setPolyToPoly_dst'>dst</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> was constructed successfully
+
+### Example
+
+<div><fiddle-embed name="c851d1313e8909aaea4f0591699fdb7b"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setRectToRect'>setRectToRect</a> <a href='#SkMatrix_MakeRectToRect'>MakeRectToRect</a>
+
+<a name='SkMatrix_invert'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_invert'>invert</a>(<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* inverse)const
+</pre>
+
+Sets <a href='#SkMatrix_invert_inverse'>inverse</a> to reciprocal <a href='SkMatrix_Reference#Matrix'>matrix</a>, returning true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> can be inverted.
+Geometrically, if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> maps from source to destination, <a href='#SkMatrix_invert_inverse'>inverse</a> <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+maps from destination to source. If <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> can not be inverted, <a href='#SkMatrix_invert_inverse'>inverse</a> is
+unchanged.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_invert_inverse'><code><strong>inverse</strong></code></a></td>
+    <td>storage for inverted <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> can be inverted
+
+### Example
+
+<div><fiddle-embed name="@Matrix_invert"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_Concat'>Concat</a>
+
+<a name='SkMatrix_SetAffineIdentity'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static void <a href='#SkMatrix_SetAffineIdentity'>SetAffineIdentity</a>(<a href='undocumented#SkScalar'>SkScalar</a> affine[6])
+</pre>
+
+Fills <a href='#SkMatrix_SetAffineIdentity_affine'>affine</a> with identity values in column major order.
+Sets <a href='#SkMatrix_SetAffineIdentity_affine'>affine</a> to:
+
+| 1 0 0 |
+| 0 1 0 |
+
+Affine 3 by 2 <a href='SkMatrix_Reference#Matrix'>matrices</a> in column major order are used by OpenGL and XPS.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_SetAffineIdentity_affine'><code><strong>affine</strong></code></a></td>
+    <td>storage for 3 by 2 <a href='#SkMatrix_SetAffineIdentity_affine'>affine</a> <a href='SkMatrix_Reference#Matrix'>matrix</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_SetAffineIdentity">
+
+#### Example Output
+
+~~~~
+ScaleX: 1 SkewY: 0 SkewX: 0 ScaleY: 1 TransX: 0 TransY: 0
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setAffine'>setAffine</a> <a href='#SkMatrix_asAffine'>asAffine</a>
+
+<a name='SkMatrix_asAffine'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_asAffine'>asAffine</a>(<a href='undocumented#SkScalar'>SkScalar</a> affine[6])const
+</pre>
+
+Fills <a href='#SkMatrix_asAffine_affine'>affine</a> in column major order. Sets <a href='#SkMatrix_asAffine_affine'>affine</a> to:
+
+| scale-x  skew-x translate-x |
+| skew-y  scale-y translate-y |
+
+If <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> contains perspective, returns false and leaves <a href='#SkMatrix_asAffine_affine'>affine</a> unchanged.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_asAffine_affine'><code><strong>affine</strong></code></a></td>
+    <td>storage for 3 by 2 <a href='#SkMatrix_asAffine_affine'>affine</a> <a href='SkMatrix_Reference#Matrix'>matrix</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> does not contain perspective
+
+### Example
+
+<div><fiddle-embed name="@Matrix_asAffine">
+
+#### Example Output
+
+~~~~
+ScaleX: 2 SkewY: 5 SkewX: 3 ScaleY: 6 TransX: 4 TransY: 7
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setAffine'>setAffine</a> <a href='#SkMatrix_SetAffineIdentity'>SetAffineIdentity</a>
+
+<a name='SkMatrix_setAffine'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setAffine'>setAffine</a>(const <a href='undocumented#SkScalar'>SkScalar</a> affine[6])
+</pre>
+
+Sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to <a href='#SkMatrix_setAffine_affine'>affine</a> values, passed in column major order. Given <a href='#SkMatrix_setAffine_affine'>affine</a>,
+column, then row, as:
+
+| scale-x  skew-x translate-x |
+|  skew-y scale-y translate-y |
+
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> is set, row, then column, to:
+
+| scale-x  skew-x translate-x |
+|  skew-y scale-y translate-y |
+|       0       0           1 |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setAffine_affine'><code><strong>affine</strong></code></a></td>
+    <td>3 by 2 <a href='#SkMatrix_setAffine_affine'>affine</a> <a href='SkMatrix_Reference#Matrix'>matrix</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_setAffine">
+
+#### Example Output
+
+~~~~
+ScaleX: 2 SkewY: 5 SkewX: 3 ScaleY: 6 TransX: 4 TransY: 7
+[  2.0000   3.0000   4.0000][  5.0000   6.0000   7.0000][  0.0000   0.0000   1.0000]
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_asAffine'>asAffine</a> <a href='#SkMatrix_SetAffineIdentity'>SetAffineIdentity</a>
+
+<a name='Transform'></a>
+
+<a name='SkMatrix_mapPoints'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_mapPoints'>mapPoints</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> dst[], const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> src[], int count)const
+</pre>
+
+Maps <a href='#SkMatrix_mapPoints_src'>src</a>  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> of length <a href='#SkMatrix_mapPoints_count'>count</a> to <a href='#SkMatrix_mapPoints_dst'>dst</a>  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> of equal or greater
+length. <a href='SkPoint_Reference#SkPoint'>SkPoint</a> are mapped by multiplying each <a href='SkPoint_Reference#SkPoint'>SkPoint</a> by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. Given:
+
+| A B C |        | x |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F |,  pt = | y |
+| G H <a href='#SkMatrix_I'>I</a> |        | 1 |
+
+where
+
+for (i = 0; i < <a href='#SkMatrix_mapPoints_count'>count</a>; ++i) {
+x = <a href='#SkMatrix_mapPoints_src'>src</a>[i].fX
+y = <a href='#SkMatrix_mapPoints_src'>src</a>[i].fY
+}
+
+each <a href='#SkMatrix_mapPoints_dst'>dst</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> is computed as:
+
+|A B C| |x|                               Ax+By+C   Dx+Ey+F
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * pt = |D E F| |y| = |Ax+By+C Dx+Ey+F Gx+Hy+<a href='#SkMatrix_I'>I</a>| = ------- , -------
+|G H <a href='#SkMatrix_I'>I</a>| |1|                               Gx+Hy+<a href='#SkMatrix_I'>I</a>   Gx+Hy+<a href='#SkMatrix_I'>I</a>
+
+<a href='#SkMatrix_mapPoints_src'>src</a> and <a href='#SkMatrix_mapPoints_dst'>dst</a> may <a href='SkPoint_Reference#Point'>point</a> to the same storage.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapPoints_dst'><code><strong>dst</strong></code></a></td>
+    <td>storage for mapped <a href='SkPoint_Reference#SkPoint'>SkPoint</a></td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapPoints_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkPoint_Reference#SkPoint'>SkPoint</a> to transform</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapPoints_count'><code><strong>count</strong></code></a></td>
+    <td>number of <a href='SkPoint_Reference#SkPoint'>SkPoint</a> to transform</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_mapPoints"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapXY'>mapXY</a> <a href='#SkMatrix_mapHomogeneousPoints'>mapHomogeneousPoints</a> <a href='#SkMatrix_mapVectors'>mapVectors</a>
+
+<a name='SkMatrix_mapPoints_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_mapPoints'>mapPoints</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], int count)const
+</pre>
+
+Maps <a href='#SkMatrix_mapPoints_2_pts'>pts</a>  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> of length <a href='#SkMatrix_mapPoints_2_count'>count</a> in place. <a href='SkPoint_Reference#SkPoint'>SkPoint</a> are mapped by multiplying
+each <a href='SkPoint_Reference#SkPoint'>SkPoint</a> by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. Given:
+
+| A B C |        | x |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F |,  pt = | y |
+| G H <a href='#SkMatrix_I'>I</a> |        | 1 |
+
+where
+
+for (i = 0; i < <a href='#SkMatrix_mapPoints_2_count'>count</a>; ++i) {
+x = <a href='#SkMatrix_mapPoints_2_pts'>pts</a>[i].fX
+y = <a href='#SkMatrix_mapPoints_2_pts'>pts</a>[i].fY
+}
+
+each resulting <a href='#SkMatrix_mapPoints_2_pts'>pts</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> is computed as:
+
+|A B C| |x|                               Ax+By+C   Dx+Ey+F
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * pt = |D E F| |y| = |Ax+By+C Dx+Ey+F Gx+Hy+<a href='#SkMatrix_I'>I</a>| = ------- , -------
+|G H <a href='#SkMatrix_I'>I</a>| |1|                               Gx+Hy+<a href='#SkMatrix_I'>I</a>   Gx+Hy+<a href='#SkMatrix_I'>I</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapPoints_2_pts'><code><strong>pts</strong></code></a></td>
+    <td>storage for mapped <a href='SkPoint_Reference#SkPoint'>SkPoint</a></td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapPoints_2_count'><code><strong>count</strong></code></a></td>
+    <td>number of <a href='SkPoint_Reference#SkPoint'>SkPoint</a> to transform</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_mapPoints_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapXY'>mapXY</a> <a href='#SkMatrix_mapHomogeneousPoints'>mapHomogeneousPoints</a> <a href='#SkMatrix_mapVectors'>mapVectors</a>
+
+<a name='SkMatrix_mapHomogeneousPoints'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_mapHomogeneousPoints'>mapHomogeneousPoints</a>(<a href='undocumented#SkPoint3'>SkPoint3</a> dst[], const <a href='undocumented#SkPoint3'>SkPoint3</a> src[], int count)const
+</pre>
+
+Maps <a href='#SkMatrix_mapHomogeneousPoints_src'>src</a> <a href='undocumented#SkPoint3'>SkPoint3</a> array of length <a href='#SkMatrix_mapHomogeneousPoints_count'>count</a> to <a href='#SkMatrix_mapHomogeneousPoints_dst'>dst</a> <a href='undocumented#SkPoint3'>SkPoint3</a> array, which must of length <a href='#SkMatrix_mapHomogeneousPoints_count'>count</a> or
+greater. <a href='undocumented#SkPoint3'>SkPoint3</a> array is mapped by multiplying each <a href='undocumented#SkPoint3'>SkPoint3</a> by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. Given:
+
+| A B C |         | x |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F |,  <a href='#SkMatrix_mapHomogeneousPoints_src'>src</a> = | y |
+| G H <a href='#SkMatrix_I'>I</a> |         | z |
+
+each resulting <a href='#SkMatrix_mapHomogeneousPoints_dst'>dst</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> is computed as:
+
+|A B C| |x|
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * <a href='#SkMatrix_mapHomogeneousPoints_src'>src</a> = |D E F| |y| = |Ax+By+Cz Dx+Ey+Fz Gx+Hy+Iz|
+|G H <a href='#SkMatrix_I'>I</a>| |z|
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapHomogeneousPoints_dst'><code><strong>dst</strong></code></a></td>
+    <td>storage for mapped <a href='undocumented#SkPoint3'>SkPoint3</a> array</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapHomogeneousPoints_src'><code><strong>src</strong></code></a></td>
+    <td><a href='undocumented#SkPoint3'>SkPoint3</a> array to transform</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapHomogeneousPoints_count'><code><strong>count</strong></code></a></td>
+    <td>items in <a href='undocumented#SkPoint3'>SkPoint3</a> array to transform</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_mapHomogeneousPoints"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapPoints'>mapPoints</a> <a href='#SkMatrix_mapXY'>mapXY</a> <a href='#SkMatrix_mapVectors'>mapVectors</a>
+
+<a name='SkMatrix_mapXY'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_mapXY'>mapXY</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, <a href='SkPoint_Reference#SkPoint'>SkPoint</a>* result)const
+</pre>
+
+Maps <a href='SkPoint_Reference#SkPoint'>SkPoint</a> (<a href='#SkMatrix_mapXY_x'>x</a>, <a href='#SkMatrix_mapXY_y'>y</a>) to <a href='#SkMatrix_mapXY_result'>result</a>. <a href='SkPoint_Reference#SkPoint'>SkPoint</a> is mapped by multiplying by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. Given:
+
+| A B C |        | <a href='#SkMatrix_mapXY_x'>x</a> |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F |,  pt = | <a href='#SkMatrix_mapXY_y'>y</a> |
+| G H <a href='#SkMatrix_I'>I</a> |        | 1 |
+
+<a href='#SkMatrix_mapXY_result'>result</a> is computed as:
+
+|A B C| |<a href='#SkMatrix_mapXY_x'>x</a>|                               Ax+By+C   Dx+Ey+F
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * pt = |D E F| |<a href='#SkMatrix_mapXY_y'>y</a>| = |Ax+By+C Dx+Ey+F Gx+Hy+<a href='#SkMatrix_I'>I</a>| = ------- , -------
+|G H <a href='#SkMatrix_I'>I</a>| |1|                               Gx+Hy+<a href='#SkMatrix_I'>I</a>   Gx+Hy+<a href='#SkMatrix_I'>I</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapXY_x'><code><strong>x</strong></code></a></td>
+    <td>x-axis value of <a href='SkPoint_Reference#SkPoint'>SkPoint</a> to map</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapXY_y'><code><strong>y</strong></code></a></td>
+    <td>y-axis value of <a href='SkPoint_Reference#SkPoint'>SkPoint</a> to map</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapXY_result'><code><strong>result</strong></code></a></td>
+    <td>storage for mapped <a href='SkPoint_Reference#SkPoint'>SkPoint</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_mapXY"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapPoints'>mapPoints</a> <a href='#SkMatrix_mapVectors'>mapVectors</a>
+
+<a name='SkMatrix_mapXY_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkMatrix_mapXY'>mapXY</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y)const
+</pre>
+
+Returns <a href='SkPoint_Reference#SkPoint'>SkPoint</a> (<a href='#SkMatrix_mapXY_2_x'>x</a>, <a href='#SkMatrix_mapXY_2_y'>y</a>) multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. Given:
+
+| A B C |        | <a href='#SkMatrix_mapXY_2_x'>x</a> |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F |,  pt = | <a href='#SkMatrix_mapXY_2_y'>y</a> |
+| G H <a href='#SkMatrix_I'>I</a> |        | 1 |
+
+result is computed as:
+
+|A B C| |<a href='#SkMatrix_mapXY_2_x'>x</a>|                               Ax+By+C   Dx+Ey+F
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * pt = |D E F| |<a href='#SkMatrix_mapXY_2_y'>y</a>| = |Ax+By+C Dx+Ey+F Gx+Hy+<a href='#SkMatrix_I'>I</a>| = ------- , -------
+|G H <a href='#SkMatrix_I'>I</a>| |1|                               Gx+Hy+<a href='#SkMatrix_I'>I</a>   Gx+Hy+<a href='#SkMatrix_I'>I</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapXY_2_x'><code><strong>x</strong></code></a></td>
+    <td>x-axis value of <a href='SkPoint_Reference#SkPoint'>SkPoint</a> to map</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapXY_2_y'><code><strong>y</strong></code></a></td>
+    <td>y-axis value of <a href='SkPoint_Reference#SkPoint'>SkPoint</a> to map</td>
+  </tr>
+</table>
+
+### Return Value
+
+mapped <a href='SkPoint_Reference#SkPoint'>SkPoint</a>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_mapXY_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapPoints'>mapPoints</a> <a href='#SkMatrix_mapVectors'>mapVectors</a>
+
+<a name='SkMatrix_mapVectors'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_mapVectors'>mapVectors</a>(<a href='SkPoint_Reference#SkVector'>SkVector</a> dst[], const <a href='SkPoint_Reference#SkVector'>SkVector</a> src[], int count)const
+</pre>
+
+Maps <a href='#SkMatrix_mapVectors_src'>src</a> <a href='SkPoint_Reference#Vector'>vector</a> array of length <a href='#SkMatrix_mapVectors_count'>count</a> to <a href='SkPoint_Reference#Vector'>vector</a>  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> of equal or greater
+length. <a href='SkPoint_Reference#Vector'>Vectors</a> are mapped by multiplying each <a href='SkPoint_Reference#Vector'>vector</a> by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, treating
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> translation as zero. Given:
+
+| A B 0 |         | x |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E 0 |,  <a href='#SkMatrix_mapVectors_src'>src</a> = | y |
+| G H <a href='#SkMatrix_I'>I</a> |         | 1 |
+
+where
+
+for (i = 0; i < <a href='#SkMatrix_mapVectors_count'>count</a>; ++i) {
+x = <a href='#SkMatrix_mapVectors_src'>src</a>[i].fX
+y = <a href='#SkMatrix_mapVectors_src'>src</a>[i].fY
+}
+
+each <a href='#SkMatrix_mapVectors_dst'>dst</a> <a href='SkPoint_Reference#Vector'>vector</a> is computed as:
+
+|A B 0| |x|                            Ax+By     Dx+Ey
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * <a href='#SkMatrix_mapVectors_src'>src</a> = |D E 0| |y| = |Ax+By Dx+Ey Gx+Hy+<a href='#SkMatrix_I'>I</a>| = ------- , -------
+|G H <a href='#SkMatrix_I'>I</a>| |1|                           Gx+Hy+<a href='#SkMatrix_I'>I</a>   Gx+Hy+<a href='#SkMatrix_I'>I</a>
+
+<a href='#SkMatrix_mapVectors_src'>src</a> and <a href='#SkMatrix_mapVectors_dst'>dst</a> may <a href='SkPoint_Reference#Point'>point</a> to the same storage.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapVectors_dst'><code><strong>dst</strong></code></a></td>
+    <td>storage for mapped <a href='SkPoint_Reference#Vector'>vectors</a></td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapVectors_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkPoint_Reference#Vector'>vectors</a> to transform</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapVectors_count'><code><strong>count</strong></code></a></td>
+    <td>number of <a href='SkPoint_Reference#Vector'>vectors</a> to transform</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_mapVectors"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapVector'>mapVector</a> <a href='#SkMatrix_mapPoints'>mapPoints</a> <a href='#SkMatrix_mapXY'>mapXY</a>
+
+<a name='SkMatrix_mapVectors_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_mapVectors'>mapVectors</a>(<a href='SkPoint_Reference#SkVector'>SkVector</a> vecs[], int count)const
+</pre>
+
+Maps <a href='#SkMatrix_mapVectors_2_vecs'>vecs</a> <a href='SkPoint_Reference#Vector'>vector</a> array of length <a href='#SkMatrix_mapVectors_2_count'>count</a> in place, multiplying each <a href='SkPoint_Reference#Vector'>vector</a> by
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, treating <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> translation as zero. Given:
+
+| A B 0 |         | x |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E 0 |,  vec = | y |
+| G H <a href='#SkMatrix_I'>I</a> |         | 1 |
+
+where
+
+for (i = 0; i < <a href='#SkMatrix_mapVectors_2_count'>count</a>; ++i) {
+x = <a href='#SkMatrix_mapVectors_2_vecs'>vecs</a>[i].fX
+y = <a href='#SkMatrix_mapVectors_2_vecs'>vecs</a>[i].fY
+}
+
+each result <a href='SkPoint_Reference#Vector'>vector</a> is computed as:
+
+|A B 0| |x|                            Ax+By     Dx+Ey
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * vec = |D E 0| |y| = |Ax+By Dx+Ey Gx+Hy+<a href='#SkMatrix_I'>I</a>| = ------- , -------
+|G H <a href='#SkMatrix_I'>I</a>| |1|                           Gx+Hy+<a href='#SkMatrix_I'>I</a>   Gx+Hy+<a href='#SkMatrix_I'>I</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapVectors_2_vecs'><code><strong>vecs</strong></code></a></td>
+    <td><a href='SkPoint_Reference#Vector'>vectors</a> to transform, and storage for mapped <a href='SkPoint_Reference#Vector'>vectors</a></td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapVectors_2_count'><code><strong>count</strong></code></a></td>
+    <td>number of <a href='SkPoint_Reference#Vector'>vectors</a> to transform</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_mapVectors_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapVector'>mapVector</a> <a href='#SkMatrix_mapPoints'>mapPoints</a> <a href='#SkMatrix_mapXY'>mapXY</a>
+
+<a name='SkMatrix_mapVector'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_mapVector'>mapVector</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy, <a href='SkPoint_Reference#SkVector'>SkVector</a>* result)const
+</pre>
+
+Maps <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkMatrix_mapVector_dx'>dx</a>, <a href='#SkMatrix_mapVector_dy'>dy</a>) to <a href='#SkMatrix_mapVector_result'>result</a>. <a href='SkPoint_Reference#Vector'>Vector</a> is mapped by multiplying by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>,
+treating <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> translation as zero. Given:
+
+| A B 0 |         | <a href='#SkMatrix_mapVector_dx'>dx</a> |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E 0 |,  vec = | <a href='#SkMatrix_mapVector_dy'>dy</a> |
+| G H <a href='#SkMatrix_I'>I</a> |         |  1 |
+
+each <a href='#SkMatrix_mapVector_result'>result</a> <a href='SkPoint_Reference#Vector'>vector</a> is computed as:
+
+|A B 0| |<a href='#SkMatrix_mapVector_dx'>dx</a>|                                        A*<a href='#SkMatrix_mapVector_dx'>dx</a>+B*<a href='#SkMatrix_mapVector_dy'>dy</a>     D*<a href='#SkMatrix_mapVector_dx'>dx</a>+E*<a href='#SkMatrix_mapVector_dy'>dy</a>
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * vec = |D E 0| |<a href='#SkMatrix_mapVector_dy'>dy</a>| = |A*<a href='#SkMatrix_mapVector_dx'>dx</a>+B*<a href='#SkMatrix_mapVector_dy'>dy</a> D*<a href='#SkMatrix_mapVector_dx'>dx</a>+E*<a href='#SkMatrix_mapVector_dy'>dy</a> G*<a href='#SkMatrix_mapVector_dx'>dx</a>+H*<a href='#SkMatrix_mapVector_dy'>dy</a>+<a href='#SkMatrix_I'>I</a>| = ----------- , -----------
+|G H <a href='#SkMatrix_I'>I</a>| | 1|                                       G*<a href='#SkMatrix_mapVector_dx'>dx</a>+H*<a href='#SkMatrix_mapVector_dy'>dy</a>+<a href='#SkMatrix_I'>I</a>   G*<a href='#SkMatrix_mapVector_dx'>dx</a>+*dHy+<a href='#SkMatrix_I'>I</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapVector_dx'><code><strong>dx</strong></code></a></td>
+    <td>x-axis value of <a href='SkPoint_Reference#Vector'>vector</a> to map</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapVector_dy'><code><strong>dy</strong></code></a></td>
+    <td>y-axis value of <a href='SkPoint_Reference#Vector'>vector</a> to map</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapVector_result'><code><strong>result</strong></code></a></td>
+    <td>storage for mapped <a href='SkPoint_Reference#Vector'>vector</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="aed143fc6cd0bce4ed029b98d1e61f2d"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapVectors'>mapVectors</a> <a href='#SkMatrix_mapPoints'>mapPoints</a> <a href='#SkMatrix_mapXY'>mapXY</a>
+
+<a name='SkMatrix_mapVector_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPoint_Reference#SkVector'>SkVector</a> <a href='#SkMatrix_mapVector'>mapVector</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)const
+</pre>
+
+Returns <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkMatrix_mapVector_2_dx'>dx</a>, <a href='#SkMatrix_mapVector_2_dy'>dy</a>) multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>, treating <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> translation as zero.
+Given:
+
+| A B 0 |         | <a href='#SkMatrix_mapVector_2_dx'>dx</a> |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E 0 |,  vec = | <a href='#SkMatrix_mapVector_2_dy'>dy</a> |
+| G H <a href='#SkMatrix_I'>I</a> |         |  1 |
+
+each result <a href='SkPoint_Reference#Vector'>vector</a> is computed as:
+
+|A B 0| |<a href='#SkMatrix_mapVector_2_dx'>dx</a>|                                        A*<a href='#SkMatrix_mapVector_2_dx'>dx</a>+B*<a href='#SkMatrix_mapVector_2_dy'>dy</a>     D*<a href='#SkMatrix_mapVector_2_dx'>dx</a>+E*<a href='#SkMatrix_mapVector_2_dy'>dy</a>
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * vec = |D E 0| |<a href='#SkMatrix_mapVector_2_dy'>dy</a>| = |A*<a href='#SkMatrix_mapVector_2_dx'>dx</a>+B*<a href='#SkMatrix_mapVector_2_dy'>dy</a> D*<a href='#SkMatrix_mapVector_2_dx'>dx</a>+E*<a href='#SkMatrix_mapVector_2_dy'>dy</a> G*<a href='#SkMatrix_mapVector_2_dx'>dx</a>+H*<a href='#SkMatrix_mapVector_2_dy'>dy</a>+<a href='#SkMatrix_I'>I</a>| = ----------- , -----------
+|G H <a href='#SkMatrix_I'>I</a>| | 1|                                       G*<a href='#SkMatrix_mapVector_2_dx'>dx</a>+H*<a href='#SkMatrix_mapVector_2_dy'>dy</a>+<a href='#SkMatrix_I'>I</a>   G*<a href='#SkMatrix_mapVector_2_dx'>dx</a>+*dHy+<a href='#SkMatrix_I'>I</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapVector_2_dx'><code><strong>dx</strong></code></a></td>
+    <td>x-axis value of <a href='SkPoint_Reference#Vector'>vector</a> to map</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapVector_2_dy'><code><strong>dy</strong></code></a></td>
+    <td>y-axis value of <a href='SkPoint_Reference#Vector'>vector</a> to map</td>
+  </tr>
+</table>
+
+### Return Value
+
+mapped <a href='SkPoint_Reference#Vector'>vector</a>
+
+### Example
+
+<div><fiddle-embed name="8bf1518db3f369696cd3065b541a8bd7"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapVectors'>mapVectors</a> <a href='#SkMatrix_mapPoints'>mapPoints</a> <a href='#SkMatrix_mapXY'>mapXY</a>
+
+<a name='SkMatrix_mapRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_mapRect'>mapRect</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* dst, const <a href='SkRect_Reference#SkRect'>SkRect</a>& src)const
+</pre>
+
+Sets <a href='#SkMatrix_mapRect_dst'>dst</a> to bounds of <a href='#SkMatrix_mapRect_src'>src</a> corners mapped by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+Returns true if mapped corners are <a href='#SkMatrix_mapRect_dst'>dst</a> corners.
+
+Returned value is the same as calling <a href='#SkMatrix_rectStaysRect'>rectStaysRect</a>().
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapRect_dst'><code><strong>dst</strong></code></a></td>
+    <td>storage for bounds of mapped <a href='SkPoint_Reference#SkPoint'>SkPoint</a></td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapRect_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to map</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkMatrix_mapRect_dst'>dst</a> is equivalent to mapped <a href='#SkMatrix_mapRect_src'>src</a>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_mapRect"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapPoints'>mapPoints</a> <a href='#SkMatrix_rectStaysRect'>rectStaysRect</a>
+
+<a name='SkMatrix_mapRect_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_mapRect'>mapRect</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* <a href='SkRect_Reference#Rect'>rect</a>)const
+</pre>
+
+Sets <a href='#SkMatrix_mapRect_2_rect'>rect</a> to bounds of <a href='#SkMatrix_mapRect_2_rect'>rect</a> corners mapped by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+Returns true if mapped corners are computed <a href='#SkMatrix_mapRect_2_rect'>rect</a> corners.
+
+Returned value is the same as calling <a href='#SkMatrix_rectStaysRect'>rectStaysRect</a>().
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapRect_2_rect'><code><strong>rect</strong></code></a></td>
+    <td>rectangle to map, and storage for bounds of mapped corners</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if result is equivalent to mapped <a href='#SkMatrix_mapRect_2_rect'>rect</a>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_mapRect_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapRectScaleTranslate'>mapRectScaleTranslate</a> <a href='#SkMatrix_mapPoints'>mapPoints</a> <a href='#SkMatrix_rectStaysRect'>rectStaysRect</a>
+
+<a name='SkMatrix_mapRect_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkMatrix_mapRect'>mapRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& src)const
+</pre>
+
+Returns bounds of <a href='#SkMatrix_mapRect_3_src'>src</a> corners mapped by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapRect_3_src'><code><strong>src</strong></code></a></td>
+    <td>rectangle to map</td>
+  </tr>
+</table>
+
+### Return Value
+
+mapped bounds
+
+### Example
+
+<div><fiddle-embed name="@Matrix_mapRect_3"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapRectToQuad'>mapRectToQuad</a> <a href='#SkMatrix_mapRectScaleTranslate'>mapRectScaleTranslate</a>
+
+<a name='SkMatrix_mapRectToQuad'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_mapRectToQuad'>mapRectToQuad</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> dst[4], const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>)const
+</pre>
+
+Maps four corners of <a href='#SkMatrix_mapRectToQuad_rect'>rect</a> to <a href='#SkMatrix_mapRectToQuad_dst'>dst</a>. <a href='SkPoint_Reference#SkPoint'>SkPoint</a> are mapped by multiplying each
+<a href='#SkMatrix_mapRectToQuad_rect'>rect</a> corner by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. <a href='#SkMatrix_mapRectToQuad_rect'>rect</a> corner is processed in this order:
+(<a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fLeft'>fLeft</a>, <a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fTop'>fTop</a>), (<a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fRight'>fRight</a>, <a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fTop'>fTop</a>), (<a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fRight'>fRight</a>, <a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fBottom'>fBottom</a>),
+(<a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fLeft'>fLeft</a>, <a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fBottom'>fBottom</a>).
+
+<a href='#SkMatrix_mapRectToQuad_rect'>rect</a> may be empty: <a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fLeft'>fLeft</a> may be greater than or equal to <a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fRight'>fRight</a>;
+<a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fTop'>fTop</a> may be greater than or equal to <a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fBottom'>fBottom</a>.
+
+Given:
+
+| A B C |        | x |
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> = | D E F |,  pt = | y |
+| G H <a href='#SkMatrix_I'>I</a> |        | 1 |
+
+where pt is initialized from each of (<a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fLeft'>fLeft</a>, <a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fTop'>fTop</a>),
+(<a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fRight'>fRight</a>, <a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fTop'>fTop</a>), (<a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fRight'>fRight</a>, <a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fBottom'>fBottom</a>), (<a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fLeft'>fLeft</a>, <a href='#SkMatrix_mapRectToQuad_rect'>rect</a>.<a href='#SkRect_fBottom'>fBottom</a>),
+each <a href='#SkMatrix_mapRectToQuad_dst'>dst</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> is computed as:
+
+|A B C| |x|                               Ax+By+C   Dx+Ey+F
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> * pt = |D E F| |y| = |Ax+By+C Dx+Ey+F Gx+Hy+<a href='#SkMatrix_I'>I</a>| = ------- , -------
+|G H <a href='#SkMatrix_I'>I</a>| |1|                               Gx+Hy+<a href='#SkMatrix_I'>I</a>   Gx+Hy+<a href='#SkMatrix_I'>I</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapRectToQuad_dst'><code><strong>dst</strong></code></a></td>
+    <td>storage for mapped corner <a href='SkPoint_Reference#SkPoint'>SkPoint</a></td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapRectToQuad_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to map</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_mapRectToQuad"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapRect'>mapRect</a> <a href='#SkMatrix_mapRectScaleTranslate'>mapRectScaleTranslate</a>
+
+<a name='SkMatrix_mapRectScaleTranslate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_mapRectScaleTranslate'>mapRectScaleTranslate</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* dst, const <a href='SkRect_Reference#SkRect'>SkRect</a>& src)const
+</pre>
+
+Sets <a href='#SkMatrix_mapRectScaleTranslate_dst'>dst</a> to bounds of <a href='#SkMatrix_mapRectScaleTranslate_src'>src</a> corners mapped by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. If <a href='SkMatrix_Reference#Matrix'>matrix</a> contains
+elements other than scale or translate: asserts if SK_DEBUG is defined;
+otherwise, results are undefined.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapRectScaleTranslate_dst'><code><strong>dst</strong></code></a></td>
+    <td>storage for bounds of mapped <a href='SkPoint_Reference#SkPoint'>SkPoint</a></td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_mapRectScaleTranslate_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to map</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_mapRectScaleTranslate"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapRect'>mapRect</a> <a href='#SkMatrix_mapRectToQuad'>mapRectToQuad</a> <a href='#SkMatrix_isScaleTranslate'>isScaleTranslate</a> <a href='#SkMatrix_rectStaysRect'>rectStaysRect</a>
+
+<a name='SkMatrix_mapRadius'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_mapRadius'>mapRadius</a>(<a href='undocumented#SkScalar'>SkScalar</a> radius)const
+</pre>
+
+Returns geometric mean <a href='#SkMatrix_mapRadius_radius'>radius</a> of ellipse formed by constructing <a href='undocumented#Circle'>circle</a> of
+<a href='undocumented#Size'>size</a> <a href='#SkMatrix_mapRadius_radius'>radius</a>, and mapping constructed <a href='undocumented#Circle'>circle</a> with <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. The result squared is
+equal to the major axis length times the minor axis length.
+Result is not meaningful if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> contains perspective elements.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_mapRadius_radius'><code><strong>radius</strong></code></a></td>
+    <td><a href='undocumented#Circle'>circle</a> <a href='undocumented#Size'>size</a> to map</td>
+  </tr>
+</table>
+
+### Return Value
+
+average mapped <a href='#SkMatrix_mapRadius_radius'>radius</a>
+
+### Example
+
+<div><fiddle-embed name="6d6f2082fcf59d9f02bfb1758b87db69"><div>The area enclosed by a square with sides equal to mappedRadius is the same as
+the area enclosed by the ellipse major and minor axes.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_mapVector'>mapVector</a>
+
+<a name='SkMatrix_isFixedStepInX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_isFixedStepInX'>isFixedStepInX</a>()const
+</pre>
+
+Returns true if a unit step on x-axis at some y-axis value mapped through <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+can be represented by a constant <a href='SkPoint_Reference#Vector'>vector</a>. Returns true if <a href='#SkMatrix_getType'>getType</a>() returns
+<a href='#SkMatrix_kIdentity_Mask'>kIdentity_Mask</a>, or combinations of: <a href='#SkMatrix_kTranslate_Mask'>kTranslate_Mask</a>, <a href='#SkMatrix_kScale_Mask'>kScale_Mask</a>, and <a href='#SkMatrix_kAffine_Mask'>kAffine_Mask</a>.
+
+May return true if <a href='#SkMatrix_getType'>getType</a>() returns <a href='#SkMatrix_kPerspective_Mask'>kPerspective_Mask</a>, but only when <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+does not include rotation or skewing along the y-axis.
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> does not have complex perspective
+
+### Example
+
+<div><fiddle-embed name="@Matrix_isFixedStepInX">
+
+#### Example Output
+
+~~~~
+[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]
+isFixedStepInX: true
+[  1.0000   0.0000   0.0000][  0.0000   2.0000   0.0000][  0.0000   0.0000   1.0000]
+isFixedStepInX: true
+[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.1000   1.0000]
+isFixedStepInX: true
+[  1.0000   0.0000   0.0000][  0.0000   2.0000   0.0000][  0.0000   0.1000   1.0000]
+isFixedStepInX: true
+[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.1000   0.0000   1.0000]
+isFixedStepInX: false
+[  1.0000   0.0000   0.0000][  0.0000   2.0000   0.0000][  0.1000   0.0000   1.0000]
+isFixedStepInX: false
+[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.1000   0.1000   1.0000]
+isFixedStepInX: false
+[  1.0000   0.0000   0.0000][  0.0000   2.0000   0.0000][  0.1000   0.1000   1.0000]
+isFixedStepInX: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_fixedStepInX'>fixedStepInX</a> <a href='#SkMatrix_getType'>getType</a>
+
+<a name='SkMatrix_fixedStepInX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPoint_Reference#SkVector'>SkVector</a> <a href='#SkMatrix_fixedStepInX'>fixedStepInX</a>(<a href='undocumented#SkScalar'>SkScalar</a> y)const
+</pre>
+
+Returns <a href='SkPoint_Reference#Vector'>vector</a> representing a unit step on x-axis at <a href='#SkMatrix_fixedStepInX_y'>y</a> mapped through <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>.
+If <a href='#SkMatrix_isFixedStepInX'>isFixedStepInX</a>() is false, returned value is undefined.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_fixedStepInX_y'><code><strong>y</strong></code></a></td>
+    <td>position of <a href='undocumented#Line'>line</a> parallel to x-axis</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkPoint_Reference#Vector'>vector</a> advance of mapped unit step on x-axis
+
+### Example
+
+<div><fiddle-embed name="@Matrix_fixedStepInX"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_isFixedStepInX'>isFixedStepInX</a> <a href='#SkMatrix_getType'>getType</a>
+
+<a name='SkMatrix_cheapEqualTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_cheapEqualTo'>cheapEqualTo</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& m)const
+</pre>
+
+Returns true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> equals <a href='#SkMatrix_cheapEqualTo_m'>m</a>, using an efficient comparison.
+
+Returns false when the sign of zero values is the different; when one
+<a href='SkMatrix_Reference#Matrix'>matrix</a> has positive zero value and the other has negative zero value.
+
+Returns true even when both <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> contain NaN.
+
+NaN never equals any value, including itself. To improve performance, NaN values
+are treated as bit patterns that are equal if their bit patterns are equal.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_cheapEqualTo_m'><code><strong>m</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkMatrix_cheapEqualTo_m'>m</a> and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> are represented by identical bit patterns
+
+### Example
+
+<div><fiddle-embed name="@Matrix_cheapEqualTo">
+
+#### Example Output
+
+~~~~
+identity: a == b a.cheapEqualTo(b): true
+neg zero: a == b a.cheapEqualTo(b): false
+one NaN: a != b a.cheapEqualTo(b): false
+both NaN: a != b a.cheapEqualTo(b): true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_equal_operator'>operator==</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& a, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& b)
+
+<a name='SkMatrix_equal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_equal_operator'>operator==</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& a, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& b)
+</pre>
+
+Compares <a href='#SkMatrix_equal_operator_a'>a</a> and <a href='#SkMatrix_equal_operator_b'>b</a>; returns true if <a href='#SkMatrix_equal_operator_a'>a</a> and <a href='#SkMatrix_equal_operator_b'>b</a> are numerically equal. Returns true
+even if sign of zero values are different. Returns false if either <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+contains NaN, even if the other <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> also contains NaN.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_equal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to compare</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_equal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_equal_operator_a'>a</a> and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_equal_operator_b'>b</a> are numerically equal
+
+### Example
+
+<div><fiddle-embed name="@Matrix_equal_operator">
+
+#### Example Output
+
+~~~~
+identity: a == b a.cheapEqualTo(b): true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_cheapEqualTo'>cheapEqualTo</a> <a href='#SkMatrix_notequal_operator'>operator!=</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='#SkMatrix_equal_operator_a'>a</a>, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='#SkMatrix_equal_operator_b'>b</a>)
+
+<a name='SkMatrix_notequal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_notequal_operator'>operator!=</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& a, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& b)
+</pre>
+
+Compares <a href='#SkMatrix_notequal_operator_a'>a</a> and <a href='#SkMatrix_notequal_operator_b'>b</a>; returns true if <a href='#SkMatrix_notequal_operator_a'>a</a> and <a href='#SkMatrix_notequal_operator_b'>b</a> are not numerically equal. Returns false
+even if sign of zero values are different. Returns true if either <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+contains NaN, even if the other <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> also contains NaN.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_notequal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to compare</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_notequal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_notequal_operator_a'>a</a> and <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_notequal_operator_b'>b</a> are numerically not equal
+
+### Example
+
+<div><fiddle-embed name="@Matrix_notequal_operator"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_cheapEqualTo'>cheapEqualTo</a> <a href='#SkMatrix_equal_operator'>operator==</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='#SkMatrix_notequal_operator_a'>a</a>, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='#SkMatrix_notequal_operator_b'>b</a>)
+
+<a name='Utility'></a>
+
+<a name='SkMatrix_dump'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_dump'>dump()</a>const
+</pre>
+
+Writes <a href='undocumented#Text'>text</a> representation of <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to standard output. Floating <a href='SkPoint_Reference#Point'>point</a> values
+are written with limited precision; it may not be possible to reconstruct
+original <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> from output.
+
+### Example
+
+<div><fiddle-embed name="@Matrix_dump">
+
+#### Example Output
+
+~~~~
+[  0.7071  -0.7071   0.0000][  0.7071   0.7071   0.0000][  0.0000   0.0000   1.0000]
+[  0.7071  -0.7071   0.0000][  0.7071   0.7071   0.0000][  0.0000   0.0000   1.0000]
+matrix != nearlyEqual
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_dump'>dump</a>
+
+<a name='SkMatrix_getMinScale'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getMinScale'>getMinScale</a>()const
+</pre>
+
+Returns the minimum scaling factor of <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> by decomposing the scaling and
+skewing elements.
+Returns -1 if scale factor overflows or <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> contains perspective.
+
+### Return Value
+
+minimum scale factor
+
+### Example
+
+<div><fiddle-embed name="@Matrix_getMinScale">
+
+#### Example Output
+
+~~~~
+matrix.getMinScale() 24
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_getMaxScale'>getMaxScale</a> <a href='#SkMatrix_getMinMaxScales'>getMinMaxScales</a>
+
+<a name='SkMatrix_getMaxScale'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkMatrix_getMaxScale'>getMaxScale</a>()const
+</pre>
+
+Returns the maximum scaling factor of <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> by decomposing the scaling and
+skewing elements.
+Returns -1 if scale factor overflows or <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> contains perspective.
+
+### Return Value
+
+maximum scale factor
+
+### Example
+
+<div><fiddle-embed name="@Matrix_getMaxScale">
+
+#### Example Output
+
+~~~~
+matrix.getMaxScale() 42
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_getMinScale'>getMinScale</a> <a href='#SkMatrix_getMinMaxScales'>getMinMaxScales</a>
+
+<a name='SkMatrix_getMinMaxScales'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_getMinMaxScales'>getMinMaxScales</a>(<a href='undocumented#SkScalar'>SkScalar</a> scaleFactors[2])const
+</pre>
+
+Sets <a href='#SkMatrix_getMinMaxScales_scaleFactors'>scaleFactors</a>[0] to the minimum scaling factor, and <a href='#SkMatrix_getMinMaxScales_scaleFactors'>scaleFactors</a>[1] to the
+maximum scaling factor. Scaling factors are computed by decomposing
+the <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> scaling and skewing elements.
+
+Returns true if <a href='#SkMatrix_getMinMaxScales_scaleFactors'>scaleFactors</a> are found; otherwise, returns false and sets
+<a href='#SkMatrix_getMinMaxScales_scaleFactors'>scaleFactors</a> to undefined values.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_getMinMaxScales_scaleFactors'><code><strong>scaleFactors</strong></code></a></td>
+    <td>storage for minimum and maximum scale factors</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if scale factors were computed correctly
+
+### Example
+
+<div><fiddle-embed name="@Matrix_getMinMaxScales">
+
+#### Example Output
+
+~~~~
+matrix.getMinMaxScales() false 2 2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_getMinScale'>getMinScale</a> <a href='#SkMatrix_getMaxScale'>getMaxScale</a>
+
+<a name='SkMatrix_decomposeScale'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_decomposeScale'>decomposeScale</a>(<a href='undocumented#SkSize'>SkSize</a>* scale, <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* remaining = nullptr)const
+</pre>
+
+Decomposes <a href='SkMatrix_Reference#Matrix'>Matrix</a> into <a href='#SkMatrix_decomposeScale_scale'>scale</a> components and whatever remains. Returns false if
+<a href='SkMatrix_Reference#Matrix'>Matrix</a> could not be decomposed.
+
+Sets <a href='#SkMatrix_decomposeScale_scale'>scale</a> to portion of <a href='SkMatrix_Reference#Matrix'>Matrix</a> that <a href='#SkMatrix_decomposeScale_scale'>scale</a> axes. Sets <a href='#SkMatrix_decomposeScale_remaining'>remaining</a> to <a href='SkMatrix_Reference#Matrix'>Matrix</a>
+with scaling factored out. <a href='#SkMatrix_decomposeScale_remaining'>remaining</a> may be passed as nullptr
+to determine if <a href='SkMatrix_Reference#Matrix'>Matrix</a> can be decomposed without computing remainder.
+
+Returns true if <a href='#SkMatrix_decomposeScale_scale'>scale</a> components are found. <a href='#SkMatrix_decomposeScale_scale'>scale</a> and <a href='#SkMatrix_decomposeScale_remaining'>remaining</a> are
+unchanged if <a href='SkMatrix_Reference#Matrix'>Matrix</a> contains perspective; <a href='#SkMatrix_decomposeScale_scale'>scale</a> factors are not finite, or
+are nearly zero.
+
+On success: <code><a href='SkMatrix_Reference#Matrix'>Matrix</a> = <a href='#SkMatrix_decomposeScale_scale'>scale</a> * Remaining</code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_decomposeScale_scale'><code><strong>scale</strong></code></a></td>
+    <td>axes scaling factors; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_decomposeScale_remaining'><code><strong>remaining</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#Matrix'>Matrix</a> without scaling; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkMatrix_decomposeScale_scale'>scale</a> can be computed
+
+### Example
+
+<div><fiddle-embed name="@Matrix_decomposeScale">
+
+#### Example Output
+
+~~~~
+[  0.0000  -0.2500   0.0000][  0.5000   0.0000   0.0000][  0.0000   0.0000   1.0000]
+success: true  scale: 0.5, 0.25
+[  0.0000  -0.5000   0.0000][  2.0000   0.0000   0.0000][  0.0000   0.0000   1.0000]
+[  0.0000  -0.2500   0.0000][  0.5000   0.0000   0.0000][  0.0000   0.0000   1.0000]
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setScale'>setScale</a> <a href='#SkMatrix_MakeScale'>MakeScale</a>
+
+<a name='SkMatrix_I'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='#SkMatrix_I'>I</a>()
+</pre>
+
+Returns reference to const identity <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>. Returned <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> is set to:
+
+| 1 0 0 |
+| 0 1 0 |
+| 0 0 1 |
+
+### Return Value
+
+const identity <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_I">
+
+#### Example Output
+
+~~~~
+m1 == m2
+m2 == m3
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_reset'>reset()</a> <a href='#SkMatrix_setIdentity'>setIdentity</a>
+
+<a name='SkMatrix_InvalidMatrix'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='#SkMatrix_InvalidMatrix'>InvalidMatrix</a>()
+</pre>
+
+Returns reference to a const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> with invalid values. Returned <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> is set
+to:
+
+| <a href='undocumented#SK_ScalarMax'>SK_ScalarMax</a> <a href='undocumented#SK_ScalarMax'>SK_ScalarMax</a> <a href='undocumented#SK_ScalarMax'>SK_ScalarMax</a> |
+| <a href='undocumented#SK_ScalarMax'>SK_ScalarMax</a> <a href='undocumented#SK_ScalarMax'>SK_ScalarMax</a> <a href='undocumented#SK_ScalarMax'>SK_ScalarMax</a> |
+| <a href='undocumented#SK_ScalarMax'>SK_ScalarMax</a> <a href='undocumented#SK_ScalarMax'>SK_ScalarMax</a> <a href='undocumented#SK_ScalarMax'>SK_ScalarMax</a> |
+
+### Return Value
+
+const invalid <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_InvalidMatrix">
+
+#### Example Output
+
+~~~~
+scaleX 3.40282e+38
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_getType'>getType</a>
+
+<a name='SkMatrix_Concat'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_Concat'>Concat</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& a, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& b)
+</pre>
+
+Returns <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_Concat_a'>a</a> multiplied by <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> <a href='#SkMatrix_Concat_b'>b</a>.
+
+Given:
+
+| A B C |      | J K L |
+<a href='#SkMatrix_Concat_a'>a</a> = | D E F |, <a href='#SkMatrix_Concat_b'>b</a> = | M N O |
+| G H <a href='#SkMatrix_I'>I</a> |      | P Q R |
+
+sets <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to:
+
+| A B C |   | J K L |   | AJ+BM+CP AK+BN+CQ AL+BO+CR |
+<a href='#SkMatrix_Concat_a'>a</a> * <a href='#SkMatrix_Concat_b'>b</a> = | D E F | * | M N O | = | DJ+EM+FP DK+EN+FQ DL+EO+FR |
+| G H <a href='#SkMatrix_I'>I</a> |   | P Q R |   | GJ+HM+IP GK+HN+IQ GL+HO+IR |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_Concat_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> on  left side of multiply expression</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_Concat_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> on  right side of multiply expression</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> computed from <a href='#SkMatrix_Concat_a'>a</a> times <a href='#SkMatrix_Concat_b'>b</a>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_Concat"><div><a href='#SkMatrix_setPolyToPoly'>setPolyToPoly</a> creates perspective <a href='SkMatrix_Reference#Matrix'>matrices</a>, one the inverse of the other.
+Multiplying the <a href='SkMatrix_Reference#Matrix'>matrix</a> by its inverse turns into an identity <a href='SkMatrix_Reference#Matrix'>matrix</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_preConcat'>preConcat</a> <a href='#SkMatrix_postConcat'>postConcat</a>
+
+<a name='SkMatrix_dirtyMatrixTypeCache'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_dirtyMatrixTypeCache'>dirtyMatrixTypeCache</a>()
+</pre>
+
+Sets internal cache to unknown state. Use to force update after repeated
+modifications to <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> element reference returned by <a href='#SkMatrix_array1_operator'>operator[]</a>(int index).
+
+### Example
+
+<div><fiddle-embed name="@Matrix_dirtyMatrixTypeCache">
+
+#### Example Output
+
+~~~~
+with identity matrix: x = 24
+after skew x mod:     x = 24
+after 2nd skew x mod: x = 24
+after dirty cache:    x = 66
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_array1_operator'>operator[]</a>(int index) <a href='#SkMatrix_getType'>getType</a>
+
+<a name='SkMatrix_setScaleTranslate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkMatrix_setScaleTranslate'>setScaleTranslate</a>(<a href='undocumented#SkScalar'>SkScalar</a> sx, <a href='undocumented#SkScalar'>SkScalar</a> sy, <a href='undocumented#SkScalar'>SkScalar</a> tx, <a href='undocumented#SkScalar'>SkScalar</a> ty)
+</pre>
+
+Initializes <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> with scale and translate elements.
+
+| <a href='#SkMatrix_setScaleTranslate_sx'>sx</a>  0 <a href='#SkMatrix_setScaleTranslate_tx'>tx</a> |
+|  0 <a href='#SkMatrix_setScaleTranslate_sy'>sy</a> <a href='#SkMatrix_setScaleTranslate_ty'>ty</a> |
+|  0  0  1 |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkMatrix_setScaleTranslate_sx'><code><strong>sx</strong></code></a></td>
+    <td>horizontal scale factor to store</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setScaleTranslate_sy'><code><strong>sy</strong></code></a></td>
+    <td>vertical scale factor to store</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setScaleTranslate_tx'><code><strong>tx</strong></code></a></td>
+    <td>horizontal translation to store</td>
+  </tr>
+  <tr>    <td><a name='SkMatrix_setScaleTranslate_ty'><code><strong>ty</strong></code></a></td>
+    <td>vertical translation to store</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Matrix_setScaleTranslate">
+
+#### Example Output
+
+~~~~
+[  1.0000   0.0000   3.0000][  0.0000   2.0000   4.0000][  0.0000   0.0000   1.0000]
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkMatrix_setScale'>setScale</a> <a href='#SkMatrix_preTranslate'>preTranslate</a> <a href='#SkMatrix_postTranslate'>postTranslate</a>
+
+<a name='SkMatrix_isFinite'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkMatrix_isFinite'>isFinite</a>()const
+</pre>
+
+Returns true if all elements of the <a href='SkMatrix_Reference#Matrix'>matrix</a> are finite. Returns false if any
+element is infinity, or NaN.
+
+### Return Value
+
+true if <a href='SkMatrix_Reference#Matrix'>matrix</a> has only finite elements
+
+### Example
+
+<div><fiddle-embed name="@Matrix_isFinite">
+
+#### Example Output
+
+~~~~
+[  1.0000   0.0000      nan][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]
+matrix is finite: false
+matrix != matrix
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+operator==
+
diff --git a/src/third_party/skia/site/user/api/SkPaint_Reference.md b/src/third_party/skia/site/user/api/SkPaint_Reference.md
new file mode 100644
index 0000000..b3f6bb6
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkPaint_Reference.md
@@ -0,0 +1,4076 @@
+SkPaint Reference
+===
+
+
+<a name='SkPaint'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkPaint_Reference#SkPaint'>SkPaint</a> {
+
+    <a href='#SkPaint_empty_constructor'>SkPaint()</a>;
+    <a href='#SkPaint_copy_const_SkPaint'>SkPaint</a>(const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    <a href='#SkPaint_move_SkPaint'>SkPaint</a>(<a href='SkPaint_Reference#SkPaint'>SkPaint</a>&& <a href='SkPaint_Reference#Paint'>paint</a>);
+    <a href='#SkPaint_destructor'>~SkPaint()</a>;
+    <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='#SkPaint_copy_operator'>operator=</a>(const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>);
+    <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='#SkPaint_move_operator'>operator=</a>(<a href='SkPaint_Reference#SkPaint'>SkPaint</a>&& <a href='SkPaint_Reference#Paint'>paint</a>);
+    friend bool <a href='#SkPaint_equal_operator'>operator==</a>(const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& a, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& b);
+    friend bool <a href='#SkPaint_notequal_operator'>operator!=</a>(const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& a, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& b);
+    uint32_t <a href='#SkPaint_getHash'>getHash</a>() const;
+    void <a href='#SkPaint_reset'>reset()</a>;
+    void <a href='#SkPaint_setHinting'>setHinting</a>(<a href='undocumented#SkFontHinting'>SkFontHinting</a> hintingLevel);
+    <a href='undocumented#SkFontHinting'>SkFontHinting</a> <a href='#SkPaint_getHinting'>getHinting</a>() const;
+
+    enum <a href='#SkPaint_Flags'>Flags</a> {
+        <a href='#SkPaint_kAntiAlias_Flag'>kAntiAlias_Flag</a> = 0x01,
+        <a href='#SkPaint_kDither_Flag'>kDither_Flag</a> = 0x04,
+        <a href='#SkPaint_kFakeBoldText_Flag'>kFakeBoldText_Flag</a> = 0x20,
+        <a href='#SkPaint_kLinearText_Flag'>kLinearText_Flag</a> = 0x40,
+        <a href='#SkPaint_kSubpixelText_Flag'>kSubpixelText_Flag</a> = 0x80,
+        <a href='#SkPaint_kLCDRenderText_Flag'>kLCDRenderText_Flag</a> = 0x200,
+        <a href='#SkPaint_kEmbeddedBitmapText_Flag'>kEmbeddedBitmapText_Flag</a> = 0x400,
+        <a href='#SkPaint_kAutoHinting_Flag'>kAutoHinting_Flag</a> = 0x800,
+        <a href='#SkPaint_kAllFlags'>kAllFlags</a> = 0xFFFF,
+    };
+
+    uint32_t <a href='#SkPaint_getFlags'>getFlags</a>() const;
+    void <a href='#SkPaint_setFlags'>setFlags</a>(uint32_t flags);
+    bool <a href='#SkPaint_isAntiAlias'>isAntiAlias</a>() const;
+    void <a href='#SkPaint_setAntiAlias'>setAntiAlias</a>(bool aa);
+    bool <a href='#SkPaint_isDither'>isDither</a>() const;
+    void <a href='#SkPaint_setDither'>setDither</a>(bool dither);
+    bool <a href='#SkPaint_isLinearText'>isLinearText</a>() const;
+    void <a href='#SkPaint_setLinearText'>setLinearText</a>(bool linearText);
+    bool <a href='#SkPaint_isSubpixelText'>isSubpixelText</a>() const;
+    void <a href='#SkPaint_setSubpixelText'>setSubpixelText</a>(bool subpixelText);
+    bool <a href='#SkPaint_isLCDRenderText'>isLCDRenderText</a>() const;
+    void <a href='#SkPaint_setLCDRenderText'>setLCDRenderText</a>(bool lcdText);
+    bool <a href='#SkPaint_isEmbeddedBitmapText'>isEmbeddedBitmapText</a>() const;
+    void <a href='#SkPaint_setEmbeddedBitmapText'>setEmbeddedBitmapText</a>(bool useEmbeddedBitmapText);
+    bool <a href='#SkPaint_isAutohinted'>isAutohinted</a>() const;
+    void <a href='#SkPaint_setAutohinted'>setAutohinted</a>(bool useAutohinter);
+    bool <a href='#SkPaint_isFakeBoldText'>isFakeBoldText</a>() const;
+    void <a href='#SkPaint_setFakeBoldText'>setFakeBoldText</a>(bool fakeBoldText);
+    <a href='undocumented#SkFilterQuality'>SkFilterQuality</a> <a href='#SkPaint_getFilterQuality'>getFilterQuality</a>() const;
+    void <a href='#SkPaint_setFilterQuality'>setFilterQuality</a>(<a href='undocumented#SkFilterQuality'>SkFilterQuality</a> quality);
+
+    enum <a href='#SkPaint_Style'>Style</a> : uint8_t {
+        <a href='#SkPaint_kFill_Style'>kFill_Style</a>,
+        <a href='#SkPaint_kStroke_Style'>kStroke_Style</a>,
+        <a href='#SkPaint_kStrokeAndFill_Style'>kStrokeAndFill_Style</a>,
+    };
+
+    static constexpr int <a href='#SkPaint_kStyleCount'>kStyleCount</a> = <a href='#SkPaint_kStrokeAndFill_Style'>kStrokeAndFill_Style</a> + 1
+    <a href='#SkPaint_Style'>Style</a> <a href='#SkPaint_getStyle'>getStyle</a>() const;
+    void <a href='#SkPaint_setStyle'>setStyle</a>(<a href='#SkPaint_Style'>Style</a> style);
+    <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='#SkPaint_getColor'>getColor</a>() const;
+    <a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a> <a href='#SkPaint_getColor4f'>getColor4f</a>() const;
+    void <a href='#SkPaint_setColor'>setColor</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#Color'>color</a>);
+    void <a href='#SkPaint_setColor4f'>setColor4f</a>(const <a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a>& <a href='SkColor_Reference#Color'>color</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a>* colorSpace);
+    uint8_t <a href='#SkPaint_getAlpha'>getAlpha</a>() const;
+    void <a href='#SkPaint_setAlpha'>setAlpha</a>(<a href='undocumented#U8CPU'>U8CPU</a> a);
+    void <a href='#SkPaint_setARGB'>setARGB</a>(<a href='undocumented#U8CPU'>U8CPU</a> a, <a href='undocumented#U8CPU'>U8CPU</a> r, <a href='undocumented#U8CPU'>U8CPU</a> g, <a href='undocumented#U8CPU'>U8CPU</a> b);
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_getStrokeWidth'>getStrokeWidth</a>() const;
+    void <a href='#SkPaint_setStrokeWidth'>setStrokeWidth</a>(<a href='undocumented#SkScalar'>SkScalar</a> width);
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_getStrokeMiter'>getStrokeMiter</a>() const;
+    void <a href='#SkPaint_setStrokeMiter'>setStrokeMiter</a>(<a href='undocumented#SkScalar'>SkScalar</a> miter);
+
+    enum <a href='#SkPaint_Cap'>Cap</a> {
+        <a href='#SkPaint_kButt_Cap'>kButt_Cap</a>,
+        <a href='#SkPaint_kRound_Cap'>kRound_Cap</a>,
+        <a href='#SkPaint_kSquare_Cap'>kSquare_Cap</a>,
+        <a href='#SkPaint_kLast_Cap'>kLast_Cap</a> = <a href='#SkPaint_kSquare_Cap'>kSquare_Cap</a>,
+        <a href='#SkPaint_kDefault_Cap'>kDefault_Cap</a> = <a href='#SkPaint_kButt_Cap'>kButt_Cap</a>,
+    };
+
+    static constexpr int <a href='#SkPaint_kCapCount'>kCapCount</a> = <a href='#SkPaint_kLast_Cap'>kLast_Cap</a> + 1
+    enum <a href='#SkPaint_Join'>Join</a> : uint8_t {
+        <a href='#SkPaint_kMiter_Join'>kMiter_Join</a>,
+        <a href='#SkPaint_kRound_Join'>kRound_Join</a>,
+        <a href='#SkPaint_kBevel_Join'>kBevel_Join</a>,
+        <a href='#SkPaint_kLast_Join'>kLast_Join</a> = <a href='#SkPaint_kBevel_Join'>kBevel_Join</a>,
+        <a href='#SkPaint_kDefault_Join'>kDefault_Join</a> = <a href='#SkPaint_kMiter_Join'>kMiter_Join</a>,
+    };
+
+    static constexpr int <a href='#SkPaint_kJoinCount'>kJoinCount</a> = <a href='#SkPaint_kLast_Join'>kLast_Join</a> + 1
+    <a href='#SkPaint_Cap'>Cap</a> <a href='#SkPaint_getStrokeCap'>getStrokeCap</a>() const;
+    void <a href='#SkPaint_setStrokeCap'>setStrokeCap</a>(<a href='#SkPaint_Cap'>Cap</a> cap);
+    <a href='#SkPaint_Join'>Join</a> <a href='#SkPaint_getStrokeJoin'>getStrokeJoin</a>() const;
+    void <a href='#SkPaint_setStrokeJoin'>setStrokeJoin</a>(<a href='#SkPaint_Join'>Join</a> join);
+    bool <a href='#SkPaint_getFillPath'>getFillPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& src, <a href='SkPath_Reference#SkPath'>SkPath</a>* dst, const <a href='SkRect_Reference#SkRect'>SkRect</a>* cullRect,
+                     <a href='undocumented#SkScalar'>SkScalar</a> resScale = 1) const;
+    bool <a href='#SkPaint_getFillPath'>getFillPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& src, <a href='SkPath_Reference#SkPath'>SkPath</a>* dst) const;
+    <a href='undocumented#SkShader'>SkShader</a>* <a href='#SkPaint_getShader'>getShader</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkShader'>SkShader</a>> <a href='#SkPaint_refShader'>refShader</a>() const;
+    void <a href='#SkPaint_setShader'>setShader</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkShader'>SkShader</a>> <a href='undocumented#Shader'>shader</a>);
+    <a href='undocumented#SkColorFilter'>SkColorFilter</a>* <a href='#SkPaint_getColorFilter'>getColorFilter</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorFilter'>SkColorFilter</a>> <a href='#SkPaint_refColorFilter'>refColorFilter</a>() const;
+    void <a href='#SkPaint_setColorFilter'>setColorFilter</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorFilter'>SkColorFilter</a>> colorFilter);
+    <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> <a href='#SkPaint_getBlendMode'>getBlendMode</a>() const;
+    bool <a href='#SkPaint_isSrcOver'>isSrcOver</a>() const;
+    void <a href='#SkPaint_setBlendMode'>setBlendMode</a>(<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode);
+    <a href='undocumented#SkPathEffect'>SkPathEffect</a>* <a href='#SkPaint_getPathEffect'>getPathEffect</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkPathEffect'>SkPathEffect</a>> <a href='#SkPaint_refPathEffect'>refPathEffect</a>() const;
+    void <a href='#SkPaint_setPathEffect'>setPathEffect</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkPathEffect'>SkPathEffect</a>> pathEffect);
+    <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>* <a href='#SkPaint_getMaskFilter'>getMaskFilter</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkMaskFilter'>SkMaskFilter</a>> <a href='#SkPaint_refMaskFilter'>refMaskFilter</a>() const;
+    void <a href='#SkPaint_setMaskFilter'>setMaskFilter</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkMaskFilter'>SkMaskFilter</a>> maskFilter);
+    <a href='undocumented#SkTypeface'>SkTypeface</a>* <a href='#SkPaint_getTypeface'>getTypeface</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkTypeface'>SkTypeface</a>> <a href='#SkPaint_refTypeface'>refTypeface</a>() const;
+    void <a href='#SkPaint_setTypeface'>setTypeface</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkTypeface'>SkTypeface</a>> <a href='undocumented#Typeface'>typeface</a>);
+    <a href='undocumented#SkImageFilter'>SkImageFilter</a>* <a href='#SkPaint_getImageFilter'>getImageFilter</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkImageFilter'>SkImageFilter</a>> <a href='#SkPaint_refImageFilter'>refImageFilter</a>() const;
+    void <a href='#SkPaint_setImageFilter'>setImageFilter</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkImageFilter'>SkImageFilter</a>> imageFilter);
+    <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>* <a href='#SkPaint_getDrawLooper'>getDrawLooper</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkDrawLooper'>SkDrawLooper</a>> <a href='#SkPaint_refDrawLooper'>refDrawLooper</a>() const;
+    void <a href='#SkPaint_setDrawLooper'>setDrawLooper</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkDrawLooper'>SkDrawLooper</a>> drawLooper);
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_getTextSize'>getTextSize</a>() const;
+    void <a href='#SkPaint_setTextSize'>setTextSize</a>(<a href='undocumented#SkScalar'>SkScalar</a> textSize);
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_getTextScaleX'>getTextScaleX</a>() const;
+    void <a href='#SkPaint_setTextScaleX'>setTextScaleX</a>(<a href='undocumented#SkScalar'>SkScalar</a> scaleX);
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_getTextSkewX'>getTextSkewX</a>() const;
+    void <a href='#SkPaint_setTextSkewX'>setTextSkewX</a>(<a href='undocumented#SkScalar'>SkScalar</a> skewX);
+    <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> <a href='#SkPaint_getTextEncoding'>getTextEncoding</a>() const;
+    void <a href='#SkPaint_setTextEncoding'>setTextEncoding</a>(<a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding);
+
+    typedef <a href='undocumented#SkFontMetrics'>SkFontMetrics</a> <a href='#SkPaint_FontMetrics'>FontMetrics</a>;
+
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_getFontMetrics'>getFontMetrics</a>(<a href='undocumented#SkFontMetrics'>SkFontMetrics</a>* metrics) const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_getFontSpacing'>getFontSpacing</a>() const;
+    int <a href='#SkPaint_textToGlyphs'>textToGlyphs</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength,
+                     <a href='undocumented#SkGlyphID'>SkGlyphID</a> <a href='undocumented#Glyph'>glyphs</a>[]) const;
+    bool <a href='#SkPaint_containsText'>containsText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength) const;
+    void <a href='#SkPaint_glyphsToUnichars'>glyphsToUnichars</a>(const <a href='undocumented#SkGlyphID'>SkGlyphID</a> <a href='undocumented#Glyph'>glyphs</a>[], int count, <a href='undocumented#SkUnichar'>SkUnichar</a> <a href='undocumented#Text'>text</a>[]) const;
+    int <a href='#SkPaint_countText'>countText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength) const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_measureText'>measureText</a>(const void* <a href='undocumented#Text'>text</a>, size_t length, <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds) const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_measureText'>measureText</a>(const void* <a href='undocumented#Text'>text</a>, size_t length) const;
+    int <a href='#SkPaint_getTextWidths'>getTextWidths</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, <a href='undocumented#SkScalar'>SkScalar</a> widths[],
+                      <a href='SkRect_Reference#SkRect'>SkRect</a> bounds[] = nullptr) const;
+    void <a href='#SkPaint_getTextPath'>getTextPath</a>(const void* <a href='undocumented#Text'>text</a>, size_t length, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y,
+                     <a href='SkPath_Reference#SkPath'>SkPath</a>* <a href='SkPath_Reference#Path'>path</a>) const;
+    void <a href='#SkPaint_getPosTextPath'>getPosTextPath</a>(const void* <a href='undocumented#Text'>text</a>, size_t length,
+                        const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pos[], <a href='SkPath_Reference#SkPath'>SkPath</a>* <a href='SkPath_Reference#Path'>path</a>) const;
+    bool <a href='#SkPaint_nothingToDraw'>nothingToDraw</a>() const;
+};
+
+</pre>
+
+<a href='SkPaint_Reference#Paint'>Paint</a> controls options applied when drawing and measuring. <a href='SkPaint_Reference#Paint'>Paint</a> collects all
+options outside of the <a href='#Canvas_Clip'>Canvas_Clip</a> and <a href='#Canvas_Matrix'>Canvas_Matrix</a>.
+
+Various options apply to <a href='undocumented#Text'>text</a>, strokes and fills, and images.
+
+Some options may not be implemented on all platforms; in these cases, setting
+the option has no effect. Some options are conveniences that duplicate <a href='SkCanvas_Reference#Canvas'>Canvas</a>
+functionality; for instance,  <a href='#Text_Size'>text size</a> is identical to <a href='SkMatrix_Reference#Matrix'>matrix</a> scale.
+
+<a href='SkPaint_Reference#Paint'>Paint</a> options are rarely exclusive; each option modifies a stage of the drawing
+pipeline and multiple pipeline stages may be affected by a single <a href='SkPaint_Reference#Paint'>Paint</a>.
+
+<a href='SkPaint_Reference#Paint'>Paint</a> collects effects and filters that describe single-pass and multiple-pass
+algorithms that alter the drawing geometry, <a href='SkColor_Reference#Color'>color</a>, and transparency. For instance,
+<a href='SkPaint_Reference#Paint'>Paint</a> does not directly implement dashing or blur, but contains the objects that do so.
+
+The objects contained by <a href='SkPaint_Reference#Paint'>Paint</a> are opaque, and cannot be edited outside of the <a href='SkPaint_Reference#Paint'>Paint</a>
+to affect it. The implementation is free to defer computations associated with the
+<a href='SkPaint_Reference#Paint'>Paint</a>, or ignore them altogether. For instance, some GPU implementations draw all
+<a href='SkPath_Reference#Path'>Path</a> geometries with <a href='#Paint_Anti_Alias'>Anti_Aliasing</a>, regardless of how <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kAntiAlias_Flag'>kAntiAlias_Flag</a>
+is set in <a href='SkPaint_Reference#Paint'>Paint</a>.
+
+<a href='SkPaint_Reference#Paint'>Paint</a> describes a single <a href='SkColor_Reference#Color'>color</a>, a single <a href='SkFont_Reference#Font'>font</a>, a single <a href='SkImage_Reference#Image'>image</a> quality, and so on.
+Multiple colors are drawn either by using multiple paints or with objects like
+<a href='undocumented#Shader'>Shader</a> attached to <a href='SkPaint_Reference#Paint'>Paint</a>.
+
+<a name='SkPaint_empty_constructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPaint_empty_constructor'>SkPaint()</a>
+</pre>
+
+Constructs <a href='SkPaint_Reference#Paint'>Paint</a> with default values.
+
+| attribute | default value |
+| --- | ---  |
+| <a href='#Paint_Anti_Alias'>Anti_Alias</a> | false |
+| <a href='#Blend_Mode'>Blend_Mode</a> | <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOver'>kSrcOver</a> |
+| <a href='SkColor_Reference#Color'>Color</a> | <a href='SkColor_Reference#SK_ColorBLACK'>SK_ColorBLACK</a> |
+| <a href='#Color_Alpha'>Color_Alpha</a> | 255 |
+| <a href='#Color_Filter'>Color_Filter</a> | nullptr |
+| Dither | false |
+| <a href='#Draw_Looper'>Draw_Looper</a> | nullptr |
+| <a href='#Filter_Quality'>Filter_Quality</a> | <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a> |
+| <a href='#Font_Force_Hinting'>Font_Force_Hinting</a> | false |
+| <a href='#Font_Embedded_Bitmaps'>Font_Embedded_Bitmaps</a> | false |
+| <a href='#Font_Embolden'>Font_Embolden</a> | false |
+| <a href='#Font_Hinting'>Font_Hinting</a> | <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNormal'>kNormal</a> |
+| <a href='#Font_Hinting_Spacing'>Font_Hinting_Spacing</a> | false |
+| <a href='#Font_Anti_Alias'>Font_Anti_Alias</a> | false |
+| <a href='#Font_Linear'>Font_Linear</a> | false |
+| <a href='#Font_Scale_X'>Font_Scale_X</a> | 1 |
+| <a href='#Font_Size'>Font_Size</a> | 12 |
+| <a href='#Font_Skew_X'>Font_Skew_X</a> | 0 |
+| <a href='#Font_Subpixel'>Font_Subpixel</a> | false |
+| <a href='#Image_Filter'>Image_Filter</a> | nullptr |
+| <a href='#Paint_Miter_Limit'>Miter_Limit</a> | 4 |
+| <a href='#Mask_Filter'>Mask_Filter</a> | nullptr |
+| <a href='#Path_Effect'>Path_Effect</a> | nullptr |
+| <a href='undocumented#Shader'>Shader</a> | nullptr |
+| <a href='#SkPaint_Style'>Style</a> | <a href='#SkPaint_kFill_Style'>kFill_Style</a> |
+| <a href='#Text_Encoding'>Text_Encoding</a> | <a href='undocumented#SkTextEncoding::kUTF8'>SkTextEncoding::kUTF8</a> |
+| <a href='undocumented#Typeface'>Typeface</a> | nullptr |
+| <a href='#Paint_Stroke_Cap'>Stroke_Cap</a> | <a href='#SkPaint_kButt_Cap'>kButt_Cap</a> |
+| <a href='#Paint_Stroke_Join'>Stroke_Join</a> | <a href='#SkPaint_kMiter_Join'>kMiter_Join</a> |
+| <a href='#Paint_Stroke_Width'>Stroke_Width</a> | 0 |
+
+The flags, <a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a>, hinting, and miter limit may be overridden at compile time by defining
+<a href='SkPaint_Reference#Paint'>paint</a> default values. The overrides may be included in "SkUserConfig.h" or predefined by the
+build system.
+
+### Return Value
+
+default initialized <a href='SkPaint_Reference#Paint'>Paint</a>
+
+### Example
+
+<div><fiddle-embed name="@Paint_empty_constructor"></fiddle-embed></div>
+
+<a name='SkPaint_copy_const_SkPaint'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPaint_copy_const_SkPaint'>SkPaint</a>(const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Makes a shallow copy of <a href='SkPaint_Reference#SkPaint'>SkPaint</a>. <a href='undocumented#SkTypeface'>SkTypeface</a>, <a href='undocumented#SkPathEffect'>SkPathEffect</a>, <a href='undocumented#SkShader'>SkShader</a>,
+<a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>, and <a href='undocumented#SkImageFilter'>SkImageFilter</a> are shared
+between the original <a href='#SkPaint_copy_const_SkPaint_paint'>paint</a> and the copy. Objects containing <a href='undocumented#SkRefCnt'>SkRefCnt</a> increment
+their references by one.
+
+The referenced objects <a href='undocumented#SkPathEffect'>SkPathEffect</a>, <a href='undocumented#SkShader'>SkShader</a>, <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>,
+<a href='undocumented#SkDrawLooper'>SkDrawLooper</a>, and <a href='undocumented#SkImageFilter'>SkImageFilter</a> cannot be modified after they are created.
+This prevents objects with <a href='undocumented#SkRefCnt'>SkRefCnt</a> from being modified once <a href='SkPaint_Reference#SkPaint'>SkPaint</a> refers to them.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_copy_const_SkPaint_paint'><code><strong>paint</strong></code></a></td>
+    <td>original to copy</td>
+  </tr>
+</table>
+
+### Return Value
+
+shallow copy of <a href='#SkPaint_copy_const_SkPaint_paint'>paint</a>
+
+### Example
+
+<div><fiddle-embed name="@Paint_copy_const_SkPaint">
+
+#### Example Output
+
+~~~~
+SK_ColorRED == paint1.getColor()
+SK_ColorBLUE == paint2.getColor()
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_move_SkPaint'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPaint_move_SkPaint'>SkPaint</a>(<a href='SkPaint_Reference#SkPaint'>SkPaint</a>&& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Implements a move constructor to avoid increasing the reference counts
+of objects referenced by the <a href='#SkPaint_move_SkPaint_paint'>paint</a>.
+
+After the call, <a href='#SkPaint_move_SkPaint_paint'>paint</a> is undefined, and can be safely destructed.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_move_SkPaint_paint'><code><strong>paint</strong></code></a></td>
+    <td>original to move</td>
+  </tr>
+</table>
+
+### Return Value
+
+content of <a href='#SkPaint_move_SkPaint_paint'>paint</a>
+
+### Example
+
+<div><fiddle-embed name="@Paint_move_SkPaint">
+
+#### Example Output
+
+~~~~
+path effect unique: true
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_reset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_reset'>reset()</a>
+</pre>
+
+Sets all <a href='SkPaint_Reference#SkPaint'>SkPaint</a> contents to their initial values. This is equivalent to replacing
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a> with the result of <a href='#SkPaint_empty_constructor'>SkPaint()</a>.
+
+### Example
+
+<div><fiddle-embed name="@Paint_reset">
+
+#### Example Output
+
+~~~~
+paint1 == paint2
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_destructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPaint_destructor'>~SkPaint()</a>
+</pre>
+
+Decreases <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> of owned objects: <a href='undocumented#SkTypeface'>SkTypeface</a>, <a href='undocumented#SkPathEffect'>SkPathEffect</a>, <a href='undocumented#SkShader'>SkShader</a>,
+<a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>, and <a href='undocumented#SkImageFilter'>SkImageFilter</a>. If the
+objects containing <a href='undocumented#SkRefCnt'>SkRefCnt</a> go to zero, they are deleted.
+
+<a name='Management'></a>
+
+<a name='SkPaint_copy_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='#SkPaint_copy_operator'>operator=</a>(const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Makes a shallow copy of <a href='SkPaint_Reference#SkPaint'>SkPaint</a>. <a href='undocumented#SkTypeface'>SkTypeface</a>, <a href='undocumented#SkPathEffect'>SkPathEffect</a>, <a href='undocumented#SkShader'>SkShader</a>,
+<a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>, and <a href='undocumented#SkImageFilter'>SkImageFilter</a> are shared
+between the original <a href='#SkPaint_copy_operator_paint'>paint</a> and the copy. Objects containing <a href='undocumented#SkRefCnt'>SkRefCnt</a> in the
+prior destination are decreased by one, and the referenced objects are deleted if the
+resulting count is zero. Objects containing <a href='undocumented#SkRefCnt'>SkRefCnt</a> in the parameter <a href='#SkPaint_copy_operator_paint'>paint</a>
+are increased by one. <a href='#SkPaint_copy_operator_paint'>paint</a> is unmodified.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_copy_operator_paint'><code><strong>paint</strong></code></a></td>
+    <td>original to copy</td>
+  </tr>
+</table>
+
+### Return Value
+
+content of <a href='#SkPaint_copy_operator_paint'>paint</a>
+
+### Example
+
+<div><fiddle-embed name="@Paint_copy_operator">
+
+#### Example Output
+
+~~~~
+SK_ColorRED == paint1.getColor()
+SK_ColorRED == paint2.getColor()
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_move_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='#SkPaint_move_operator'>operator=</a>(<a href='SkPaint_Reference#SkPaint'>SkPaint</a>&& <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Moves the <a href='#SkPaint_move_operator_paint'>paint</a> to avoid increasing the reference counts
+of objects referenced by the <a href='#SkPaint_move_operator_paint'>paint</a> parameter. Objects containing <a href='undocumented#SkRefCnt'>SkRefCnt</a> in the
+prior destination are decreased by one; those objects are deleted if the resulting count
+is zero.
+
+After the call, <a href='#SkPaint_move_operator_paint'>paint</a> is undefined, and can be safely destructed.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_move_operator_paint'><code><strong>paint</strong></code></a></td>
+    <td>original to move</td>
+  </tr>
+</table>
+
+### Return Value
+
+content of <a href='#SkPaint_move_operator_paint'>paint</a>
+
+### Example
+
+<div><fiddle-embed name="@Paint_move_operator">
+
+#### Example Output
+
+~~~~
+SK_ColorRED == paint2.getColor()
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_equal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_equal_operator'>operator==</a>(const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& a, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& b)
+</pre>
+
+Compares <a href='#SkPaint_equal_operator_a'>a</a> and <a href='#SkPaint_equal_operator_b'>b</a>, and returns true if <a href='#SkPaint_equal_operator_a'>a</a> and <a href='#SkPaint_equal_operator_b'>b</a> are equivalent. May return false
+if <a href='undocumented#SkTypeface'>SkTypeface</a>, <a href='undocumented#SkPathEffect'>SkPathEffect</a>, <a href='undocumented#SkShader'>SkShader</a>, <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>,
+<a href='undocumented#SkDrawLooper'>SkDrawLooper</a>, or <a href='undocumented#SkImageFilter'>SkImageFilter</a> have identical contents but different pointers.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_equal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> to compare</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_equal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkPaint_Reference#SkPaint'>SkPaint</a> pair are equivalent
+
+### Example
+
+<div><fiddle-embed name="@Paint_equal_operator">
+
+#### Example Output
+
+~~~~
+paint1 == paint2
+paint1 != paint2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPaint_notequal_operator'>operator!=</a>(const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='#SkPaint_equal_operator_a'>a</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='#SkPaint_equal_operator_b'>b</a>)
+
+<a name='SkPaint_notequal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_notequal_operator'>operator!=</a>(const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& a, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& b)
+</pre>
+
+Compares <a href='#SkPaint_notequal_operator_a'>a</a> and <a href='#SkPaint_notequal_operator_b'>b</a>, and returns true if <a href='#SkPaint_notequal_operator_a'>a</a> and <a href='#SkPaint_notequal_operator_b'>b</a> are not equivalent. May return true
+if <a href='undocumented#SkTypeface'>SkTypeface</a>, <a href='undocumented#SkPathEffect'>SkPathEffect</a>, <a href='undocumented#SkShader'>SkShader</a>, <a href='undocumented#SkMaskFilter'>SkMaskFilter</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>,
+<a href='undocumented#SkDrawLooper'>SkDrawLooper</a>, or <a href='undocumented#SkImageFilter'>SkImageFilter</a> have identical contents but different pointers.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_notequal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> to compare</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_notequal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkPaint_Reference#SkPaint'>SkPaint</a> pair are not equivalent
+
+### Example
+
+<div><fiddle-embed name="@Paint_notequal_operator">
+
+#### Example Output
+
+~~~~
+paint1 == paint2
+paint1 == paint2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPaint_equal_operator'>operator==</a>(const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='#SkPaint_notequal_operator_a'>a</a>, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& <a href='#SkPaint_notequal_operator_b'>b</a>)
+
+<a name='SkPaint_getHash'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint32_t <a href='#SkPaint_getHash'>getHash</a>()const
+</pre>
+
+Returns a hash generated from <a href='SkPaint_Reference#SkPaint'>SkPaint</a> values and pointers.
+Identical hashes guarantee that the paints are
+equivalent, but differing hashes do not guarantee that the paints have differing
+contents.
+
+If <a href='#SkPaint_equal_operator'>operator==</a>(const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& a, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>& b) returns true for two paints,
+their hashes are also equal.
+
+The hash returned is platform and implementation specific.
+
+### Return Value
+
+a shallow hash
+
+### Example
+
+<div><fiddle-embed name="@Paint_getHash">
+
+#### Example Output
+
+~~~~
+paint1 == paint2
+paint1.getHash() == paint2.getHash()
+~~~~
+
+</fiddle-embed></div>
+
+<a name='Hinting'></a>
+
+<a name='SkPaint_setHinting'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setHinting'>setHinting</a>(<a href='undocumented#SkFontHinting'>SkFontHinting</a> hintingLevel)
+</pre>
+
+Sets level of <a href='undocumented#Glyph'>glyph</a> outline adjustment.
+Does not check for valid values of <a href='#SkPaint_setHinting_hintingLevel'>hintingLevel</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setHinting_hintingLevel'><code><strong>hintingLevel</strong></code></a></td>
+    <td>one of: <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNone'>kNone</a>, <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kSlight'>kSlight</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNormal'>kNormal</a>, <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kFull'>kFull</a>
+
+### Example
+
+<div><fiddle-embed name="bb179ec5698ec1398ff18f3657ab73f7">
+
+#### Example Output
+
+~~~~
+paint1 == paint2
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_getHinting'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkFontHinting'>SkFontHinting</a> <a href='#SkPaint_getHinting'>getHinting</a>()const
+</pre>
+
+Returns level of <a href='undocumented#Glyph'>glyph</a> outline adjustment.
+
+### Return Value
+
+one of: <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNone'>kNone</a>, <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kSlight'>kSlight</a>, <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNormal'>kNormal</a>,
+
+<a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kFull'>kFull</a>
+
+### Example
+
+<div><fiddle-embed name="b56b70c7ea2453c41bfa58b626953bed">
+
+#### Example Output
+
+~~~~
+SkFontHinting::kNormal == paint.getHinting()
+~~~~
+
+</fiddle-embed></div>
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kAntiAlias_Flag'><code>SkPaint::kAntiAlias_Flag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0x0001</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+mask for setting Anti_Alias</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kDither_Flag'><code>SkPaint::kDither_Flag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0x0004</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+mask for setting Dither</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kFakeBoldText_Flag'><code>SkPaint::kFakeBoldText_Flag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0x0020</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+mask for setting Font_Embolden</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kLinearText_Flag'><code>SkPaint::kLinearText_Flag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0x0040</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+mask for setting Font_Linear</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kSubpixelText_Flag'><code>SkPaint::kSubpixelText_Flag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0x0080</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+mask for setting Font_Subpixel</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kLCDRenderText_Flag'><code>SkPaint::kLCDRenderText_Flag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0x0200</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+mask for setting Font_Anti_Alias</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kEmbeddedBitmapText_Flag'><code>SkPaint::kEmbeddedBitmapText_Flag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0x0400</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+mask for setting Font_Embedded_Bitmaps</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kAutoHinting_Flag'><code>SkPaint::kAutoHinting_Flag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0x0800</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+mask for setting Font_Force_Hinting</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kAllFlags'><code>SkPaint::kAllFlags</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0xFFFF</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+mask of all <a href='#SkPaint_Flags'>Flags</a>, including private flags and flags reserved for future use
+</td>
+  </tr>
+<a href='#SkPaint_Flags'>Flags</a> default to all flags clear, disabling the associated feature.
+</table>
+
+<a name='SkPaint_getFlags'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint32_t <a href='#SkPaint_getFlags'>getFlags</a>()const
+</pre>
+
+Returns <a href='SkPaint_Reference#Paint'>paint</a> settings described by <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Flags'>Flags</a>. Each setting uses one
+bit, and can be tested with <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Flags'>Flags</a> members.
+
+### Return Value
+
+zero, one, or more bits described by <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Flags'>Flags</a>
+
+### Example
+
+<div><fiddle-embed name="8a3f8c309533388b01aa66e1267f322d">
+
+#### Example Output
+
+~~~~
+(SkPaint::kAntiAlias_Flag & paint.getFlags()) != 0
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setFlags'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setFlags'>setFlags</a>(uint32_t flags)
+</pre>
+
+Replaces <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Flags'>Flags</a> with <a href='#SkPaint_setFlags_flags'>flags</a>, the union of the <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Flags'>Flags</a> members.
+All <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Flags'>Flags</a> members may be cleared, or one or more may be set.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setFlags_flags'><code><strong>flags</strong></code></a></td>
+    <td>union of <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Flags'>Flags</a> for <a href='SkPaint_Reference#SkPaint'>SkPaint</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="54baed3f6bc4b9c31ba664e27767fdc7">
+
+#### Example Output
+
+~~~~
+paint.isAntiAlias()
+paint.isDither()
+~~~~
+
+</fiddle-embed></div>
+
+<a name='Anti_Alias'></a>
+
+---
+
+<a href='#Paint_Anti_Alias'>Anti_Alias</a> drawing approximates partial <a href='undocumented#Pixel'>pixel</a> coverage with transparency.
+If <a href='#SkPaint_kAntiAlias_Flag'>kAntiAlias_Flag</a> is clear, <a href='undocumented#Pixel'>pixel</a> centers contained by the shape edge are drawn opaque.
+If <a href='#SkPaint_kAntiAlias_Flag'>kAntiAlias_Flag</a> is set, pixels are drawn with <a href='#Color_Alpha'>Color_Alpha</a> equal to their coverage.
+
+The rule for <a href='undocumented#Alias'>Aliased</a> pixels is inconsistent across platforms. A shape edge
+passing through the <a href='undocumented#Pixel'>pixel</a> center may, but is not required to, draw the <a href='undocumented#Pixel'>pixel</a>.
+
+<a href='#Raster_Engine'>Raster_Engine</a> draws <a href='undocumented#Alias'>Aliased</a> pixels whose centers are on or to the right of the start of an
+active <a href='SkPath_Reference#Path'>Path</a> edge, and whose center is to the left of the end of the active <a href='SkPath_Reference#Path'>Path</a> edge.
+
+A platform may only support <a href='#Paint_Anti_Alias'>Anti_Aliased</a> drawing. Some GPU-backed platforms use
+<a href='undocumented#Supersampling'>Supersampling</a> to <a href='#Paint_Anti_Alias'>Anti_Alias</a> all drawing, and have no mechanism to selectively
+<a href='undocumented#Alias'>Alias</a>.
+
+The amount of coverage computed for <a href='#Paint_Anti_Alias'>Anti_Aliased</a> pixels also varies across platforms.
+
+<a href='#Paint_Anti_Alias'>Anti_Alias</a> is disabled by default.
+<a href='#Paint_Anti_Alias'>Anti_Alias</a> can be enabled by default by setting <a href='undocumented#SkPaintDefaults_Flags'>SkPaintDefaults_Flags</a> to <a href='#SkPaint_kAntiAlias_Flag'>kAntiAlias_Flag</a>
+at compile time.
+
+### Example
+
+<div><fiddle-embed name="@Anti_Alias"><div>A red <a href='undocumented#Line'>line</a> is drawn with transparency on the edges to make it look smoother.
+A blue <a href='undocumented#Line'>line</a> draws only where the <a href='undocumented#Pixel'>pixel</a> centers are contained.
+The <a href='undocumented#Line'>lines</a> are drawn into <a href='SkBitmap_Reference#Bitmap'>Bitmap</a>, then drawn magnified to make the
+<a href='undocumented#Alias'>Aliasing</a> easier to see.
+</div></fiddle-embed></div>
+
+<a name='SkPaint_isAntiAlias'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_isAntiAlias'>isAntiAlias</a>()const
+</pre>
+
+Returns true if pixels on the active edges of <a href='SkPath_Reference#SkPath'>SkPath</a> may be drawn with partial transparency.
+
+Equivalent to <a href='#SkPaint_getFlags'>getFlags</a>() masked with <a href='#SkPaint_kAntiAlias_Flag'>kAntiAlias_Flag</a>.
+
+### Return Value
+
+<a href='#SkPaint_kAntiAlias_Flag'>kAntiAlias_Flag</a> state
+
+### Example
+
+<div><fiddle-embed name="d7d5f4f7da7acd5104a652f490c6f7b8">
+
+#### Example Output
+
+~~~~
+paint.isAntiAlias() == !!(paint.getFlags() & SkPaint::kAntiAlias_Flag)
+paint.isAntiAlias() == !!(paint.getFlags() & SkPaint::kAntiAlias_Flag)
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setAntiAlias'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setAntiAlias'>setAntiAlias</a>(bool aa)
+</pre>
+
+Requests, but does not require, that edge pixels draw opaque or with
+partial transparency.
+
+Sets <a href='#SkPaint_kAntiAlias_Flag'>kAntiAlias_Flag</a> if <a href='#SkPaint_setAntiAlias_aa'>aa</a> is true.
+Clears <a href='#SkPaint_kAntiAlias_Flag'>kAntiAlias_Flag</a> if <a href='#SkPaint_setAntiAlias_aa'>aa</a> is false.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setAntiAlias_aa'><code><strong>aa</strong></code></a></td>
+    <td>setting for <a href='#SkPaint_kAntiAlias_Flag'>kAntiAlias_Flag</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="c2ff148374d01cbef845b223e725905c">
+
+#### Example Output
+
+~~~~
+paint1 == paint2
+~~~~
+
+</fiddle-embed></div>
+
+<a name='Dither'></a>
+
+---
+
+Dither increases fidelity by adjusting the <a href='SkColor_Reference#Color'>color</a> of adjacent pixels.
+This can help to smooth <a href='SkColor_Reference#Color'>color</a> transitions and reducing banding in gradients.
+Dithering lessens visible banding from <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>
+and <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a> gradients,
+and improves rendering into a <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a> <a href='SkSurface_Reference#Surface'>Surface</a>.
+
+Dithering is always enabled for linear gradients drawing into
+<a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a> <a href='SkSurface_Reference#Surface'>Surface</a> and <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a> <a href='SkSurface_Reference#Surface'>Surface</a>.
+Dither cannot be enabled for <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a> <a href='SkSurface_Reference#Surface'>Surface</a> and
+<a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a> <a href='SkSurface_Reference#Surface'>Surface</a>.
+
+Dither is disabled by default.
+Dither can be enabled by default by setting <a href='undocumented#SkPaintDefaults_Flags'>SkPaintDefaults_Flags</a> to <a href='#SkPaint_kDither_Flag'>kDither_Flag</a>
+at compile time.
+
+Some platform implementations may ignore dithering. Set <code>SK_IGNORE_GPU_DITHER</code>to ignore Dither on <a href='#GPU_Surface'>GPU_Surface</a>.
+
+### Example
+
+<div><fiddle-embed name="@Dither_a"><div>Dithering in the bottom half more closely approximates the requested <a href='SkColor_Reference#Color'>color</a> by
+alternating nearby colors from <a href='undocumented#Pixel'>pixel</a> to <a href='undocumented#Pixel'>pixel</a>.
+</div></fiddle-embed></div>
+
+### Example
+
+<div><fiddle-embed name="@Dither_b"><div>Dithering introduces subtle adjustments to <a href='SkColor_Reference#Color'>color</a> to smooth gradients.
+Drawing the gradient repeatedly with <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kPlus'>kPlus</a> exaggerates the
+dither, making it easier to see.
+</div></fiddle-embed></div>
+
+### See Also
+
+Gradient <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>
+
+<a name='SkPaint_isDither'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_isDither'>isDither</a>()const
+</pre>
+
+Returns true if <a href='SkColor_Reference#Color'>color</a> error may be distributed to smooth <a href='SkColor_Reference#Color'>color</a> transition.
+
+Equivalent to <a href='#SkPaint_getFlags'>getFlags</a>() masked with <a href='#SkPaint_kDither_Flag'>kDither_Flag</a>.
+
+### Return Value
+
+<a href='#SkPaint_kDither_Flag'>kDither_Flag</a> state
+
+### Example
+
+<div><fiddle-embed name="f4ce93f6c5e7335436a985377fd980c0">
+
+#### Example Output
+
+~~~~
+paint.isDither() == !!(paint.getFlags() & SkPaint::kDither_Flag)
+paint.isDither() == !!(paint.getFlags() & SkPaint::kDither_Flag)
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setDither'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setDither'>setDither</a>(bool dither)
+</pre>
+
+Requests, but does not require, to distribute <a href='SkColor_Reference#Color'>color</a> error.
+
+Sets <a href='#SkPaint_kDither_Flag'>kDither_Flag</a> if <a href='#SkPaint_setDither_dither'>dither</a> is true.
+Clears <a href='#SkPaint_kDither_Flag'>kDither_Flag</a> if <a href='#SkPaint_setDither_dither'>dither</a> is false.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setDither_dither'><code><strong>dither</strong></code></a></td>
+    <td>setting for <a href='#SkPaint_kDither_Flag'>kDither_Flag</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="69b7162e8324d9239dd02dd9ada2bdff">
+
+#### Example Output
+
+~~~~
+paint1 == paint2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>
+
+<a name='Device_Text'></a>
+
+---
+
+<a href='#Font_Anti_Alias'>Font_Anti_Alias</a> and <a href='#Font_Subpixel'>Font_Subpixel</a> increase the precision of <a href='undocumented#Glyph'>glyph</a> position.
+
+When set, <a href='#SkPaint_Flags'>Flags</a> <a href='#SkPaint_kLCDRenderText_Flag'>kLCDRenderText_Flag</a> takes advantage of the organization of RGB stripes that
+create a <a href='SkColor_Reference#Color'>color</a>, and relies
+on the small <a href='undocumented#Size'>size</a> of the stripe and visual perception to make the <a href='SkColor_Reference#Color'>color</a> fringing imperceptible.
+<a href='#Font_Anti_Alias'>Font_Anti_Alias</a> can be enabled on devices that orient stripes horizontally or vertically, and that order
+the <a href='SkColor_Reference#Color'>color</a> components as RGB or BGR.
+
+<a href='#SkPaint_Flags'>Flags</a> <a href='#SkPaint_kSubpixelText_Flag'>kSubpixelText_Flag</a> uses the <a href='undocumented#Pixel'>pixel</a> transparency to represent a fractional offset.
+As the opaqueness
+of the <a href='SkColor_Reference#Color'>color</a> increases, the edge of the <a href='undocumented#Glyph'>glyph</a> appears to move towards the outside of the <a href='undocumented#Pixel'>pixel</a>.
+
+Either or both techniques can be enabled.
+<a href='#SkPaint_kLCDRenderText_Flag'>kLCDRenderText_Flag</a> and <a href='#SkPaint_kSubpixelText_Flag'>kSubpixelText_Flag</a> are clear by default.
+<a href='#Font_Anti_Alias'>Font_Anti_Alias</a> or <a href='#Font_Subpixel'>Font_Subpixel</a> can be enabled by default by setting <a href='undocumented#SkPaintDefaults_Flags'>SkPaintDefaults_Flags</a> to
+<a href='#SkPaint_kLCDRenderText_Flag'>kLCDRenderText_Flag</a> or <a href='#SkPaint_kSubpixelText_Flag'>kSubpixelText_Flag</a> (or both) at compile time.
+
+### Example
+
+<div><fiddle-embed name="4606ae1be792d6bc46d496432f050ee9"><div>Four commas are drawn normally and with combinations of <a href='#Font_Anti_Alias'>Font_Anti_Alias</a> and <a href='#Font_Subpixel'>Font_Subpixel</a>.
+When <a href='#Font_Subpixel'>Font_Subpixel</a> is disabled, the comma <a href='undocumented#Glyph'>Glyphs</a> are identical, but not evenly spaced.
+When <a href='#Font_Subpixel'>Font_Subpixel</a> is enabled, the comma <a href='undocumented#Glyph'>Glyphs</a> are unique, but appear evenly spaced.
+</div></fiddle-embed></div>
+
+<a name='Linear_Text'></a>
+
+<a href='#Font_Linear'>Font_Linear</a> selects whether <a href='undocumented#Text'>text</a> is rendered as a <a href='undocumented#Glyph'>Glyph</a> or as a <a href='SkPath_Reference#Path'>Path</a>.
+If <a href='#Font_Linear'>Font_Linear</a> is set, it has the same effect as setting Hinting to <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNormal'>kNormal</a>.
+If <a href='#Font_Linear'>Font_Linear</a> is clear, it is the same as setting Hinting to <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNone'>kNone</a>.
+
+<a name='SkPaint_isLinearText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_isLinearText'>isLinearText</a>()const
+</pre>
+
+Returns true if <a href='undocumented#Text'>text</a> is converted to <a href='SkPath_Reference#SkPath'>SkPath</a> before drawing and measuring.
+
+Equivalent to <a href='#SkPaint_getFlags'>getFlags</a>() masked with <a href='#SkPaint_kLinearText_Flag'>kLinearText_Flag</a>.
+
+### Return Value
+
+<a href='#SkPaint_kLinearText_Flag'>kLinearText_Flag</a> state
+
+### Example
+
+<div><fiddle-embed name="2890ad644f980637837e6fcb386fb462"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPaint_setLinearText'>setLinearText</a> Hinting
+
+<a name='SkPaint_setLinearText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setLinearText'>setLinearText</a>(bool linearText)
+</pre>
+
+Requests, but does not require, that <a href='undocumented#Glyph'>glyphs</a> are converted to <a href='SkPath_Reference#SkPath'>SkPath</a>
+before drawing and measuring.
+By default, <a href='#SkPaint_kLinearText_Flag'>kLinearText_Flag</a> is clear.
+
+Sets <a href='#SkPaint_kLinearText_Flag'>kLinearText_Flag</a> if <a href='#SkPaint_setLinearText_linearText'>linearText</a> is true.
+Clears <a href='#SkPaint_kLinearText_Flag'>kLinearText_Flag</a> if <a href='#SkPaint_setLinearText_linearText'>linearText</a> is false.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setLinearText_linearText'><code><strong>linearText</strong></code></a></td>
+    <td>setting for <a href='#SkPaint_kLinearText_Flag'>kLinearText_Flag</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="c93bb912f3bddfb4d96d3ad70ada552b"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPaint_isLinearText'>isLinearText</a> Hinting
+
+<a name='Subpixel_Text'></a>
+
+<a href='#SkPaint_Flags'>Flags</a> <a href='#SkPaint_kSubpixelText_Flag'>kSubpixelText_Flag</a> uses the <a href='undocumented#Pixel'>pixel</a> transparency to represent a fractional offset.
+As the opaqueness
+of the <a href='SkColor_Reference#Color'>color</a> increases, the edge of the <a href='undocumented#Glyph'>glyph</a> appears to move towards the outside of the <a href='undocumented#Pixel'>pixel</a>.
+
+<a name='SkPaint_isSubpixelText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_isSubpixelText'>isSubpixelText</a>()const
+</pre>
+
+Returns true if <a href='undocumented#Glyph'>glyphs</a> at different <a href='SkFont_Reference#Subpixel'>sub-pixel</a> positions may differ on <a href='undocumented#Pixel'>pixel</a> edge coverage.
+
+Equivalent to <a href='#SkPaint_getFlags'>getFlags</a>() masked with <a href='#SkPaint_kSubpixelText_Flag'>kSubpixelText_Flag</a>.
+
+### Return Value
+
+<a href='#SkPaint_kSubpixelText_Flag'>kSubpixelText_Flag</a> state
+
+### Example
+
+<div><fiddle-embed name="abe9afc0932e2199324ae6cbb396e67c">
+
+#### Example Output
+
+~~~~
+paint.isSubpixelText() == !!(paint.getFlags() & SkPaint::kSubpixelText_Flag)
+paint.isSubpixelText() == !!(paint.getFlags() & SkPaint::kSubpixelText_Flag)
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setSubpixelText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setSubpixelText'>setSubpixelText</a>(bool subpixelText)
+</pre>
+
+Requests, but does not require, that <a href='undocumented#Glyph'>glyphs</a> respect <a href='SkFont_Reference#Subpixel'>sub-pixel</a> positioning.
+
+Sets <a href='#SkPaint_kSubpixelText_Flag'>kSubpixelText_Flag</a> if <a href='#SkPaint_setSubpixelText_subpixelText'>subpixelText</a> is true.
+Clears <a href='#SkPaint_kSubpixelText_Flag'>kSubpixelText_Flag</a> if <a href='#SkPaint_setSubpixelText_subpixelText'>subpixelText</a> is false.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setSubpixelText_subpixelText'><code><strong>subpixelText</strong></code></a></td>
+    <td>setting for <a href='#SkPaint_kSubpixelText_Flag'>kSubpixelText_Flag</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="a77bbc1a4e3be9a8ab0f842f877c5ee4">
+
+#### Example Output
+
+~~~~
+paint1 == paint2
+~~~~
+
+</fiddle-embed></div>
+
+<a name='LCD_Text'></a>
+
+When set, <a href='#Font_Anti_Alias'>Font_Anti_Alias</a> takes advantage of the organization of RGB stripes that
+create a <a href='SkColor_Reference#Color'>color</a>, and relies
+on the small <a href='undocumented#Size'>size</a> of the stripe and visual perception to make the <a href='SkColor_Reference#Color'>color</a> fringing imperceptible.
+<a href='#Font_Anti_Alias'>Font_Anti_Alias</a> can be enabled on devices that orient stripes horizontally or vertically, and that order
+the <a href='SkColor_Reference#Color'>color</a> components as RGB or BGR.
+
+<a name='SkPaint_isLCDRenderText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_isLCDRenderText'>isLCDRenderText</a>()const
+</pre>
+
+Returns true if <a href='undocumented#Glyph'>glyphs</a> may use LCD striping to improve <a href='undocumented#Glyph'>glyph</a> edges.
+
+Returns true if <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Flags'>Flags</a> <a href='#SkPaint_kLCDRenderText_Flag'>kLCDRenderText_Flag</a> is set.
+
+### Return Value
+
+<a href='#SkPaint_kLCDRenderText_Flag'>kLCDRenderText_Flag</a> state
+
+### Example
+
+<div><fiddle-embed name="68e1fd95dd2fd06a333899d2bd2396b9">
+
+#### Example Output
+
+~~~~
+paint.isLCDRenderText() == !!(paint.getFlags() & SkPaint::kLCDRenderText_Flag)
+paint.isLCDRenderText() == !!(paint.getFlags() & SkPaint::kLCDRenderText_Flag)
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setLCDRenderText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setLCDRenderText'>setLCDRenderText</a>(bool lcdText)
+</pre>
+
+Requests, but does not require, that <a href='undocumented#Glyph'>glyphs</a> use LCD striping for <a href='undocumented#Glyph'>glyph</a> edges.
+
+Sets <a href='#SkPaint_kLCDRenderText_Flag'>kLCDRenderText_Flag</a> if <a href='#SkPaint_setLCDRenderText_lcdText'>lcdText</a> is true.
+Clears <a href='#SkPaint_kLCDRenderText_Flag'>kLCDRenderText_Flag</a> if <a href='#SkPaint_setLCDRenderText_lcdText'>lcdText</a> is false.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setLCDRenderText_lcdText'><code><strong>lcdText</strong></code></a></td>
+    <td>setting for <a href='#SkPaint_kLCDRenderText_Flag'>kLCDRenderText_Flag</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="50dedf8450159571a3edaf4f0050defe">
+
+#### Example Output
+
+~~~~
+paint1 == paint2
+~~~~
+
+</fiddle-embed></div>
+
+<a name='Embedded_Bitmaps'></a>
+
+---
+
+<a href='#Font_Embedded_Bitmaps'>Font_Embedded_Bitmaps</a> allows selecting custom sized <a href='SkBitmap_Reference#Bitmap'>bitmap</a> <a href='undocumented#Glyph'>Glyphs</a>.
+<a href='#SkPaint_Flags'>Flags</a> <a href='#SkPaint_kEmbeddedBitmapText_Flag'>kEmbeddedBitmapText_Flag</a> when set chooses an embedded <a href='SkBitmap_Reference#Bitmap'>bitmap</a> <a href='undocumented#Glyph'>glyph</a> over an outline contained
+in a <a href='SkFont_Reference#Font'>font</a> if the platform supports this option.
+
+FreeType selects the <a href='SkBitmap_Reference#Bitmap'>bitmap</a> <a href='undocumented#Glyph'>glyph</a> if available when <a href='#SkPaint_kEmbeddedBitmapText_Flag'>kEmbeddedBitmapText_Flag</a> is set, and selects
+the outline <a href='undocumented#Glyph'>glyph</a> if <a href='#SkPaint_kEmbeddedBitmapText_Flag'>kEmbeddedBitmapText_Flag</a> is clear.
+Windows may select the <a href='SkBitmap_Reference#Bitmap'>bitmap</a> <a href='undocumented#Glyph'>glyph</a> but is not required to do so.
+<a href='#OS_X'>OS_X</a> and iOS do not support this option.
+
+<a href='#Font_Embedded_Bitmaps'>Font_Embedded_Bitmaps</a> is disabled by default.
+<a href='#Font_Embedded_Bitmaps'>Font_Embedded_Bitmaps</a> can be enabled by default by setting <a href='undocumented#SkPaintDefaults_Flags'>SkPaintDefaults_Flags</a> to
+<a href='#SkPaint_kEmbeddedBitmapText_Flag'>kEmbeddedBitmapText_Flag</a> at compile time.
+
+### Example
+
+<pre style="padding: 1em 1em 1em 1em; font-size: 13px width: 62.5em; background-color: #f0f0f0">
+<div>The "hintgasp" TrueType font in the Skia resources/fonts directory
+        includes an embedded bitmap Glyph at odd font sizes. This example works
+        on platforms that use FreeType as their Font_Engine.
+        Windows may, but is not required to, return a bitmap glyph if
+        kEmbeddedBitmapText_Flag is set.</div>SkBitmap bitmap;
+    bitmap.allocN32Pixels(30, 15);
+    bitmap.eraseColor(0);
+    SkCanvas offscreen(bitmap);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(13);
+    paint.setTypeface(MakeResourceAsTypeface("fonts/hintgasp.ttf"));
+    for (bool embedded : { false, true}) {
+        paint.setEmbeddedBitmapText(embedded);
+        offscreen.drawString("A", embedded ? 5 : 15, 15, paint);
+    }
+    canvas->drawBitmap(bitmap, 0, 0);
+    canvas->scale(10, 10);
+    canvas->drawBitmap(bitmap, -2, 1);
+
+</pre>
+
+<a name='SkPaint_isEmbeddedBitmapText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_isEmbeddedBitmapText'>isEmbeddedBitmapText</a>()const
+</pre>
+
+Returns true if <a href='SkFont_Reference#Font'>font</a> engine may return <a href='undocumented#Glyph'>glyphs</a> from <a href='SkFont_Reference#Font'>font</a> <a href='SkBitmap_Reference#Bitmap'>bitmaps</a> instead of from outlines.
+
+Equivalent to <a href='#SkPaint_getFlags'>getFlags</a>() masked with <a href='#SkPaint_kEmbeddedBitmapText_Flag'>kEmbeddedBitmapText_Flag</a>.
+
+### Return Value
+
+<a href='#SkPaint_kEmbeddedBitmapText_Flag'>kEmbeddedBitmapText_Flag</a> state
+
+### Example
+
+<div><fiddle-embed name="eba10b27b790e87183ae451b3fc5c4b1">
+
+#### Example Output
+
+~~~~
+paint.isEmbeddedBitmapText() == !!(paint.getFlags() & SkPaint::kEmbeddedBitmapText_Flag)
+paint.isEmbeddedBitmapText() == !!(paint.getFlags() & SkPaint::kEmbeddedBitmapText_Flag)
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setEmbeddedBitmapText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setEmbeddedBitmapText'>setEmbeddedBitmapText</a>(bool useEmbeddedBitmapText)
+</pre>
+
+Requests, but does not require, to use <a href='SkBitmap_Reference#Bitmap'>bitmaps</a> in fonts instead of outlines.
+
+Sets <a href='#SkPaint_kEmbeddedBitmapText_Flag'>kEmbeddedBitmapText_Flag</a> if <a href='#SkPaint_setEmbeddedBitmapText_useEmbeddedBitmapText'>useEmbeddedBitmapText</a> is true.
+Clears <a href='#SkPaint_kEmbeddedBitmapText_Flag'>kEmbeddedBitmapText_Flag</a> if <a href='#SkPaint_setEmbeddedBitmapText_useEmbeddedBitmapText'>useEmbeddedBitmapText</a> is false.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setEmbeddedBitmapText_useEmbeddedBitmapText'><code><strong>useEmbeddedBitmapText</strong></code></a></td>
+    <td>setting for <a href='#SkPaint_kEmbeddedBitmapText_Flag'>kEmbeddedBitmapText_Flag</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="246dffdd93a484ba4ad7ecf71198a5d4">
+
+#### Example Output
+
+~~~~
+paint1 == paint2
+~~~~
+
+</fiddle-embed></div>
+
+<a name='Automatic_Hinting'></a>
+
+If Hinting is set to <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNormal'>kNormal</a> or <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kFull'>kFull</a>, <a href='#Font_Force_Hinting'>Font_Force_Hinting</a>
+instructs the <a href='#Font_Manager'>Font_Manager</a> to always hint <a href='undocumented#Glyph'>Glyphs</a>.
+<a href='#Font_Force_Hinting'>Font_Force_Hinting</a> has no effect if Hinting is set to <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNone'>kNone</a> or
+<a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kSlight'>kSlight</a>.
+
+<a href='#Font_Force_Hinting'>Font_Force_Hinting</a> only affects platforms that use FreeType as the <a href='#Font_Manager'>Font_Manager</a>.
+
+<a name='SkPaint_isAutohinted'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_isAutohinted'>isAutohinted</a>()const
+</pre>
+
+Returns true if <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::Hinting is set to <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNormal'>kNormal</a> or
+<a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kFull'>kFull</a>, and if platform uses FreeType as the <a href='SkFont_Reference#Font'>font</a> manager.
+If true, instructs the <a href='SkFont_Reference#Font'>font</a> manager to always hint <a href='undocumented#Glyph'>glyphs</a>.
+
+Equivalent to <a href='#SkPaint_getFlags'>getFlags</a>() masked with <a href='#SkPaint_kAutoHinting_Flag'>kAutoHinting_Flag</a>.
+
+### Return Value
+
+<a href='#SkPaint_kAutoHinting_Flag'>kAutoHinting_Flag</a> state
+
+### Example
+
+<div><fiddle-embed name="aa4781afbe3b90e7ef56a287e5b9ce1e">
+
+#### Example Output
+
+~~~~
+paint.isAutohinted() == !!(paint.getFlags() & SkPaint::kAutoHinting_Flag)
+paint.isAutohinted() == !!(paint.getFlags() & SkPaint::kAutoHinting_Flag)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPaint_setAutohinted'>setAutohinted</a> Hinting
+
+<a name='SkPaint_setAutohinted'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setAutohinted'>setAutohinted</a>(bool useAutohinter)
+</pre>
+
+Sets whether to always hint <a href='undocumented#Glyph'>glyphs</a>.
+If <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::Hinting is set to <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNormal'>kNormal</a> or <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kFull'>kFull</a>
+and <a href='#SkPaint_setAutohinted_useAutohinter'>useAutohinter</a> is set, instructs the  <a href='undocumented#Font_Manager'>font manager</a> to always hint <a href='undocumented#Glyph'>glyphs</a>.
+<a href='#SkPaint_setAutohinted_useAutohinter'>useAutohinter</a> has no effect if <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::Hinting is set to <a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kNone'>kNone</a> or
+<a href='undocumented#SkFontHinting'>SkFontHinting</a>::<a href='#SkFontHinting_kSlight'>kSlight</a>.
+
+Only affects platforms that use FreeType as the  <a href='undocumented#Font_Manager'>font manager</a>.
+
+Sets <a href='#SkPaint_kAutoHinting_Flag'>kAutoHinting_Flag</a> if <a href='#SkPaint_setAutohinted_useAutohinter'>useAutohinter</a> is true.
+Clears <a href='#SkPaint_kAutoHinting_Flag'>kAutoHinting_Flag</a> if <a href='#SkPaint_setAutohinted_useAutohinter'>useAutohinter</a> is false.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setAutohinted_useAutohinter'><code><strong>useAutohinter</strong></code></a></td>
+    <td>setting for <a href='#SkPaint_kAutoHinting_Flag'>kAutoHinting_Flag</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="4e185306d7de9390fe8445eed0139309"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPaint_isAutohinted'>isAutohinted</a> Hinting
+
+<a name='Fake_Bold'></a>
+
+---
+
+<a href='#Font_Embolden'>Font_Embolden</a> approximates the bold <a href='SkFont_Reference#Font'>font</a> style accompanying a normal <a href='SkFont_Reference#Font'>font</a> when a bold <a href='SkFont_Reference#Font'>font</a> face
+is not available. Skia does not provide <a href='SkFont_Reference#Font'>font</a> substitution; it is up to the client to find the
+bold <a href='SkFont_Reference#Font'>font</a> face using the platform <a href='#Font_Manager'>Font_Manager</a>.
+
+Use <a href='#Paint_Text_Skew_X'>Text_Skew_X</a> to approximate an italic <a href='SkFont_Reference#Font'>font</a> style when the italic <a href='SkFont_Reference#Font'>font</a> face
+is not available.
+
+A FreeType based port may define SK_USE_FREETYPE_EMBOLDEN at compile time to direct
+the  <a href='SkFont_Reference#Font_Engine'>font engine</a> to create the bold <a href='undocumented#Glyph'>Glyphs</a>. Otherwise, the extra bold is computed
+by increasing the  <a href='#Stroke_Width'>stroke width</a> and setting the <a href='#SkPaint_Style'>Style</a> to <a href='#SkPaint_kStrokeAndFill_Style'>kStrokeAndFill_Style</a> as needed.
+
+<a href='#Font_Embolden'>Font_Embolden</a> is disabled by default.
+
+### Example
+
+<div><fiddle-embed name="e811f4829a2daaaeaad3795504a7e02a"></fiddle-embed></div>
+
+<a name='SkPaint_isFakeBoldText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_isFakeBoldText'>isFakeBoldText</a>()const
+</pre>
+
+Returns true if approximate bold by increasing the stroke width when creating <a href='undocumented#Glyph'>glyph</a> <a href='SkBitmap_Reference#Bitmap'>bitmaps</a>
+from outlines.
+
+Equivalent to <a href='#SkPaint_getFlags'>getFlags</a>() masked with <a href='#SkPaint_kFakeBoldText_Flag'>kFakeBoldText_Flag</a>.
+
+### Return Value
+
+<a href='#SkPaint_kFakeBoldText_Flag'>kFakeBoldText_Flag</a> state
+
+### Example
+
+<div><fiddle-embed name="f54d1f85b16073b80b9eef2e1a1d151d">
+
+#### Example Output
+
+~~~~
+paint.isFakeBoldText() == !!(paint.getFlags() & SkPaint::kFakeBoldText_Flag)
+paint.isFakeBoldText() == !!(paint.getFlags() & SkPaint::kFakeBoldText_Flag)
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setFakeBoldText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setFakeBoldText'>setFakeBoldText</a>(bool fakeBoldText)
+</pre>
+
+Increases  <a href='#Stroke_Width'>stroke width</a> when creating <a href='undocumented#Glyph'>glyph</a> <a href='SkBitmap_Reference#Bitmap'>bitmaps</a> to approximate a bold <a href='undocumented#Typeface'>typeface</a>.
+
+Sets <a href='#SkPaint_kFakeBoldText_Flag'>kFakeBoldText_Flag</a> if <a href='#SkPaint_setFakeBoldText_fakeBoldText'>fakeBoldText</a> is true.
+Clears <a href='#SkPaint_kFakeBoldText_Flag'>kFakeBoldText_Flag</a> if <a href='#SkPaint_setFakeBoldText_fakeBoldText'>fakeBoldText</a> is false.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setFakeBoldText_fakeBoldText'><code><strong>fakeBoldText</strong></code></a></td>
+    <td>setting for <a href='#SkPaint_kFakeBoldText_Flag'>kFakeBoldText_Flag</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="594d47858eb11028cb626515a520910a">
+
+#### Example Output
+
+~~~~
+paint1 == paint2
+~~~~
+
+</fiddle-embed></div>
+
+<a name='Filter_Quality_Methods'></a>
+
+---
+
+<a href='#Filter_Quality'>Filter_Quality</a> trades speed for <a href='SkImage_Reference#Image'>image</a> filtering when the <a href='SkImage_Reference#Image'>image</a> is scaled.
+A lower <a href='#Filter_Quality'>Filter_Quality</a> draws faster, but has less fidelity.
+A higher <a href='#Filter_Quality'>Filter_Quality</a> draws slower, but looks better.
+If the <a href='SkImage_Reference#Image'>image</a> is drawn without scaling, the <a href='#Filter_Quality'>Filter_Quality</a> choice will not result
+in a noticeable difference.
+
+<a href='#Filter_Quality'>Filter_Quality</a> is used in <a href='SkPaint_Reference#Paint'>Paint</a> passed as a parameter to
+
+<table>  <tr>
+    <td><a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawBitmap'>drawBitmap</a></td>
+  </tr>  <tr>
+    <td><a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawBitmapRect'>drawBitmapRect</a></td>
+  </tr>  <tr>
+    <td><a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawImage'>drawImage</a></td>
+  </tr>  <tr>
+    <td><a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawImageRect'>drawImageRect</a></td>
+  </tr>
+</table>
+
+and when <a href='SkPaint_Reference#Paint'>Paint</a> has a <a href='undocumented#Shader'>Shader</a> specialization that uses <a href='SkImage_Reference#Image'>Image</a> or <a href='SkBitmap_Reference#Bitmap'>Bitmap</a>.
+
+<a href='#Filter_Quality'>Filter_Quality</a> is <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a> by default.
+
+### Example
+
+<div><fiddle-embed name="@Filter_Quality_Methods"></fiddle-embed></div>
+
+<a name='SkPaint_getFilterQuality'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkFilterQuality'>SkFilterQuality</a> <a href='#SkPaint_getFilterQuality'>getFilterQuality</a>()const
+</pre>
+
+Returns <a href='undocumented#SkFilterQuality'>SkFilterQuality</a>, the <a href='SkImage_Reference#Image'>image</a> filtering level. A lower setting
+draws faster; a higher setting looks better when the <a href='SkImage_Reference#Image'>image</a> is scaled.
+
+### Return Value
+
+one of: <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a>,
+
+<a href='undocumented#kMedium_SkFilterQuality'>kMedium_SkFilterQuality</a>, <a href='undocumented#kHigh_SkFilterQuality'>kHigh_SkFilterQuality</a>
+
+### Example
+
+<div><fiddle-embed name="@Paint_getFilterQuality">
+
+#### Example Output
+
+~~~~
+kNone_SkFilterQuality == paint.getFilterQuality()
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setFilterQuality'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setFilterQuality'>setFilterQuality</a>(<a href='undocumented#SkFilterQuality'>SkFilterQuality</a> quality)
+</pre>
+
+Sets <a href='undocumented#SkFilterQuality'>SkFilterQuality</a>, the <a href='SkImage_Reference#Image'>image</a> filtering level. A lower setting
+draws faster; a higher setting looks better when the <a href='SkImage_Reference#Image'>image</a> is scaled.
+Does not check to see if <a href='#SkPaint_setFilterQuality_quality'>quality</a> is valid.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setFilterQuality_quality'><code><strong>quality</strong></code></a></td>
+    <td>one of: <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#kMedium_SkFilterQuality'>kMedium_SkFilterQuality</a>, <a href='undocumented#kHigh_SkFilterQuality'>kHigh_SkFilterQuality</a>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setFilterQuality">
+
+#### Example Output
+
+~~~~
+kHigh_SkFilterQuality == paint.getFilterQuality()
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#SkFilterQuality'>SkFilterQuality</a> <a href='#Image_Scaling'>Image_Scaling</a>
+
+<a name='Color_Methods'></a>
+
+---
+
+| name | description |
+| --- | ---  |
+| <a href='#SkPaint_getColor'>getColor</a> | returns <a href='#Color_Alpha'>Color_Alpha</a> and RGB, one drawing <a href='SkColor_Reference#Color'>color</a> |
+| <a href='#SkPaint_setColor'>setColor</a> | sets <a href='#Color_Alpha'>Color_Alpha</a> and RGB, one drawing <a href='SkColor_Reference#Color'>color</a> |
+
+<a href='SkColor_Reference#Color'>Color</a> specifies the red, blue, green, and <a href='#Color_Alpha'>Color_Alpha</a>
+values used to draw a filled or stroked shape in a 32-bit value. Each component
+occupies 8-bits, ranging from zero: no contribution; to 255: full intensity.
+All values in any combination are valid.
+
+<a href='SkColor_Reference#Color'>Color</a> is not <a href='undocumented#Premultiply'>Premultiplied</a>; <a href='#Color_Alpha'>Color_Alpha</a> sets the transparency independent of
+RGB: red, blue, and green.
+
+The bit positions of <a href='#Color_Alpha'>Color_Alpha</a> and RGB are independent of the bit
+positions on the output <a href='undocumented#Device'>device</a>, which may have more or fewer bits, and may have
+a different arrangement.
+
+| bit positions | <a href='#Color_Alpha'>Color_Alpha</a> | red | blue | green |
+| --- | --- | --- | --- | ---  |
+|  | 31 - 24 | 23 - 16 | 15 - 8 | 7 - 0 |
+
+### Example
+
+<div><fiddle-embed name="@Color_Methods"></fiddle-embed></div>
+
+<a name='SkPaint_getColor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='#SkPaint_getColor'>getColor</a>()const
+</pre>
+
+Retrieves <a href='SkColor_Reference#Alpha'>alpha</a> and RGB, <a href='undocumented#Unpremultiply'>unpremultiplied</a>, packed into 32 bits.
+Use helpers <a href='SkColor_Reference#SkColorGetA'>SkColorGetA</a>(), <a href='SkColor_Reference#SkColorGetR'>SkColorGetR</a>(), <a href='SkColor_Reference#SkColorGetG'>SkColorGetG</a>(), and <a href='SkColor_Reference#SkColorGetB'>SkColorGetB</a>() to extract
+a <a href='SkColor_Reference#Color'>color</a> component.
+
+### Return Value
+
+<a href='undocumented#Unpremultiply'>unpremultiplied</a> ARGB
+
+### Example
+
+<div><fiddle-embed name="@Paint_getColor">
+
+#### Example Output
+
+~~~~
+Yellow is 100% red, 100% green, and 0% blue.
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPaint_getColor4f'>getColor4f</a> <a href='SkColor_Reference#SkColor'>SkColor</a>
+
+<a name='SkPaint_getColor4f'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a> <a href='#SkPaint_getColor4f'>getColor4f</a>()const
+</pre>
+
+Retrieves <a href='SkColor_Reference#Alpha'>alpha</a> and RGB, <a href='undocumented#Unpremultiply'>unpremultiplied</a>, as four floating <a href='SkPoint_Reference#Point'>point</a> values. RGB are
+are extended sRGB values (sRGB gamut, and encoded with the sRGB transfer function).
+
+### Return Value
+
+<a href='undocumented#Unpremultiply'>unpremultiplied</a> RGBA
+
+### Example
+
+<div><fiddle-embed name="@Paint_getColor4f">
+
+#### Example Output
+
+~~~~
+Yellow is 100% red, 100% green, and 0% blue.
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPaint_getColor'>getColor</a> <a href='SkColor_Reference#SkColor'>SkColor</a>
+
+<a name='SkPaint_setColor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setColor'>setColor</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#Color'>color</a>)
+</pre>
+
+Sets <a href='SkColor_Reference#Alpha'>alpha</a> and RGB used when stroking and filling. The <a href='#SkPaint_setColor_color'>color</a> is a 32-bit value,
+<a href='undocumented#Unpremultiply'>unpremultiplied</a>, packing 8-bit components for <a href='SkColor_Reference#Alpha'>alpha</a>, red, blue, and green.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setColor_color'><code><strong>color</strong></code></a></td>
+    <td><a href='undocumented#Unpremultiply'>unpremultiplied</a> ARGB</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setColor">
+
+#### Example Output
+
+~~~~
+green1 == green2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='#SkPaint_setColor4f'>setColor4f</a> <a href='#SkPaint_setARGB'>setARGB</a> <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>
+
+<a name='SkPaint_setColor4f'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setColor4f'>setColor4f</a>(const <a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a>& <a href='SkColor_Reference#Color'>color</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a>* colorSpace)
+</pre>
+
+Sets <a href='SkColor_Reference#Alpha'>alpha</a> and RGB used when stroking and filling. The <a href='#SkPaint_setColor4f_color'>color</a> is four floating
+<a href='SkPoint_Reference#Point'>point</a> values, <a href='undocumented#Unpremultiply'>unpremultiplied</a>. The <a href='#SkPaint_setColor4f_color'>color</a> values are interpreted as being in
+the <a href='#SkPaint_setColor4f_colorSpace'>colorSpace</a>. If <a href='#SkPaint_setColor4f_colorSpace'>colorSpace</a> is nullptr, then <a href='#SkPaint_setColor4f_color'>color</a> is assumed to be in the
+sRGB  <a href='undocumented#Color_Space'>color space</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setColor4f_color'><code><strong>color</strong></code></a></td>
+    <td><a href='undocumented#Unpremultiply'>unpremultiplied</a> RGBA</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_setColor4f_colorSpace'><code><strong>colorSpace</strong></code></a></td>
+    <td><a href='undocumented#SkColorSpace'>SkColorSpace</a> describing the encoding of <a href='#SkPaint_setColor4f_color'>color</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setColor4f">
+
+#### Example Output
+
+~~~~
+green1 == green2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='#SkPaint_setColor'>setColor</a> <a href='#SkPaint_setARGB'>setARGB</a> <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>
+
+<a name='Alpha_Methods'></a>
+
+<a href='#Color_Alpha'>Color_Alpha</a> sets the transparency independent of RGB: red, blue, and green.
+
+<a name='SkPaint_getAlpha'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint8_t <a href='#SkPaint_getAlpha'>getAlpha</a>()const
+</pre>
+
+Retrieves <a href='SkColor_Reference#Alpha'>alpha</a> from the <a href='SkColor_Reference#Color'>color</a> used when stroking and filling.
+
+### Return Value
+
+<a href='SkColor_Reference#Alpha'>alpha</a> ranging from zero, fully transparent, to 255, fully opaque
+
+### Example
+
+<div><fiddle-embed name="@Paint_getAlpha">
+
+#### Example Output
+
+~~~~
+255 == paint.getAlpha()
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setAlpha'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setAlpha'>setAlpha</a>(<a href='undocumented#U8CPU'>U8CPU</a> a)
+</pre>
+
+Replaces <a href='SkColor_Reference#Alpha'>alpha</a>, leaving RGB
+unchanged. An out of range value triggers an assert in the debug
+build. <a href='#SkPaint_setAlpha_a'>a</a> is <a href='#SkPaint_setAlpha_a'>a</a> value from zero to 255.
+<a href='#SkPaint_setAlpha_a'>a</a> set to zero makes <a href='SkColor_Reference#Color'>color</a> fully transparent; <a href='#SkPaint_setAlpha_a'>a</a> set to 255 makes <a href='SkColor_Reference#Color'>color</a>
+fully opaque.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setAlpha_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkColor_Reference#Alpha'>alpha</a> component of <a href='SkColor_Reference#Color'>color</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setAlpha">
+
+#### Example Output
+
+~~~~
+0x44112233 == paint.getColor()
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setARGB'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setARGB'>setARGB</a>(<a href='undocumented#U8CPU'>U8CPU</a> a, <a href='undocumented#U8CPU'>U8CPU</a> r, <a href='undocumented#U8CPU'>U8CPU</a> g, <a href='undocumented#U8CPU'>U8CPU</a> b)
+</pre>
+
+Sets <a href='SkColor_Reference#Color'>color</a> used when drawing solid fills. The <a href='SkColor_Reference#Color'>color</a> components range from 0 to 255.
+The <a href='SkColor_Reference#Color'>color</a> is <a href='undocumented#Unpremultiply'>unpremultiplied</a>; <a href='SkColor_Reference#Alpha'>alpha</a> sets the transparency independent of RGB.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setARGB_a'><code><strong>a</strong></code></a></td>
+    <td>amount of <a href='SkColor_Reference#Alpha'>alpha</a>, from fully transparent (0) to fully opaque (255)</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_setARGB_r'><code><strong>r</strong></code></a></td>
+    <td>amount of red, from no red (0) to full red (255)</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_setARGB_g'><code><strong>g</strong></code></a></td>
+    <td>amount of green, from no green (0) to full green (255)</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_setARGB_b'><code><strong>b</strong></code></a></td>
+    <td>amount of blue, from no blue (0) to full blue (255)</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setARGB">
+
+#### Example Output
+
+~~~~
+transRed1 == transRed2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPaint_setColor'>setColor</a> <a href='SkColor_Reference#SkColorSetARGB'>SkColorSetARGB</a>
+
+<a name='Style'></a>
+
+---
+
+<a href='#SkPaint_Style'>Style</a> specifies if the geometry is filled, stroked, or both filled and stroked.
+Some shapes ignore <a href='#SkPaint_Style'>Style</a> and are always drawn filled or stroked.
+
+<a name='Style_Fill'></a>
+
+Set <a href='#SkPaint_Style'>Style</a> to <a href='#SkPaint_kFill_Style'>kFill_Style</a> to fill the shape.
+The fill covers the area inside the geometry for most shapes.
+
+<a name='Style_Stroke'></a>
+
+Set <a href='#SkPaint_Style'>Style</a> to <a href='#SkPaint_kStroke_Style'>kStroke_Style</a> to stroke the shape.
+
+The stroke covers the area described by following the shape edge with a pen or brush of
+<a href='#Paint_Stroke_Width'>Stroke_Width</a>. The area covered where the shape starts and stops is described by <a href='#Paint_Stroke_Cap'>Stroke_Cap</a>.
+The area covered where the shape turns a corner is described by <a href='#Paint_Stroke_Join'>Stroke_Join</a>.
+The stroke is centered on the shape; it extends equally on either side of the shape edge.As <a href='#Paint_Stroke_Width'>Stroke_Width</a> gets smaller, the drawn <a href='SkPath_Reference#Path'>path</a> frame is thinner. <a href='#Paint_Stroke_Width'>Stroke_Width</a> less than one
+may have gaps, and if <a href='#SkPaint_kAntiAlias_Flag'>kAntiAlias_Flag</a> is set, <a href='#Color_Alpha'>Color_Alpha</a> will increase to visually decrease coverage.
+
+### See Also
+
+<a href='#Path_Fill_Type'>Path_Fill_Type</a> <a href='#Path_Effect'>Path_Effect</a> <a href='#Paint_Style_Fill'>Style_Fill</a> <a href='#Paint_Style_Stroke'>Style_Stroke</a>
+
+<a name='Hairline'></a>
+
+---
+
+<a href='#Paint_Stroke_Width'>Stroke_Width</a> of zero has a special meaning and switches drawing to use Hairline.
+Hairline draws the thinnest continuous frame. If <a href='#SkPaint_kAntiAlias_Flag'>kAntiAlias_Flag</a> is clear, adjacent pixels
+flow horizontally, vertically,or diagonally.
+
+<a href='SkPath_Reference#Path'>Path</a> drawing with Hairline may hit the same <a href='undocumented#Pixel'>pixel</a> more than once. For instance, <a href='SkPath_Reference#Path'>Path</a> containing
+two <a href='undocumented#Line'>lines</a> in one <a href='#Path_Overview_Contour'>Path_Contour</a> will draw the corner <a href='SkPoint_Reference#Point'>point</a> once, but may both <a href='undocumented#Line'>lines</a> may draw the adjacent
+<a href='undocumented#Pixel'>pixel</a>. If <a href='#SkPaint_kAntiAlias_Flag'>kAntiAlias_Flag</a> is set, transparency is applied twice, resulting in a darker <a href='undocumented#Pixel'>pixel</a>. Some
+GPU-backed implementations apply transparency at a later drawing stage, avoiding double hit pixels
+while stroking.
+
+### See Also
+
+<a href='#Path_Fill_Type'>Path_Fill_Type</a> <a href='#Path_Effect'>Path_Effect</a> <a href='#Paint_Style_Fill'>Style_Fill</a> <a href='#Paint_Style_Stroke'>Style_Stroke</a>
+
+<a name='SkPaint_Style'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkPaint_Style'>Style</a> : uint8_t {
+        <a href='#SkPaint_kFill_Style'>kFill_Style</a>,
+        <a href='#SkPaint_kStroke_Style'>kStroke_Style</a>,
+        <a href='#SkPaint_kStrokeAndFill_Style'>kStrokeAndFill_Style</a>,
+    };
+
+</pre>
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    static constexpr int <a href='#SkPaint_kStyleCount'>kStyleCount</a> = <a href='#SkPaint_kStrokeAndFill_Style'>kStrokeAndFill_Style</a> + 1;
+</pre>
+
+Set <a href='#SkPaint_Style'>Style</a> to fill, stroke, or both fill and stroke geometry.
+The stroke and fill
+share all <a href='SkPaint_Reference#Paint'>paint</a> attributes; for instance, they are drawn with the same <a href='SkColor_Reference#Color'>color</a>.
+
+Use <a href='#SkPaint_kStrokeAndFill_Style'>kStrokeAndFill_Style</a> to avoid hitting the same pixels twice with a stroke draw and
+a fill draw.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kFill_Style'><code>SkPaint::kFill_Style</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Applies to <a href='SkRect_Reference#Rect'>Rect</a>, <a href='SkRegion_Reference#Region'>Region</a>, <a href='#RRect'>Round_Rect</a>, <a href='undocumented#Circle'>Circles</a>, <a href='undocumented#Oval'>Ovals</a>, <a href='SkPath_Reference#Path'>Path</a>, and <a href='undocumented#Text'>Text</a>.
+<a href='SkBitmap_Reference#Bitmap'>Bitmap</a>, <a href='SkImage_Reference#Image'>Image</a>, <a href='undocumented#Patch'>Patches</a>, <a href='SkRegion_Reference#Region'>Region</a>, <a href='undocumented#Sprite'>Sprites</a>, and <a href='undocumented#Vertices'>Vertices</a> are painted as if
+<a href='#SkPaint_kFill_Style'>kFill_Style</a> is set, and ignore the set <a href='#SkPaint_Style'>Style</a>.
+The <a href='#Path_Fill_Type'>Path_Fill_Type</a> specifies additional rules to fill the area outside the <a href='SkPath_Reference#Path'>path</a> edge,
+and to create an unfilled hole inside the shape.
+<a href='#SkPaint_Style'>Style</a> is set to <a href='#SkPaint_kFill_Style'>kFill_Style</a> by default.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kStroke_Style'><code>SkPaint::kStroke_Style</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Applies to <a href='SkRect_Reference#Rect'>Rect</a>, <a href='SkRegion_Reference#Region'>Region</a>, <a href='#RRect'>Round_Rect</a>, <a href='undocumented#Arc'>Arcs</a>, <a href='undocumented#Circle'>Circles</a>, <a href='undocumented#Oval'>Ovals</a>, <a href='SkPath_Reference#Path'>Path</a>, and <a href='undocumented#Text'>Text</a>.
+<a href='undocumented#Arc'>Arcs</a>, <a href='undocumented#Line'>Lines</a>, and <a href='SkPoint_Reference#Point'>points</a>, are always drawn as if <a href='#SkPaint_kStroke_Style'>kStroke_Style</a> is set,
+and ignore the set <a href='#SkPaint_Style'>Style</a>.
+The stroke construction is unaffected by the <a href='#Path_Fill_Type'>Path_Fill_Type</a>.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kStrokeAndFill_Style'><code>SkPaint::kStrokeAndFill_Style</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Applies to <a href='SkRect_Reference#Rect'>Rect</a>, <a href='SkRegion_Reference#Region'>Region</a>, <a href='#RRect'>Round_Rect</a>, <a href='undocumented#Circle'>Circles</a>, <a href='undocumented#Oval'>Ovals</a>, <a href='SkPath_Reference#Path'>Path</a>, and <a href='undocumented#Text'>Text</a>.
+<a href='SkPath_Reference#Path'>Path</a> is treated as if it is set to <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kWinding_FillType'>kWinding_FillType</a>,
+and the set <a href='#Path_Fill_Type'>Path_Fill_Type</a> is ignored.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kStyleCount'><code>SkPaint::kStyleCount</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+May be used to verify that <a href='#SkPaint_Style'>Style</a> is a legal value.
+</td>
+  </tr>
+</table>
+
+<a name='SkPaint_getStyle'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPaint_Style'>Style</a> <a href='#SkPaint_getStyle'>getStyle</a>()const
+</pre>
+
+Returns whether the geometry is filled, stroked, or filled and stroked.
+
+### Return Value
+
+one of:<a href='#SkPaint_kFill_Style'>kFill_Style</a>, <a href='#SkPaint_kStroke_Style'>kStroke_Style</a>, <a href='#SkPaint_kStrokeAndFill_Style'>kStrokeAndFill_Style</a>
+
+### Example
+
+<div><fiddle-embed name="@Paint_getStyle">
+
+#### Example Output
+
+~~~~
+SkPaint::kFill_Style == paint.getStyle()
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPaint_Style'>Style</a> <a href='#SkPaint_setStyle'>setStyle</a>
+
+<a name='SkPaint_setStyle'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setStyle'>setStyle</a>(<a href='#SkPaint_Style'>Style</a> style)
+</pre>
+
+Sets whether the geometry is filled, stroked, or filled and stroked.
+Has no effect if <a href='#SkPaint_setStyle_style'>style</a> is not a legal <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> value.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setStyle_style'><code><strong>style</strong></code></a></td>
+    <td>one of: <a href='#SkPaint_kFill_Style'>kFill_Style</a>, <a href='#SkPaint_kStroke_Style'>kStroke_Style</a>, <a href='#SkPaint_kStrokeAndFill_Style'>kStrokeAndFill_Style</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setStyle"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPaint_Style'>Style</a> <a href='#SkPaint_getStyle'>getStyle</a>
+
+<a name='Stroke_Width'></a>
+
+---
+
+<a href='#Paint_Stroke_Width'>Stroke_Width</a> sets the width for stroking. The width is the thickness
+of the stroke perpendicular to the  <a href='SkPath_Reference#Path_Direction'>path direction</a> when the  <a href='SkPaint_Reference#Paint'>paint style</a> is
+set to <a href='#SkPaint_kStroke_Style'>kStroke_Style</a> or <a href='#SkPaint_kStrokeAndFill_Style'>kStrokeAndFill_Style</a>.
+
+When width is greater than zero, the stroke encompasses as many pixels partially
+or fully as needed. When the width equals zero, the <a href='SkPaint_Reference#Paint'>paint</a> enables hairlines;
+the stroke is always one <a href='undocumented#Pixel'>pixel</a> wide.
+
+The stroke dimensions are scaled by the  <a href='SkCanvas_Reference#Canvas_Matrix'>canvas matrix</a>, but Hairline stroke
+remains one <a href='undocumented#Pixel'>pixel</a> wide regardless of scaling.
+
+The default width for the <a href='SkPaint_Reference#Paint'>paint</a> is zero.
+
+### Example
+
+<div><fiddle-embed name="@Stroke_Width" gpu="true"><div>The pixels hit to represent thin <a href='undocumented#Line'>lines</a> vary with the angle of the
+<a href='undocumented#Line'>line</a> and the platform implementation.
+</div></fiddle-embed></div>
+
+<a name='SkPaint_getStrokeWidth'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_getStrokeWidth'>getStrokeWidth</a>()const
+</pre>
+
+Returns the thickness of the pen used by <a href='SkPaint_Reference#SkPaint'>SkPaint</a> to
+outline the shape.
+
+### Return Value
+
+zero for hairline, greater than zero for pen thickness
+
+### Example
+
+<div><fiddle-embed name="@Paint_getStrokeWidth">
+
+#### Example Output
+
+~~~~
+0 == paint.getStrokeWidth()
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setStrokeWidth'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setStrokeWidth'>setStrokeWidth</a>(<a href='undocumented#SkScalar'>SkScalar</a> width)
+</pre>
+
+Sets the thickness of the pen used by the <a href='SkPaint_Reference#Paint'>paint</a> to
+outline the shape.
+Has no effect if <a href='#SkPaint_setStrokeWidth_width'>width</a> is less than zero.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setStrokeWidth_width'><code><strong>width</strong></code></a></td>
+    <td>zero thickness for hairline; greater than zero for pen thickness</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setStrokeWidth">
+
+#### Example Output
+
+~~~~
+5 == paint.getStrokeWidth()
+~~~~
+
+</fiddle-embed></div>
+
+<a name='Miter_Limit'></a>
+
+---
+
+<a href='#Paint_Miter_Limit'>Miter_Limit</a> specifies the maximum miter length,
+relative to the  <a href='#Stroke_Width'>stroke width</a>.
+
+<a href='#Paint_Miter_Limit'>Miter_Limit</a> is used when the <a href='#Paint_Stroke_Join'>Stroke_Join</a>
+is set to <a href='#SkPaint_kMiter_Join'>kMiter_Join</a>, and the <a href='#SkPaint_Style'>Style</a> is either <a href='#SkPaint_kStroke_Style'>kStroke_Style</a>
+or <a href='#SkPaint_kStrokeAndFill_Style'>kStrokeAndFill_Style</a>.
+
+If the miter at a corner exceeds this limit, <a href='#SkPaint_kMiter_Join'>kMiter_Join</a>
+is replaced with <a href='#SkPaint_kBevel_Join'>kBevel_Join</a>.
+
+<a href='#Paint_Miter_Limit'>Miter_Limit</a> can be computed from the corner angle using:
+<code><a href='#Miter_Limit'>miter limit</a> = 1 / sin ( angle / 2 )</code>.
+
+<a href='#Paint_Miter_Limit'>Miter_Limit</a> default value is 4.
+The default may be changed at compile time by setting <a href='undocumented#SkPaintDefaults_MiterLimit'>SkPaintDefaults_MiterLimit</a>
+in "SkUserConfig.h" or as a define supplied by the build environment.
+
+Here are some miter limits and the angles that triggers them.
+
+| <a href='#Miter_Limit'>miter limit</a> | angle in degrees |
+| --- | ---  |
+| 10 | 11.48 |
+| 9 | 12.76 |
+| 8 | 14.36 |
+| 7 | 16.43 |
+| 6 | 19.19 |
+| 5 | 23.07 |
+| 4 | 28.96 |
+| 3 | 38.94 |
+| 2 | 60 |
+| 1 | 180 |
+
+### Example
+
+<div><fiddle-embed name="@Miter_Limit"><div>This example draws a stroked corner and the miter length beneath.
+When the  <a href='#Miter_Limit'>miter limit</a> is decreased slightly, the miter join is replaced
+by a bevel join.
+</div></fiddle-embed></div>
+
+<a name='SkPaint_getStrokeMiter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_getStrokeMiter'>getStrokeMiter</a>()const
+</pre>
+
+Returns the limit at which a sharp corner is drawn beveled.
+
+### Return Value
+
+zero and greater miter limit
+
+### Example
+
+<div><fiddle-embed name="@Paint_getStrokeMiter">
+
+#### Example Output
+
+~~~~
+default miter limit == 4
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Paint_Miter_Limit'>Miter_Limit</a> <a href='#SkPaint_setStrokeMiter'>setStrokeMiter</a> <a href='#SkPaint_Join'>Join</a>
+
+<a name='SkPaint_setStrokeMiter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setStrokeMiter'>setStrokeMiter</a>(<a href='undocumented#SkScalar'>SkScalar</a> miter)
+</pre>
+
+Sets the limit at which a sharp corner is drawn beveled.
+Valid values are zero and greater.
+Has no effect if <a href='#SkPaint_setStrokeMiter_miter'>miter</a> is less than zero.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setStrokeMiter_miter'><code><strong>miter</strong></code></a></td>
+    <td>zero and greater  <a href='#Miter_Limit'>miter limit</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setStrokeMiter">
+
+#### Example Output
+
+~~~~
+default miter limit == 8
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Paint_Miter_Limit'>Miter_Limit</a> <a href='#SkPaint_getStrokeMiter'>getStrokeMiter</a> <a href='#SkPaint_Join'>Join</a>
+
+<a name='Stroke_Cap'></a>
+
+<a name='SkPaint_Cap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkPaint_Cap'>Cap</a> {
+        <a href='#SkPaint_kButt_Cap'>kButt_Cap</a>,
+        <a href='#SkPaint_kRound_Cap'>kRound_Cap</a>,
+        <a href='#SkPaint_kSquare_Cap'>kSquare_Cap</a>,
+        <a href='#SkPaint_kLast_Cap'>kLast_Cap</a> = <a href='#SkPaint_kSquare_Cap'>kSquare_Cap</a>,
+        <a href='#SkPaint_kDefault_Cap'>kDefault_Cap</a> = <a href='#SkPaint_kButt_Cap'>kButt_Cap</a>,
+    };
+
+</pre>
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    static constexpr int <a href='#SkPaint_kCapCount'>kCapCount</a> = <a href='#SkPaint_kLast_Cap'>kLast_Cap</a> + 1;
+</pre>
+
+<a href='#Paint_Stroke_Cap'>Stroke_Cap</a> draws at the beginning and end of an open <a href='#Path_Overview_Contour'>Path_Contour</a>.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kButt_Cap'><code>SkPaint::kButt_Cap</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Does not extend the stroke past the beginning or the end.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kRound_Cap'><code>SkPaint::kRound_Cap</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Adds a <a href='undocumented#Circle'>circle</a> with a diameter equal to <a href='#Paint_Stroke_Width'>Stroke_Width</a> at the beginning
+and end.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kSquare_Cap'><code>SkPaint::kSquare_Cap</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Adds a square with sides equal to <a href='#Paint_Stroke_Width'>Stroke_Width</a> at the beginning
+and end. The square sides are parallel to the initial and final direction
+of the stroke.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kLast_Cap'><code>SkPaint::kLast_Cap</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Equivalent to the largest value for <a href='#Paint_Stroke_Cap'>Stroke_Cap</a>.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kDefault_Cap'><code>SkPaint::kDefault_Cap</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#Paint_Stroke_Cap'>Stroke_Cap</a> is set to <a href='#SkPaint_kButt_Cap'>kButt_Cap</a> by default.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kCapCount'><code>SkPaint::kCapCount</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+May be used to verify that <a href='#Paint_Stroke_Cap'>Stroke_Cap</a> is a legal value.
+</td>
+  </tr>
+</table>
+
+Stroke describes the area covered by a pen of <a href='#Paint_Stroke_Width'>Stroke_Width</a> as it
+follows the <a href='#Path_Overview_Contour'>Path_Contour</a>, moving parallel to the <a href='SkPath_Overview#Contour'>contour</a> direction.
+
+If the <a href='#Path_Overview_Contour'>Path_Contour</a> is not terminated by <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kClose_Verb'>kClose_Verb</a>, the <a href='SkPath_Overview#Contour'>contour</a> has a
+visible beginning and end.
+
+<a href='#Path_Overview_Contour'>Path_Contour</a> may start and end at the same <a href='SkPoint_Reference#Point'>point</a>; defining <a href='#Path_Overview_Contour_Zero_Length'>Zero_Length_Contour</a>.
+
+<a href='#SkPaint_kButt_Cap'>kButt_Cap</a> and <a href='#Path_Overview_Contour_Zero_Length'>Zero_Length_Contour</a> is not drawn.
+<a href='#SkPaint_kRound_Cap'>kRound_Cap</a> and <a href='#Path_Overview_Contour_Zero_Length'>Zero_Length_Contour</a> draws a <a href='undocumented#Circle'>circle</a> of diameter <a href='#Paint_Stroke_Width'>Stroke_Width</a>
+at the <a href='SkPath_Overview#Contour'>contour</a> <a href='SkPoint_Reference#Point'>point</a>.
+<a href='#SkPaint_kSquare_Cap'>kSquare_Cap</a> and <a href='#Path_Overview_Contour_Zero_Length'>Zero_Length_Contour</a> draws an upright square with a side of
+<a href='#Paint_Stroke_Width'>Stroke_Width</a> at the <a href='SkPath_Overview#Contour'>contour</a> <a href='SkPoint_Reference#Point'>point</a>.
+
+<a href='#Paint_Stroke_Cap'>Stroke_Cap</a> is <a href='#SkPaint_kButt_Cap'>kButt_Cap</a> by default.
+
+### Example
+
+<div><fiddle-embed name="@Paint_053"></fiddle-embed></div>
+
+<a name='SkPaint_getStrokeCap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPaint_Cap'>Cap</a> <a href='#SkPaint_getStrokeCap'>getStrokeCap</a>()const
+</pre>
+
+Returns the geometry drawn at the beginning and end of strokes.
+
+### Return Value
+
+one of: <a href='#SkPaint_kButt_Cap'>kButt_Cap</a>, <a href='#SkPaint_kRound_Cap'>kRound_Cap</a>, <a href='#SkPaint_kSquare_Cap'>kSquare_Cap</a>
+
+### Example
+
+<div><fiddle-embed name="@Paint_getStrokeCap">
+
+#### Example Output
+
+~~~~
+kButt_Cap == default stroke cap
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Paint_Stroke_Cap'>Stroke_Cap</a> <a href='#SkPaint_setStrokeCap'>setStrokeCap</a>
+
+<a name='SkPaint_setStrokeCap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setStrokeCap'>setStrokeCap</a>(<a href='#SkPaint_Cap'>Cap</a> cap)
+</pre>
+
+Sets the geometry drawn at the beginning and end of strokes.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setStrokeCap_cap'><code><strong>cap</strong></code></a></td>
+    <td>one of: <a href='#SkPaint_kButt_Cap'>kButt_Cap</a>, <a href='#SkPaint_kRound_Cap'>kRound_Cap</a>, <a href='#SkPaint_kSquare_Cap'>kSquare_Cap</a>;</td>
+  </tr>
+</table>
+
+has no effect if <a href='#SkPaint_setStrokeCap_cap'>cap</a> is not valid
+
+### Example
+
+<div><fiddle-embed name="@Paint_setStrokeCap_a">
+
+#### Example Output
+
+~~~~
+kRound_Cap == paint.getStrokeCap()
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Paint_Stroke_Cap'>Stroke_Cap</a> <a href='#SkPaint_getStrokeCap'>getStrokeCap</a>
+
+<a name='Stroke_Join'></a>
+
+<a href='#Paint_Stroke_Join'>Stroke_Join</a> draws at the sharp corners of an open or closed <a href='#Path_Overview_Contour'>Path_Contour</a>.
+
+Stroke describes the area covered by a pen of <a href='#Paint_Stroke_Width'>Stroke_Width</a> as it
+follows the <a href='#Path_Overview_Contour'>Path_Contour</a>, moving parallel to the <a href='SkPath_Overview#Contour'>contour</a> direction.
+
+If the <a href='SkPath_Overview#Contour'>contour</a> direction changes abruptly, because the tangent direction leading
+to the end of a <a href='undocumented#Curve'>curve</a> within the <a href='SkPath_Overview#Contour'>contour</a> does not match the tangent direction of
+the following <a href='undocumented#Curve'>curve</a>, the pair of <a href='undocumented#Curve'>curves</a> meet at <a href='#Paint_Stroke_Join'>Stroke_Join</a>.
+
+### Example
+
+<div><fiddle-embed name="@Paint_setStrokeCap_b"></fiddle-embed></div>
+
+<a name='SkPaint_Join'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkPaint_Join'>Join</a> : uint8_t {
+        <a href='#SkPaint_kMiter_Join'>kMiter_Join</a>,
+        <a href='#SkPaint_kRound_Join'>kRound_Join</a>,
+        <a href='#SkPaint_kBevel_Join'>kBevel_Join</a>,
+        <a href='#SkPaint_kLast_Join'>kLast_Join</a> = <a href='#SkPaint_kBevel_Join'>kBevel_Join</a>,
+        <a href='#SkPaint_kDefault_Join'>kDefault_Join</a> = <a href='#SkPaint_kMiter_Join'>kMiter_Join</a>,
+    };
+
+</pre>
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    static constexpr int <a href='#SkPaint_kJoinCount'>kJoinCount</a> = <a href='#SkPaint_kLast_Join'>kLast_Join</a> + 1;
+</pre>
+
+<a href='#SkPaint_Join'>Join</a> specifies how corners are drawn when a shape is stroked. <a href='#SkPaint_Join'>Join</a>
+affects the four corners of a stroked rectangle, and the connected segments in a
+stroked <a href='SkPath_Reference#Path'>path</a>.
+
+Choose miter join to draw sharp corners. Choose round join to draw a <a href='undocumented#Circle'>circle</a> with a
+radius equal to the  <a href='#Stroke_Width'>stroke width</a> on top of the corner. Choose bevel join to minimally
+connect the thick strokes.
+
+The  <a href='#Fill_Path'>fill path</a> constructed to describe the stroked <a href='SkPath_Reference#Path'>path</a> respects the join setting but may
+not contain the actual join. For instance, a  <a href='#Fill_Path'>fill path</a> constructed with round joins does
+not necessarily include <a href='undocumented#Circle'>circles</a> at each connected segment.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kMiter_Join'><code>SkPaint::kMiter_Join</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Extends the outside corner to the extent allowed by <a href='#Paint_Miter_Limit'>Miter_Limit</a>.
+If the extension exceeds <a href='#Paint_Miter_Limit'>Miter_Limit</a>, <a href='#SkPaint_kBevel_Join'>kBevel_Join</a> is used instead.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kRound_Join'><code>SkPaint::kRound_Join</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Adds a <a href='undocumented#Circle'>circle</a> with a diameter of <a href='#Paint_Stroke_Width'>Stroke_Width</a> at the sharp corner.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kBevel_Join'><code>SkPaint::kBevel_Join</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Connects the outside edges of the sharp corner.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kLast_Join'><code>SkPaint::kLast_Join</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+equivalent to the largest value for Stroke_Join</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kDefault_Join'><code>SkPaint::kDefault_Join</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#Paint_Stroke_Join'>Stroke_Join</a> is set to <a href='#SkPaint_kMiter_Join'>kMiter_Join</a> by default.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kJoinCount'><code>SkPaint::kJoinCount</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+May be used to verify that <a href='#Paint_Stroke_Join'>Stroke_Join</a> is a legal value.
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Paint_057"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPaint_setStrokeJoin'>setStrokeJoin</a> <a href='#SkPaint_getStrokeJoin'>getStrokeJoin</a> <a href='#SkPaint_setStrokeMiter'>setStrokeMiter</a> <a href='#SkPaint_getStrokeMiter'>getStrokeMiter</a>
+
+<a name='SkPaint_getStrokeJoin'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPaint_Join'>Join</a> <a href='#SkPaint_getStrokeJoin'>getStrokeJoin</a>()const
+</pre>
+
+Returns the geometry drawn at the corners of strokes.
+
+### Return Value
+
+one of: <a href='#SkPaint_kMiter_Join'>kMiter_Join</a>, <a href='#SkPaint_kRound_Join'>kRound_Join</a>, <a href='#SkPaint_kBevel_Join'>kBevel_Join</a>
+
+### Example
+
+<div><fiddle-embed name="@Paint_getStrokeJoin">
+
+#### Example Output
+
+~~~~
+kMiter_Join == default stroke join
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Paint_Stroke_Join'>Stroke_Join</a> <a href='#SkPaint_setStrokeJoin'>setStrokeJoin</a>
+
+<a name='SkPaint_setStrokeJoin'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setStrokeJoin'>setStrokeJoin</a>(<a href='#SkPaint_Join'>Join</a> join)
+</pre>
+
+Sets the geometry drawn at the corners of strokes.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setStrokeJoin_join'><code><strong>join</strong></code></a></td>
+    <td>one of: <a href='#SkPaint_kMiter_Join'>kMiter_Join</a>, <a href='#SkPaint_kRound_Join'>kRound_Join</a>, <a href='#SkPaint_kBevel_Join'>kBevel_Join</a>;</td>
+  </tr>
+</table>
+
+otherwise, has no effect
+
+### Example
+
+<div><fiddle-embed name="@Paint_setStrokeJoin">
+
+#### Example Output
+
+~~~~
+kMiter_Join == paint.getStrokeJoin()
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Paint_Stroke_Join'>Stroke_Join</a> <a href='#SkPaint_getStrokeJoin'>getStrokeJoin</a>
+
+### See Also
+
+<a href='#Paint_Miter_Limit'>Miter_Limit</a>
+
+<a name='Fill_Path'></a>
+
+---
+
+<a href='#Paint_Fill_Path'>Fill_Path</a> creates a <a href='SkPath_Reference#Path'>Path</a> by applying the <a href='#Path_Effect'>Path_Effect</a>, followed by the <a href='#Paint_Style_Stroke'>Style_Stroke</a>.
+
+If <a href='SkPaint_Reference#Paint'>Paint</a> contains <a href='#Path_Effect'>Path_Effect</a>, <a href='#Path_Effect'>Path_Effect</a> operates on the source <a href='SkPath_Reference#Path'>Path</a>; the result
+replaces the destination <a href='SkPath_Reference#Path'>Path</a>. Otherwise, the source <a href='SkPath_Reference#Path'>Path</a> is replaces the
+destination <a href='SkPath_Reference#Path'>Path</a>.
+
+Fill <a href='SkPath_Reference#Path'>Path</a> can request the <a href='#Path_Effect'>Path_Effect</a> to restrict to a culling rectangle, but
+the <a href='#Path_Effect'>Path_Effect</a> is not required to do so.
+
+If <a href='#SkPaint_Style'>Style</a> is <a href='#SkPaint_kStroke_Style'>kStroke_Style</a> or <a href='#SkPaint_kStrokeAndFill_Style'>kStrokeAndFill_Style</a>,
+and <a href='#Paint_Stroke_Width'>Stroke_Width</a> is greater than zero, the <a href='#Paint_Stroke_Width'>Stroke_Width</a>, <a href='#Paint_Stroke_Cap'>Stroke_Cap</a>, <a href='#Paint_Stroke_Join'>Stroke_Join</a>,
+and <a href='#Paint_Miter_Limit'>Miter_Limit</a> operate on the destination <a href='SkPath_Reference#Path'>Path</a>, replacing it.
+
+Fill <a href='SkPath_Reference#Path'>Path</a> can specify the precision used by <a href='#Paint_Stroke_Width'>Stroke_Width</a> to approximate the stroke geometry.
+
+If the <a href='#SkPaint_Style'>Style</a> is <a href='#SkPaint_kStroke_Style'>kStroke_Style</a> and the <a href='#Paint_Stroke_Width'>Stroke_Width</a> is zero, <a href='#SkPaint_getFillPath'>getFillPath</a>
+returns false since Hairline has no filled equivalent.
+
+### See Also
+
+<a href='#Paint_Style_Stroke'>Style_Stroke</a> <a href='#Paint_Stroke_Width'>Stroke_Width</a> <a href='#Path_Effect'>Path_Effect</a>
+
+<a name='SkPaint_getFillPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_getFillPath'>getFillPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& src, <a href='SkPath_Reference#SkPath'>SkPath</a>* dst, const <a href='SkRect_Reference#SkRect'>SkRect</a>* cullRect, <a href='undocumented#SkScalar'>SkScalar</a> resScale = 1)const
+</pre>
+
+Returns the filled equivalent of the stroked <a href='SkPath_Reference#Path'>path</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_getFillPath_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> read to create a filled version</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_getFillPath_dst'><code><strong>dst</strong></code></a></td>
+    <td>resulting <a href='SkPath_Reference#SkPath'>SkPath</a>; may be the same as <a href='#SkPaint_getFillPath_src'>src</a>, but may not be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_getFillPath_cullRect'><code><strong>cullRect</strong></code></a></td>
+    <td>optional limit passed to <a href='undocumented#SkPathEffect'>SkPathEffect</a></td>
+  </tr>
+  <tr>    <td><a name='SkPaint_getFillPath_resScale'><code><strong>resScale</strong></code></a></td>
+    <td>if > 1, increase precision, else if (0 < <a href='#SkPaint_getFillPath_resScale'>resScale</a> < 1) reduce precision</td>
+  </tr>
+</table>
+
+to favor speed and <a href='undocumented#Size'>size</a>
+
+### Return Value
+
+true if the <a href='SkPath_Reference#Path'>path</a> represents  <a href='#Style_Fill'>style fill</a>, or false if it represents hairline
+
+### Example
+
+<div><fiddle-embed name="@Paint_getFillPath"><div>A very small <a href='SkPath_Reference#Quad'>Quad</a> stroke is turned into a filled <a href='SkPath_Reference#Path'>path</a> with increasing levels of precision.
+At the lowest precision, the <a href='SkPath_Reference#Quad'>Quad</a> stroke is approximated by a rectangle.
+At the highest precision, the filled <a href='SkPath_Reference#Path'>path</a> has high fidelity compared to the original stroke.
+</div></fiddle-embed></div>
+
+<a name='SkPaint_getFillPath_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_getFillPath'>getFillPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& src, <a href='SkPath_Reference#SkPath'>SkPath</a>* dst)const
+</pre>
+
+Returns the filled equivalent of the stroked <a href='SkPath_Reference#Path'>path</a>.
+
+Replaces <a href='#SkPaint_getFillPath_2_dst'>dst</a> with the <a href='#SkPaint_getFillPath_2_src'>src</a> <a href='SkPath_Reference#Path'>path</a> modified by <a href='undocumented#SkPathEffect'>SkPathEffect</a> and  <a href='#Style_Stroke'>style stroke</a>.
+<a href='undocumented#SkPathEffect'>SkPathEffect</a>, if any, is not culled.  <a href='#Stroke_Width'>stroke width</a> is created with default precision.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_getFillPath_2_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> read to create a filled version</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_getFillPath_2_dst'><code><strong>dst</strong></code></a></td>
+    <td>resulting <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='#SkPaint_getFillPath_2_dst'>dst</a> may be the same as <a href='#SkPaint_getFillPath_2_src'>src</a>, but may not be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if the <a href='SkPath_Reference#Path'>path</a> represents  <a href='#Style_Fill'>style fill</a>, or false if it represents hairline
+
+### Example
+
+<div><fiddle-embed name="@Paint_getFillPath_2"></fiddle-embed></div>
+
+<a name='Shader_Methods'></a>
+
+---
+
+<a href='undocumented#Shader'>Shader</a> defines the colors used when drawing a shape.
+<a href='undocumented#Shader'>Shader</a> may be an <a href='SkImage_Reference#Image'>image</a>, a gradient, or a computed fill.
+If <a href='SkPaint_Reference#Paint'>Paint</a> has no <a href='undocumented#Shader'>Shader</a>, then <a href='SkColor_Reference#Color'>Color</a> fills the shape.
+
+<a href='undocumented#Shader'>Shader</a> is modulated by <a href='#Color_Alpha'>Color_Alpha</a> component of <a href='SkColor_Reference#Color'>Color</a>.
+If <a href='undocumented#Shader'>Shader</a> object defines only <a href='#Color_Alpha'>Color_Alpha</a>, then <a href='SkColor_Reference#Color'>Color</a> modulated by <a href='#Color_Alpha'>Color_Alpha</a> describes
+the fill.
+
+The drawn transparency can be modified without altering <a href='undocumented#Shader'>Shader</a>, by changing <a href='#Color_Alpha'>Color_Alpha</a>.
+
+### Example
+
+<div><fiddle-embed name="@Shader_Methods_a"></fiddle-embed></div>
+
+If <a href='undocumented#Shader'>Shader</a> generates only <a href='#Color_Alpha'>Color_Alpha</a> then all components of <a href='SkColor_Reference#Color'>Color</a> modulate the output.
+
+### Example
+
+<div><fiddle-embed name="@Shader_Methods_b"></fiddle-embed></div>
+
+<a name='SkPaint_getShader'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkShader'>SkShader</a>* <a href='#SkPaint_getShader'>getShader</a>()const
+</pre>
+
+Returns optional colors used when filling a <a href='SkPath_Reference#Path'>path</a>, such as a gradient.
+
+Does not alter <a href='undocumented#SkShader'>SkShader</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a>.
+
+### Return Value
+
+<a href='undocumented#SkShader'>SkShader</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="@Paint_getShader">
+
+#### Example Output
+
+~~~~
+nullptr == shader
+nullptr != shader
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_refShader'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkShader'>SkShader</a>&gt; <a href='#SkPaint_refShader'>refShader</a>()const
+</pre>
+
+Returns optional colors used when filling a <a href='SkPath_Reference#Path'>path</a>, such as a gradient.
+
+Increases <a href='undocumented#SkShader'>SkShader</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Return Value
+
+<a href='undocumented#SkShader'>SkShader</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="@Paint_refShader">
+
+#### Example Output
+
+~~~~
+shader unique: true
+shader unique: false
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setShader'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setShader'>setShader</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkShader'>SkShader</a>&gt; <a href='undocumented#Shader'>shader</a>)
+</pre>
+
+Sets optional colors used when filling a <a href='SkPath_Reference#Path'>path</a>, such as a gradient.
+
+Sets <a href='undocumented#SkShader'>SkShader</a> to <a href='#SkPaint_setShader_shader'>shader</a>, decreasing <a href='undocumented#SkRefCnt'>SkRefCnt</a> of the previous <a href='undocumented#SkShader'>SkShader</a>.
+Increments <a href='#SkPaint_setShader_shader'>shader</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setShader_shader'><code><strong>shader</strong></code></a></td>
+    <td>how geometry is filled with <a href='SkColor_Reference#Color'>color</a>; if nullptr, <a href='SkColor_Reference#Color'>color</a> is used instead</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setShader"></fiddle-embed></div>
+
+<a name='Color_Filter_Methods'></a>
+
+---
+
+<a href='#Color_Filter'>Color_Filter</a> alters the <a href='SkColor_Reference#Color'>color</a> used when drawing a shape.
+<a href='#Color_Filter'>Color_Filter</a> may apply <a href='#Blend_Mode'>Blend_Mode</a>, transform the <a href='SkColor_Reference#Color'>color</a> through a <a href='SkMatrix_Reference#Matrix'>matrix</a>, or composite multiple filters.
+If <a href='SkPaint_Reference#Paint'>Paint</a> has no <a href='#Color_Filter'>Color_Filter</a>, the <a href='SkColor_Reference#Color'>color</a> is unaltered.
+
+The drawn transparency can be modified without altering <a href='#Color_Filter'>Color_Filter</a>, by changing <a href='#Color_Alpha'>Color_Alpha</a>.
+
+### Example
+
+<div><fiddle-embed name="@Color_Filter_Methods"></fiddle-embed></div>
+
+<a name='SkPaint_getColorFilter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkColorFilter'>SkColorFilter</a>* <a href='#SkPaint_getColorFilter'>getColorFilter</a>()const
+</pre>
+
+Returns <a href='undocumented#SkColorFilter'>SkColorFilter</a> if set, or nullptr.
+Does not alter <a href='undocumented#SkColorFilter'>SkColorFilter</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a>.
+
+### Return Value
+
+<a href='undocumented#SkColorFilter'>SkColorFilter</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="@Paint_getColorFilter">
+
+#### Example Output
+
+~~~~
+nullptr == color filter
+nullptr != color filter
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_refColorFilter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorFilter'>SkColorFilter</a>&gt; <a href='#SkPaint_refColorFilter'>refColorFilter</a>()const
+</pre>
+
+Returns <a href='undocumented#SkColorFilter'>SkColorFilter</a> if set, or nullptr.
+Increases <a href='undocumented#SkColorFilter'>SkColorFilter</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Return Value
+
+<a href='undocumented#SkColorFilter'>SkColorFilter</a> if set, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Paint_refColorFilter">
+
+#### Example Output
+
+~~~~
+color filter unique: true
+color filter unique: false
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setColorFilter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setColorFilter'>setColorFilter</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorFilter'>SkColorFilter</a>&gt; colorFilter)
+</pre>
+
+Sets <a href='undocumented#SkColorFilter'>SkColorFilter</a> to filter, decreasing <a href='undocumented#SkRefCnt'>SkRefCnt</a> of the previous
+<a href='undocumented#SkColorFilter'>SkColorFilter</a>. Pass nullptr to clear <a href='undocumented#SkColorFilter'>SkColorFilter</a>.
+
+Increments filter <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setColorFilter_colorFilter'><code><strong>colorFilter</strong></code></a></td>
+    <td><a href='undocumented#SkColorFilter'>SkColorFilter</a> to apply to subsequent draw</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setColorFilter"></fiddle-embed></div>
+
+<a name='Blend_Mode_Methods'></a>
+
+---
+
+<a href='#Blend_Mode'>Blend_Mode</a> describes how <a href='SkColor_Reference#Color'>Color</a> combines with the destination <a href='SkColor_Reference#Color'>color</a>.
+The default setting, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOver'>kSrcOver</a>, draws the source <a href='SkColor_Reference#Color'>color</a>
+over the destination <a href='SkColor_Reference#Color'>color</a>.
+
+### Example
+
+<div><fiddle-embed name="@Blend_Mode_Methods"></fiddle-embed></div>
+
+### See Also
+
+<a href='#Blend_Mode'>Blend_Mode</a>
+
+<a name='SkPaint_getBlendMode'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> <a href='#SkPaint_getBlendMode'>getBlendMode</a>()const
+</pre>
+
+Returns <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>.
+By default, returns <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOver'>kSrcOver</a>.
+
+### Return Value
+
+mode used to combine source <a href='SkColor_Reference#Color'>color</a> with destination <a href='SkColor_Reference#Color'>color</a>
+
+### Example
+
+<div><fiddle-embed name="@Paint_getBlendMode">
+
+#### Example Output
+
+~~~~
+kSrcOver == getBlendMode
+kSrcOver != getBlendMode
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_isSrcOver'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_isSrcOver'>isSrcOver</a>()const
+</pre>
+
+Returns true if <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> is <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOver'>kSrcOver</a>, the default.
+
+### Return Value
+
+true if <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> is <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOver'>kSrcOver</a>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setBlendMode">
+
+#### Example Output
+
+~~~~
+isSrcOver == true
+isSrcOver != true
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setBlendMode'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setBlendMode'>setBlendMode</a>(<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode)
+</pre>
+
+Sets <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> to <a href='#SkPaint_setBlendMode_mode'>mode</a>.
+Does not check for valid input.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setBlendMode_mode'><code><strong>mode</strong></code></a></td>
+    <td><a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> used to combine source <a href='SkColor_Reference#Color'>color</a> and destination</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setBlendMode">
+
+#### Example Output
+
+~~~~
+isSrcOver == true
+isSrcOver != true
+~~~~
+
+</fiddle-embed></div>
+
+<a name='Path_Effect_Methods'></a>
+
+---
+
+<a href='#Path_Effect'>Path_Effect</a> modifies the <a href='SkPath_Reference#Path'>path</a> geometry before drawing it.
+<a href='#Path_Effect'>Path_Effect</a> may implement dashing, custom fill effects and custom stroke effects.
+If <a href='SkPaint_Reference#Paint'>Paint</a> has no <a href='#Path_Effect'>Path_Effect</a>, the <a href='SkPath_Reference#Path'>path</a> geometry is unaltered when filled or stroked.
+
+### Example
+
+<div><fiddle-embed name="@Path_Effect_Methods"></fiddle-embed></div>
+
+### See Also
+
+<a href='#Path_Effect'>Path_Effect</a>
+
+<a name='SkPaint_getPathEffect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkPathEffect'>SkPathEffect</a>* <a href='#SkPaint_getPathEffect'>getPathEffect</a>()const
+</pre>
+
+Returns <a href='undocumented#SkPathEffect'>SkPathEffect</a> if set, or nullptr.
+Does not alter <a href='undocumented#SkPathEffect'>SkPathEffect</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a>.
+
+### Return Value
+
+<a href='undocumented#SkPathEffect'>SkPathEffect</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="@Paint_getPathEffect">
+
+#### Example Output
+
+~~~~
+nullptr == path effect
+nullptr != path effect
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_refPathEffect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkPathEffect'>SkPathEffect</a>&gt; <a href='#SkPaint_refPathEffect'>refPathEffect</a>()const
+</pre>
+
+Returns <a href='undocumented#SkPathEffect'>SkPathEffect</a> if set, or nullptr.
+Increases <a href='undocumented#SkPathEffect'>SkPathEffect</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Return Value
+
+<a href='undocumented#SkPathEffect'>SkPathEffect</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="@Paint_refPathEffect">
+
+#### Example Output
+
+~~~~
+path effect unique: true
+path effect unique: false
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setPathEffect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setPathEffect'>setPathEffect</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkPathEffect'>SkPathEffect</a>&gt; pathEffect)
+</pre>
+
+Sets <a href='undocumented#SkPathEffect'>SkPathEffect</a> to <a href='#SkPaint_setPathEffect_pathEffect'>pathEffect</a>, decreasing <a href='undocumented#SkRefCnt'>SkRefCnt</a> of the previous
+<a href='undocumented#SkPathEffect'>SkPathEffect</a>. Pass nullptr to leave the <a href='SkPath_Reference#Path'>path</a> geometry unaltered.
+
+Increments <a href='#SkPaint_setPathEffect_pathEffect'>pathEffect</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setPathEffect_pathEffect'><code><strong>pathEffect</strong></code></a></td>
+    <td>replace <a href='SkPath_Reference#SkPath'>SkPath</a> with a modification when drawn</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setPathEffect"></fiddle-embed></div>
+
+<a name='Mask_Filter_Methods'></a>
+
+---
+
+<a href='#Mask_Filter'>Mask_Filter</a> uses coverage of the shape drawn to create <a href='#Mask_Alpha'>Mask_Alpha</a>.
+<a href='#Mask_Filter'>Mask_Filter</a> takes a Mask, and returns a Mask.
+
+<a href='#Mask_Filter'>Mask_Filter</a> may change the geometry and transparency of the shape, such as
+creating a blur effect. Set <a href='#Mask_Filter'>Mask_Filter</a> to nullptr to prevent <a href='#Mask_Filter'>Mask_Filter</a> from
+modifying the draw.
+
+### Example
+
+<div><fiddle-embed name="@Mask_Filter_Methods"></fiddle-embed></div>
+
+<a name='SkPaint_getMaskFilter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkMaskFilter'>SkMaskFilter</a>* <a href='#SkPaint_getMaskFilter'>getMaskFilter</a>()const
+</pre>
+
+Returns <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> if set, or nullptr.
+Does not alter <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a>.
+
+### Return Value
+
+<a href='undocumented#SkMaskFilter'>SkMaskFilter</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="@Paint_getMaskFilter">
+
+#### Example Output
+
+~~~~
+nullptr == mask filter
+nullptr != mask filter
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_refMaskFilter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkMaskFilter'>SkMaskFilter</a>&gt; <a href='#SkPaint_refMaskFilter'>refMaskFilter</a>()const
+</pre>
+
+Returns <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> if set, or nullptr.
+
+Increases <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Return Value
+
+<a href='undocumented#SkMaskFilter'>SkMaskFilter</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="@Paint_refMaskFilter">
+
+#### Example Output
+
+~~~~
+mask filter unique: true
+mask filter unique: false
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setMaskFilter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setMaskFilter'>setMaskFilter</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkMaskFilter'>SkMaskFilter</a>&gt; maskFilter)
+</pre>
+
+Sets <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> to <a href='#SkPaint_setMaskFilter_maskFilter'>maskFilter</a>, decreasing <a href='undocumented#SkRefCnt'>SkRefCnt</a> of the previous
+<a href='undocumented#SkMaskFilter'>SkMaskFilter</a>. Pass nullptr to clear <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> and leave <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> effect on
+<a href='undocumented#Mask_Alpha'>mask alpha</a> unaltered.
+
+Increments <a href='#SkPaint_setMaskFilter_maskFilter'>maskFilter</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setMaskFilter_maskFilter'><code><strong>maskFilter</strong></code></a></td>
+    <td>modifies clipping mask generated from drawn geometry</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setMaskFilter"></fiddle-embed></div>
+
+<a name='Typeface_Methods'></a>
+
+---
+
+<a href='undocumented#Typeface'>Typeface</a> identifies the <a href='SkFont_Reference#Font'>font</a> used when drawing and measuring <a href='undocumented#Text'>text</a>.
+<a href='undocumented#Typeface'>Typeface</a> may be specified by name, from a file, or from a <a href='undocumented#Data'>data</a> <a href='SkStream_Reference#Stream'>stream</a>.
+The default <a href='undocumented#Typeface'>Typeface</a> defers to the platform-specific default <a href='SkFont_Reference#Font'>font</a>
+implementation.
+
+### Example
+
+<div><fiddle-embed name="1a7a5062725139760962582f599f1b97"></fiddle-embed></div>
+
+<a name='SkPaint_getTypeface'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkTypeface'>SkTypeface</a>* <a href='#SkPaint_getTypeface'>getTypeface</a>()const
+</pre>
+
+Returns <a href='undocumented#SkTypeface'>SkTypeface</a> if set, or nullptr.
+Does not alter <a href='undocumented#SkTypeface'>SkTypeface</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a>.
+
+### Return Value
+
+<a href='undocumented#SkTypeface'>SkTypeface</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="5ce718e5a184baaac80e7098d7dad67b">
+
+#### Example Output
+
+~~~~
+nullptr == typeface
+nullptr != typeface
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_refTypeface'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkTypeface'>SkTypeface</a>&gt; <a href='#SkPaint_refTypeface'>refTypeface</a>()const
+</pre>
+
+Increases <a href='undocumented#SkTypeface'>SkTypeface</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Return Value
+
+<a href='undocumented#SkTypeface'>SkTypeface</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="8b5aa7e555a0dc31be69db7cadf471a1">
+
+#### Example Output
+
+~~~~
+typeface1 != typeface2
+typeface1 == typeface2
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setTypeface'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setTypeface'>setTypeface</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkTypeface'>SkTypeface</a>&gt; <a href='undocumented#Typeface'>typeface</a>)
+</pre>
+
+Sets <a href='undocumented#SkTypeface'>SkTypeface</a> to <a href='#SkPaint_setTypeface_typeface'>typeface</a>, decreasing <a href='undocumented#SkRefCnt'>SkRefCnt</a> of the previous <a href='undocumented#SkTypeface'>SkTypeface</a>.
+Pass nullptr to clear <a href='undocumented#SkTypeface'>SkTypeface</a> and use the default <a href='#SkPaint_setTypeface_typeface'>typeface</a>. Increments
+<a href='#SkPaint_setTypeface_typeface'>typeface</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setTypeface_typeface'><code><strong>typeface</strong></code></a></td>
+    <td><a href='SkFont_Reference#Font'>font</a> and style used to draw <a href='undocumented#Text'>text</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="0e6fbb7773cd925b274552f4cd1abef2"></fiddle-embed></div>
+
+<a name='Image_Filter_Methods'></a>
+
+---
+
+<a href='#Image_Filter'>Image_Filter</a> operates on the <a href='undocumented#Pixel'>pixel</a> representation of the shape, as modified by <a href='SkPaint_Reference#Paint'>Paint</a>
+with <a href='#Blend_Mode'>Blend_Mode</a> set to <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>::<a href='#SkBlendMode_kSrcOver'>kSrcOver</a>. <a href='#Image_Filter'>Image_Filter</a> creates a new <a href='SkBitmap_Reference#Bitmap'>bitmap</a>,
+which is drawn to the <a href='undocumented#Device'>device</a> using the set <a href='#Blend_Mode'>Blend_Mode</a>.
+
+<a href='#Image_Filter'>Image_Filter</a> is higher level than <a href='#Mask_Filter'>Mask_Filter</a>; for instance, an <a href='#Image_Filter'>Image_Filter</a>
+can operate on all channels of <a href='SkColor_Reference#Color'>Color</a>, while <a href='#Mask_Filter'>Mask_Filter</a> generates <a href='SkColor_Reference#Alpha'>Alpha</a> only.
+<a href='#Image_Filter'>Image_Filter</a> operates independently of and can be used in combination with
+<a href='#Mask_Filter'>Mask_Filter</a>.
+
+### Example
+
+<div><fiddle-embed name="@Image_Filter_Methods"></fiddle-embed></div>
+
+<a name='SkPaint_getImageFilter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkImageFilter'>SkImageFilter</a>* <a href='#SkPaint_getImageFilter'>getImageFilter</a>()const
+</pre>
+
+Returns <a href='undocumented#SkImageFilter'>SkImageFilter</a> if set, or nullptr.
+Does not alter <a href='undocumented#SkImageFilter'>SkImageFilter</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a>.
+
+### Return Value
+
+<a href='undocumented#SkImageFilter'>SkImageFilter</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="@Paint_getImageFilter">
+
+#### Example Output
+
+~~~~
+nullptr == image filter
+nullptr != image filter
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_refImageFilter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkImageFilter'>SkImageFilter</a>&gt; <a href='#SkPaint_refImageFilter'>refImageFilter</a>()const
+</pre>
+
+Returns <a href='undocumented#SkImageFilter'>SkImageFilter</a> if set, or nullptr.
+Increases <a href='undocumented#SkImageFilter'>SkImageFilter</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Return Value
+
+<a href='undocumented#SkImageFilter'>SkImageFilter</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="@Paint_refImageFilter">
+
+#### Example Output
+
+~~~~
+image filter unique: true
+image filter unique: false
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setImageFilter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setImageFilter'>setImageFilter</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkImageFilter'>SkImageFilter</a>&gt; imageFilter)
+</pre>
+
+Sets <a href='undocumented#SkImageFilter'>SkImageFilter</a> to <a href='#SkPaint_setImageFilter_imageFilter'>imageFilter</a>, decreasing <a href='undocumented#SkRefCnt'>SkRefCnt</a> of the previous
+<a href='undocumented#SkImageFilter'>SkImageFilter</a>. Pass nullptr to clear <a href='undocumented#SkImageFilter'>SkImageFilter</a>, and remove <a href='undocumented#SkImageFilter'>SkImageFilter</a> effect
+on drawing.
+
+Increments <a href='#SkPaint_setImageFilter_imageFilter'>imageFilter</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setImageFilter_imageFilter'><code><strong>imageFilter</strong></code></a></td>
+    <td>how <a href='SkImage_Reference#SkImage'>SkImage</a> is sampled when transformed</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="6679d6e4ec632715ee03e68391bd7f9a"></fiddle-embed></div>
+
+<a name='Draw_Looper_Methods'></a>
+
+---
+
+<a href='#Draw_Looper'>Draw_Looper</a> sets a modifier that communicates state from one <a href='#Draw_Layer'>Draw_Layer</a>
+to another to construct the draw.
+
+<a href='#Draw_Looper'>Draw_Looper</a> draws one or more times, modifying the <a href='SkCanvas_Reference#Canvas'>canvas</a> and <a href='SkPaint_Reference#Paint'>paint</a> each time.
+<a href='#Draw_Looper'>Draw_Looper</a> may be used to draw multiple colors or create a colored shadow.
+Set <a href='#Draw_Looper'>Draw_Looper</a> to nullptr to prevent <a href='#Draw_Looper'>Draw_Looper</a> from modifying the draw.
+
+### Example
+
+<div><fiddle-embed name="@Draw_Looper_Methods"></fiddle-embed></div>
+
+<a name='SkPaint_getDrawLooper'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkDrawLooper'>SkDrawLooper</a>* <a href='#SkPaint_getDrawLooper'>getDrawLooper</a>()const
+</pre>
+
+Returns <a href='undocumented#SkDrawLooper'>SkDrawLooper</a> if set, or nullptr.
+Does not alter <a href='undocumented#SkDrawLooper'>SkDrawLooper</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a>.
+
+### Return Value
+
+<a href='undocumented#SkDrawLooper'>SkDrawLooper</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="@Paint_getDrawLooper">
+
+#### Example Output
+
+~~~~
+nullptr == draw looper
+nullptr != draw looper
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_refDrawLooper'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkDrawLooper'>SkDrawLooper</a>&gt; <a href='#SkPaint_refDrawLooper'>refDrawLooper</a>()const
+</pre>
+
+Returns <a href='undocumented#SkDrawLooper'>SkDrawLooper</a> if set, or nullptr.
+Increases <a href='undocumented#SkDrawLooper'>SkDrawLooper</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Return Value
+
+<a href='undocumented#SkDrawLooper'>SkDrawLooper</a> if previously set, nullptr otherwise
+
+### Example
+
+<div><fiddle-embed name="@Paint_refDrawLooper">
+
+#### Example Output
+
+~~~~
+draw looper unique: true
+draw looper unique: false
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setDrawLooper'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setDrawLooper'>setDrawLooper</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkDrawLooper'>SkDrawLooper</a>&gt; drawLooper)
+</pre>
+
+Sets <a href='undocumented#SkDrawLooper'>SkDrawLooper</a> to <a href='#SkPaint_setDrawLooper_drawLooper'>drawLooper</a>, decreasing <a href='undocumented#SkRefCnt'>SkRefCnt</a> of the previous
+<a href='#SkPaint_setDrawLooper_drawLooper'>drawLooper</a>.  Pass nullptr to clear <a href='undocumented#SkDrawLooper'>SkDrawLooper</a> and leave <a href='undocumented#SkDrawLooper'>SkDrawLooper</a> effect on
+drawing unaltered.
+
+Increments <a href='#SkPaint_setDrawLooper_drawLooper'>drawLooper</a> <a href='undocumented#SkRefCnt'>SkRefCnt</a> by one.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setDrawLooper_drawLooper'><code><strong>drawLooper</strong></code></a></td>
+    <td>iterates through drawing one or more time, altering <a href='SkPaint_Reference#SkPaint'>SkPaint</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Paint_setDrawLooper"></fiddle-embed></div>
+
+<a name='Text_Size'></a>
+
+---
+
+<a href='#Paint_Text_Size'>Text_Size</a> adjusts the overall  <a href='#Text_Size'>text size</a> in <a href='SkPoint_Reference#Point'>points</a>.
+<a href='#Paint_Text_Size'>Text_Size</a> can be set to any positive value or zero.
+<a href='#Paint_Text_Size'>Text_Size</a> defaults to 12.
+Set <a href='undocumented#SkPaintDefaults_TextSize'>SkPaintDefaults_TextSize</a> at compile time to change the default setting.
+
+### Example
+
+<div><fiddle-embed name="91c9a3e498bb9412e4522a95d076ed5f"></fiddle-embed></div>
+
+<a name='SkPaint_getTextSize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_getTextSize'>getTextSize</a>()const
+</pre>
+
+Returns <a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a> in <a href='SkPoint_Reference#Point'>points</a>.
+
+### Return Value
+
+typographic height of <a href='undocumented#Text'>text</a>
+
+### Example
+
+<div><fiddle-embed name="983e2a71ba72d4ba8c945420040b8f1c"></fiddle-embed></div>
+
+<a name='SkPaint_setTextSize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setTextSize'>setTextSize</a>(<a href='undocumented#SkScalar'>SkScalar</a> textSize)
+</pre>
+
+Sets  <a href='#Text_Size'>text size</a> in <a href='SkPoint_Reference#Point'>points</a>.
+Has no effect if <a href='#SkPaint_setTextSize_textSize'>textSize</a> is not greater than or equal to zero.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setTextSize_textSize'><code><strong>textSize</strong></code></a></td>
+    <td>typographic height of <a href='undocumented#Text'>text</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="6510c9e2f57b83c47e67829e7a68d493"></fiddle-embed></div>
+
+<a name='Text_Scale_X'></a>
+
+---
+
+<a href='#Paint_Text_Scale_X'>Text_Scale_X</a> adjusts the <a href='undocumented#Text'>text</a> horizontal scale.
+<a href='undocumented#Text'>Text</a> scaling approximates condensed and expanded type faces when the actual face
+is not available.
+<a href='#Paint_Text_Scale_X'>Text_Scale_X</a> can be set to any value.
+<a href='#Paint_Text_Scale_X'>Text_Scale_X</a> defaults to 1.
+
+### Example
+
+<div><fiddle-embed name="d13d787c1e36f515319fc998411c1d91"></fiddle-embed></div>
+
+<a name='SkPaint_getTextScaleX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_getTextScaleX'>getTextScaleX</a>()const
+</pre>
+
+Returns <a href='undocumented#Text'>text</a> scale on x-axis.
+Default value is 1.
+
+### Return Value
+
+<a href='undocumented#Text'>text</a> horizontal scale
+
+### Example
+
+<div><fiddle-embed name="5dc8e58f6910cb8e4de9ed60f888188b"></fiddle-embed></div>
+
+<a name='SkPaint_setTextScaleX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setTextScaleX'>setTextScaleX</a>(<a href='undocumented#SkScalar'>SkScalar</a> scaleX)
+</pre>
+
+Sets  <a href='undocumented#Text'>text scale</a> on x-axis.
+Default value is 1.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setTextScaleX_scaleX'><code><strong>scaleX</strong></code></a></td>
+    <td><a href='undocumented#Text'>text</a> horizontal scale</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="a75bbdb8bb866b125c4c1dd5e967d470"></fiddle-embed></div>
+
+<a name='Text_Skew_X'></a>
+
+---
+
+<a href='#Paint_Text_Skew_X'>Text_Skew_X</a> adjusts the <a href='undocumented#Text'>text</a> horizontal slant.
+<a href='undocumented#Text'>Text</a> skewing approximates italic and oblique type faces when the actual face
+is not available.
+<a href='#Paint_Text_Skew_X'>Text_Skew_X</a> can be set to any value.
+<a href='#Paint_Text_Skew_X'>Text_Skew_X</a> defaults to 0.
+
+### Example
+
+<div><fiddle-embed name="aff208b0aab265f273045b27e683c17c"></fiddle-embed></div>
+
+<a name='SkPaint_getTextSkewX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_getTextSkewX'>getTextSkewX</a>()const
+</pre>
+
+Returns <a href='undocumented#Text'>text</a> skew on x-axis.
+Default value is zero.
+
+### Return Value
+
+additional shear on x-axis relative to y-axis
+
+### Example
+
+<div><fiddle-embed name="11c10f466dae0d1639dbb9f6a0040218"></fiddle-embed></div>
+
+<a name='SkPaint_setTextSkewX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setTextSkewX'>setTextSkewX</a>(<a href='undocumented#SkScalar'>SkScalar</a> skewX)
+</pre>
+
+Sets  <a href='undocumented#Text'>text skew</a> on x-axis.
+Default value is zero.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setTextSkewX_skewX'><code><strong>skewX</strong></code></a></td>
+    <td>additional shear on x-axis relative to y-axis</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="6bd705a6e0c5f8ee24f302fe531bfabc"></fiddle-embed></div>
+
+<a name='Text_Encoding'></a>
+
+---
+
+### Example
+
+<div><fiddle-embed name="767fa4e7b6300e16a419f9881f0f9d3d"><div>First <a href='undocumented#Line'>line</a> is encoded in UTF-8.
+Second <a href='undocumented#Line'>line</a> is encoded in UTF-16.
+Third <a href='undocumented#Line'>line</a> is encoded in UTF-32.
+Fourth <a href='undocumented#Line'>line</a> has 16-bit <a href='undocumented#Glyph'>glyph</a> indices.
+</div></fiddle-embed></div>
+
+<a name='SkPaint_getTextEncoding'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkTextEncoding'>SkTextEncoding</a> <a href='#SkPaint_getTextEncoding'>getTextEncoding</a>()const
+</pre>
+
+Returns the <a href='undocumented#Text'>text</a> encoding. <a href='undocumented#Text'>Text</a> encoding describes how to interpret the <a href='undocumented#Text'>text</a> bytes pass
+to methods like <a href='#SkPaint_measureText'>measureText</a>() and <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawText'>drawText</a>().
+
+### Return Value
+
+the <a href='undocumented#Text'>text</a> encoding
+
+### Example
+
+<div><fiddle-embed name="0d21e968e9a4c78c902ae3ef494941a0">
+
+#### Example Output
+
+~~~~
+SkTextEncoding::kUTF8 == text encoding
+SkTextEncoding::kGlyphID == text encoding
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_setTextEncoding'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_setTextEncoding'>setTextEncoding</a>(<a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding)
+</pre>
+
+Sets the  <a href='#Text_Encoding'>text encoding</a>. <a href='undocumented#Text'>Text</a> <a href='#SkPaint_setTextEncoding_encoding'>encoding</a> describes how to interpret the <a href='undocumented#Text'>text</a> bytes pass
+to methods like <a href='#SkPaint_measureText'>measureText</a>() and <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawText'>drawText</a>().
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_setTextEncoding_encoding'><code><strong>encoding</strong></code></a></td>
+    <td>the new  <a href='#Text_Encoding'>text encoding</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="a5d1ba0dbf42afb797ffdb07647b5cb9">
+
+#### Example Output
+
+~~~~
+4 != text encoding
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_FontMetrics'></a>
+
+---
+
+<a name='Font_Metrics'></a>
+
+<a name='SkPaint_getFontMetrics'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_getFontMetrics'>getFontMetrics</a>(<a href='undocumented#SkFontMetrics'>SkFontMetrics</a>* metrics)const
+</pre>
+
+Returns <a href='undocumented#SkFontMetrics'>SkFontMetrics</a> associated with <a href='undocumented#SkTypeface'>SkTypeface</a>.
+The return value is the recommended spacing between <a href='undocumented#Line'>lines</a>: the sum of <a href='#SkPaint_getFontMetrics_metrics'>metrics</a>
+descent, ascent, and leading.
+If <a href='#SkPaint_getFontMetrics_metrics'>metrics</a> is not nullptr, <a href='undocumented#SkFontMetrics'>SkFontMetrics</a> is copied to <a href='#SkPaint_getFontMetrics_metrics'>metrics</a>.
+Results are scaled by  <a href='#Text_Size'>text size</a> but does not take into account
+dimensions required by   <a href='#Text_Scale_X'>text scale x</a>,   <a href='#Text_Skew_X'>text skew x</a>,  <a href='#Fake_Bold'>fake bold</a>,
+<a href='#Style_Stroke'>style stroke</a>, and <a href='undocumented#SkPathEffect'>SkPathEffect</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_getFontMetrics_metrics'><code><strong>metrics</strong></code></a></td>
+    <td>storage for <a href='undocumented#SkFontMetrics'>SkFontMetrics</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+recommended spacing between <a href='undocumented#Line'>lines</a>
+
+### Example
+
+<div><fiddle-embed name="59d9b8249afa1c2af6186711250ce240"></fiddle-embed></div>
+
+### See Also
+
+<a href='#Font_Size'>Font_Size</a> <a href='undocumented#Typeface'>Typeface</a> <a href='#Paint_Typeface_Methods'>Typeface_Methods</a>
+
+<a name='SkPaint_getFontSpacing'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_getFontSpacing'>getFontSpacing</a>()const
+</pre>
+
+Returns the recommended spacing between <a href='undocumented#Line'>lines</a>: the sum of metrics
+descent, ascent, and leading.
+Result is scaled by <a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a> but does not take into account
+dimensions required by stroking and <a href='undocumented#SkPathEffect'>SkPathEffect</a>.
+Returns the same result as <a href='#SkPaint_getFontMetrics'>getFontMetrics</a>().
+
+### Return Value
+
+recommended spacing between <a href='undocumented#Line'>lines</a>
+
+### Example
+
+<div><fiddle-embed name="424741e26e1b174e43087d67422ce14f">
+
+#### Example Output
+
+~~~~
+textSize: 12 fontSpacing: 13.9688
+textSize: 18 fontSpacing: 20.9531
+textSize: 24 fontSpacing: 27.9375
+textSize: 32 fontSpacing: 37.25
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_textToGlyphs'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkPaint_textToGlyphs'>textToGlyphs</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, <a href='undocumented#SkGlyphID'>SkGlyphID</a> <a href='undocumented#Glyph'>glyphs</a>[])const
+</pre>
+
+Converts <a href='#SkPaint_textToGlyphs_text'>text</a> into <a href='undocumented#Glyph'>glyph</a> indices.
+Returns the number of <a href='undocumented#Glyph'>glyph</a> indices represented by <a href='#SkPaint_textToGlyphs_text'>text</a>.
+<a href='undocumented#SkTextEncoding'>SkTextEncoding</a> specifies how <a href='#SkPaint_textToGlyphs_text'>text</a> represents characters or <a href='#SkPaint_textToGlyphs_glyphs'>glyphs</a>.
+<a href='#SkPaint_textToGlyphs_glyphs'>glyphs</a> may be nullptr, to compute the <a href='undocumented#Glyph'>glyph</a> count.
+
+Does not check <a href='#SkPaint_textToGlyphs_text'>text</a> for valid character codes or valid <a href='undocumented#Glyph'>glyph</a> indices.
+
+If <a href='#SkPaint_textToGlyphs_byteLength'>byteLength</a> equals zero, returns zero.
+If <a href='#SkPaint_textToGlyphs_byteLength'>byteLength</a> includes a partial character, the partial character is ignored.
+
+If <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> is <a href='undocumented#SkTextEncoding::kUTF8'>SkTextEncoding::kUTF8</a> and
+<a href='#SkPaint_textToGlyphs_text'>text</a> contains an invalid UTF-8 sequence, zero is returned.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_textToGlyphs_text'><code><strong>text</strong></code></a></td>
+    <td>character storage encoded with <a href='undocumented#SkTextEncoding'>SkTextEncoding</a></td>
+  </tr>
+  <tr>    <td><a name='SkPaint_textToGlyphs_byteLength'><code><strong>byteLength</strong></code></a></td>
+    <td>length of character storage in bytes</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_textToGlyphs_glyphs'><code><strong>glyphs</strong></code></a></td>
+    <td>storage for <a href='undocumented#Glyph'>glyph</a> indices; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+number of <a href='#SkPaint_textToGlyphs_glyphs'>glyphs</a> represented by <a href='#SkPaint_textToGlyphs_text'>text</a> of length <a href='#SkPaint_textToGlyphs_byteLength'>byteLength</a>
+
+### Example
+
+<div><fiddle-embed name="d11136d8a74f63009da2a7f550710823"></fiddle-embed></div>
+
+<a name='SkPaint_countText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkPaint_countText'>countText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength)const
+</pre>
+
+Returns the number of <a href='undocumented#Glyph'>glyphs</a> in <a href='#SkPaint_countText_text'>text</a>.
+Uses <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> to count the <a href='undocumented#Glyph'>glyphs</a>.
+Returns the same result as <a href='#SkPaint_textToGlyphs'>textToGlyphs</a>().
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_countText_text'><code><strong>text</strong></code></a></td>
+    <td>character storage encoded with <a href='undocumented#SkTextEncoding'>SkTextEncoding</a></td>
+  </tr>
+  <tr>    <td><a name='SkPaint_countText_byteLength'><code><strong>byteLength</strong></code></a></td>
+    <td>length of character storage in bytes</td>
+  </tr>
+</table>
+
+### Return Value
+
+number of <a href='undocumented#Glyph'>glyphs</a> represented by <a href='#SkPaint_countText_text'>text</a> of length <a href='#SkPaint_countText_byteLength'>byteLength</a>
+
+### Example
+
+<div><fiddle-embed name="85436c71aab5410767fc688ab0573e09">
+
+#### Example Output
+
+~~~~
+count = 5
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_containsText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_containsText'>containsText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength)const
+</pre>
+
+Returns true if all <a href='#SkPaint_containsText_text'>text</a> corresponds to a non-zero <a href='undocumented#Glyph'>glyph</a> index.
+Returns false if any characters in <a href='#SkPaint_containsText_text'>text</a> are not supported in
+<a href='undocumented#SkTypeface'>SkTypeface</a>.
+
+If <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> is <a href='undocumented#SkTextEncoding::kGlyphID'>SkTextEncoding::kGlyphID</a>,
+returns true if all <a href='undocumented#Glyph'>glyph</a> indices in <a href='#SkPaint_containsText_text'>text</a> are non-zero;
+does not check to see if <a href='#SkPaint_containsText_text'>text</a> contains valid <a href='undocumented#Glyph'>glyph</a> indices for <a href='undocumented#SkTypeface'>SkTypeface</a>.
+
+Returns true if <a href='#SkPaint_containsText_byteLength'>byteLength</a> is zero.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_containsText_text'><code><strong>text</strong></code></a></td>
+    <td>array of characters or <a href='undocumented#Glyph'>glyphs</a></td>
+  </tr>
+  <tr>    <td><a name='SkPaint_containsText_byteLength'><code><strong>byteLength</strong></code></a></td>
+    <td>number of bytes in <a href='#SkPaint_containsText_text'>text</a> array</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if all <a href='#SkPaint_containsText_text'>text</a> corresponds to a non-zero <a href='undocumented#Glyph'>glyph</a> index
+
+<div><a href='#SkPaint_containsText'>containsText</a> succeeds for degree symbol, but cannot find a <a href='undocumented#Glyph'>glyph</a> index
+corresponding to the Unicode surrogate code <a href='SkPoint_Reference#Point'>point</a>.
+</div>
+
+#### Example Output
+
+~~~~
+0x00b0 == has char
+0xd800 != has char
+~~~~
+
+### Example
+
+<div><fiddle-embed name="6a68cb3c8b81a5976c81ee004f559247"><div><a href='#SkPaint_containsText'>containsText</a> returns true that <a href='undocumented#Glyph'>glyph</a> index is greater than zero, not
+that it corresponds to an entry in <a href='undocumented#Typeface'>Typeface</a>.
+</div>
+
+#### Example Output
+
+~~~~
+0x01ff == has glyph
+0x0000 != has glyph
+0xffff == has glyph
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPaint_setTextEncoding'>setTextEncoding</a> <a href='undocumented#Typeface'>Typeface</a>
+
+<a name='SkPaint_glyphsToUnichars'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_glyphsToUnichars'>glyphsToUnichars</a>(const <a href='undocumented#SkGlyphID'>SkGlyphID</a> <a href='undocumented#Glyph'>glyphs</a>[], int count, <a href='undocumented#SkUnichar'>SkUnichar</a> <a href='undocumented#Text'>text</a>[])const
+</pre>
+
+Converts <a href='#SkPaint_glyphsToUnichars_glyphs'>glyphs</a> into <a href='#SkPaint_glyphsToUnichars_text'>text</a> if possible.
+<a href='undocumented#Glyph'>Glyph</a> values without direct Unicode equivalents are mapped to zero.
+Uses the <a href='undocumented#SkTypeface'>SkTypeface</a>, but is unaffected
+by <a href='undocumented#SkTextEncoding'>SkTextEncoding</a>; the <a href='#SkPaint_glyphsToUnichars_text'>text</a> values returned are equivalent to <a href='undocumented#SkTextEncoding::kUTF32'>SkTextEncoding::kUTF32</a>.
+
+Only supported on platforms that use FreeType as the  <a href='SkFont_Reference#Font_Engine'>font engine</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_glyphsToUnichars_glyphs'><code><strong>glyphs</strong></code></a></td>
+    <td>array of indices into <a href='SkFont_Reference#Font'>font</a></td>
+  </tr>
+  <tr>    <td><a name='SkPaint_glyphsToUnichars_count'><code><strong>count</strong></code></a></td>
+    <td>length of <a href='undocumented#Glyph'>glyph</a> array</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_glyphsToUnichars_text'><code><strong>text</strong></code></a></td>
+    <td>storage for character codes, one per <a href='undocumented#Glyph'>glyph</a></td>
+  </tr>
+</table>
+
+<div>Convert UTF-8 <a href='#SkPaint_glyphsToUnichars_text'>text</a> to <a href='#SkPaint_glyphsToUnichars_glyphs'>glyphs</a>; then convert <a href='#SkPaint_glyphsToUnichars_glyphs'>glyphs</a> to Unichar code <a href='SkPoint_Reference#Point'>points</a>.
+</div>
+
+<a name='Measure_Text'></a>
+
+<a name='SkPaint_measureText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_measureText'>measureText</a>(const void* <a href='undocumented#Text'>text</a>, size_t length, <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds)const
+</pre>
+
+Returns the advance width of <a href='#SkPaint_measureText_text'>text</a>.
+The advance is the normal distance to move before drawing additional <a href='#SkPaint_measureText_text'>text</a>.
+Uses <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> to decode <a href='#SkPaint_measureText_text'>text</a>, <a href='undocumented#SkTypeface'>SkTypeface</a> to get the  <a href='#Font_Metrics'>font metrics</a>,
+and  <a href='#Text_Size'>text size</a>,   <a href='#Text_Scale_X'>text scale x</a>,   <a href='#Text_Skew_X'>text skew x</a>,  <a href='#Stroke_Width'>stroke width</a>, and
+<a href='undocumented#SkPathEffect'>SkPathEffect</a> to scale the metrics and <a href='#SkPaint_measureText_bounds'>bounds</a>.
+Returns the bounding box of <a href='#SkPaint_measureText_text'>text</a> if <a href='#SkPaint_measureText_bounds'>bounds</a> is not nullptr.
+The bounding box is computed as if the <a href='#SkPaint_measureText_text'>text</a> was drawn at the origin.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_measureText_text'><code><strong>text</strong></code></a></td>
+    <td>character codes or <a href='undocumented#Glyph'>glyph</a> indices to be measured</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_measureText_length'><code><strong>length</strong></code></a></td>
+    <td>number of bytes of <a href='#SkPaint_measureText_text'>text</a> to measure</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_measureText_bounds'><code><strong>bounds</strong></code></a></td>
+    <td>returns bounding box relative to (0, 0) if not nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+advance width or height
+
+### Example
+
+<div><fiddle-embed name="06084f609184470135a9cd9ebc5af149"></fiddle-embed></div>
+
+<a name='SkPaint_measureText_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPaint_measureText'>measureText</a>(const void* <a href='undocumented#Text'>text</a>, size_t length)const
+</pre>
+
+Returns the advance width of <a href='#SkPaint_measureText_2_text'>text</a>.
+The advance is the normal distance to move before drawing additional <a href='#SkPaint_measureText_2_text'>text</a>.
+Uses <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> to decode <a href='#SkPaint_measureText_2_text'>text</a>, <a href='undocumented#SkTypeface'>SkTypeface</a> to get the  <a href='#Font_Metrics'>font metrics</a>,
+and  <a href='#Text_Size'>text size</a> to scale the metrics.
+Does not scale the advance or bounds by  <a href='#Fake_Bold'>fake bold</a> or <a href='undocumented#SkPathEffect'>SkPathEffect</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_measureText_2_text'><code><strong>text</strong></code></a></td>
+    <td>character codes or <a href='undocumented#Glyph'>glyph</a> indices to be measured</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_measureText_2_length'><code><strong>length</strong></code></a></td>
+    <td>number of bytes of <a href='#SkPaint_measureText_2_text'>text</a> to measure</td>
+  </tr>
+</table>
+
+### Return Value
+
+advance width or height
+
+### Example
+
+<div><fiddle-embed name="f1139a5ddd17fd47c2f45f6e642cac76">
+
+#### Example Output
+
+~~~~
+default width = 5
+double width = 10
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPaint_getTextWidths'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkPaint_getTextWidths'>getTextWidths</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, <a href='undocumented#SkScalar'>SkScalar</a> widths[], <a href='SkRect_Reference#SkRect'>SkRect</a> bounds[] = nullptr)const
+</pre>
+
+Retrieves the advance and <a href='#SkPaint_getTextWidths_bounds'>bounds</a> for each <a href='undocumented#Glyph'>glyph</a> in <a href='#SkPaint_getTextWidths_text'>text</a>, and returns
+the <a href='undocumented#Glyph'>glyph</a> count in <a href='#SkPaint_getTextWidths_text'>text</a>.
+Both <a href='#SkPaint_getTextWidths_widths'>widths</a> and <a href='#SkPaint_getTextWidths_bounds'>bounds</a> may be nullptr.
+If <a href='#SkPaint_getTextWidths_widths'>widths</a> is not nullptr, <a href='#SkPaint_getTextWidths_widths'>widths</a> must be an array of <a href='undocumented#Glyph'>glyph</a> count entries.
+if <a href='#SkPaint_getTextWidths_bounds'>bounds</a> is not nullptr, <a href='#SkPaint_getTextWidths_bounds'>bounds</a> must be an array of <a href='undocumented#Glyph'>glyph</a> count entries.
+Uses <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> to decode <a href='#SkPaint_getTextWidths_text'>text</a>, <a href='undocumented#SkTypeface'>SkTypeface</a> to get the  <a href='#Font_Metrics'>font metrics</a>,
+and  <a href='#Text_Size'>text size</a> to scale the <a href='#SkPaint_getTextWidths_widths'>widths</a> and <a href='#SkPaint_getTextWidths_bounds'>bounds</a>.
+Does not scale the advance by  <a href='#Fake_Bold'>fake bold</a> or <a href='undocumented#SkPathEffect'>SkPathEffect</a>.
+Does include  <a href='#Fake_Bold'>fake bold</a> and <a href='undocumented#SkPathEffect'>SkPathEffect</a> in the <a href='#SkPaint_getTextWidths_bounds'>bounds</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_getTextWidths_text'><code><strong>text</strong></code></a></td>
+    <td>character codes or <a href='undocumented#Glyph'>glyph</a> indices to be measured</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_getTextWidths_byteLength'><code><strong>byteLength</strong></code></a></td>
+    <td>number of bytes of <a href='#SkPaint_getTextWidths_text'>text</a> to measure</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_getTextWidths_widths'><code><strong>widths</strong></code></a></td>
+    <td>returns <a href='#SkPaint_getTextWidths_text'>text</a> advances for each <a href='undocumented#Glyph'>glyph</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_getTextWidths_bounds'><code><strong>bounds</strong></code></a></td>
+    <td>returns <a href='#SkPaint_getTextWidths_bounds'>bounds</a> for each <a href='undocumented#Glyph'>glyph</a> relative to (0, 0); may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='undocumented#Glyph'>glyph</a> count in <a href='#SkPaint_getTextWidths_text'>text</a>
+
+### Example
+
+<div><fiddle-embed name="6b9e101f49e9c2c28755c5bdcef64dfb"><div>Bounds of <a href='undocumented#Glyph'>Glyphs</a> increase for stroked <a href='#SkPaint_getTextWidths_text'>text</a>, but <a href='#SkPaint_getTextWidths_text'>text</a> advance remains the same.
+The underlines show the <a href='#SkPaint_getTextWidths_text'>text</a> advance, spaced to keep them distinct.
+</div></fiddle-embed></div>
+
+<a name='Text_Path'></a>
+
+<a href='#Paint_Text_Path'>Text_Path</a> describes the geometry of <a href='undocumented#Glyph'>Glyphs</a> used to draw <a href='undocumented#Text'>text</a>.
+
+<a name='SkPaint_getTextPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_getTextPath'>getTextPath</a>(const void* <a href='undocumented#Text'>text</a>, size_t length, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, <a href='SkPath_Reference#SkPath'>SkPath</a>* <a href='SkPath_Reference#Path'>path</a>)const
+</pre>
+
+Returns the geometry as <a href='SkPath_Reference#SkPath'>SkPath</a> equivalent to the drawn <a href='#SkPaint_getTextPath_text'>text</a>.
+Uses <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> to decode <a href='#SkPaint_getTextPath_text'>text</a>, <a href='undocumented#SkTypeface'>SkTypeface</a> to get the <a href='undocumented#Glyph'>glyph</a> <a href='SkPath_Reference#Path'>paths</a>,
+and  <a href='#Text_Size'>text size</a>,  <a href='#Fake_Bold'>fake bold</a>, and <a href='undocumented#SkPathEffect'>SkPathEffect</a> to scale and modify the <a href='undocumented#Glyph'>glyph</a> <a href='SkPath_Reference#Path'>paths</a>.
+All of the <a href='undocumented#Glyph'>glyph</a> <a href='SkPath_Reference#Path'>paths</a> are stored in <a href='#SkPaint_getTextPath_path'>path</a>.
+Uses <a href='#SkPaint_getTextPath_x'>x</a>, <a href='#SkPaint_getTextPath_y'>y</a>, to position <a href='#SkPaint_getTextPath_path'>path</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_getTextPath_text'><code><strong>text</strong></code></a></td>
+    <td>character codes or <a href='undocumented#Glyph'>glyph</a> indices</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_getTextPath_length'><code><strong>length</strong></code></a></td>
+    <td>number of bytes of <a href='#SkPaint_getTextPath_text'>text</a></td>
+  </tr>
+  <tr>    <td><a name='SkPaint_getTextPath_x'><code><strong>x</strong></code></a></td>
+    <td>x-axis value of the origin of the <a href='#SkPaint_getTextPath_text'>text</a></td>
+  </tr>
+  <tr>    <td><a name='SkPaint_getTextPath_y'><code><strong>y</strong></code></a></td>
+    <td>y-axis value of the origin of the <a href='#SkPaint_getTextPath_text'>text</a></td>
+  </tr>
+  <tr>    <td><a name='SkPaint_getTextPath_path'><code><strong>path</strong></code></a></td>
+    <td>geometry of the <a href='undocumented#Glyph'>glyphs</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="7c9e6a399f898d68026c1f0865e6f73e"><div><a href='undocumented#Text'>Text</a> is added to <a href='SkPath_Reference#Path'>Path</a>, offset, and subtracted from <a href='SkPath_Reference#Path'>Path</a>, then added at
+the offset location. The result is rendered with one draw call.
+</div></fiddle-embed></div>
+
+<a name='SkPaint_getPosTextPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPaint_getPosTextPath'>getPosTextPath</a>(const void* <a href='undocumented#Text'>text</a>, size_t length, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pos[], <a href='SkPath_Reference#SkPath'>SkPath</a>* <a href='SkPath_Reference#Path'>path</a>)const
+</pre>
+
+Returns the geometry as <a href='SkPath_Reference#SkPath'>SkPath</a> equivalent to the drawn <a href='#SkPaint_getPosTextPath_text'>text</a>.
+Uses <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> to decode <a href='#SkPaint_getPosTextPath_text'>text</a>, <a href='undocumented#SkTypeface'>SkTypeface</a> to get the <a href='undocumented#Glyph'>glyph</a> <a href='SkPath_Reference#Path'>paths</a>,
+and  <a href='#Text_Size'>text size</a>,  <a href='#Fake_Bold'>fake bold</a>, and <a href='undocumented#SkPathEffect'>SkPathEffect</a> to scale and modify the <a href='undocumented#Glyph'>glyph</a> <a href='SkPath_Reference#Path'>paths</a>.
+All of the <a href='undocumented#Glyph'>glyph</a> <a href='SkPath_Reference#Path'>paths</a> are stored in <a href='#SkPaint_getPosTextPath_path'>path</a>.
+Uses <a href='#SkPaint_getPosTextPath_pos'>pos</a> array to position <a href='#SkPaint_getPosTextPath_path'>path</a>.
+<a href='#SkPaint_getPosTextPath_pos'>pos</a> contains a position for each <a href='undocumented#Glyph'>glyph</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPaint_getPosTextPath_text'><code><strong>text</strong></code></a></td>
+    <td>character codes or <a href='undocumented#Glyph'>glyph</a> indices</td>
+  </tr>
+  <tr>    <td><a name='SkPaint_getPosTextPath_length'><code><strong>length</strong></code></a></td>
+    <td>number of bytes of <a href='#SkPaint_getPosTextPath_text'>text</a></td>
+  </tr>
+  <tr>    <td><a name='SkPaint_getPosTextPath_pos'><code><strong>pos</strong></code></a></td>
+    <td>positions of each <a href='undocumented#Glyph'>glyph</a></td>
+  </tr>
+  <tr>    <td><a name='SkPaint_getPosTextPath_path'><code><strong>path</strong></code></a></td>
+    <td>geometry of the <a href='undocumented#Glyph'>glyphs</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="7f27c93472aa99a7542fb3493076f072"><div>Simplifies three <a href='undocumented#Glyph'>Glyphs</a> to eliminate overlaps, and strokes the result.
+</div></fiddle-embed></div>
+
+<a name='SkPaint_nothingToDraw'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPaint_nothingToDraw'>nothingToDraw</a>()const
+</pre>
+
+Returns true if <a href='SkPaint_Reference#SkPaint'>SkPaint</a> prevents all drawing;
+otherwise, the <a href='SkPaint_Reference#SkPaint'>SkPaint</a> may or may not allow drawing.
+
+Returns true if, for example, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> combined with <a href='SkColor_Reference#Alpha'>alpha</a> computes a
+new <a href='SkColor_Reference#Alpha'>alpha</a> of zero.
+
+### Return Value
+
+true if <a href='SkPaint_Reference#SkPaint'>SkPaint</a> prevents all drawing
+
+### Example
+
+<div><fiddle-embed name="@Paint_nothingToDraw">
+
+#### Example Output
+
+~~~~
+initial nothing to draw: false
+blend dst nothing to draw: true
+blend src over nothing to draw: false
+alpha 0 nothing to draw: true
+~~~~
+
+</fiddle-embed></div>
+
+<a name='Utility'></a>
+
diff --git a/src/third_party/skia/site/user/api/SkPath_Overview.md b/src/third_party/skia/site/user/api/SkPath_Overview.md
new file mode 100644
index 0000000..fecc60f
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkPath_Overview.md
@@ -0,0 +1,80 @@
+SkPath Overview
+===
+<a href='SkPath_Reference#Path'>Path</a> contains <a href='undocumented#Line'>Lines</a> and <a href='undocumented#Curve'>Curves</a> which can be stroked or filled. <a href='SkPath_Overview#Contour'>Contour</a> is
+composed of a series of connected <a href='undocumented#Line'>Lines</a> and <a href='undocumented#Curve'>Curves</a>. <a href='SkPath_Reference#Path'>Path</a> may contain zero,
+one, or more <a href='SkPath_Overview#Contour'>Contours</a>.
+Each <a href='undocumented#Line'>Line</a> and <a href='undocumented#Curve'>Curve</a> are described by Verb, <a href='SkPoint_Reference#Point'>Points</a>, and optional <a href='#Path_Conic_Weight'>Path_Conic_Weight</a>.
+
+Each pair of connected <a href='undocumented#Line'>Lines</a> and <a href='undocumented#Curve'>Curves</a> share common <a href='SkPoint_Reference#Point'>Point</a>; for instance, <a href='SkPath_Reference#Path'>Path</a>
+containing two connected <a href='undocumented#Line'>Lines</a> are described the <a href='#Path_Verb'>Path_Verb</a> sequence:
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kMove_Verb'>kMove_Verb</a>, <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kLine_Verb'>kLine_Verb</a>, <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kLine_Verb'>kLine_Verb</a>; and a <a href='SkPoint_Reference#Point'>Point</a> sequence
+with three entries, sharing
+the middle entry as the end of the first <a href='undocumented#Line'>Line</a> and the start of the second <a href='undocumented#Line'>Line</a>.
+
+<a href='SkPath_Reference#Path'>Path</a> components <a href='undocumented#Arc'>Arc</a>, <a href='SkRect_Reference#Rect'>Rect</a>, <a href='#RRect'>Round_Rect</a>, <a href='undocumented#Circle'>Circle</a>, and <a href='undocumented#Oval'>Oval</a> are composed of
+<a href='undocumented#Line'>Lines</a> and <a href='undocumented#Curve'>Curves</a> with as many <a href='SkPath_Reference#Verb'>Verbs</a> and <a href='SkPoint_Reference#Point'>Points</a> required
+for an exact description. Once added to <a href='SkPath_Reference#Path'>Path</a>, these components may lose their
+identity; although <a href='SkPath_Reference#Path'>Path</a> can be inspected to determine if it describes a single
+<a href='SkRect_Reference#Rect'>Rect</a>, <a href='undocumented#Oval'>Oval</a>, <a href='#RRect'>Round_Rect</a>, and so on.
+
+### Example
+
+<div><fiddle-embed name="93887af0c1dac49521972698cf04069c"><div><a href='SkPath_Reference#Path'>Path</a> contains three <a href='SkPath_Overview#Contour'>Contours</a>: <a href='undocumented#Line'>Line</a>, <a href='undocumented#Circle'>Circle</a>, and <a href='SkPath_Reference#Quad'>Quad</a>. <a href='undocumented#Line'>Line</a> is stroked but
+not filled. <a href='undocumented#Circle'>Circle</a> is stroked and filled; <a href='undocumented#Circle'>Circle</a> stroke forms a loop. <a href='SkPath_Reference#Quad'>Quad</a>
+is stroked and filled, but since it is not closed, <a href='SkPath_Reference#Quad'>Quad</a> does not stroke a loop.
+</div></fiddle-embed></div>
+
+<a href='SkPath_Reference#Path'>Path</a> contains a <a href='#Path_Fill_Type'>Path_Fill_Type</a> which determines whether overlapping <a href='SkPath_Overview#Contour'>Contours</a>
+form fills or holes. <a href='#Path_Fill_Type'>Path_Fill_Type</a> also determines whether area inside or outside
+<a href='undocumented#Line'>Lines</a> and <a href='undocumented#Curve'>Curves</a> is filled.
+
+### Example
+
+<div><fiddle-embed name="36a995442c081ee779ecab2962d36e69"><div><a href='SkPath_Reference#Path'>Path</a> is drawn filled, then stroked, then stroked and filled.
+</div></fiddle-embed></div>
+
+<a href='SkPath_Reference#Path'>Path</a> contents are never shared. Copying <a href='SkPath_Reference#Path'>Path</a> by value effectively creates
+a new <a href='SkPath_Reference#Path'>Path</a> independent of the original. Internally, the copy does not duplicate
+its contents until it is edited, to reduce memory use and improve performance.
+
+<a name='Contour'></a>
+
+---
+
+<a href='SkPath_Overview#Contour'>Contour</a> contains one or more <a href='SkPath_Reference#Verb'>Verbs</a>, and as many <a href='SkPoint_Reference#Point'>Points</a> as
+are required to satisfy <a href='#Path_Verb_Array'>Path_Verb_Array</a>. First <a href='#Path_Verb'>Path_Verb</a> in <a href='SkPath_Reference#Path'>Path</a> is always
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kMove_Verb'>kMove_Verb</a>; each <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kMove_Verb'>kMove_Verb</a> that follows starts a new <a href='SkPath_Overview#Contour'>Contour</a>.
+
+### Example
+
+<div><fiddle-embed name="0374f2dcd7effeb1dd435205a6c2de6f"><div>Each <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_moveTo'>moveTo</a> starts a new <a href='SkPath_Overview#Contour'>Contour</a>, and content after <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_close'>close()</a>
+also starts a new <a href='SkPath_Overview#Contour'>Contour</a>. Since <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_conicTo'>conicTo</a> is not preceded by
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_moveTo'>moveTo</a>, the first <a href='SkPoint_Reference#Point'>Point</a> of the third <a href='SkPath_Overview#Contour'>Contour</a> starts at the last <a href='SkPoint_Reference#Point'>Point</a>
+of the second <a href='SkPath_Overview#Contour'>Contour</a>.
+</div></fiddle-embed></div>
+
+If final <a href='#Path_Verb'>Path_Verb</a> in <a href='SkPath_Overview#Contour'>Contour</a> is <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kClose_Verb'>kClose_Verb</a>, <a href='undocumented#Line'>Line</a> connects <a href='#Path_Last_Point'>Path_Last_Point</a> in
+<a href='SkPath_Overview#Contour'>Contour</a> with first <a href='SkPoint_Reference#Point'>Point</a>. A closed <a href='SkPath_Overview#Contour'>Contour</a>, stroked, draws
+<a href='#Paint_Stroke_Join'>Paint_Stroke_Join</a> at <a href='#Path_Last_Point'>Path_Last_Point</a> and first <a href='SkPoint_Reference#Point'>Point</a>. Without <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_kClose_Verb'>kClose_Verb</a>
+as final Verb, <a href='#Path_Last_Point'>Path_Last_Point</a> and first <a href='SkPoint_Reference#Point'>Point</a> are not connected; <a href='SkPath_Overview#Contour'>Contour</a>
+remains open. An open <a href='SkPath_Overview#Contour'>Contour</a>, stroked, draws <a href='#Paint_Stroke_Cap'>Paint_Stroke_Cap</a> at
+<a href='#Path_Last_Point'>Path_Last_Point</a> and first <a href='SkPoint_Reference#Point'>Point</a>.
+
+### Example
+
+<div><fiddle-embed name="7a1f39b12d2cd8b7f5b1190879259cb2"><div><a href='SkPath_Reference#Path'>Path</a> is drawn stroked, with an open <a href='SkPath_Overview#Contour'>Contour</a> and a closed <a href='SkPath_Overview#Contour'>Contour</a>.
+</div></fiddle-embed></div>
+
+<a name='Contour_Zero_Length'></a>
+
+---
+
+<a href='SkPath_Overview#Contour'>Contour</a> length is distance traveled from first <a href='SkPoint_Reference#Point'>Point</a> to <a href='#Path_Last_Point'>Path_Last_Point</a>,
+plus, if <a href='SkPath_Overview#Contour'>Contour</a> is closed, distance from <a href='#Path_Last_Point'>Path_Last_Point</a> to first <a href='SkPoint_Reference#Point'>Point</a>.
+Even if <a href='SkPath_Overview#Contour'>Contour</a> length is zero, stroked <a href='undocumented#Line'>Lines</a> are drawn if <a href='#Paint_Stroke_Cap'>Paint_Stroke_Cap</a>
+makes them visible.
+
+### Example
+
+<div><fiddle-embed name="62848df605af6258653d9e16b27d8f7f"></fiddle-embed></div>
+
diff --git a/src/third_party/skia/site/user/api/SkPath_Reference.md b/src/third_party/skia/site/user/api/SkPath_Reference.md
new file mode 100644
index 0000000..f4de9fb
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkPath_Reference.md
@@ -0,0 +1,5523 @@
+SkPath Reference
+===
+
+
+<a name='SkPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkPath_Reference#SkPath'>SkPath</a> {
+
+    enum <a href='#SkPath_Direction'>Direction</a> : int {
+        <a href='#SkPath_kCW_Direction'>kCW_Direction</a>,
+        <a href='#SkPath_kCCW_Direction'>kCCW_Direction</a>,
+    };
+
+    <a href='#SkPath_empty_constructor'>SkPath()</a>;
+    <a href='#SkPath_copy_const_SkPath'>SkPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>);
+    <a href='#SkPath_destructor'>~SkPath()</a>;
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_copy_operator'>operator=</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>);
+    friend bool <a href='#SkPath_equal_operator'>operator==</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& a, const <a href='SkPath_Reference#SkPath'>SkPath</a>& b);
+    friend bool <a href='#SkPath_notequal_operator'>operator!=</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& a, const <a href='SkPath_Reference#SkPath'>SkPath</a>& b);
+    bool <a href='#SkPath_isInterpolatable'>isInterpolatable</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& compare) const;
+    bool <a href='#SkPath_interpolate'>interpolate</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& ending, <a href='undocumented#SkScalar'>SkScalar</a> weight, <a href='SkPath_Reference#SkPath'>SkPath</a>* out) const;
+
+    enum <a href='#SkPath_FillType'>FillType</a> {
+        <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a>,
+        <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a>,
+        <a href='#SkPath_kInverseWinding_FillType'>kInverseWinding_FillType</a>,
+        <a href='#SkPath_kInverseEvenOdd_FillType'>kInverseEvenOdd_FillType</a>,
+    };
+
+    <a href='#SkPath_FillType'>FillType</a> <a href='#SkPath_getFillType'>getFillType</a>() const;
+    void <a href='#SkPath_setFillType'>setFillType</a>(<a href='#SkPath_FillType'>FillType</a> ft);
+    bool <a href='#SkPath_isInverseFillType'>isInverseFillType</a>() const;
+    void <a href='#SkPath_toggleInverseFillType'>toggleInverseFillType</a>();
+
+    enum <a href='#SkPath_Convexity'>Convexity</a> : uint8_t {
+        <a href='#SkPath_kUnknown_Convexity'>kUnknown_Convexity</a>,
+        <a href='#SkPath_kConvex_Convexity'>kConvex_Convexity</a>,
+        <a href='#SkPath_kConcave_Convexity'>kConcave_Convexity</a>,
+    };
+
+    <a href='#SkPath_Convexity'>Convexity</a> <a href='#SkPath_getConvexity'>getConvexity</a>() const;
+    <a href='#SkPath_Convexity'>Convexity</a> <a href='#SkPath_getConvexityOrUnknown'>getConvexityOrUnknown</a>() const;
+    void <a href='#SkPath_setConvexity'>setConvexity</a>(<a href='#SkPath_Convexity'>Convexity</a> convexity);
+    bool <a href='#SkPath_isConvex'>isConvex</a>() const;
+    bool <a href='#SkPath_isOval'>isOval</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* bounds) const;
+    bool <a href='#SkPath_isRRect'>isRRect</a>(<a href='SkRRect_Reference#SkRRect'>SkRRect</a>* rrect) const;
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_reset'>reset()</a>;
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_rewind'>rewind()</a>;
+    bool <a href='#SkPath_isEmpty'>isEmpty</a>() const;
+    bool <a href='#SkPath_isLastContourClosed'>isLastContourClosed</a>() const;
+    bool <a href='#SkPath_isFinite'>isFinite</a>() const;
+    bool <a href='#SkPath_isVolatile'>isVolatile</a>() const;
+    void <a href='#SkPath_setIsVolatile'>setIsVolatile</a>(bool <a href='#SkPath_isVolatile'>isVolatile</a>);
+    static bool <a href='#SkPath_IsLineDegenerate'>IsLineDegenerate</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p2, bool exact);
+    static bool <a href='#SkPath_IsQuadDegenerate'>IsQuadDegenerate</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p2,
+                                 const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p3, bool exact);
+    static bool <a href='#SkPath_IsCubicDegenerate'>IsCubicDegenerate</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p2,
+                                  const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p3, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p4, bool exact);
+    bool <a href='#SkPath_isLine'>isLine</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='undocumented#Line'>line</a>[2]) const;
+    int <a href='#SkPath_countPoints'>countPoints</a>() const;
+    <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_getPoint'>getPoint</a>(int index) const;
+    int <a href='#SkPath_getPoints'>getPoints</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='SkPoint_Reference#Point'>points</a>[], int max) const;
+    int <a href='#SkPath_countVerbs'>countVerbs</a>() const;
+    int <a href='#SkPath_getVerbs'>getVerbs</a>(uint8_t <a href='SkPath_Reference#Verb'>verbs</a>[], int max) const;
+    void <a href='#SkPath_swap'>swap</a>(<a href='SkPath_Reference#SkPath'>SkPath</a>& other);
+    const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='#SkPath_getBounds'>getBounds</a>() const;
+    void <a href='#SkPath_updateBoundsCache'>updateBoundsCache</a>() const;
+    <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkPath_computeTightBounds'>computeTightBounds</a>() const;
+    bool <a href='#SkPath_conservativelyContainsRect'>conservativelyContainsRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>) const;
+    void <a href='#SkPath_incReserve'>incReserve</a>(int extraPtCount);
+    void <a href='#SkPath_shrinkToFit'>shrinkToFit</a>();
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_moveTo'>moveTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_moveTo'>moveTo</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_rMoveTo'>rMoveTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_lineTo'>lineTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_lineTo'>lineTo</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_rLineTo'>rLineTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_quadTo'>quadTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> x1, <a href='undocumented#SkScalar'>SkScalar</a> y1, <a href='undocumented#SkScalar'>SkScalar</a> x2, <a href='undocumented#SkScalar'>SkScalar</a> y2);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_quadTo'>quadTo</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p2);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_rQuadTo'>rQuadTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx1, <a href='undocumented#SkScalar'>SkScalar</a> dy1, <a href='undocumented#SkScalar'>SkScalar</a> dx2, <a href='undocumented#SkScalar'>SkScalar</a> dy2);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_conicTo'>conicTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> x1, <a href='undocumented#SkScalar'>SkScalar</a> y1, <a href='undocumented#SkScalar'>SkScalar</a> x2, <a href='undocumented#SkScalar'>SkScalar</a> y2,
+                    <a href='undocumented#SkScalar'>SkScalar</a> w);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_conicTo'>conicTo</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p2, <a href='undocumented#SkScalar'>SkScalar</a> w);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_rConicTo'>rConicTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx1, <a href='undocumented#SkScalar'>SkScalar</a> dy1, <a href='undocumented#SkScalar'>SkScalar</a> dx2, <a href='undocumented#SkScalar'>SkScalar</a> dy2,
+                     <a href='undocumented#SkScalar'>SkScalar</a> w);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_cubicTo'>cubicTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> x1, <a href='undocumented#SkScalar'>SkScalar</a> y1, <a href='undocumented#SkScalar'>SkScalar</a> x2, <a href='undocumented#SkScalar'>SkScalar</a> y2,
+                    <a href='undocumented#SkScalar'>SkScalar</a> x3, <a href='undocumented#SkScalar'>SkScalar</a> y3);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_cubicTo'>cubicTo</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p2, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p3);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_rCubicTo'>rCubicTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx1, <a href='undocumented#SkScalar'>SkScalar</a> dy1, <a href='undocumented#SkScalar'>SkScalar</a> dx2, <a href='undocumented#SkScalar'>SkScalar</a> dy2,
+                     <a href='undocumented#SkScalar'>SkScalar</a> dx3, <a href='undocumented#SkScalar'>SkScalar</a> dy3);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_arcTo'>arcTo</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>, <a href='undocumented#SkScalar'>SkScalar</a> startAngle, <a href='undocumented#SkScalar'>SkScalar</a> sweepAngle, bool forceMoveTo);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_arcTo'>arcTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> x1, <a href='undocumented#SkScalar'>SkScalar</a> y1, <a href='undocumented#SkScalar'>SkScalar</a> x2, <a href='undocumented#SkScalar'>SkScalar</a> y2, <a href='undocumented#SkScalar'>SkScalar</a> radius);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_arcTo'>arcTo</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> p2, <a href='undocumented#SkScalar'>SkScalar</a> radius);
+
+    enum <a href='#SkPath_ArcSize'>ArcSize</a> {
+        <a href='#SkPath_kSmall_ArcSize'>kSmall_ArcSize</a>,
+        <a href='#SkPath_kLarge_ArcSize'>kLarge_ArcSize</a>,
+    };
+
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_arcTo'>arcTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> rx, <a href='undocumented#SkScalar'>SkScalar</a> ry, <a href='undocumented#SkScalar'>SkScalar</a> xAxisRotate, <a href='#SkPath_ArcSize'>ArcSize</a> largeArc,
+                  <a href='#SkPath_Direction'>Direction</a> sweep, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_arcTo'>arcTo</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> r, <a href='undocumented#SkScalar'>SkScalar</a> xAxisRotate, <a href='#SkPath_ArcSize'>ArcSize</a> largeArc, <a href='#SkPath_Direction'>Direction</a> sweep,
+               const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> xy);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_rArcTo'>rArcTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> rx, <a href='undocumented#SkScalar'>SkScalar</a> ry, <a href='undocumented#SkScalar'>SkScalar</a> xAxisRotate, <a href='#SkPath_ArcSize'>ArcSize</a> largeArc,
+                   <a href='#SkPath_Direction'>Direction</a> sweep, <a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_close'>close()</a>;
+    static bool <a href='#SkPath_IsInverseFillType'>IsInverseFillType</a>(<a href='#SkPath_FillType'>FillType</a> fill);
+    static <a href='#SkPath_FillType'>FillType</a> <a href='#SkPath_ConvertToNonInverseFillType'>ConvertToNonInverseFillType</a>(<a href='#SkPath_FillType'>FillType</a> fill);
+    static int <a href='#SkPath_ConvertConicToQuads'>ConvertConicToQuads</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p0, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p2,
+                                   <a href='undocumented#SkScalar'>SkScalar</a> w, <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], int pow2);
+    bool <a href='#SkPath_isRect'>isRect</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* <a href='SkRect_Reference#Rect'>rect</a>, bool* isClosed = nullptr, <a href='#SkPath_Direction'>Direction</a>* direction = nullptr) const;
+    bool <a href='#SkPath_isNestedFillRects'>isNestedFillRects</a>(<a href='SkRect_Reference#SkRect'>SkRect</a> <a href='SkRect_Reference#Rect'>rect</a>[2], <a href='#SkPath_Direction'>Direction</a> dirs[2] = nullptr) const;
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addRect'>addRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='#SkPath_Direction'>Direction</a> dir = <a href='#SkPath_kCW_Direction'>kCW_Direction</a>);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addRect'>addRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='#SkPath_Direction'>Direction</a> dir, unsigned start);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addRect'>addRect</a>(<a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top, <a href='undocumented#SkScalar'>SkScalar</a> right, <a href='undocumented#SkScalar'>SkScalar</a> bottom,
+                    <a href='#SkPath_Direction'>Direction</a> dir = <a href='#SkPath_kCW_Direction'>kCW_Direction</a>);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addOval'>addOval</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>, <a href='#SkPath_Direction'>Direction</a> dir = <a href='#SkPath_kCW_Direction'>kCW_Direction</a>);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addOval'>addOval</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>, <a href='#SkPath_Direction'>Direction</a> dir, unsigned start);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addCircle'>addCircle</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, <a href='undocumented#SkScalar'>SkScalar</a> radius,
+                      <a href='#SkPath_Direction'>Direction</a> dir = <a href='#SkPath_kCW_Direction'>kCW_Direction</a>);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addArc'>addArc</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>, <a href='undocumented#SkScalar'>SkScalar</a> startAngle, <a href='undocumented#SkScalar'>SkScalar</a> sweepAngle);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addRoundRect'>addRoundRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='undocumented#SkScalar'>SkScalar</a> rx, <a href='undocumented#SkScalar'>SkScalar</a> ry,
+                         <a href='#SkPath_Direction'>Direction</a> dir = <a href='#SkPath_kCW_Direction'>kCW_Direction</a>);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addRoundRect'>addRoundRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, const <a href='undocumented#SkScalar'>SkScalar</a> radii[],
+                         <a href='#SkPath_Direction'>Direction</a> dir = <a href='#SkPath_kCW_Direction'>kCW_Direction</a>);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addRRect'>addRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect, <a href='#SkPath_Direction'>Direction</a> dir = <a href='#SkPath_kCW_Direction'>kCW_Direction</a>);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addRRect'>addRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect, <a href='#SkPath_Direction'>Direction</a> dir, unsigned start);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addPoly'>addPoly</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], int count, bool close);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addPoly'>addPoly</a>(const std::initializer_list<<a href='SkPoint_Reference#SkPoint'>SkPoint</a>>& list, bool close);
+
+    enum <a href='#SkPath_AddPathMode'>AddPathMode</a> {
+        <a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a>,
+        <a href='#SkPath_kExtend_AddPathMode'>kExtend_AddPathMode</a>,
+    };
+
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addPath'>addPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& src, <a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy,
+                    <a href='#SkPath_AddPathMode'>AddPathMode</a> mode = <a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a>);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addPath'>addPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& src, <a href='#SkPath_AddPathMode'>AddPathMode</a> mode = <a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a>);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addPath'>addPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& src, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='SkMatrix_Reference#Matrix'>matrix</a>,
+                    <a href='#SkPath_AddPathMode'>AddPathMode</a> mode = <a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a>);
+    <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_reverseAddPath'>reverseAddPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& src);
+    void <a href='#SkPath_offset'>offset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy, <a href='SkPath_Reference#SkPath'>SkPath</a>* dst) const;
+    void <a href='#SkPath_offset'>offset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    void <a href='#SkPath_transform'>transform</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='SkMatrix_Reference#Matrix'>matrix</a>, <a href='SkPath_Reference#SkPath'>SkPath</a>* dst) const;
+    void <a href='#SkPath_transform'>transform</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='SkMatrix_Reference#Matrix'>matrix</a>);
+    bool <a href='#SkPath_getLastPt'>getLastPt</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a>* lastPt) const;
+    void <a href='#SkPath_setLastPt'>setLastPt</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y);
+    void <a href='#SkPath_setLastPt'>setLastPt</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p);
+
+    enum <a href='#SkPath_SegmentMask'>SegmentMask</a> {
+        <a href='#SkPath_kLine_SegmentMask'>kLine_SegmentMask</a> = 1 << 0,
+        <a href='#SkPath_kQuad_SegmentMask'>kQuad_SegmentMask</a> = 1 << 1,
+        <a href='#SkPath_kConic_SegmentMask'>kConic_SegmentMask</a> = 1 << 2,
+        <a href='#SkPath_kCubic_SegmentMask'>kCubic_SegmentMask</a> = 1 << 3,
+    };
+
+    uint32_t <a href='#SkPath_getSegmentMasks'>getSegmentMasks</a>() const;
+
+    enum <a href='#SkPath_Verb'>Verb</a> {
+        <a href='#SkPath_kMove_Verb'>kMove_Verb</a>,
+        <a href='#SkPath_kLine_Verb'>kLine_Verb</a>,
+        <a href='#SkPath_kQuad_Verb'>kQuad_Verb</a>,
+        <a href='#SkPath_kConic_Verb'>kConic_Verb</a>,
+        <a href='#SkPath_kCubic_Verb'>kCubic_Verb</a>,
+        <a href='#SkPath_kClose_Verb'>kClose_Verb</a>,
+        <a href='#SkPath_kDone_Verb'>kDone_Verb</a>,
+    };
+
+    bool <a href='#SkPath_contains'>contains</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y) const;
+    void <a href='#SkPath_dump'>dump</a>(<a href='SkWStream_Reference#SkWStream'>SkWStream</a>* <a href='SkStream_Reference#Stream'>stream</a>, bool forceClose, bool dumpAsHex) const;
+    void <a href='#SkPath_dump'>dump()</a> const;
+    void <a href='#SkPath_dumpHex'>dumpHex</a>() const;
+    size_t <a href='#SkPath_writeToMemory'>writeToMemory</a>(void* buffer) const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkData'>SkData</a>> <a href='#SkPath_serialize'>serialize()</a> const;
+    size_t <a href='#SkPath_readFromMemory'>readFromMemory</a>(const void* buffer, size_t length);
+    uint32_t <a href='#SkPath_getGenerationID'>getGenerationID</a>() const;
+    bool <a href='#SkPath_isValid'>isValid</a>() const;
+};
+
+</pre>
+
+<a href='SkPath_Reference#Path'>Paths</a> contain geometry. <a href='SkPath_Reference#Path'>Paths</a> may be empty, or contain one or more <a href='SkPath_Reference#Verb'>Verbs</a> that
+outline a figure. <a href='SkPath_Reference#Path'>Path</a> always starts with a move verb to a <a href='#Cartesian_Coordinate'>Cartesian_Coordinate</a>,
+and may be followed by additional <a href='SkPath_Reference#Verb'>verbs</a> that add <a href='undocumented#Line'>lines</a> or <a href='undocumented#Curve'>curves</a>.
+Adding a close verb makes the geometry into a continuous loop, a closed <a href='SkPath_Overview#Contour'>contour</a>.
+<a href='SkPath_Reference#Path'>Paths</a> may contain any number of <a href='SkPath_Overview#Contour'>contours</a>, each beginning with a move verb.
+
+<a href='SkPath_Reference#Path'>Path</a> <a href='SkPath_Overview#Contour'>contours</a> may contain only a move verb, or may also contain <a href='undocumented#Line'>lines</a>,
+<a href='#Path_Quad'>Quadratic_Beziers</a>, <a href='SkPath_Reference#Conic'>Conics</a>, and <a href='#Path_Cubic'>Cubic_Beziers</a>. <a href='SkPath_Reference#Path'>Path</a> <a href='SkPath_Overview#Contour'>contours</a> may be open or
+closed.
+
+When used to draw a filled area, <a href='SkPath_Reference#Path'>Path</a> describes whether the fill is inside or
+outside the geometry. <a href='SkPath_Reference#Path'>Path</a> also describes the winding rule used to fill
+overlapping <a href='SkPath_Overview#Contour'>contours</a>.
+
+Internally, <a href='SkPath_Reference#Path'>Path</a> lazily computes metrics likes bounds and convexity. Call
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_updateBoundsCache'>updateBoundsCache</a> to make <a href='SkPath_Reference#Path'>Path</a> thread safe.
+
+<a name='Verb'></a>
+
+<a name='SkPath_Verb'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkPath_Verb'>Verb</a> {
+        <a href='#SkPath_kMove_Verb'>kMove_Verb</a>,
+        <a href='#SkPath_kLine_Verb'>kLine_Verb</a>,
+        <a href='#SkPath_kQuad_Verb'>kQuad_Verb</a>,
+        <a href='#SkPath_kConic_Verb'>kConic_Verb</a>,
+        <a href='#SkPath_kCubic_Verb'>kCubic_Verb</a>,
+        <a href='#SkPath_kClose_Verb'>kClose_Verb</a>,
+        <a href='#SkPath_kDone_Verb'>kDone_Verb</a>,
+    };
+</pre>
+
+<a href='#SkPath_Verb'>Verb</a> instructs <a href='SkPath_Reference#Path'>Path</a> how to interpret one or more <a href='SkPoint_Reference#Point'>Point</a> and optional <a href='#Path_Conic_Weight'>Conic_Weight</a>;
+manage <a href='SkPath_Overview#Contour'>Contour</a>, and terminate <a href='SkPath_Reference#Path'>Path</a>.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kMove_Verb'><code>SkPath::kMove_Verb</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Consecutive <a href='#SkPath_kMove_Verb'>kMove_Verb</a> are preserved but all but the last <a href='#SkPath_kMove_Verb'>kMove_Verb</a> is
+ignored. <a href='#SkPath_kMove_Verb'>kMove_Verb</a> after other <a href='SkPath_Reference#Verb'>Verbs</a> implicitly closes the previous <a href='SkPath_Overview#Contour'>Contour</a>
+if <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kFill_Style'>kFill_Style</a> is set when drawn; otherwise, stroke is drawn open.
+<a href='#SkPath_kMove_Verb'>kMove_Verb</a> as the last <a href='#SkPath_Verb'>Verb</a> is preserved but ignored.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kLine_Verb'><code>SkPath::kLine_Verb</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='undocumented#Line'>Line</a> is a straight segment from <a href='SkPoint_Reference#Point'>Point</a> to <a href='SkPoint_Reference#Point'>Point</a>. Consecutive <a href='#SkPath_kLine_Verb'>kLine_Verb</a>
+extend <a href='SkPath_Overview#Contour'>Contour</a>. <a href='#SkPath_kLine_Verb'>kLine_Verb</a> at same position as prior <a href='#SkPath_kMove_Verb'>kMove_Verb</a> is
+preserved, and draws <a href='SkPoint_Reference#Point'>Point</a> if <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kStroke_Style'>kStroke_Style</a> is set, and
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Cap'>Cap</a> is <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kSquare_Cap'>kSquare_Cap</a> or <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kRound_Cap'>kRound_Cap</a>. <a href='#SkPath_kLine_Verb'>kLine_Verb</a>
+at same position as prior <a href='undocumented#Line'>line</a> or <a href='undocumented#Curve'>curve</a> <a href='#SkPath_Verb'>Verb</a> is preserved but is ignored.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kQuad_Verb'><code>SkPath::kQuad_Verb</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Adds <a href='SkPath_Reference#Quad'>Quad</a> from <a href='#Path_Last_Point'>Last_Point</a>, using control <a href='SkPoint_Reference#Point'>Point</a>, and end <a href='SkPoint_Reference#Point'>Point</a>.
+<a href='SkPath_Reference#Quad'>Quad</a> is a parabolic section within tangents from <a href='#Path_Last_Point'>Last_Point</a> to control <a href='SkPoint_Reference#Point'>Point</a>,
+and control <a href='SkPoint_Reference#Point'>Point</a> to end <a href='SkPoint_Reference#Point'>Point</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kConic_Verb'><code>SkPath::kConic_Verb</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Adds <a href='SkPath_Reference#Conic'>Conic</a> from <a href='#Path_Last_Point'>Last_Point</a>, using control <a href='SkPoint_Reference#Point'>Point</a>, end <a href='SkPoint_Reference#Point'>Point</a>, and <a href='#Path_Conic_Weight'>Conic_Weight</a>.
+<a href='SkPath_Reference#Conic'>Conic</a> is a elliptical, parabolic, or hyperbolic section within tangents
+from <a href='#Path_Last_Point'>Last_Point</a> to control <a href='SkPoint_Reference#Point'>Point</a>, and control <a href='SkPoint_Reference#Point'>Point</a> to end <a href='SkPoint_Reference#Point'>Point</a>, constrained
+by <a href='#Path_Conic_Weight'>Conic_Weight</a>. <a href='#Path_Conic_Weight'>Conic_Weight</a> less than one is elliptical; equal to one is
+parabolic (and identical to <a href='SkPath_Reference#Quad'>Quad</a>); greater than one hyperbolic.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kCubic_Verb'><code>SkPath::kCubic_Verb</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>4</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Adds <a href='SkPath_Reference#Cubic'>Cubic</a> from <a href='#Path_Last_Point'>Last_Point</a>, using two control <a href='SkPoint_Reference#Point'>Points</a>, and end <a href='SkPoint_Reference#Point'>Point</a>.
+<a href='SkPath_Reference#Cubic'>Cubic</a> is a third-order <a href='#Bezier_Curve'>Bezier_Curve</a> section within tangents from <a href='#Path_Last_Point'>Last_Point</a>
+to first control <a href='SkPoint_Reference#Point'>Point</a>, and from second control <a href='SkPoint_Reference#Point'>Point</a> to end <a href='SkPoint_Reference#Point'>Point</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kClose_Verb'><code>SkPath::kClose_Verb</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>5</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Closes <a href='SkPath_Overview#Contour'>Contour</a>, connecting <a href='#Path_Last_Point'>Last_Point</a> to <a href='#SkPath_kMove_Verb'>kMove_Verb</a> <a href='SkPoint_Reference#Point'>Point</a>. Consecutive
+<a href='#SkPath_kClose_Verb'>kClose_Verb</a> are preserved but only first has an effect. <a href='#SkPath_kClose_Verb'>kClose_Verb</a> after
+<a href='#SkPath_kMove_Verb'>kMove_Verb</a> has no effect.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kDone_Verb'><code>SkPath::kDone_Verb</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>6</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Not in <a href='#Path_Verb_Array'>Verb_Array</a>, but returned by <a href='SkPath_Reference#Path'>Path</a> iterator.
+</td>
+  </tr>
+Each <a href='#SkPath_Verb'>Verb</a> has zero or more <a href='SkPoint_Reference#Point'>Points</a> stored in <a href='SkPath_Reference#Path'>Path</a>.
+<a href='SkPath_Reference#Path'>Path</a> iterator returns complete <a href='undocumented#Curve'>curve</a> descriptions, duplicating shared <a href='SkPoint_Reference#Point'>Points</a>
+for consecutive entries.
+
+</table>
+
+| <a href='#SkPath_Verb'>Verb</a> | Allocated <a href='SkPoint_Reference#Point'>Points</a> | Iterated <a href='SkPoint_Reference#Point'>Points</a> | <a href='SkPath_Reference#Conic_Weight'>Weights</a> |
+| --- | --- | --- | ---  |
+| <a href='#SkPath_kMove_Verb'>kMove_Verb</a> | 1 | 1 | 0 |
+| <a href='#SkPath_kLine_Verb'>kLine_Verb</a> | 1 | 2 | 0 |
+| <a href='#SkPath_kQuad_Verb'>kQuad_Verb</a> | 2 | 3 | 0 |
+| <a href='#SkPath_kConic_Verb'>kConic_Verb</a> | 2 | 3 | 1 |
+| <a href='#SkPath_kCubic_Verb'>kCubic_Verb</a> | 3 | 4 | 0 |
+| <a href='#SkPath_kClose_Verb'>kClose_Verb</a> | 0 | 1 | 0 |
+| <a href='#SkPath_kDone_Verb'>kDone_Verb</a> | -- | 0 | 0 |
+
+### Example
+
+<div><fiddle-embed name="@Path_Verb">
+
+#### Example Output
+
+~~~~
+verb count: 7
+verbs: kMove_Verb kLine_Verb kQuad_Verb kClose_Verb kMove_Verb kCubic_Verb kConic_Verb
+~~~~
+
+</fiddle-embed></div>
+
+<a name='Direction'></a>
+
+<a name='SkPath_Direction'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkPath_Direction'>Direction</a> : int {
+        <a href='#SkPath_kCW_Direction'>kCW_Direction</a>,
+        <a href='#SkPath_kCCW_Direction'>kCCW_Direction</a>,
+    };
+</pre>
+
+<a href='#SkPath_Direction'>Direction</a> describes whether <a href='SkPath_Overview#Contour'>Contour</a> is clockwise or counterclockwise.
+When <a href='SkPath_Reference#Path'>Path</a> contains multiple overlapping <a href='SkPath_Overview#Contour'>Contours</a>, <a href='#SkPath_Direction'>Direction</a> together with
+<a href='#Path_Fill_Type'>Fill_Type</a> determines whether overlaps are filled or form holes.
+
+<a href='#SkPath_Direction'>Direction</a> also determines how <a href='SkPath_Overview#Contour'>Contour</a> is measured. For instance, dashing
+measures along <a href='SkPath_Reference#Path'>Path</a> to determine where to start and stop stroke; <a href='#SkPath_Direction'>Direction</a>
+will change dashed results as it steps clockwise or counterclockwise.
+
+Closed <a href='SkPath_Overview#Contour'>Contours</a> like <a href='SkRect_Reference#Rect'>Rect</a>, <a href='#RRect'>Round_Rect</a>, <a href='undocumented#Circle'>Circle</a>, and <a href='undocumented#Oval'>Oval</a> added with
+<a href='#SkPath_kCW_Direction'>kCW_Direction</a> travel clockwise; the same added with <a href='#SkPath_kCCW_Direction'>kCCW_Direction</a>
+travel counterclockwise.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kCW_Direction'><code>SkPath::kCW_Direction</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+contour travels clockwise</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kCCW_Direction'><code>SkPath::kCCW_Direction</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+contour travels counterclockwise</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="4bbae00b40ed2cfcd0007921ad693a7b"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_arcTo'>arcTo</a> <a href='#SkPath_rArcTo'>rArcTo</a> <a href='#SkPath_isRect'>isRect</a> <a href='#SkPath_isNestedFillRects'>isNestedFillRects</a> <a href='#SkPath_addRect'>addRect</a> <a href='#SkPath_addOval'>addOval</a>
+
+<a name='SkPath_empty_constructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPath_empty_constructor'>SkPath()</a>
+</pre>
+
+Constructs an empty <a href='SkPath_Reference#SkPath'>SkPath</a>. By default, <a href='SkPath_Reference#SkPath'>SkPath</a> has no <a href='SkPath_Reference#Verb'>verbs</a>, no <a href='SkPoint_Reference#SkPoint'>SkPoint</a>, and no <a href='SkPath_Reference#Conic_Weight'>weights</a>.
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_FillType'>FillType</a> is set to <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a>.
+
+### Return Value
+
+empty <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_empty_constructor">
+
+#### Example Output
+
+~~~~
+path is empty
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_reset'>reset</a> <a href='#SkPath_rewind'>rewind</a>
+
+<a name='SkPath_copy_const_SkPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPath_copy_const_SkPath'>SkPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>)
+</pre>
+
+Constructs a copy of an existing <a href='#SkPath_copy_const_SkPath_path'>path</a>.
+Copy constructor makes two <a href='SkPath_Reference#Path'>paths</a> identical by value. Internally, <a href='#SkPath_copy_const_SkPath_path'>path</a> and
+the returned result share pointer values. The underlying  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>
+and <a href='SkPath_Reference#Conic_Weight'>weights</a> are copied when modified.
+
+Creating a <a href='SkPath_Reference#SkPath'>SkPath</a> copy is very efficient and never allocates memory.
+<a href='SkPath_Reference#SkPath'>SkPath</a> are always copied by value from the interface; the underlying shared
+pointers are not exposed.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_copy_const_SkPath_path'><code><strong>path</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to copy by value</td>
+  </tr>
+</table>
+
+### Return Value
+
+copy of <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_copy_const_SkPath"><div>Modifying one <a href='#SkPath_copy_const_SkPath_path'>path</a> does not effect another, even if they started as copies
+of each other.
+</div>
+
+#### Example Output
+
+~~~~
+path verbs: 2
+path2 verbs: 3
+after reset
+path verbs: 0
+path2 verbs: 3
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_copy_operator'>operator=</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_copy_const_SkPath_path'>path</a>)
+
+<a name='SkPath_destructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPath_destructor'>~SkPath()</a>
+</pre>
+
+Releases ownership of any shared <a href='undocumented#Data'>data</a> and deletes <a href='undocumented#Data'>data</a> if <a href='SkPath_Reference#SkPath'>SkPath</a> is sole owner.
+
+### Example
+
+<div><fiddle-embed name="@Path_destructor"><div>delete calls <a href='SkPath_Reference#Path'>Path</a> destructor, but copy of original in path2 is unaffected.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_empty_constructor'>SkPath()</a> <a href='#SkPath_copy_const_SkPath'>SkPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>) <a href='#SkPath_copy_operator'>operator=</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>)
+
+<a name='SkPath_copy_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_copy_operator'>operator=</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>)
+</pre>
+
+Constructs a copy of an existing <a href='#SkPath_copy_operator_path'>path</a>.
+<a href='SkPath_Reference#SkPath'>SkPath</a> assignment makes two <a href='SkPath_Reference#Path'>paths</a> identical by value. Internally, assignment
+shares pointer values. The underlying  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> and <a href='SkPath_Reference#Conic_Weight'>weights</a>
+are copied when modified.
+
+Copying <a href='SkPath_Reference#SkPath'>SkPath</a> by assignment is very efficient and never allocates memory.
+<a href='SkPath_Reference#SkPath'>SkPath</a> are always copied by value from the interface; the underlying shared
+pointers are not exposed.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_copy_operator_path'><code><strong>path</strong></code></a></td>
+    <td><a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, <a href='SkPath_Reference#Conic_Weight'>weights</a>, and <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_FillType'>FillType</a> to copy</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkPath_Reference#SkPath'>SkPath</a> copied by value
+
+### Example
+
+<div><fiddle-embed name="@Path_copy_operator">
+
+#### Example Output
+
+~~~~
+path1 bounds = 10, 20, 30, 40
+path2 bounds = 10, 20, 30, 40
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_swap'>swap</a> <a href='#SkPath_copy_const_SkPath'>SkPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_copy_operator_path'>path</a>)
+
+<a name='SkPath_equal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_equal_operator'>operator==</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& a, const <a href='SkPath_Reference#SkPath'>SkPath</a>& b)
+</pre>
+
+Compares <a href='#SkPath_equal_operator_a'>a</a> and <a href='#SkPath_equal_operator_b'>b</a>; returns true if <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_FillType'>FillType</a>,  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, and <a href='SkPath_Reference#Conic_Weight'>weights</a>
+are equivalent.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_equal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to compare</td>
+  </tr>
+  <tr>    <td><a name='SkPath_equal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkPath_Reference#SkPath'>SkPath</a> pair are equivalent
+
+### Example
+
+<div><fiddle-embed name="@Path_equal_operator"><div><a href='#SkPath_rewind'>rewind()</a> removes <a href='#Path_Verb_Array'>Verb_Array</a> but leaves storage; since storage is not compared,
+<a href='SkPath_Reference#Path'>Path</a> pair are equivalent.
+</div>
+
+#### Example Output
+
+~~~~
+empty one == two
+moveTo one != two
+rewind one == two
+reset one == two
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_notequal_operator'>operator!=</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_equal_operator_a'>a</a>, const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_equal_operator_b'>b</a>) <a href='#SkPath_copy_operator'>operator=</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>)
+
+<a name='SkPath_notequal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_notequal_operator'>operator!=</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& a, const <a href='SkPath_Reference#SkPath'>SkPath</a>& b)
+</pre>
+
+Compares <a href='#SkPath_notequal_operator_a'>a</a> and <a href='#SkPath_notequal_operator_b'>b</a>; returns true if <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_FillType'>FillType</a>,  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, and <a href='SkPath_Reference#Conic_Weight'>weights</a>
+are not equivalent.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_notequal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to compare</td>
+  </tr>
+  <tr>    <td><a name='SkPath_notequal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkPath_Reference#SkPath'>SkPath</a> pair are not equivalent
+
+### Example
+
+<div><fiddle-embed name="@Path_notequal_operator"><div><a href='SkPath_Reference#Path'>Path</a> pair are equal though their convexity is not equal.
+</div>
+
+#### Example Output
+
+~~~~
+empty one == two
+add rect one == two
+setConvexity one == two
+convexity !=
+~~~~
+
+</fiddle-embed></div>
+
+<a name='Property'></a>
+
+<a name='SkPath_isInterpolatable'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_isInterpolatable'>isInterpolatable</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& compare)const
+</pre>
+
+Returns true if <a href='SkPath_Reference#SkPath'>SkPath</a> contain equal <a href='SkPath_Reference#Verb'>verbs</a> and equal <a href='SkPath_Reference#Conic_Weight'>weights</a>.
+If <a href='SkPath_Reference#SkPath'>SkPath</a> contain one or more <a href='SkPath_Reference#Conic'>conics</a>, the <a href='SkPath_Reference#Conic_Weight'>weights</a> must match.
+
+<a href='#SkPath_conicTo'>conicTo</a>() may add different <a href='SkPath_Reference#Verb'>verbs</a> depending on  <a href='#Conic_Weight'>conic weight</a>, so it is not
+trivial to interpolate a pair of <a href='SkPath_Reference#SkPath'>SkPath</a> containing <a href='SkPath_Reference#Conic'>conics</a> with different
+<a href='#Conic_Weight'>conic weight</a> values.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_isInterpolatable_compare'><code><strong>compare</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to <a href='#SkPath_isInterpolatable_compare'>compare</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkPath_Reference#SkPath'>SkPath</a>  <a href='#Verb_Array'>verb array</a> and <a href='SkPath_Reference#Conic_Weight'>weights</a> are equivalent
+
+### Example
+
+<div><fiddle-embed name="@Path_isInterpolatable">
+
+#### Example Output
+
+~~~~
+paths are interpolatable
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_isInterpolatable'>isInterpolatable</a>
+
+<a name='Interpolate'></a>
+
+<a name='SkPath_interpolate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool interpolate(const <a href='SkPath_Reference#SkPath'>SkPath</a>& ending, <a href='undocumented#SkScalar'>SkScalar</a> weight, <a href='SkPath_Reference#SkPath'>SkPath</a>* out)const
+</pre>
+
+Interpolates between <a href='SkPath_Reference#Path'>Paths</a> with <a href='#Path_Point_Array'>Point_Array</a> of equal <a href='undocumented#Size'>size</a>.
+Copy <a href='#Path_Verb_Array'>Verb_Array</a> and <a href='SkPath_Reference#Conic_Weight'>Weights</a> to <a href='#SkPath_interpolate_out'>out</a>, and set <a href='#SkPath_interpolate_out'>out</a> <a href='#Path_Point_Array'>Point_Array</a> to a weighted
+average of this <a href='#Path_Point_Array'>Point_Array</a> and <a href='#SkPath_interpolate_ending'>ending</a> <a href='#Path_Point_Array'>Point_Array</a>, using the formula:
+<code>(<a href='SkPath_Reference#Path'>Path</a> <a href='SkPoint_Reference#Point'>Point</a> * <a href='#SkPath_interpolate_weight'>weight</a>) + <a href='#SkPath_interpolate_ending'>ending</a> <a href='SkPoint_Reference#Point'>Point</a> * (1 - <a href='#SkPath_interpolate_weight'>weight</a>)</code>.
+
+<a href='#SkPath_interpolate_weight'>weight</a> is most useful when between zero (<a href='#SkPath_interpolate_ending'>ending</a> <a href='#Path_Point_Array'>Point_Array</a>) and
+one (this <a href='#Path_Point_Array'>Point_Array</a>); will work with values outside of this
+range.
+
+<a href='#SkPath_interpolate'>interpolate()</a> returns false and leaves <a href='#SkPath_interpolate_out'>out</a> unchanged if <a href='#Path_Point_Array'>Point_Array</a> is not
+the same <a href='undocumented#Size'>size</a> as <a href='#SkPath_interpolate_ending'>ending</a> <a href='#Path_Point_Array'>Point_Array</a>. Call <a href='#SkPath_isInterpolatable'>isInterpolatable</a> to check <a href='SkPath_Reference#Path'>Path</a>
+compatibility prior to calling <a href='#SkPath_interpolate'>interpolate()</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_interpolate_ending'><code><strong>ending</strong></code></a></td>
+    <td><a href='#Path_Point_Array'>Point_Array</a> averaged with this <a href='#Path_Point_Array'>Point_Array</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_interpolate_weight'><code><strong>weight</strong></code></a></td>
+    <td>contribution of this <a href='#Path_Point_Array'>Point_Array</a>, and
+one minus contribution of <a href='#SkPath_interpolate_ending'>ending</a> <a href='#Path_Point_Array'>Point_Array</a>
+</td>
+  </tr>
+  <tr>    <td><a name='SkPath_interpolate_out'><code><strong>out</strong></code></a></td>
+    <td><a href='SkPath_Reference#Path'>Path</a> replaced by interpolated averages</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkPath_Reference#Path'>Paths</a> contain same number of <a href='SkPoint_Reference#Point'>Points</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_interpolate"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_isInterpolatable'>isInterpolatable</a>
+
+<a name='Fill_Type'></a>
+
+<a name='SkPath_FillType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkPath_FillType'>FillType</a> {
+        <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a>,
+        <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a>,
+        <a href='#SkPath_kInverseWinding_FillType'>kInverseWinding_FillType</a>,
+        <a href='#SkPath_kInverseEvenOdd_FillType'>kInverseEvenOdd_FillType</a>,
+    };
+</pre>
+
+<a href='#Path_Fill_Type'>Fill_Type</a> selects the rule used to fill <a href='SkPath_Reference#Path'>Path</a>. <a href='SkPath_Reference#Path'>Path</a> set to <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a>
+fills if the sum of <a href='SkPath_Overview#Contour'>Contour</a> edges is not zero, where clockwise edges add one, and
+counterclockwise edges subtract one. <a href='SkPath_Reference#Path'>Path</a> set to <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a> fills if the
+number of <a href='SkPath_Overview#Contour'>Contour</a> edges is odd. Each <a href='#Path_Fill_Type'>Fill_Type</a> has an inverse variant that
+reverses the rule:
+<a href='#SkPath_kInverseWinding_FillType'>kInverseWinding_FillType</a> fills where the sum of <a href='SkPath_Overview#Contour'>Contour</a> edges is zero;
+<a href='#SkPath_kInverseEvenOdd_FillType'>kInverseEvenOdd_FillType</a> fills where the number of <a href='SkPath_Overview#Contour'>Contour</a> edges is even.
+
+### Example
+
+<div><fiddle-embed name="@Path_FillType_a"><div>The top row has two clockwise rectangles. The second row has one clockwise and
+one counterclockwise rectangle. The even-odd variants draw the same. The
+winding variants draw the top rectangle overlap, which has a winding of 2, the
+same as the outer parts of the top rectangles, which have a winding of 1.
+</div></fiddle-embed></div>
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kWinding_FillType'><code>SkPath::kWinding_FillType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+is enclosed by a non-zero sum of Contour Directions</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kEvenOdd_FillType'><code>SkPath::kEvenOdd_FillType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+is enclosed by an odd number of Contours</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kInverseWinding_FillType'><code>SkPath::kInverseWinding_FillType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+is enclosed by a zero sum of Contour Directions</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kInverseEvenOdd_FillType'><code>SkPath::kInverseEvenOdd_FillType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+is enclosed by an even number of Contours</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="d2c33dc791cd165dcc2423226ba5b095"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Style'>Style</a> <a href='#SkPath_Direction'>Direction</a> <a href='#SkPath_getFillType'>getFillType</a> <a href='#SkPath_setFillType'>setFillType</a>
+
+<a name='SkPath_getFillType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPath_FillType'>FillType</a> <a href='#SkPath_getFillType'>getFillType</a>()const
+</pre>
+
+Returns <a href='#SkPath_FillType'>FillType</a>, the rule used to fill <a href='SkPath_Reference#SkPath'>SkPath</a>. <a href='#SkPath_FillType'>FillType</a> of a new <a href='SkPath_Reference#SkPath'>SkPath</a> is
+<a href='#SkPath_kWinding_FillType'>kWinding_FillType</a>.
+
+### Return Value
+
+one of: <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a>, <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a>,  <a href='#SkPath_kInverseWinding_FillType'>kInverseWinding_FillType</a>,
+
+<a href='#SkPath_kInverseEvenOdd_FillType'>kInverseEvenOdd_FillType</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_getFillType">
+
+#### Example Output
+
+~~~~
+default path fill type is kWinding_FillType
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_FillType'>FillType</a> <a href='#SkPath_setFillType'>setFillType</a> <a href='#SkPath_isInverseFillType'>isInverseFillType</a>
+
+<a name='SkPath_setFillType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_setFillType'>setFillType</a>(<a href='#SkPath_FillType'>FillType</a> ft)
+</pre>
+
+Sets <a href='#SkPath_FillType'>FillType</a>, the rule used to fill <a href='SkPath_Reference#SkPath'>SkPath</a>. While there is no check
+that <a href='#SkPath_setFillType_ft'>ft</a> is legal, values outside of <a href='#SkPath_FillType'>FillType</a> are not supported.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_setFillType_ft'><code><strong>ft</strong></code></a></td>
+    <td>one of: <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a>, <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a>,  <a href='#SkPath_kInverseWinding_FillType'>kInverseWinding_FillType</a>,</td>
+  </tr>
+</table>
+
+<a href='#SkPath_kInverseEvenOdd_FillType'>kInverseEvenOdd_FillType</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_setFillType"><div>If empty <a href='SkPath_Reference#Path'>Path</a> is set to inverse <a href='#SkPath_FillType'>FillType</a>, it fills all pixels.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_FillType'>FillType</a> <a href='#SkPath_getFillType'>getFillType</a> <a href='#SkPath_toggleInverseFillType'>toggleInverseFillType</a>
+
+<a name='SkPath_isInverseFillType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_isInverseFillType'>isInverseFillType</a>()const
+</pre>
+
+Returns if <a href='#SkPath_FillType'>FillType</a> describes area outside <a href='SkPath_Reference#SkPath'>SkPath</a> geometry. The inverse fill area
+extends indefinitely.
+
+### Return Value
+
+true if <a href='#SkPath_FillType'>FillType</a> is <a href='#SkPath_kInverseWinding_FillType'>kInverseWinding_FillType</a> or <a href='#SkPath_kInverseEvenOdd_FillType'>kInverseEvenOdd_FillType</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_isInverseFillType_2">
+
+#### Example Output
+
+~~~~
+default path fill type is inverse: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_FillType'>FillType</a> <a href='#SkPath_getFillType'>getFillType</a> <a href='#SkPath_setFillType'>setFillType</a> <a href='#SkPath_toggleInverseFillType'>toggleInverseFillType</a>
+
+<a name='SkPath_toggleInverseFillType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_toggleInverseFillType'>toggleInverseFillType</a>()
+</pre>
+
+Replaces <a href='#SkPath_FillType'>FillType</a> with its inverse. The inverse of <a href='#SkPath_FillType'>FillType</a> describes the area
+unmodified by the original <a href='#SkPath_FillType'>FillType</a>.
+
+| <a href='#SkPath_FillType'>FillType</a> | toggled <a href='#SkPath_FillType'>FillType</a> |
+| --- | ---  |
+| <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a> | <a href='#SkPath_kInverseWinding_FillType'>kInverseWinding_FillType</a> |
+| <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a> | <a href='#SkPath_kInverseEvenOdd_FillType'>kInverseEvenOdd_FillType</a> |
+| <a href='#SkPath_kInverseWinding_FillType'>kInverseWinding_FillType</a> | <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a> |
+| <a href='#SkPath_kInverseEvenOdd_FillType'>kInverseEvenOdd_FillType</a> | <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a> |
+
+### Example
+
+<div><fiddle-embed name="400facce23d417bc5043c5f58404afbd"><div><a href='SkPath_Reference#Path'>Path</a> drawn normally and through its inverse touches every <a href='undocumented#Pixel'>pixel</a> once.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_FillType'>FillType</a> <a href='#SkPath_getFillType'>getFillType</a> <a href='#SkPath_setFillType'>setFillType</a> <a href='#SkPath_isInverseFillType'>isInverseFillType</a>
+
+<a name='Convexity'></a>
+
+<a name='SkPath_Convexity'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkPath_Convexity'>Convexity</a> : uint8_t {
+        <a href='#SkPath_kUnknown_Convexity'>kUnknown_Convexity</a>,
+        <a href='#SkPath_kConvex_Convexity'>kConvex_Convexity</a>,
+        <a href='#SkPath_kConcave_Convexity'>kConcave_Convexity</a>,
+    };
+</pre>
+
+<a href='SkPath_Reference#Path'>Path</a> is convex if it contains one <a href='SkPath_Overview#Contour'>Contour</a> and <a href='SkPath_Overview#Contour'>Contour</a> loops no more than
+360 degrees, and <a href='SkPath_Overview#Contour'>Contour</a> angles all have same <a href='#SkPath_Direction'>Direction</a>. Convex <a href='SkPath_Reference#Path'>Path</a>
+may have better performance and require fewer resources on <a href='#GPU_Surface'>GPU_Surface</a>.
+
+<a href='SkPath_Reference#Path'>Path</a> is concave when either at least one <a href='#SkPath_Direction'>Direction</a> change is clockwise and
+another is counterclockwise, or the sum of the changes in <a href='#SkPath_Direction'>Direction</a> is not 360
+degrees.
+
+Initially <a href='SkPath_Reference#Path'>Path</a> <a href='#SkPath_Convexity'>Convexity</a> is <a href='#SkPath_kUnknown_Convexity'>kUnknown_Convexity</a>. <a href='SkPath_Reference#Path'>Path</a> <a href='#SkPath_Convexity'>Convexity</a> is computed
+if needed by destination <a href='SkSurface_Reference#Surface'>Surface</a>.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kUnknown_Convexity'><code>SkPath::kUnknown_Convexity</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+indicates Convexity has not been determined</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kConvex_Convexity'><code>SkPath::kConvex_Convexity</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+one Contour made of a simple geometry without indentations</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kConcave_Convexity'><code>SkPath::kConcave_Convexity</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+more than one Contour, or a geometry with indentations</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="ac49e8b810bd6ed5d84b4f5a3b40a0ec"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_Direction'>Direction</a> <a href='#SkPath_getConvexity'>getConvexity</a> <a href='#SkPath_getConvexityOrUnknown'>getConvexityOrUnknown</a> <a href='#SkPath_setConvexity'>setConvexity</a> <a href='#SkPath_isConvex'>isConvex</a>
+
+<a name='SkPath_getConvexity'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPath_Convexity'>Convexity</a> <a href='#SkPath_getConvexity'>getConvexity</a>()const
+</pre>
+
+Computes <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Convexity'>Convexity</a> if required, and returns stored value.
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Convexity'>Convexity</a> is computed if stored value is <a href='#SkPath_kUnknown_Convexity'>kUnknown_Convexity</a>,
+or if <a href='SkPath_Reference#SkPath'>SkPath</a> has been altered since <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Convexity'>Convexity</a> was computed or set.
+
+### Return Value
+
+computed or stored <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Convexity'>Convexity</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_getConvexity"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_Convexity'>Convexity</a> <a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_Direction'>Direction</a> <a href='#SkPath_getConvexityOrUnknown'>getConvexityOrUnknown</a> <a href='#SkPath_setConvexity'>setConvexity</a> <a href='#SkPath_isConvex'>isConvex</a>
+
+<a name='SkPath_getConvexityOrUnknown'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPath_Convexity'>Convexity</a> <a href='#SkPath_getConvexityOrUnknown'>getConvexityOrUnknown</a>()const
+</pre>
+
+Returns last computed <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Convexity'>Convexity</a>, or <a href='#SkPath_kUnknown_Convexity'>kUnknown_Convexity</a> if
+<a href='SkPath_Reference#SkPath'>SkPath</a> has been altered since <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Convexity'>Convexity</a> was computed or set.
+
+### Return Value
+
+stored <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Convexity'>Convexity</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_getConvexityOrUnknown"><div><a href='#SkPath_Convexity'>Convexity</a> is unknown unless <a href='#SkPath_getConvexity'>getConvexity</a> is called without a subsequent call
+that alters the <a href='SkPath_Reference#Path'>path</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_Convexity'>Convexity</a> <a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_Direction'>Direction</a> <a href='#SkPath_getConvexity'>getConvexity</a> <a href='#SkPath_setConvexity'>setConvexity</a> <a href='#SkPath_isConvex'>isConvex</a>
+
+<a name='SkPath_setConvexity'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_setConvexity'>setConvexity</a>(<a href='#SkPath_Convexity'>Convexity</a> convexity)
+</pre>
+
+Stores <a href='#SkPath_setConvexity_convexity'>convexity</a> so that it is later returned by <a href='#SkPath_getConvexity'>getConvexity</a>() or <a href='#SkPath_getConvexityOrUnknown'>getConvexityOrUnknown</a>().
+<a href='#SkPath_setConvexity_convexity'>convexity</a> may differ from <a href='#SkPath_getConvexity'>getConvexity</a>(), although setting an incorrect value may
+cause incorrect or inefficient drawing.
+
+If <a href='#SkPath_setConvexity_convexity'>convexity</a> is <a href='#SkPath_kUnknown_Convexity'>kUnknown_Convexity</a>: <a href='#SkPath_getConvexity'>getConvexity</a>() will
+compute <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Convexity'>Convexity</a>, and <a href='#SkPath_getConvexityOrUnknown'>getConvexityOrUnknown</a>() will return <a href='#SkPath_kUnknown_Convexity'>kUnknown_Convexity</a>.
+
+If <a href='#SkPath_setConvexity_convexity'>convexity</a> is <a href='#SkPath_kConvex_Convexity'>kConvex_Convexity</a> or <a href='#SkPath_kConcave_Convexity'>kConcave_Convexity</a>, <a href='#SkPath_getConvexity'>getConvexity</a>()
+and <a href='#SkPath_getConvexityOrUnknown'>getConvexityOrUnknown</a>() will return <a href='#SkPath_setConvexity_convexity'>convexity</a> until the <a href='SkPath_Reference#Path'>path</a> is
+altered.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_setConvexity_convexity'><code><strong>convexity</strong></code></a></td>
+    <td>one of: <a href='#SkPath_kUnknown_Convexity'>kUnknown_Convexity</a>, <a href='#SkPath_kConvex_Convexity'>kConvex_Convexity</a>, or <a href='#SkPath_kConcave_Convexity'>kConcave_Convexity</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Path_setConvexity"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_Convexity'>Convexity</a> <a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_Direction'>Direction</a> <a href='#SkPath_getConvexity'>getConvexity</a> <a href='#SkPath_getConvexityOrUnknown'>getConvexityOrUnknown</a> <a href='#SkPath_isConvex'>isConvex</a>
+
+<a name='SkPath_isConvex'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_isConvex'>isConvex</a>()const
+</pre>
+
+Computes <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Convexity'>Convexity</a> if required, and returns true if value is <a href='#SkPath_kConvex_Convexity'>kConvex_Convexity</a>.
+If <a href='#SkPath_setConvexity'>setConvexity</a>() was called with <a href='#SkPath_kConvex_Convexity'>kConvex_Convexity</a> or <a href='#SkPath_kConcave_Convexity'>kConcave_Convexity</a>, and
+the <a href='SkPath_Reference#Path'>path</a> has not been altered, <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Convexity'>Convexity</a> is not recomputed.
+
+### Return Value
+
+true if <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Convexity'>Convexity</a> stored or computed is <a href='#SkPath_kConvex_Convexity'>kConvex_Convexity</a>
+
+### Example
+
+<div><fiddle-embed name="d8be8b6e59de244e4cbf58ec9554557b"><div>Concave shape is erroneously considered convex after a forced call to
+<a href='#SkPath_setConvexity'>setConvexity</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_Convexity'>Convexity</a> <a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_Direction'>Direction</a> <a href='#SkPath_getConvexity'>getConvexity</a> <a href='#SkPath_getConvexityOrUnknown'>getConvexityOrUnknown</a> <a href='#SkPath_setConvexity'>setConvexity</a>
+
+<a name='SkPath_isOval'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_isOval'>isOval</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* bounds)const
+</pre>
+
+Returns true if this <a href='SkPath_Reference#Path'>path</a> is recognized as an <a href='undocumented#Oval'>oval</a> or <a href='undocumented#Circle'>circle</a>.
+
+<a href='#SkPath_isOval_bounds'>bounds</a> receives <a href='#SkPath_isOval_bounds'>bounds</a> of <a href='undocumented#Oval'>oval</a>.
+
+<a href='#SkPath_isOval_bounds'>bounds</a> is unmodified if <a href='undocumented#Oval'>oval</a> is not found.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_isOval_bounds'><code><strong>bounds</strong></code></a></td>
+    <td>storage for bounding <a href='SkRect_Reference#SkRect'>SkRect</a> of <a href='undocumented#Oval'>oval</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkPath_Reference#SkPath'>SkPath</a> is recognized as an <a href='undocumented#Oval'>oval</a> or <a href='undocumented#Circle'>circle</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_isOval"></fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#Oval'>Oval</a> <a href='#SkPath_addCircle'>addCircle</a> <a href='#SkPath_addOval'>addOval</a>
+
+<a name='SkPath_isRRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_isRRect'>isRRect</a>(<a href='SkRRect_Reference#SkRRect'>SkRRect</a>* rrect)const
+</pre>
+
+Returns true if <a href='SkPath_Reference#Path'>path</a> is representable as <a href='SkRRect_Reference#SkRRect'>SkRRect</a>.
+Returns false if <a href='SkPath_Reference#Path'>path</a> is representable as <a href='undocumented#Oval'>oval</a>, <a href='undocumented#Circle'>circle</a>, or <a href='SkRect_Reference#SkRect'>SkRect</a>.
+
+<a href='#SkPath_isRRect_rrect'>rrect</a> receives bounds of <a href='SkRRect_Reference#SkRRect'>SkRRect</a>.
+
+<a href='#SkPath_isRRect_rrect'>rrect</a> is unmodified if <a href='SkRRect_Reference#SkRRect'>SkRRect</a> is not found.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_isRRect_rrect'><code><strong>rrect</strong></code></a></td>
+    <td>storage for bounding <a href='SkRect_Reference#SkRect'>SkRect</a> of <a href='SkRRect_Reference#SkRRect'>SkRRect</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkPath_Reference#SkPath'>SkPath</a> contains only <a href='SkRRect_Reference#SkRRect'>SkRRect</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_isRRect"><div>Draw rounded rectangle and its bounds.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#RRect'>Round_Rect</a> <a href='#SkPath_addRoundRect'>addRoundRect</a> <a href='#SkPath_addRRect'>addRRect</a>
+
+<a name='SkPath_reset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_reset'>reset()</a>
+</pre>
+
+Sets <a href='SkPath_Reference#SkPath'>SkPath</a> to its initial state.
+Removes verb array, <a href='SkPoint_Reference#SkPoint'>SkPoint</a> array, and <a href='SkPath_Reference#Conic_Weight'>weights</a>, and sets <a href='#SkPath_FillType'>FillType</a> to <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a>.
+Internal storage associated with <a href='SkPath_Reference#SkPath'>SkPath</a> is released.
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_reset"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_rewind'>rewind()</a>
+
+<a name='SkPath_rewind'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_rewind'>rewind()</a>
+</pre>
+
+Sets <a href='SkPath_Reference#SkPath'>SkPath</a> to its initial state, preserving internal storage.
+Removes verb array, <a href='SkPoint_Reference#SkPoint'>SkPoint</a> array, and <a href='SkPath_Reference#Conic_Weight'>weights</a>, and sets <a href='#SkPath_FillType'>FillType</a> to <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a>.
+Internal storage associated with <a href='SkPath_Reference#SkPath'>SkPath</a> is retained.
+
+Use <a href='#SkPath_rewind'>rewind()</a> instead of <a href='#SkPath_reset'>reset()</a> if <a href='SkPath_Reference#SkPath'>SkPath</a> storage will be reused and performance
+is critical.
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_rewind"><div>Although path1 retains its internal storage, it is indistinguishable from
+a newly initialized <a href='SkPath_Reference#Path'>path</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_reset'>reset()</a>
+
+<a name='SkPath_isEmpty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_isEmpty'>isEmpty</a>()const
+</pre>
+
+Returns if <a href='SkPath_Reference#SkPath'>SkPath</a> is empty.
+Empty <a href='SkPath_Reference#SkPath'>SkPath</a> may have <a href='#SkPath_FillType'>FillType</a> but has no <a href='SkPoint_Reference#SkPoint'>SkPoint</a>, <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a>, or <a href='SkPath_Reference#Conic'>conic</a> weight.
+<a href='#SkPath_empty_constructor'>SkPath()</a> constructs empty <a href='SkPath_Reference#SkPath'>SkPath</a>; <a href='#SkPath_reset'>reset()</a> and <a href='#SkPath_rewind'>rewind()</a> make <a href='SkPath_Reference#SkPath'>SkPath</a> empty.
+
+### Return Value
+
+true if the <a href='SkPath_Reference#Path'>path</a> contains no <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> array
+
+### Example
+
+<div><fiddle-embed name="@Path_isEmpty">
+
+#### Example Output
+
+~~~~
+initial path is empty
+after moveTo path is not empty
+after rewind path is empty
+after lineTo path is not empty
+after reset path is empty
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_empty_constructor'>SkPath()</a> <a href='#SkPath_reset'>reset()</a> <a href='#SkPath_rewind'>rewind()</a>
+
+<a name='SkPath_isLastContourClosed'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_isLastContourClosed'>isLastContourClosed</a>()const
+</pre>
+
+Returns if <a href='SkPath_Overview#Contour'>contour</a> is closed.
+<a href='SkPath_Overview#Contour'>Contour</a> is closed if <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> array was last modified by <a href='#SkPath_close'>close()</a>. When stroked,
+closed <a href='SkPath_Overview#Contour'>contour</a> draws <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Join'>Join</a> instead of <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Cap'>Cap</a> at first and last <a href='SkPoint_Reference#SkPoint'>SkPoint</a>.
+
+### Return Value
+
+true if the last <a href='SkPath_Overview#Contour'>contour</a> ends with a <a href='#SkPath_kClose_Verb'>kClose_Verb</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_isLastContourClosed"><div><a href='#SkPath_close'>close()</a> has no effect if <a href='SkPath_Reference#Path'>Path</a> is empty; <a href='#SkPath_isLastContourClosed'>isLastContourClosed</a>() returns
+false until <a href='SkPath_Reference#Path'>Path</a> has geometry followed by <a href='#SkPath_close'>close()</a>.
+</div>
+
+#### Example Output
+
+~~~~
+initial last contour is not closed
+after close last contour is not closed
+after lineTo last contour is not closed
+after close last contour is closed
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_close'>close()</a>
+
+<a name='SkPath_isFinite'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_isFinite'>isFinite</a>()const
+</pre>
+
+Returns true for finite <a href='SkPoint_Reference#SkPoint'>SkPoint</a> array values between negative <a href='undocumented#SK_ScalarMax'>SK_ScalarMax</a> and
+positive <a href='undocumented#SK_ScalarMax'>SK_ScalarMax</a>. Returns false for any <a href='SkPoint_Reference#SkPoint'>SkPoint</a> array value of
+<a href='undocumented#SK_ScalarInfinity'>SK_ScalarInfinity</a>, <a href='undocumented#SK_ScalarNegativeInfinity'>SK_ScalarNegativeInfinity</a>, or <a href='undocumented#SK_ScalarNaN'>SK_ScalarNaN</a>.
+
+### Return Value
+
+true if all <a href='SkPoint_Reference#SkPoint'>SkPoint</a> values are finite
+
+### Example
+
+<div><fiddle-embed name="@Path_isFinite">
+
+#### Example Output
+
+~~~~
+initial path is finite
+after line path is finite
+after scale path is not finite
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#SkScalar'>SkScalar</a>
+
+<a name='SkPath_isVolatile'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_isVolatile'>isVolatile</a>()const
+</pre>
+
+Returns true if the <a href='SkPath_Reference#Path'>path</a> is volatile; it will not be altered or discarded
+by the caller after it is drawn. <a href='SkPath_Reference#SkPath'>SkPath</a> by default have volatile set false, allowing
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> to attach a cache of <a href='undocumented#Data'>data</a> which speeds repeated drawing. If true, <a href='SkSurface_Reference#SkSurface'>SkSurface</a>
+may not speed repeated drawing.
+
+### Return Value
+
+true if caller will alter <a href='SkPath_Reference#SkPath'>SkPath</a> after drawing
+
+### Example
+
+<div><fiddle-embed name="@Path_isVolatile">
+
+#### Example Output
+
+~~~~
+volatile by default is false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_setIsVolatile'>setIsVolatile</a>
+
+<a name='Volatile'></a>
+
+<a name='SkPath_setIsVolatile'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_setIsVolatile'>setIsVolatile</a>(bool <a href='#SkPath_isVolatile'>isVolatile</a>)
+</pre>
+
+Specifies whether <a href='SkPath_Reference#SkPath'>SkPath</a> is volatile; whether it will be altered or discarded
+by the caller after it is drawn. <a href='SkPath_Reference#SkPath'>SkPath</a> by default have volatile set false, allowing
+<a href='undocumented#SkBaseDevice'>SkBaseDevice</a> to attach a cache of <a href='undocumented#Data'>data</a> which speeds repeated drawing.
+
+Mark temporary <a href='SkPath_Reference#Path'>paths</a>, discarded or modified after use, as volatile
+to inform <a href='undocumented#SkBaseDevice'>SkBaseDevice</a> that the <a href='SkPath_Reference#Path'>path</a> need not be cached.
+
+Mark animating <a href='SkPath_Reference#SkPath'>SkPath</a> volatile to improve performance.
+Mark unchanging <a href='SkPath_Reference#SkPath'>SkPath</a> non-volatile to improve repeated rendering.
+
+<a href='undocumented#Raster_Surface'>raster surface</a> <a href='SkPath_Reference#SkPath'>SkPath</a> draws are affected by volatile for some shadows.
+<a href='undocumented#GPU_Surface'>GPU surface</a> <a href='SkPath_Reference#SkPath'>SkPath</a> draws are affected by volatile for some shadows and concave geometries.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_setIsVolatile_isVolatile'><code><strong>isVolatile</strong></code></a></td>
+    <td>true if caller will alter <a href='SkPath_Reference#SkPath'>SkPath</a> after drawing</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Path_setIsVolatile"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_setIsVolatile_isVolatile'>isVolatile</a>
+
+<a name='SkPath_IsLineDegenerate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static bool <a href='#SkPath_IsLineDegenerate'>IsLineDegenerate</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p2, bool exact)
+</pre>
+
+Tests if <a href='undocumented#Line'>line</a> between <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pair is degenerate.
+<a href='undocumented#Line'>Line</a> with no length or that moves a very short distance is degenerate; it is
+treated as a <a href='SkPoint_Reference#Point'>point</a>.
+
+<a href='#SkPath_IsLineDegenerate_exact'>exact</a> changes the equality test. If true, returns true only if <a href='#SkPath_IsLineDegenerate_p1'>p1</a> equals <a href='#SkPath_IsLineDegenerate_p2'>p2</a>.
+If false, returns true if <a href='#SkPath_IsLineDegenerate_p1'>p1</a> equals or nearly equals <a href='#SkPath_IsLineDegenerate_p2'>p2</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_IsLineDegenerate_p1'><code><strong>p1</strong></code></a></td>
+    <td><a href='undocumented#Line'>line</a> start <a href='SkPoint_Reference#Point'>point</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_IsLineDegenerate_p2'><code><strong>p2</strong></code></a></td>
+    <td><a href='undocumented#Line'>line</a> end <a href='SkPoint_Reference#Point'>point</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_IsLineDegenerate_exact'><code><strong>exact</strong></code></a></td>
+    <td>if false, allow nearly equals</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='undocumented#Line'>line</a> is degenerate; its length is effectively zero
+
+### Example
+
+<div><fiddle-embed name="@Path_IsLineDegenerate"><div>As single precision floats, 100 and 100.000001 have the same bit representation,
+and are exactly equal. 100 and 100.0001 have different bit representations, and
+are not exactly equal, but are nearly equal.
+</div>
+
+#### Example Output
+
+~~~~
+line from (100,100) to (100,100) is degenerate, nearly
+line from (100,100) to (100,100) is degenerate, exactly
+line from (100,100) to (100.0001,100.0001) is degenerate, nearly
+line from (100,100) to (100.0001,100.0001) is not degenerate, exactly
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_IsQuadDegenerate'>IsQuadDegenerate</a> <a href='#SkPath_IsCubicDegenerate'>IsCubicDegenerate</a>
+
+<a name='SkPath_IsQuadDegenerate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static bool <a href='#SkPath_IsQuadDegenerate'>IsQuadDegenerate</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p2, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p3, bool exact)
+</pre>
+
+Tests if <a href='SkPath_Reference#Quad'>quad</a> is degenerate.
+<a href='SkPath_Reference#Quad'>Quad</a> with no length or that moves a very short distance is degenerate; it is
+treated as a <a href='SkPoint_Reference#Point'>point</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_IsQuadDegenerate_p1'><code><strong>p1</strong></code></a></td>
+    <td><a href='SkPath_Reference#Quad'>quad</a> start <a href='SkPoint_Reference#Point'>point</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_IsQuadDegenerate_p2'><code><strong>p2</strong></code></a></td>
+    <td><a href='SkPath_Reference#Quad'>quad</a> control <a href='SkPoint_Reference#Point'>point</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_IsQuadDegenerate_p3'><code><strong>p3</strong></code></a></td>
+    <td><a href='SkPath_Reference#Quad'>quad</a> end <a href='SkPoint_Reference#Point'>point</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_IsQuadDegenerate_exact'><code><strong>exact</strong></code></a></td>
+    <td>if true, returns true only if <a href='#SkPath_IsQuadDegenerate_p1'>p1</a>, <a href='#SkPath_IsQuadDegenerate_p2'>p2</a>, and <a href='#SkPath_IsQuadDegenerate_p3'>p3</a> are equal;</td>
+  </tr>
+</table>
+
+if false, returns true if <a href='#SkPath_IsQuadDegenerate_p1'>p1</a>, <a href='#SkPath_IsQuadDegenerate_p2'>p2</a>, and <a href='#SkPath_IsQuadDegenerate_p3'>p3</a> are equal or nearly equal
+
+### Return Value
+
+true if <a href='SkPath_Reference#Quad'>quad</a> is degenerate; its length is effectively zero
+
+### Example
+
+<div><fiddle-embed name="@Path_IsQuadDegenerate"><div>As single precision floats: 100, 100.00001, and 100.00002 have different bit representations
+but nearly the same value. Translating all three by 1000 gives them the same bit representation;
+the fractional portion of the number can not be represented by the float and is lost.
+</div>
+
+#### Example Output
+
+~~~~
+quad (100,100), (100.00001,100.00001), (100.00002,100.00002) is degenerate, nearly
+quad (1100,1100), (1100,1100), (1100,1100) is degenerate, nearly
+quad (100,100), (100.00001,100.00001), (100.00002,100.00002) is not degenerate, exactly
+quad (1100,1100), (1100,1100), (1100,1100) is degenerate, exactly
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_IsLineDegenerate'>IsLineDegenerate</a> <a href='#SkPath_IsCubicDegenerate'>IsCubicDegenerate</a>
+
+<a name='SkPath_IsCubicDegenerate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static bool <a href='#SkPath_IsCubicDegenerate'>IsCubicDegenerate</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p2, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p3,
+                              const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p4, bool exact)
+</pre>
+
+Tests if <a href='SkPath_Reference#Cubic'>cubic</a> is degenerate.
+<a href='SkPath_Reference#Cubic'>Cubic</a> with no length or that moves a very short distance is degenerate; it is
+treated as a <a href='SkPoint_Reference#Point'>point</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_IsCubicDegenerate_p1'><code><strong>p1</strong></code></a></td>
+    <td><a href='SkPath_Reference#Cubic'>cubic</a> start <a href='SkPoint_Reference#Point'>point</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_IsCubicDegenerate_p2'><code><strong>p2</strong></code></a></td>
+    <td><a href='SkPath_Reference#Cubic'>cubic</a> control <a href='SkPoint_Reference#Point'>point</a> 1</td>
+  </tr>
+  <tr>    <td><a name='SkPath_IsCubicDegenerate_p3'><code><strong>p3</strong></code></a></td>
+    <td><a href='SkPath_Reference#Cubic'>cubic</a> control <a href='SkPoint_Reference#Point'>point</a> 2</td>
+  </tr>
+  <tr>    <td><a name='SkPath_IsCubicDegenerate_p4'><code><strong>p4</strong></code></a></td>
+    <td><a href='SkPath_Reference#Cubic'>cubic</a> end <a href='SkPoint_Reference#Point'>point</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_IsCubicDegenerate_exact'><code><strong>exact</strong></code></a></td>
+    <td>if true, returns true only if <a href='#SkPath_IsCubicDegenerate_p1'>p1</a>, <a href='#SkPath_IsCubicDegenerate_p2'>p2</a>, <a href='#SkPath_IsCubicDegenerate_p3'>p3</a>, and <a href='#SkPath_IsCubicDegenerate_p4'>p4</a> are equal;</td>
+  </tr>
+</table>
+
+if false, returns true if <a href='#SkPath_IsCubicDegenerate_p1'>p1</a>, <a href='#SkPath_IsCubicDegenerate_p2'>p2</a>, <a href='#SkPath_IsCubicDegenerate_p3'>p3</a>, and <a href='#SkPath_IsCubicDegenerate_p4'>p4</a> are equal or nearly equal
+
+### Return Value
+
+true if <a href='SkPath_Reference#Cubic'>cubic</a> is degenerate; its length is effectively zero
+
+### Example
+
+<div><fiddle-embed name="@Path_IsCubicDegenerate">
+
+#### Example Output
+
+~~~~
+0.00024414062 is degenerate
+0.00024414065 is length
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPath_isLine'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_isLine'>isLine</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='undocumented#Line'>line</a>[2])const
+</pre>
+
+Returns true if <a href='SkPath_Reference#SkPath'>SkPath</a> contains only one <a href='#SkPath_isLine_line'>line</a>;
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> array has two entries: <a href='#SkPath_kMove_Verb'>kMove_Verb</a>, <a href='#SkPath_kLine_Verb'>kLine_Verb</a>.
+If <a href='SkPath_Reference#SkPath'>SkPath</a> contains one <a href='#SkPath_isLine_line'>line</a> and <a href='#SkPath_isLine_line'>line</a> is not nullptr, <a href='#SkPath_isLine_line'>line</a> is set to
+<a href='#SkPath_isLine_line'>line</a> start <a href='SkPoint_Reference#Point'>point</a> and <a href='#SkPath_isLine_line'>line</a> end <a href='SkPoint_Reference#Point'>point</a>.
+Returns false if <a href='SkPath_Reference#SkPath'>SkPath</a> is not one <a href='#SkPath_isLine_line'>line</a>; <a href='#SkPath_isLine_line'>line</a> is unaltered.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_isLine_line'><code><strong>line</strong></code></a></td>
+    <td>storage for <a href='#SkPath_isLine_line'>line</a>. May be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkPath_Reference#SkPath'>SkPath</a> contains exactly one <a href='#SkPath_isLine_line'>line</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_isLine">
+
+#### Example Output
+
+~~~~
+empty is not line
+zero line is line (0,0) (0,0)
+line is line (10,10) (20,20)
+second move is not line
+~~~~
+
+</fiddle-embed></div>
+
+<a name='Point_Array'></a>
+
+<a href='#Path_Point_Array'>Point_Array</a> contains <a href='SkPoint_Reference#Point'>Points</a> satisfying the allocated <a href='SkPoint_Reference#Point'>Points</a> for
+each <a href='#SkPath_Verb'>Verb</a> in <a href='#Path_Verb_Array'>Verb_Array</a>. For instance, <a href='SkPath_Reference#Path'>Path</a> containing one <a href='SkPath_Overview#Contour'>Contour</a> with <a href='undocumented#Line'>Line</a>
+and <a href='SkPath_Reference#Quad'>Quad</a> is described by <a href='#Path_Verb_Array'>Verb_Array</a>: <a href='#SkPath_kMove_Verb'>kMove_Verb</a>, <a href='#SkPath_kLine_Verb'>kLine_Verb</a>, <a href='#SkPath_kQuad_Verb'>kQuad_Verb</a>; and
+one <a href='SkPoint_Reference#Point'>Point</a> for move, one <a href='SkPoint_Reference#Point'>Point</a> for <a href='undocumented#Line'>Line</a>, two <a href='SkPoint_Reference#Point'>Points</a> for <a href='SkPath_Reference#Quad'>Quad</a>; totaling four <a href='SkPoint_Reference#Point'>Points</a>.
+
+<a href='#Path_Point_Array'>Point_Array</a> may be read directly from <a href='SkPath_Reference#Path'>Path</a> with <a href='#SkPath_getPoints'>getPoints</a>, or inspected with
+<a href='#SkPath_getPoint'>getPoint</a>, with <a href='#SkPath_Iter'>Iter</a>, or with <a href='#SkPath_RawIter'>RawIter</a>.
+
+<a name='SkPath_getPoints'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkPath_getPoints'>getPoints</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='SkPoint_Reference#Point'>points</a>[], int max)const
+</pre>
+
+Returns number of <a href='#SkPath_getPoints_points'>points</a> in <a href='SkPath_Reference#SkPath'>SkPath</a>. Up to <a href='#SkPath_getPoints_max'>max</a> <a href='#SkPath_getPoints_points'>points</a> are copied.
+<a href='#SkPath_getPoints_points'>points</a> may be nullptr; then, <a href='#SkPath_getPoints_max'>max</a> must be zero.
+If <a href='#SkPath_getPoints_max'>max</a> is greater than number of <a href='#SkPath_getPoints_points'>points</a>, excess <a href='#SkPath_getPoints_points'>points</a> storage is unaltered.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_getPoints_points'><code><strong>points</strong></code></a></td>
+    <td>storage for <a href='SkPath_Reference#SkPath'>SkPath</a>  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>. May be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkPath_getPoints_max'><code><strong>max</strong></code></a></td>
+    <td>maximum to copy; must be greater than or equal to zero</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkPath_Reference#SkPath'>SkPath</a>  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> length
+
+### Example
+
+<div><fiddle-embed name="@Path_getPoints">
+
+#### Example Output
+
+~~~~
+no points point count: 3
+zero max point count: 3
+too small point count: 3  (0,0) (20,20)
+just right point count: 3  (0,0) (20,20) (-10,-10)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_countPoints'>countPoints</a> <a href='#SkPath_getPoint'>getPoint</a>
+
+<a name='SkPath_countPoints'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkPath_countPoints'>countPoints</a>()const
+</pre>
+
+Returns the number of <a href='SkPoint_Reference#Point'>points</a> in <a href='SkPath_Reference#SkPath'>SkPath</a>.
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a> count is initially zero.
+
+### Return Value
+
+<a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> array length
+
+### Example
+
+<div><fiddle-embed name="@Path_countPoints">
+
+#### Example Output
+
+~~~~
+empty point count: 0
+zero line point count: 2
+line point count: 2
+second move point count: 3
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_getPoints'>getPoints</a>
+
+<a name='SkPath_getPoint'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_getPoint'>getPoint</a>(int index)const
+</pre>
+
+Returns <a href='SkPoint_Reference#SkPoint'>SkPoint</a> at <a href='#SkPath_getPoint_index'>index</a> in  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>. Valid range for <a href='#SkPath_getPoint_index'>index</a> is
+0 to <a href='#SkPath_countPoints'>countPoints</a>() - 1.
+Returns (0, 0) if <a href='#SkPath_getPoint_index'>index</a> is out of range.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_getPoint_index'><code><strong>index</strong></code></a></td>
+    <td><a href='SkPath_Reference#Point_Array'>SkPoint array</a> element selector</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkPath_Reference#Point_Array'>SkPoint array</a> value or (0, 0)
+
+### Example
+
+<div><fiddle-embed name="@Path_getPoint">
+
+#### Example Output
+
+~~~~
+point 0: (-10,-10)
+point 1: (10,10)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_countPoints'>countPoints</a> <a href='#SkPath_getPoints'>getPoints</a>
+
+<a name='Verb_Array'></a>
+
+<a href='#Path_Verb_Array'>Verb_Array</a> always starts with <a href='#SkPath_kMove_Verb'>kMove_Verb</a>.
+If <a href='#SkPath_kClose_Verb'>kClose_Verb</a> is not the last entry, it is always followed by <a href='#SkPath_kMove_Verb'>kMove_Verb</a>;
+the quantity of <a href='#SkPath_kMove_Verb'>kMove_Verb</a> equals the <a href='SkPath_Overview#Contour'>Contour</a> count.
+<a href='#Path_Verb_Array'>Verb_Array</a> does not include or count <a href='#SkPath_kDone_Verb'>kDone_Verb</a>; it is a convenience
+returned when iterating through <a href='#Path_Verb_Array'>Verb_Array</a>.
+
+<a href='#Path_Verb_Array'>Verb_Array</a> may be read directly from <a href='SkPath_Reference#Path'>Path</a> with <a href='#SkPath_getVerbs'>getVerbs</a>, or inspected with <a href='#SkPath_Iter'>Iter</a>,
+or with <a href='#SkPath_RawIter'>RawIter</a>.
+
+<a name='SkPath_countVerbs'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkPath_countVerbs'>countVerbs</a>()const
+</pre>
+
+Returns the number of <a href='SkPath_Reference#Verb'>verbs</a>: <a href='#SkPath_kMove_Verb'>kMove_Verb</a>, <a href='#SkPath_kLine_Verb'>kLine_Verb</a>, <a href='#SkPath_kQuad_Verb'>kQuad_Verb</a>, <a href='#SkPath_kConic_Verb'>kConic_Verb</a>,
+<a href='#SkPath_kCubic_Verb'>kCubic_Verb</a>, and <a href='#SkPath_kClose_Verb'>kClose_Verb</a>; added to <a href='SkPath_Reference#SkPath'>SkPath</a>.
+
+### Return Value
+
+length of verb array
+
+### Example
+
+<div><fiddle-embed name="@Path_countVerbs">
+
+#### Example Output
+
+~~~~
+empty verb count: 0
+round rect verb count: 10
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_getVerbs'>getVerbs</a> <a href='#SkPath_Iter'>Iter</a> <a href='#SkPath_RawIter'>RawIter</a>
+
+<a name='SkPath_getVerbs'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkPath_getVerbs'>getVerbs</a>(uint8_t <a href='SkPath_Reference#Verb'>verbs</a>[], int max)const
+</pre>
+
+Returns the number of <a href='#SkPath_getVerbs_verbs'>verbs</a> in the <a href='SkPath_Reference#Path'>path</a>. Up to <a href='#SkPath_getVerbs_max'>max</a> <a href='#SkPath_getVerbs_verbs'>verbs</a> are copied. The
+<a href='#SkPath_getVerbs_verbs'>verbs</a> are copied as one byte per verb.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_getVerbs_verbs'><code><strong>verbs</strong></code></a></td>
+    <td>storage for <a href='#SkPath_getVerbs_verbs'>verbs</a>, may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkPath_getVerbs_max'><code><strong>max</strong></code></a></td>
+    <td>maximum number to copy into <a href='#SkPath_getVerbs_verbs'>verbs</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+the actual number of <a href='#SkPath_getVerbs_verbs'>verbs</a> in the <a href='SkPath_Reference#Path'>path</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_getVerbs">
+
+#### Example Output
+
+~~~~
+no verbs verb count: 3
+zero max verb count: 3
+too small verb count: 3  move line
+just right verb count: 3  move line line
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_countVerbs'>countVerbs</a> <a href='#SkPath_getPoints'>getPoints</a> <a href='#SkPath_Iter'>Iter</a> <a href='#SkPath_RawIter'>RawIter</a>
+
+<a name='SkPath_swap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_swap'>swap</a>(<a href='SkPath_Reference#SkPath'>SkPath</a>& other)
+</pre>
+
+Exchanges the  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, <a href='SkPath_Reference#Conic_Weight'>weights</a>, and <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_FillType'>FillType</a> with <a href='#SkPath_swap_other'>other</a>.
+Cached state is also exchanged. <a href='#SkPath_swap'>swap()</a> internally exchanges pointers, so
+it is lightweight and does not allocate memory.
+
+<a href='#SkPath_swap'>swap()</a> usage has largely been replaced by <a href='#SkPath_copy_operator'>operator=</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>).
+<a href='SkPath_Reference#SkPath'>SkPath</a> do not copy their content on assignment until they are written to,
+making assignment as efficient as <a href='#SkPath_swap'>swap()</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_swap_other'><code><strong>other</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> exchanged by value</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Path_swap">
+
+#### Example Output
+
+~~~~
+path1 bounds = 0, 0, 0, 0
+path2 bounds = 10, 20, 30, 40
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_copy_operator'>operator=</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>)
+
+<a name='SkPath_getBounds'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='#SkPath_getBounds'>getBounds</a>()const
+</pre>
+
+Returns minimum and maximum axes values of <a href='SkPoint_Reference#SkPoint'>SkPoint</a> array.
+Returns (0, 0, 0, 0) if <a href='SkPath_Reference#SkPath'>SkPath</a> contains no <a href='SkPoint_Reference#Point'>points</a>. Returned bounds width and height may
+be larger or smaller than area affected when <a href='SkPath_Reference#SkPath'>SkPath</a> is drawn.
+
+<a href='SkRect_Reference#SkRect'>SkRect</a> returned includes all <a href='SkPoint_Reference#SkPoint'>SkPoint</a> added to <a href='SkPath_Reference#SkPath'>SkPath</a>, including <a href='SkPoint_Reference#SkPoint'>SkPoint</a> associated with
+<a href='#SkPath_kMove_Verb'>kMove_Verb</a> that define empty <a href='SkPath_Overview#Contour'>contours</a>.
+
+### Return Value
+
+bounds of all <a href='SkPoint_Reference#SkPoint'>SkPoint</a> in <a href='SkPoint_Reference#SkPoint'>SkPoint</a> array
+
+### Example
+
+<div><fiddle-embed name="@Path_getBounds"><div>Bounds of upright <a href='undocumented#Circle'>Circle</a> can be predicted from center and radius.
+Bounds of rotated <a href='undocumented#Circle'>Circle</a> includes control <a href='SkPoint_Reference#Point'>Points</a> outside of filled area.
+</div>
+
+#### Example Output
+
+~~~~
+empty bounds = 0, 0, 0, 0
+circle bounds = 25, 20, 75, 70
+rotated circle bounds = 14.6447, 9.64466, 85.3553, 80.3553
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_computeTightBounds'>computeTightBounds</a> <a href='#SkPath_updateBoundsCache'>updateBoundsCache</a>
+
+<a name='Utility'></a>
+
+<a name='SkPath_updateBoundsCache'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_updateBoundsCache'>updateBoundsCache</a>()const
+</pre>
+
+Updates internal bounds so that subsequent calls to <a href='#SkPath_getBounds'>getBounds</a>() are instantaneous.
+Unaltered copies of <a href='SkPath_Reference#SkPath'>SkPath</a> may also access cached bounds through <a href='#SkPath_getBounds'>getBounds</a>().
+
+For now, identical to calling <a href='#SkPath_getBounds'>getBounds</a>() and ignoring the returned value.
+
+Call to prepare <a href='SkPath_Reference#SkPath'>SkPath</a> subsequently drawn from multiple threads,
+to avoid a race condition where each draw separately computes the bounds.
+
+### Example
+
+<div><fiddle-embed name="@Path_updateBoundsCache">
+
+#### Example Output
+
+~~~~
+#Volatile
+uncached avg: 0.18048 ms
+cached avg: 0.182784 ms
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_getBounds'>getBounds</a>
+
+<a name='SkPath_computeTightBounds'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkPath_computeTightBounds'>computeTightBounds</a>()const
+</pre>
+
+Returns minimum and maximum axes values of the <a href='undocumented#Line'>lines</a> and <a href='undocumented#Curve'>curves</a> in <a href='SkPath_Reference#SkPath'>SkPath</a>.
+Returns (0, 0, 0, 0) if <a href='SkPath_Reference#SkPath'>SkPath</a> contains no <a href='SkPoint_Reference#Point'>points</a>.
+Returned bounds width and height may be larger or smaller than area affected
+when <a href='SkPath_Reference#SkPath'>SkPath</a> is drawn.
+
+Includes <a href='SkPoint_Reference#SkPoint'>SkPoint</a> associated with <a href='#SkPath_kMove_Verb'>kMove_Verb</a> that define empty
+<a href='SkPath_Overview#Contour'>contours</a>.
+
+Behaves identically to <a href='#SkPath_getBounds'>getBounds</a>() when <a href='SkPath_Reference#SkPath'>SkPath</a> contains
+only <a href='undocumented#Line'>lines</a>. If <a href='SkPath_Reference#SkPath'>SkPath</a> contains <a href='undocumented#Curve'>curves</a>, computed bounds includes
+the maximum extent of the <a href='SkPath_Reference#Quad'>quad</a>, <a href='SkPath_Reference#Conic'>conic</a>, or <a href='SkPath_Reference#Cubic'>cubic</a>; is slower than <a href='#SkPath_getBounds'>getBounds</a>();
+and unlike <a href='#SkPath_getBounds'>getBounds</a>(), does not cache the result.
+
+### Return Value
+
+tight bounds of <a href='undocumented#Curve'>curves</a> in <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_computeTightBounds">
+
+#### Example Output
+
+~~~~
+empty bounds = 0, 0, 0, 0
+circle bounds = 25, 20, 75, 70
+rotated circle bounds = 25, 20, 75, 70
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_getBounds'>getBounds</a>
+
+<a name='SkPath_conservativelyContainsRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_conservativelyContainsRect'>conservativelyContainsRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>)const
+</pre>
+
+Returns true if <a href='#SkPath_conservativelyContainsRect_rect'>rect</a> is contained by <a href='SkPath_Reference#SkPath'>SkPath</a>.
+May return false when <a href='#SkPath_conservativelyContainsRect_rect'>rect</a> is contained by <a href='SkPath_Reference#SkPath'>SkPath</a>.
+
+For now, only returns true if <a href='SkPath_Reference#SkPath'>SkPath</a> has one <a href='SkPath_Overview#Contour'>contour</a> and is convex.
+<a href='#SkPath_conservativelyContainsRect_rect'>rect</a> may share <a href='SkPoint_Reference#Point'>points</a> and edges with <a href='SkPath_Reference#SkPath'>SkPath</a> and be contained.
+Returns true if <a href='#SkPath_conservativelyContainsRect_rect'>rect</a> is empty, that is, it has zero width or height; and
+the <a href='SkPoint_Reference#SkPoint'>SkPoint</a> or <a href='undocumented#Line'>line</a> described by <a href='#SkPath_conservativelyContainsRect_rect'>rect</a> is contained by <a href='SkPath_Reference#SkPath'>SkPath</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_conservativelyContainsRect_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a>, <a href='undocumented#Line'>line</a>, or <a href='SkPoint_Reference#SkPoint'>SkPoint</a> checked for containment</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkPath_conservativelyContainsRect_rect'>rect</a> is contained
+
+### Example
+
+<div><fiddle-embed name="@Path_conservativelyContainsRect"><div><a href='SkRect_Reference#Rect'>Rect</a> is drawn in blue if it is contained by red <a href='SkPath_Reference#Path'>Path</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_contains'>contains</a> <a href='undocumented#Op'>Op</a> <a href='SkRect_Reference#Rect'>Rect</a> <a href='#SkPath_Convexity'>Convexity</a>
+
+<a name='SkPath_incReserve'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_incReserve'>incReserve</a>(int extraPtCount)
+</pre>
+
+Grows <a href='SkPath_Reference#SkPath'>SkPath</a>  <a href='#Verb_Array'>verb array</a> and  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> to contain <a href='#SkPath_incReserve_extraPtCount'>extraPtCount</a> additional <a href='SkPoint_Reference#SkPoint'>SkPoint</a>.
+May improve performance and use less memory by
+reducing the number and <a href='undocumented#Size'>size</a> of allocations when creating <a href='SkPath_Reference#SkPath'>SkPath</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_incReserve_extraPtCount'><code><strong>extraPtCount</strong></code></a></td>
+    <td>number of additional <a href='SkPoint_Reference#SkPoint'>SkPoint</a> to allocate</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Path_incReserve"></fiddle-embed></div>
+
+### See Also
+
+<a href='#Path_Point_Array'>Point_Array</a>
+
+<a name='SkPath_shrinkToFit'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_shrinkToFit'>shrinkToFit</a>()
+</pre>
+
+Shrinks <a href='SkPath_Reference#SkPath'>SkPath</a> verb array and <a href='SkPoint_Reference#SkPoint'>SkPoint</a> array storage to discard unused capacity.
+May reduce the heap overhead for <a href='SkPath_Reference#SkPath'>SkPath</a> known to be fully constructed.
+
+### See Also
+
+<a href='#SkPath_incReserve'>incReserve</a>
+
+<a name='Build'></a>
+
+<a name='SkPath_moveTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_moveTo'>moveTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y)
+</pre>
+
+Adds beginning of <a href='SkPath_Overview#Contour'>contour</a> at <a href='SkPoint_Reference#SkPoint'>SkPoint</a> (<a href='#SkPath_moveTo_x'>x</a>, <a href='#SkPath_moveTo_y'>y</a>).
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_moveTo_x'><code><strong>x</strong></code></a></td>
+    <td>x-axis value of <a href='SkPath_Overview#Contour'>contour</a> start</td>
+  </tr>
+  <tr>    <td><a name='SkPath_moveTo_y'><code><strong>y</strong></code></a></td>
+    <td>y-axis value of <a href='SkPath_Overview#Contour'>contour</a> start</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_moveTo"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_lineTo'>lineTo</a> <a href='#SkPath_rMoveTo'>rMoveTo</a> <a href='#SkPath_quadTo'>quadTo</a> <a href='#SkPath_conicTo'>conicTo</a> <a href='#SkPath_cubicTo'>cubicTo</a> <a href='#SkPath_close'>close()</a>
+
+<a name='SkPath_moveTo_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_moveTo'>moveTo</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p)
+</pre>
+
+Adds beginning of <a href='SkPath_Overview#Contour'>contour</a> at <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_moveTo_2_p'>p</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_moveTo_2_p'><code><strong>p</strong></code></a></td>
+    <td><a href='SkPath_Overview#Contour'>contour</a> start</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_moveTo_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_lineTo'>lineTo</a> <a href='#SkPath_rMoveTo'>rMoveTo</a> <a href='#SkPath_quadTo'>quadTo</a> <a href='#SkPath_conicTo'>conicTo</a> <a href='#SkPath_cubicTo'>cubicTo</a> <a href='#SkPath_close'>close()</a>
+
+<a name='SkPath_rMoveTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_rMoveTo'>rMoveTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Adds beginning of <a href='SkPath_Overview#Contour'>contour</a> relative to  <a href='#Last_Point'>last point</a>.
+If <a href='SkPath_Reference#SkPath'>SkPath</a> is empty, starts <a href='SkPath_Overview#Contour'>contour</a> at (<a href='#SkPath_rMoveTo_dx'>dx</a>, <a href='#SkPath_rMoveTo_dy'>dy</a>).
+Otherwise, start <a href='SkPath_Overview#Contour'>contour</a> at  <a href='#Last_Point'>last point</a> offset by (<a href='#SkPath_rMoveTo_dx'>dx</a>, <a href='#SkPath_rMoveTo_dy'>dy</a>).
+Function name stands for "relative move to".
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_rMoveTo_dx'><code><strong>dx</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to <a href='SkPath_Overview#Contour'>contour</a> start on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rMoveTo_dy'><code><strong>dy</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to <a href='SkPath_Overview#Contour'>contour</a> start on y-axis</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="63e32dec4b2d8440b427f368bf8313a4"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_lineTo'>lineTo</a> <a href='#SkPath_moveTo'>moveTo</a> <a href='#SkPath_quadTo'>quadTo</a> <a href='#SkPath_conicTo'>conicTo</a> <a href='#SkPath_cubicTo'>cubicTo</a> <a href='#SkPath_close'>close()</a>
+
+<a name='SkPath_lineTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_lineTo'>lineTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y)
+</pre>
+
+Adds <a href='undocumented#Line'>line</a> from  <a href='#Last_Point'>last point</a> to (<a href='#SkPath_lineTo_x'>x</a>, <a href='#SkPath_lineTo_y'>y</a>). If <a href='SkPath_Reference#SkPath'>SkPath</a> is empty, or last <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> is
+<a href='#SkPath_kClose_Verb'>kClose_Verb</a>,  <a href='#Last_Point'>last point</a> is set to (0, 0) before adding <a href='undocumented#Line'>line</a>.
+
+<a href='#SkPath_lineTo'>lineTo</a>() appends <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to  <a href='#Verb_Array'>verb array</a> and (0, 0) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, if needed.
+<a href='#SkPath_lineTo'>lineTo</a>() then appends <a href='#SkPath_kLine_Verb'>kLine_Verb</a> to  <a href='#Verb_Array'>verb array</a> and (<a href='#SkPath_lineTo_x'>x</a>, <a href='#SkPath_lineTo_y'>y</a>) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_lineTo_x'><code><strong>x</strong></code></a></td>
+    <td>end of added <a href='undocumented#Line'>line</a> on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_lineTo_y'><code><strong>y</strong></code></a></td>
+    <td>end of added <a href='undocumented#Line'>line</a> on y-axis</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="e311cdd451edacec33b50cc22a4dd5dc"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_moveTo'>moveTo</a> <a href='#SkPath_rLineTo'>rLineTo</a> <a href='#SkPath_addRect'>addRect</a>
+
+<a name='SkPath_lineTo_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_lineTo'>lineTo</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p)
+</pre>
+
+Adds <a href='undocumented#Line'>line</a> from  <a href='#Last_Point'>last point</a> to <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_lineTo_2_p'>p</a>. If <a href='SkPath_Reference#SkPath'>SkPath</a> is empty, or last <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> is
+<a href='#SkPath_kClose_Verb'>kClose_Verb</a>,  <a href='#Last_Point'>last point</a> is set to (0, 0) before adding <a href='undocumented#Line'>line</a>.
+
+<a href='#SkPath_lineTo'>lineTo</a>() first appends <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to  <a href='#Verb_Array'>verb array</a> and (0, 0) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, if needed.
+<a href='#SkPath_lineTo'>lineTo</a>() then appends <a href='#SkPath_kLine_Verb'>kLine_Verb</a> to  <a href='#Verb_Array'>verb array</a> and <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_lineTo_2_p'>p</a> to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_lineTo_2_p'><code><strong>p</strong></code></a></td>
+    <td>end <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of added <a href='undocumented#Line'>line</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_lineTo_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_moveTo'>moveTo</a> <a href='#SkPath_rLineTo'>rLineTo</a> <a href='#SkPath_addRect'>addRect</a>
+
+<a name='SkPath_rLineTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_rLineTo'>rLineTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Adds <a href='undocumented#Line'>line</a> from  <a href='#Last_Point'>last point</a> to <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rLineTo_dx'>dx</a>, <a href='#SkPath_rLineTo_dy'>dy</a>). If <a href='SkPath_Reference#SkPath'>SkPath</a> is empty, or last <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> is
+<a href='#SkPath_kClose_Verb'>kClose_Verb</a>,  <a href='#Last_Point'>last point</a> is set to (0, 0) before adding <a href='undocumented#Line'>line</a>.
+
+Appends <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to  <a href='#Verb_Array'>verb array</a> and (0, 0) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, if needed;
+then appends <a href='#SkPath_kLine_Verb'>kLine_Verb</a> to  <a href='#Verb_Array'>verb array</a> and <a href='undocumented#Line'>line</a> end to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+<a href='undocumented#Line'>Line</a> end is  <a href='#Last_Point'>last point</a> plus <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rLineTo_dx'>dx</a>, <a href='#SkPath_rLineTo_dy'>dy</a>).
+Function name stands for "relative <a href='undocumented#Line'>line</a> to".
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_rLineTo_dx'><code><strong>dx</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to <a href='undocumented#Line'>line</a> end on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rLineTo_dy'><code><strong>dy</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to <a href='undocumented#Line'>line</a> end on y-axis</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_rLineTo"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_moveTo'>moveTo</a> <a href='#SkPath_lineTo'>lineTo</a> <a href='#SkPath_addRect'>addRect</a>
+
+<a name='Quad'></a>
+
+---
+
+<a href='SkPath_Reference#Quad'>Quad</a> describes a <a href='#Path_Quad'>Quadratic_Bezier</a>, a second-order <a href='undocumented#Curve'>curve</a> identical to a section
+of a parabola. <a href='SkPath_Reference#Quad'>Quad</a> begins at a start <a href='SkPoint_Reference#Point'>Point</a>, <a href='undocumented#Curve'>curves</a> towards a control <a href='SkPoint_Reference#Point'>Point</a>,
+and then <a href='undocumented#Curve'>curves</a> to an end <a href='SkPoint_Reference#Point'>Point</a>.
+
+### Example
+
+<div><fiddle-embed name="@Quad_a"></fiddle-embed></div>
+
+<a href='SkPath_Reference#Quad'>Quad</a> is a special case of <a href='SkPath_Reference#Conic'>Conic</a> where <a href='#Path_Conic_Weight'>Conic_Weight</a> is set to one.
+
+<a href='SkPath_Reference#Quad'>Quad</a> is always contained by the triangle connecting its three <a href='SkPoint_Reference#Point'>Points</a>. <a href='SkPath_Reference#Quad'>Quad</a>
+begins tangent to the <a href='undocumented#Line'>line</a> between start <a href='SkPoint_Reference#Point'>Point</a> and control <a href='SkPoint_Reference#Point'>Point</a>, and ends
+tangent to the <a href='undocumented#Line'>line</a> between control <a href='SkPoint_Reference#Point'>Point</a> and end <a href='SkPoint_Reference#Point'>Point</a>.
+
+### Example
+
+<div><fiddle-embed name="@Quad_b"></fiddle-embed></div>
+
+<a name='SkPath_quadTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_quadTo'>quadTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> x1, <a href='undocumented#SkScalar'>SkScalar</a> y1, <a href='undocumented#SkScalar'>SkScalar</a> x2, <a href='undocumented#SkScalar'>SkScalar</a> y2)
+</pre>
+
+Adds <a href='SkPath_Reference#Quad'>quad</a> from  <a href='#Last_Point'>last point</a> towards (<a href='#SkPath_quadTo_x1'>x1</a>, <a href='#SkPath_quadTo_y1'>y1</a>), to (<a href='#SkPath_quadTo_x2'>x2</a>, <a href='#SkPath_quadTo_y2'>y2</a>).
+If <a href='SkPath_Reference#SkPath'>SkPath</a> is empty, or last <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> is <a href='#SkPath_kClose_Verb'>kClose_Verb</a>,  <a href='#Last_Point'>last point</a> is set to (0, 0)
+before adding <a href='SkPath_Reference#Quad'>quad</a>.
+
+Appends <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to  <a href='#Verb_Array'>verb array</a> and (0, 0) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, if needed;
+then appends <a href='#SkPath_kQuad_Verb'>kQuad_Verb</a> to  <a href='#Verb_Array'>verb array</a>; and (<a href='#SkPath_quadTo_x1'>x1</a>, <a href='#SkPath_quadTo_y1'>y1</a>), (<a href='#SkPath_quadTo_x2'>x2</a>, <a href='#SkPath_quadTo_y2'>y2</a>)
+to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_quadTo_x1'><code><strong>x1</strong></code></a></td>
+    <td>control <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Quad'>quad</a> on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_quadTo_y1'><code><strong>y1</strong></code></a></td>
+    <td>control <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Quad'>quad</a> on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_quadTo_x2'><code><strong>x2</strong></code></a></td>
+    <td>end <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Quad'>quad</a> on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_quadTo_y2'><code><strong>y2</strong></code></a></td>
+    <td>end <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Quad'>quad</a> on y-axis</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_quadTo"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_moveTo'>moveTo</a> <a href='#SkPath_conicTo'>conicTo</a> <a href='#SkPath_rQuadTo'>rQuadTo</a>
+
+<a name='SkPath_quadTo_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_quadTo'>quadTo</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p2)
+</pre>
+
+Adds <a href='SkPath_Reference#Quad'>quad</a> from  <a href='#Last_Point'>last point</a> towards <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_quadTo_2_p1'>p1</a>, to <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_quadTo_2_p2'>p2</a>.
+If <a href='SkPath_Reference#SkPath'>SkPath</a> is empty, or last <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> is <a href='#SkPath_kClose_Verb'>kClose_Verb</a>,  <a href='#Last_Point'>last point</a> is set to (0, 0)
+before adding <a href='SkPath_Reference#Quad'>quad</a>.
+
+Appends <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to  <a href='#Verb_Array'>verb array</a> and (0, 0) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, if needed;
+then appends <a href='#SkPath_kQuad_Verb'>kQuad_Verb</a> to  <a href='#Verb_Array'>verb array</a>; and <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_quadTo_2_p1'>p1</a>, <a href='#SkPath_quadTo_2_p2'>p2</a>
+to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_quadTo_2_p1'><code><strong>p1</strong></code></a></td>
+    <td>control <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of added <a href='SkPath_Reference#Quad'>quad</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_quadTo_2_p2'><code><strong>p2</strong></code></a></td>
+    <td>end <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of added <a href='SkPath_Reference#Quad'>quad</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_quadTo_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_moveTo'>moveTo</a> <a href='#SkPath_conicTo'>conicTo</a> <a href='#SkPath_rQuadTo'>rQuadTo</a>
+
+<a name='SkPath_rQuadTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_rQuadTo'>rQuadTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx1, <a href='undocumented#SkScalar'>SkScalar</a> dy1, <a href='undocumented#SkScalar'>SkScalar</a> dx2, <a href='undocumented#SkScalar'>SkScalar</a> dy2)
+</pre>
+
+Adds <a href='SkPath_Reference#Quad'>quad</a> from  <a href='#Last_Point'>last point</a> towards <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rQuadTo_dx1'>dx1</a>, <a href='#SkPath_rQuadTo_dy1'>dy1</a>), to <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rQuadTo_dx2'>dx2</a>, <a href='#SkPath_rQuadTo_dy2'>dy2</a>).
+If <a href='SkPath_Reference#SkPath'>SkPath</a> is empty, or last <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a>
+is <a href='#SkPath_kClose_Verb'>kClose_Verb</a>,  <a href='#Last_Point'>last point</a> is set to (0, 0) before adding <a href='SkPath_Reference#Quad'>quad</a>.
+
+Appends <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to  <a href='#Verb_Array'>verb array</a> and (0, 0) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>,
+if needed; then appends <a href='#SkPath_kQuad_Verb'>kQuad_Verb</a> to  <a href='#Verb_Array'>verb array</a>; and appends <a href='SkPath_Reference#Quad'>quad</a>
+control and <a href='SkPath_Reference#Quad'>quad</a> end to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+<a href='SkPath_Reference#Quad'>Quad</a> control is  <a href='#Last_Point'>last point</a> plus <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rQuadTo_dx1'>dx1</a>, <a href='#SkPath_rQuadTo_dy1'>dy1</a>).
+<a href='SkPath_Reference#Quad'>Quad</a> end is  <a href='#Last_Point'>last point</a> plus <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rQuadTo_dx2'>dx2</a>, <a href='#SkPath_rQuadTo_dy2'>dy2</a>).
+Function name stands for "relative <a href='SkPath_Reference#Quad'>quad</a> to".
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_rQuadTo_dx1'><code><strong>dx1</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to <a href='SkPath_Reference#Quad'>quad</a> control on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rQuadTo_dy1'><code><strong>dy1</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to <a href='SkPath_Reference#Quad'>quad</a> control on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rQuadTo_dx2'><code><strong>dx2</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to <a href='SkPath_Reference#Quad'>quad</a> end on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rQuadTo_dy2'><code><strong>dy2</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to <a href='SkPath_Reference#Quad'>quad</a> end on y-axis</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_rQuadTo"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_moveTo'>moveTo</a> <a href='#SkPath_conicTo'>conicTo</a> <a href='#SkPath_quadTo'>quadTo</a>
+
+<a name='Conic'></a>
+
+<a href='SkPath_Reference#Conic'>Conic</a> describes a conical section: a piece of an ellipse, or a piece of a
+parabola, or a piece of a hyperbola. <a href='SkPath_Reference#Conic'>Conic</a> begins at a start <a href='SkPoint_Reference#Point'>Point</a>,
+<a href='undocumented#Curve'>curves</a> towards a control <a href='SkPoint_Reference#Point'>Point</a>, and then <a href='undocumented#Curve'>curves</a> to an end <a href='SkPoint_Reference#Point'>Point</a>. The influence
+of the control <a href='SkPoint_Reference#Point'>Point</a> is determined by <a href='#Path_Conic_Weight'>Conic_Weight</a>.
+
+Each <a href='SkPath_Reference#Conic'>Conic</a> in <a href='SkPath_Reference#Path'>Path</a> adds two <a href='SkPoint_Reference#Point'>Points</a> and one <a href='#Path_Conic_Weight'>Conic_Weight</a>. <a href='#Path_Conic_Weight'>Conic_Weights</a> in <a href='SkPath_Reference#Path'>Path</a>
+may be inspected with <a href='#SkPath_Iter'>Iter</a>, or with <a href='#SkPath_RawIter'>RawIter</a>.
+
+<a name='Conic_Weight'></a>
+
+---
+
+Weight determines both the strength of the control <a href='SkPoint_Reference#Point'>Point</a> and the type of <a href='SkPath_Reference#Conic'>Conic</a>.
+Weight varies from zero to infinity. At zero, Weight causes the control <a href='SkPoint_Reference#Point'>Point</a> to
+have no effect; <a href='SkPath_Reference#Conic'>Conic</a> is identical to a <a href='undocumented#Line'>line</a> segment from start <a href='SkPoint_Reference#Point'>Point</a> to end
+<a href='SkPoint_Reference#Point'>point</a>. If Weight is less than one, <a href='SkPath_Reference#Conic'>Conic</a> follows an elliptical <a href='undocumented#Arc'>arc</a>.
+If Weight is exactly one, then <a href='SkPath_Reference#Conic'>Conic</a> is identical to <a href='SkPath_Reference#Quad'>Quad</a>; <a href='SkPath_Reference#Conic'>Conic</a> follows a
+parabolic <a href='undocumented#Arc'>arc</a>. If Weight is greater than one, <a href='SkPath_Reference#Conic'>Conic</a> follows a hyperbolic
+<a href='undocumented#Arc'>arc</a>. If Weight is infinity, <a href='SkPath_Reference#Conic'>Conic</a> is identical to two <a href='undocumented#Line'>line</a> segments, connecting
+start <a href='SkPoint_Reference#Point'>Point</a> to control <a href='SkPoint_Reference#Point'>Point</a>, and control <a href='SkPoint_Reference#Point'>Point</a> to end <a href='SkPoint_Reference#Point'>Point</a>.
+
+### Example
+
+<div><fiddle-embed name="@Conic_Weight_a"><div>When <a href='#Path_Conic_Weight'>Conic_Weight</a> is one, <a href='SkPath_Reference#Quad'>Quad</a> is added to <a href='SkPath_Reference#Path'>path</a>; the two are identical.
+</div>
+
+#### Example Output
+
+~~~~
+move {0, 0},
+quad {0, 0}, {20, 30}, {50, 60},
+done
+~~~~
+
+</fiddle-embed></div>
+
+If weight is less than one, <a href='SkPath_Reference#Conic'>Conic</a> is an elliptical segment.
+
+### Example
+
+<div><fiddle-embed name="@Conic_Weight_b"><div>A 90 degree circular <a href='undocumented#Arc'>arc</a> has the weight <code>1 / <a href='undocumented#sqrt()'>sqrt</a>(2)</code>.
+</div>
+
+#### Example Output
+
+~~~~
+move {0, 0},
+conic {0, 0}, {20, 0}, {20, 20}, weight = 0.707107
+done
+~~~~
+
+</fiddle-embed></div>
+
+If weight is greater than one, <a href='SkPath_Reference#Conic'>Conic</a> is a hyperbolic segment. As weight gets large,
+a hyperbolic segment can be approximated by straight <a href='undocumented#Line'>lines</a> connecting the
+control <a href='SkPoint_Reference#Point'>Point</a> with the end <a href='SkPoint_Reference#Point'>Points</a>.
+
+### Example
+
+<div><fiddle-embed name="@Conic_Weight_c">
+
+#### Example Output
+
+~~~~
+move {0, 0},
+line {0, 0}, {20, 0},
+line {20, 0}, {20, 20},
+done
+~~~~
+
+</fiddle-embed></div>
+
+<a name='SkPath_conicTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_conicTo'>conicTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> x1, <a href='undocumented#SkScalar'>SkScalar</a> y1, <a href='undocumented#SkScalar'>SkScalar</a> x2, <a href='undocumented#SkScalar'>SkScalar</a> y2, <a href='undocumented#SkScalar'>SkScalar</a> w)
+</pre>
+
+Adds <a href='SkPath_Reference#Conic'>conic</a> from  <a href='#Last_Point'>last point</a> towards (<a href='#SkPath_conicTo_x1'>x1</a>, <a href='#SkPath_conicTo_y1'>y1</a>), to (<a href='#SkPath_conicTo_x2'>x2</a>, <a href='#SkPath_conicTo_y2'>y2</a>), weighted by <a href='#SkPath_conicTo_w'>w</a>.
+If <a href='SkPath_Reference#SkPath'>SkPath</a> is empty, or last <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> is <a href='#SkPath_kClose_Verb'>kClose_Verb</a>,  <a href='#Last_Point'>last point</a> is set to (0, 0)
+before adding <a href='SkPath_Reference#Conic'>conic</a>.
+
+Appends <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to  <a href='#Verb_Array'>verb array</a> and (0, 0) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, if needed.
+
+If <a href='#SkPath_conicTo_w'>w</a> is finite and not one, appends <a href='#SkPath_kConic_Verb'>kConic_Verb</a> to  <a href='#Verb_Array'>verb array</a>;
+and (<a href='#SkPath_conicTo_x1'>x1</a>, <a href='#SkPath_conicTo_y1'>y1</a>), (<a href='#SkPath_conicTo_x2'>x2</a>, <a href='#SkPath_conicTo_y2'>y2</a>) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>; and <a href='#SkPath_conicTo_w'>w</a> to  <a href='SkPath_Reference#Conic_Weight'>conic weights</a>.
+
+If <a href='#SkPath_conicTo_w'>w</a> is one, appends <a href='#SkPath_kQuad_Verb'>kQuad_Verb</a> to  <a href='#Verb_Array'>verb array</a>, and
+(<a href='#SkPath_conicTo_x1'>x1</a>, <a href='#SkPath_conicTo_y1'>y1</a>), (<a href='#SkPath_conicTo_x2'>x2</a>, <a href='#SkPath_conicTo_y2'>y2</a>) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+
+If <a href='#SkPath_conicTo_w'>w</a> is not finite, appends <a href='#SkPath_kLine_Verb'>kLine_Verb</a> twice to  <a href='#Verb_Array'>verb array</a>, and
+(<a href='#SkPath_conicTo_x1'>x1</a>, <a href='#SkPath_conicTo_y1'>y1</a>), (<a href='#SkPath_conicTo_x2'>x2</a>, <a href='#SkPath_conicTo_y2'>y2</a>) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_conicTo_x1'><code><strong>x1</strong></code></a></td>
+    <td>control <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Conic'>conic</a> on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_conicTo_y1'><code><strong>y1</strong></code></a></td>
+    <td>control <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Conic'>conic</a> on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_conicTo_x2'><code><strong>x2</strong></code></a></td>
+    <td>end <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Conic'>conic</a> on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_conicTo_y2'><code><strong>y2</strong></code></a></td>
+    <td>end <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Conic'>conic</a> on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_conicTo_w'><code><strong>w</strong></code></a></td>
+    <td>weight of added <a href='SkPath_Reference#Conic'>conic</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_conicTo"><div>As weight increases, <a href='undocumented#Curve'>curve</a> is pulled towards control <a href='SkPoint_Reference#Point'>point</a>.
+The bottom two <a href='undocumented#Curve'>curves</a> are elliptical; the next is parabolic; the
+top <a href='undocumented#Curve'>curve</a> is hyperbolic.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_rConicTo'>rConicTo</a> <a href='#SkPath_arcTo'>arcTo</a> <a href='#SkPath_addArc'>addArc</a> <a href='#SkPath_quadTo'>quadTo</a>
+
+<a name='SkPath_conicTo_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_conicTo'>conicTo</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p2, <a href='undocumented#SkScalar'>SkScalar</a> w)
+</pre>
+
+Adds <a href='SkPath_Reference#Conic'>conic</a> from  <a href='#Last_Point'>last point</a> towards <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_conicTo_2_p1'>p1</a>, to <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_conicTo_2_p2'>p2</a>, weighted by <a href='#SkPath_conicTo_2_w'>w</a>.
+If <a href='SkPath_Reference#SkPath'>SkPath</a> is empty, or last <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> is <a href='#SkPath_kClose_Verb'>kClose_Verb</a>,  <a href='#Last_Point'>last point</a> is set to (0, 0)
+before adding <a href='SkPath_Reference#Conic'>conic</a>.
+
+Appends <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to  <a href='#Verb_Array'>verb array</a> and (0, 0) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, if needed.
+
+If <a href='#SkPath_conicTo_2_w'>w</a> is finite and not one, appends <a href='#SkPath_kConic_Verb'>kConic_Verb</a> to  <a href='#Verb_Array'>verb array</a>;
+and <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_conicTo_2_p1'>p1</a>, <a href='#SkPath_conicTo_2_p2'>p2</a> to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>; and <a href='#SkPath_conicTo_2_w'>w</a> to  <a href='SkPath_Reference#Conic_Weight'>conic weights</a>.
+
+If <a href='#SkPath_conicTo_2_w'>w</a> is one, appends <a href='#SkPath_kQuad_Verb'>kQuad_Verb</a> to  <a href='#Verb_Array'>verb array</a>, and <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_conicTo_2_p1'>p1</a>, <a href='#SkPath_conicTo_2_p2'>p2</a>
+to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+
+If <a href='#SkPath_conicTo_2_w'>w</a> is not finite, appends <a href='#SkPath_kLine_Verb'>kLine_Verb</a> twice to  <a href='#Verb_Array'>verb array</a>, and
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_conicTo_2_p1'>p1</a>, <a href='#SkPath_conicTo_2_p2'>p2</a> to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_conicTo_2_p1'><code><strong>p1</strong></code></a></td>
+    <td>control <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of added <a href='SkPath_Reference#Conic'>conic</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_conicTo_2_p2'><code><strong>p2</strong></code></a></td>
+    <td>end <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of added <a href='SkPath_Reference#Conic'>conic</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_conicTo_2_w'><code><strong>w</strong></code></a></td>
+    <td>weight of added <a href='SkPath_Reference#Conic'>conic</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_conicTo_2"><div><a href='SkPath_Reference#Conic'>Conics</a> and <a href='undocumented#Arc'>arcs</a> use identical representations. As the <a href='undocumented#Arc'>arc</a> sweep increases
+the <a href='#Path_Conic_Weight'>Conic_Weight</a> also increases, but remains smaller than one.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_rConicTo'>rConicTo</a> <a href='#SkPath_arcTo'>arcTo</a> <a href='#SkPath_addArc'>addArc</a> <a href='#SkPath_quadTo'>quadTo</a>
+
+<a name='SkPath_rConicTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_rConicTo'>rConicTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx1, <a href='undocumented#SkScalar'>SkScalar</a> dy1, <a href='undocumented#SkScalar'>SkScalar</a> dx2, <a href='undocumented#SkScalar'>SkScalar</a> dy2, <a href='undocumented#SkScalar'>SkScalar</a> w)
+</pre>
+
+Adds <a href='SkPath_Reference#Conic'>conic</a> from  <a href='#Last_Point'>last point</a> towards <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rConicTo_dx1'>dx1</a>, <a href='#SkPath_rConicTo_dy1'>dy1</a>), to <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rConicTo_dx2'>dx2</a>, <a href='#SkPath_rConicTo_dy2'>dy2</a>),
+weighted by <a href='#SkPath_rConicTo_w'>w</a>. If <a href='SkPath_Reference#SkPath'>SkPath</a> is empty, or last <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a>
+is <a href='#SkPath_kClose_Verb'>kClose_Verb</a>,  <a href='#Last_Point'>last point</a> is set to (0, 0) before adding <a href='SkPath_Reference#Conic'>conic</a>.
+
+Appends <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to  <a href='#Verb_Array'>verb array</a> and (0, 0) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>,
+if needed.
+
+If <a href='#SkPath_rConicTo_w'>w</a> is finite and not one, next appends <a href='#SkPath_kConic_Verb'>kConic_Verb</a> to  <a href='#Verb_Array'>verb array</a>,
+and <a href='#SkPath_rConicTo_w'>w</a> is recorded as  <a href='#Conic_Weight'>conic weight</a>; otherwise, if <a href='#SkPath_rConicTo_w'>w</a> is one, appends
+<a href='#SkPath_kQuad_Verb'>kQuad_Verb</a> to  <a href='#Verb_Array'>verb array</a>; or if <a href='#SkPath_rConicTo_w'>w</a> is not finite, appends <a href='#SkPath_kLine_Verb'>kLine_Verb</a>
+twice to  <a href='#Verb_Array'>verb array</a>.
+
+In all cases appends <a href='SkPoint_Reference#SkPoint'>SkPoint</a> control and end to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+control is  <a href='#Last_Point'>last point</a> plus <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rConicTo_dx1'>dx1</a>, <a href='#SkPath_rConicTo_dy1'>dy1</a>).
+end is  <a href='#Last_Point'>last point</a> plus <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rConicTo_dx2'>dx2</a>, <a href='#SkPath_rConicTo_dy2'>dy2</a>).
+
+Function name stands for "relative <a href='SkPath_Reference#Conic'>conic</a> to".
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_rConicTo_dx1'><code><strong>dx1</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to <a href='SkPath_Reference#Conic'>conic</a> control on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rConicTo_dy1'><code><strong>dy1</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to <a href='SkPath_Reference#Conic'>conic</a> control on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rConicTo_dx2'><code><strong>dx2</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to <a href='SkPath_Reference#Conic'>conic</a> end on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rConicTo_dy2'><code><strong>dy2</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to <a href='SkPath_Reference#Conic'>conic</a> end on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rConicTo_w'><code><strong>w</strong></code></a></td>
+    <td>weight of added <a href='SkPath_Reference#Conic'>conic</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_rConicTo"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_conicTo'>conicTo</a> <a href='#SkPath_arcTo'>arcTo</a> <a href='#SkPath_addArc'>addArc</a> <a href='#SkPath_quadTo'>quadTo</a>
+
+<a name='Cubic'></a>
+
+---
+
+<a href='SkPath_Reference#Cubic'>Cubic</a> describes a <a href='#Bezier_Curve'>Bezier_Curve</a> segment described by a third-order polynomial.
+<a href='SkPath_Reference#Cubic'>Cubic</a> begins at a start <a href='SkPoint_Reference#Point'>Point</a>, curving towards the first control <a href='SkPoint_Reference#Point'>Point</a>;
+and <a href='undocumented#Curve'>curves</a> from the end <a href='SkPoint_Reference#Point'>Point</a> towards the second control <a href='SkPoint_Reference#Point'>Point</a>.
+
+### Example
+
+<div><fiddle-embed name="@Cubic"></fiddle-embed></div>
+
+<a name='SkPath_cubicTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_cubicTo'>cubicTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> x1, <a href='undocumented#SkScalar'>SkScalar</a> y1, <a href='undocumented#SkScalar'>SkScalar</a> x2, <a href='undocumented#SkScalar'>SkScalar</a> y2, <a href='undocumented#SkScalar'>SkScalar</a> x3, <a href='undocumented#SkScalar'>SkScalar</a> y3)
+</pre>
+
+Adds <a href='SkPath_Reference#Cubic'>cubic</a> from  <a href='#Last_Point'>last point</a> towards (<a href='#SkPath_cubicTo_x1'>x1</a>, <a href='#SkPath_cubicTo_y1'>y1</a>), then towards (<a href='#SkPath_cubicTo_x2'>x2</a>, <a href='#SkPath_cubicTo_y2'>y2</a>), ending at
+(<a href='#SkPath_cubicTo_x3'>x3</a>, <a href='#SkPath_cubicTo_y3'>y3</a>). If <a href='SkPath_Reference#SkPath'>SkPath</a> is empty, or last <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> is <a href='#SkPath_kClose_Verb'>kClose_Verb</a>,  <a href='#Last_Point'>last point</a> is set to
+(0, 0) before adding <a href='SkPath_Reference#Cubic'>cubic</a>.
+
+Appends <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to  <a href='#Verb_Array'>verb array</a> and (0, 0) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, if needed;
+then appends <a href='#SkPath_kCubic_Verb'>kCubic_Verb</a> to  <a href='#Verb_Array'>verb array</a>; and (<a href='#SkPath_cubicTo_x1'>x1</a>, <a href='#SkPath_cubicTo_y1'>y1</a>), (<a href='#SkPath_cubicTo_x2'>x2</a>, <a href='#SkPath_cubicTo_y2'>y2</a>), (<a href='#SkPath_cubicTo_x3'>x3</a>, <a href='#SkPath_cubicTo_y3'>y3</a>)
+to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_cubicTo_x1'><code><strong>x1</strong></code></a></td>
+    <td>first control <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Cubic'>cubic</a> on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_cubicTo_y1'><code><strong>y1</strong></code></a></td>
+    <td>first control <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Cubic'>cubic</a> on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_cubicTo_x2'><code><strong>x2</strong></code></a></td>
+    <td>second control <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Cubic'>cubic</a> on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_cubicTo_y2'><code><strong>y2</strong></code></a></td>
+    <td>second control <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Cubic'>cubic</a> on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_cubicTo_x3'><code><strong>x3</strong></code></a></td>
+    <td>end <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Cubic'>cubic</a> on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_cubicTo_y3'><code><strong>y3</strong></code></a></td>
+    <td>end <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Cubic'>cubic</a> on y-axis</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_cubicTo"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_moveTo'>moveTo</a> <a href='#SkPath_rCubicTo'>rCubicTo</a> <a href='#SkPath_quadTo'>quadTo</a>
+
+<a name='SkPath_cubicTo_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_cubicTo'>cubicTo</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p2, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p3)
+</pre>
+
+Adds <a href='SkPath_Reference#Cubic'>cubic</a> from  <a href='#Last_Point'>last point</a> towards <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_cubicTo_2_p1'>p1</a>, then towards <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_cubicTo_2_p2'>p2</a>, ending at
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_cubicTo_2_p3'>p3</a>. If <a href='SkPath_Reference#SkPath'>SkPath</a> is empty, or last <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> is <a href='#SkPath_kClose_Verb'>kClose_Verb</a>,  <a href='#Last_Point'>last point</a> is set to
+(0, 0) before adding <a href='SkPath_Reference#Cubic'>cubic</a>.
+
+Appends <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to  <a href='#Verb_Array'>verb array</a> and (0, 0) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, if needed;
+then appends <a href='#SkPath_kCubic_Verb'>kCubic_Verb</a> to  <a href='#Verb_Array'>verb array</a>; and <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPath_cubicTo_2_p1'>p1</a>, <a href='#SkPath_cubicTo_2_p2'>p2</a>, <a href='#SkPath_cubicTo_2_p3'>p3</a>
+to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_cubicTo_2_p1'><code><strong>p1</strong></code></a></td>
+    <td>first control <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Cubic'>cubic</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_cubicTo_2_p2'><code><strong>p2</strong></code></a></td>
+    <td>second control <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Cubic'>cubic</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_cubicTo_2_p3'><code><strong>p3</strong></code></a></td>
+    <td>end <a href='SkPoint_Reference#SkPoint'>SkPoint</a> of <a href='SkPath_Reference#Cubic'>cubic</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_cubicTo_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_moveTo'>moveTo</a> <a href='#SkPath_rCubicTo'>rCubicTo</a> <a href='#SkPath_quadTo'>quadTo</a>
+
+<a name='SkPath_rCubicTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_rCubicTo'>rCubicTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx1, <a href='undocumented#SkScalar'>SkScalar</a> dy1, <a href='undocumented#SkScalar'>SkScalar</a> dx2, <a href='undocumented#SkScalar'>SkScalar</a> dy2, <a href='undocumented#SkScalar'>SkScalar</a> dx3, <a href='undocumented#SkScalar'>SkScalar</a> dy3)
+</pre>
+
+Adds <a href='SkPath_Reference#Cubic'>cubic</a> from  <a href='#Last_Point'>last point</a> towards <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rCubicTo_dx1'>dx1</a>, <a href='#SkPath_rCubicTo_dy1'>dy1</a>), then towards
+<a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rCubicTo_dx2'>dx2</a>, <a href='#SkPath_rCubicTo_dy2'>dy2</a>), to <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rCubicTo_dx3'>dx3</a>, <a href='#SkPath_rCubicTo_dy3'>dy3</a>).
+If <a href='SkPath_Reference#SkPath'>SkPath</a> is empty, or last <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a>
+is <a href='#SkPath_kClose_Verb'>kClose_Verb</a>,  <a href='#Last_Point'>last point</a> is set to (0, 0) before adding <a href='SkPath_Reference#Cubic'>cubic</a>.
+
+Appends <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to  <a href='#Verb_Array'>verb array</a> and (0, 0) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>,
+if needed; then appends <a href='#SkPath_kCubic_Verb'>kCubic_Verb</a> to  <a href='#Verb_Array'>verb array</a>; and appends <a href='SkPath_Reference#Cubic'>cubic</a>
+control and <a href='SkPath_Reference#Cubic'>cubic</a> end to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+<a href='SkPath_Reference#Cubic'>Cubic</a> control is  <a href='#Last_Point'>last point</a> plus <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rCubicTo_dx1'>dx1</a>, <a href='#SkPath_rCubicTo_dy1'>dy1</a>).
+<a href='SkPath_Reference#Cubic'>Cubic</a> end is  <a href='#Last_Point'>last point</a> plus <a href='SkPoint_Reference#Vector'>vector</a> (<a href='#SkPath_rCubicTo_dx2'>dx2</a>, <a href='#SkPath_rCubicTo_dy2'>dy2</a>).
+Function name stands for "relative <a href='SkPath_Reference#Cubic'>cubic</a> to".
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_rCubicTo_dx1'><code><strong>dx1</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to first <a href='SkPath_Reference#Cubic'>cubic</a> control on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rCubicTo_dy1'><code><strong>dy1</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to first <a href='SkPath_Reference#Cubic'>cubic</a> control on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rCubicTo_dx2'><code><strong>dx2</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to second <a href='SkPath_Reference#Cubic'>cubic</a> control on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rCubicTo_dy2'><code><strong>dy2</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to second <a href='SkPath_Reference#Cubic'>cubic</a> control on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rCubicTo_dx3'><code><strong>dx3</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to <a href='SkPath_Reference#Cubic'>cubic</a> end on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rCubicTo_dy3'><code><strong>dy3</strong></code></a></td>
+    <td>offset from  <a href='#Last_Point'>last point</a> to <a href='SkPath_Reference#Cubic'>cubic</a> end on y-axis</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_rCubicTo"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Overview#Contour'>Contour</a> <a href='#SkPath_moveTo'>moveTo</a> <a href='#SkPath_cubicTo'>cubicTo</a> <a href='#SkPath_quadTo'>quadTo</a>
+
+<a name='Arc'></a>
+
+---
+
+<a href='undocumented#Arc'>Arc</a> can be constructed in a number of ways. <a href='undocumented#Arc'>Arc</a> may be described by part of <a href='undocumented#Oval'>Oval</a> and angles,
+by start <a href='SkPoint_Reference#Point'>point</a> and end <a href='SkPoint_Reference#Point'>point</a>, and by radius and tangent <a href='undocumented#Line'>lines</a>. Each construction has advantages,
+and some constructions correspond to <a href='undocumented#Arc'>Arc</a> drawing in graphics standards.
+
+All <a href='undocumented#Arc'>Arc</a> draws are implemented by one or more <a href='SkPath_Reference#Conic'>Conic</a> draws. When <a href='#Path_Conic_Weight'>Conic_Weight</a> is less than one,
+<a href='SkPath_Reference#Conic'>Conic</a> describes an <a href='undocumented#Arc'>Arc</a> of some <a href='undocumented#Oval'>Oval</a> or <a href='undocumented#Circle'>Circle</a>.
+
+Circle<a href='#SkPath_arcTo'>arcTo(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle, bool forceMoveTo)</a>
+describes <a href='undocumented#Arc'>Arc</a> as a piece of <a href='undocumented#Oval'>Oval</a>, beginning at start angle, sweeping clockwise or counterclockwise,
+which may continue <a href='SkPath_Overview#Contour'>Contour</a> or start a new one. This construction is similar to <a href='undocumented#PostScript'>PostScript</a> and
+<a href='#HTML_Canvas'>HTML_Canvas</a> <a href='undocumented#Arc'>arcs</a>. Variation <a href='#SkPath_addArc'>addArc</a> always starts new <a href='SkPath_Overview#Contour'>Contour</a>. <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawArc'>drawArc</a> draws without
+requiring <a href='SkPath_Reference#Path'>Path</a>.
+
+Path<a href='#SkPath_arcTo_2'>arcTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2, SkScalar radius)</a>
+describes <a href='undocumented#Arc'>Arc</a> as tangent to the <a href='undocumented#Line'>line</a> segment from last <a href='SkPoint_Reference#Point'>Point</a> added to <a href='SkPath_Reference#Path'>Path</a> to (x1, y1); and tangent
+to the <a href='undocumented#Line'>line</a> segment from (x1, y1) to (x2, y2). This construction is similar to <a href='undocumented#PostScript'>PostScript</a> and
+<a href='#HTML_Canvas'>HTML_Canvas</a> <a href='undocumented#Arc'>arcs</a>.
+
+arcs<a href='#SkPath_arcTo_4'>arcTo(SkScalar rx, SkScalar ry, SkScalar xAxisRotate, ArcSize largeArc, Direction sweep, SkScalar x, SkScalar y)</a>
+describes <a href='undocumented#Arc'>Arc</a> as part of <a href='undocumented#Oval'>Oval</a> with radii (rx, ry), beginning at
+last <a href='SkPoint_Reference#Point'>Point</a> added to <a href='SkPath_Reference#Path'>Path</a> and ending at (x, y). More than one <a href='undocumented#Arc'>Arc</a> satisfies this criteria,
+so additional values choose a single solution. This construction is similar to <a href='undocumented#SVG'>SVG</a> <a href='undocumented#Arc'>arcs</a>.
+
+<a href='#SkPath_conicTo'>conicTo</a> describes <a href='undocumented#Arc'>Arc</a> of less than 180 degrees as a pair of tangent <a href='undocumented#Line'>lines</a> and <a href='#Path_Conic_Weight'>Conic_Weight</a>.
+<a href='#SkPath_conicTo'>conicTo</a> can represent any <a href='undocumented#Arc'>Arc</a> with a sweep less than 180 degrees at any rotation. All <a href='#SkPath_arcTo'>arcTo</a>
+constructions are converted to <a href='SkPath_Reference#Conic'>Conic</a> <a href='undocumented#Data'>data</a> when added to <a href='SkPath_Reference#Path'>Path</a>.
+
+![Arc](https://fiddle.skia.org/i/e17e48e9d2182e9afc0f5d26b72c60f0_raster.png "")
+
+<table>  <tr>
+    <td><sup>1</sup> sup<a href='#SkPath_arcTo'>arcTo(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle, bool forceMoveTo)</a></td>
+  </tr>  <tr>
+    <td><sup>2</sup> parameter adds move to first <a href='SkPoint_Reference#Point'>point</a></td>
+  </tr>  <tr>
+    <td><sup>3</sup> start angle must be multiple of 90 degrees</td>
+  </tr>  <tr>
+    <td><sup>4</sup> sup<a href='#SkPath_arcTo_2'>arcTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2, SkScalar radius)</a></td>
+  </tr>  <tr>
+    <td><sup>5</sup> sup<a href='#SkPath_arcTo_4'>arcTo(SkScalar rx, SkScalar ry, SkScalar xAxisRotate, ArcSize largeArc, Direction sweep, SkScalar x, SkScalar y)</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="5acc77eba0cb4d00bbf3a8f4db0c0aee"></fiddle-embed></div>
+
+In the example above:
+
+<table>  <tr>
+    <td>1 describes an <a href='undocumented#Arc'>arc</a> from an <a href='undocumented#Oval'>oval</a>, a starting angle, and a sweep angle.</td>
+  </tr>  <tr>
+    <td>2 is similar to 1, but does not require building a <a href='SkPath_Reference#Path'>path</a> to draw.</td>
+  </tr>  <tr>
+    <td>3 is similar to 1, but always begins new <a href='SkPath_Overview#Contour'>Contour</a>.</td>
+  </tr>  <tr>
+    <td>4 describes an <a href='undocumented#Arc'>arc</a> from a pair of tangent <a href='undocumented#Line'>lines</a> and a radius.</td>
+  </tr>  <tr>
+    <td>5 describes an <a href='undocumented#Arc'>arc</a> from <a href='undocumented#Oval'>Oval</a> center, <a href='undocumented#Arc'>arc</a> start <a href='SkPoint_Reference#Point'>Point</a> and <a href='undocumented#Arc'>arc</a> end <a href='SkPoint_Reference#Point'>Point</a>.</td>
+  </tr>  <tr>
+    <td>6 describes an <a href='undocumented#Arc'>arc</a> from a pair of tangent <a href='undocumented#Line'>lines</a> and a <a href='#Path_Conic_Weight'>Conic_Weight</a>.</td>
+  </tr>
+</table>
+
+<a name='SkPath_arcTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_arcTo'>arcTo</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>, <a href='undocumented#SkScalar'>SkScalar</a> startAngle, <a href='undocumented#SkScalar'>SkScalar</a> sweepAngle, bool forceMoveTo)
+</pre>
+
+Appends <a href='undocumented#Arc'>arc</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>. <a href='undocumented#Arc'>Arc</a> added is part of ellipse
+bounded by <a href='#SkPath_arcTo_oval'>oval</a>, from <a href='#SkPath_arcTo_startAngle'>startAngle</a> through <a href='#SkPath_arcTo_sweepAngle'>sweepAngle</a>. Both <a href='#SkPath_arcTo_startAngle'>startAngle</a> and
+<a href='#SkPath_arcTo_sweepAngle'>sweepAngle</a> are measured in degrees, where zero degrees is aligned with the
+positive x-axis, and positive sweeps extends <a href='undocumented#Arc'>arc</a> clockwise.
+
+<a href='#SkPath_arcTo'>arcTo</a>() adds <a href='undocumented#Line'>line</a> connecting <a href='SkPath_Reference#SkPath'>SkPath</a> last <a href='SkPoint_Reference#SkPoint'>SkPoint</a> to initial <a href='undocumented#Arc'>arc</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> if <a href='#SkPath_arcTo_forceMoveTo'>forceMoveTo</a>
+is false and <a href='SkPath_Reference#SkPath'>SkPath</a> is not empty. Otherwise, added <a href='SkPath_Overview#Contour'>contour</a> begins with first <a href='SkPoint_Reference#Point'>point</a>
+of <a href='undocumented#Arc'>arc</a>. Angles greater than -360 and less than 360 are treated modulo 360.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_arcTo_oval'><code><strong>oval</strong></code></a></td>
+    <td>bounds of ellipse containing <a href='undocumented#Arc'>arc</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_startAngle'><code><strong>startAngle</strong></code></a></td>
+    <td>starting angle of <a href='undocumented#Arc'>arc</a> in degrees</td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_sweepAngle'><code><strong>sweepAngle</strong></code></a></td>
+    <td>sweep, in degrees. Positive is clockwise; treated modulo 360</td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_forceMoveTo'><code><strong>forceMoveTo</strong></code></a></td>
+    <td>true to start a new <a href='SkPath_Overview#Contour'>contour</a> with <a href='undocumented#Arc'>arc</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_arcTo"><div><a href='#SkPath_arcTo'>arcTo</a> continues a previous <a href='SkPath_Overview#Contour'>contour</a> when <a href='#SkPath_arcTo_forceMoveTo'>forceMoveTo</a> is false and when <a href='SkPath_Reference#Path'>Path</a>
+is not empty.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_addArc'>addArc</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawArc'>drawArc</a> <a href='#SkPath_conicTo'>conicTo</a>
+
+<a name='SkPath_arcTo_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_arcTo'>arcTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> x1, <a href='undocumented#SkScalar'>SkScalar</a> y1, <a href='undocumented#SkScalar'>SkScalar</a> x2, <a href='undocumented#SkScalar'>SkScalar</a> y2, <a href='undocumented#SkScalar'>SkScalar</a> radius)
+</pre>
+
+Appends <a href='undocumented#Arc'>arc</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>, after appending <a href='undocumented#Line'>line</a> if needed. <a href='undocumented#Arc'>Arc</a> is implemented by <a href='SkPath_Reference#Conic'>conic</a>
+weighted to describe part of <a href='undocumented#Circle'>circle</a>. <a href='undocumented#Arc'>Arc</a> is contained by tangent from
+last <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPoint_Reference#Point'>point</a> to (<a href='#SkPath_arcTo_2_x1'>x1</a>, <a href='#SkPath_arcTo_2_y1'>y1</a>), and tangent from (<a href='#SkPath_arcTo_2_x1'>x1</a>, <a href='#SkPath_arcTo_2_y1'>y1</a>) to (<a href='#SkPath_arcTo_2_x2'>x2</a>, <a href='#SkPath_arcTo_2_y2'>y2</a>). <a href='undocumented#Arc'>Arc</a>
+is part of <a href='undocumented#Circle'>circle</a> sized to <a href='#SkPath_arcTo_2_radius'>radius</a>, positioned so it touches both tangent <a href='undocumented#Line'>lines</a>.
+
+If last <a href='SkPath_Reference#Path'>Path</a> <a href='SkPoint_Reference#Point'>Point</a> does not start <a href='undocumented#Arc'>Arc</a>, <a href='#SkPath_arcTo'>arcTo</a> appends connecting <a href='undocumented#Line'>Line</a> to <a href='SkPath_Reference#Path'>Path</a>.
+The length of <a href='SkPoint_Reference#Vector'>Vector</a> from (<a href='#SkPath_arcTo_2_x1'>x1</a>, <a href='#SkPath_arcTo_2_y1'>y1</a>) to (<a href='#SkPath_arcTo_2_x2'>x2</a>, <a href='#SkPath_arcTo_2_y2'>y2</a>) does not affect <a href='undocumented#Arc'>Arc</a>.
+
+<a href='undocumented#Arc'>Arc</a> sweep is always less than 180 degrees. If <a href='#SkPath_arcTo_2_radius'>radius</a> is zero, or if
+tangents are nearly parallel, <a href='#SkPath_arcTo'>arcTo</a> appends <a href='undocumented#Line'>Line</a> from last <a href='SkPath_Reference#Path'>Path</a> <a href='SkPoint_Reference#Point'>Point</a> to (<a href='#SkPath_arcTo_2_x1'>x1</a>, <a href='#SkPath_arcTo_2_y1'>y1</a>).
+
+<a href='#SkPath_arcTo'>arcTo</a> appends at most one <a href='undocumented#Line'>Line</a> and one <a href='SkPath_Reference#Conic'>conic</a>.
+<a href='#SkPath_arcTo'>arcTo</a> implements the functionality of  <a href='undocumented#Arct'>PostScript arct</a> and   <a href='undocumented#ArcTo'>HTML Canvas arcTo</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_arcTo_2_x1'><code><strong>x1</strong></code></a></td>
+    <td>x-axis value common to pair of tangents</td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_2_y1'><code><strong>y1</strong></code></a></td>
+    <td>y-axis value common to pair of tangents</td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_2_x2'><code><strong>x2</strong></code></a></td>
+    <td>x-axis value end of second tangent</td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_2_y2'><code><strong>y2</strong></code></a></td>
+    <td>y-axis value end of second tangent</td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_2_radius'><code><strong>radius</strong></code></a></td>
+    <td>distance from <a href='undocumented#Arc'>arc</a> to <a href='undocumented#Circle'>circle</a> center</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="386000684073fccabc224d7d6dc81cd9"></fiddle-embed></div>
+
+### Example
+
+<div><fiddle-embed name="78f3c65fa900610bb52518989b547095"></fiddle-embed></div>
+
+### Example
+
+<div><fiddle-embed name="@Path_arcTo_2_c"><div><a href='#SkPath_arcTo'>arcTo</a> is represented by <a href='undocumented#Line'>Line</a> and circular <a href='SkPath_Reference#Conic'>Conic</a> in <a href='SkPath_Reference#Path'>Path</a>.
+</div>
+
+#### Example Output
+
+~~~~
+move to (156,20)
+line (156,20),(79.2893,20)
+conic (79.2893,20),(200,20),(114.645,105.355) weight 0.382683
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_conicTo'>conicTo</a>
+
+<a name='SkPath_arcTo_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_arcTo'>arcTo</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> p2, <a href='undocumented#SkScalar'>SkScalar</a> radius)
+</pre>
+
+Appends <a href='undocumented#Arc'>arc</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>, after appending <a href='undocumented#Line'>line</a> if needed. <a href='undocumented#Arc'>Arc</a> is implemented by <a href='SkPath_Reference#Conic'>conic</a>
+weighted to describe part of <a href='undocumented#Circle'>circle</a>. <a href='undocumented#Arc'>Arc</a> is contained by tangent from
+last <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPoint_Reference#Point'>point</a> to <a href='#SkPath_arcTo_3_p1'>p1</a>, and tangent from <a href='#SkPath_arcTo_3_p1'>p1</a> to <a href='#SkPath_arcTo_3_p2'>p2</a>. <a href='undocumented#Arc'>Arc</a>
+is part of <a href='undocumented#Circle'>circle</a> sized to <a href='#SkPath_arcTo_3_radius'>radius</a>, positioned so it touches both tangent <a href='undocumented#Line'>lines</a>.
+
+If last <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> does not start <a href='undocumented#Arc'>arc</a>, <a href='#SkPath_arcTo'>arcTo</a>() appends connecting <a href='undocumented#Line'>line</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>.
+The length of <a href='SkPoint_Reference#Vector'>vector</a> from <a href='#SkPath_arcTo_3_p1'>p1</a> to <a href='#SkPath_arcTo_3_p2'>p2</a> does not affect <a href='undocumented#Arc'>arc</a>.
+
+<a href='undocumented#Arc'>Arc</a> sweep is always less than 180 degrees. If <a href='#SkPath_arcTo_3_radius'>radius</a> is zero, or if
+tangents are nearly parallel, <a href='#SkPath_arcTo'>arcTo</a>() appends <a href='undocumented#Line'>line</a> from last <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> to <a href='#SkPath_arcTo_3_p1'>p1</a>.
+
+<a href='#SkPath_arcTo'>arcTo</a>() appends at most one <a href='undocumented#Line'>line</a> and one <a href='SkPath_Reference#Conic'>conic</a>.
+<a href='#SkPath_arcTo'>arcTo</a>() implements the functionality of  <a href='undocumented#Arct'>PostScript arct</a> and   <a href='undocumented#ArcTo'>HTML Canvas arcTo</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_arcTo_3_p1'><code><strong>p1</strong></code></a></td>
+    <td><a href='SkPoint_Reference#SkPoint'>SkPoint</a> common to pair of tangents</td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_3_p2'><code><strong>p2</strong></code></a></td>
+    <td>end of second tangent</td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_3_radius'><code><strong>radius</strong></code></a></td>
+    <td>distance from <a href='undocumented#Arc'>arc</a> to <a href='undocumented#Circle'>circle</a> center</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_arcTo_3"><div>Because tangent <a href='undocumented#Line'>lines</a> are parallel, <a href='#SkPath_arcTo'>arcTo</a> appends <a href='undocumented#Line'>line</a> from last <a href='SkPath_Reference#Path'>Path</a> <a href='SkPoint_Reference#Point'>Point</a> to
+<a href='#SkPath_arcTo_3_p1'>p1</a>, but does not append a circular <a href='SkPath_Reference#Conic'>Conic</a>.
+</div>
+
+#### Example Output
+
+~~~~
+move to (156,20)
+line (156,20),(200,20)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_conicTo'>conicTo</a>
+
+<a name='SkPath_ArcSize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkPath_ArcSize'>ArcSize</a> {
+        <a href='#SkPath_kSmall_ArcSize'>kSmall_ArcSize</a>,
+        <a href='#SkPath_kLarge_ArcSize'>kLarge_ArcSize</a>,
+    };
+</pre>
+
+Four axis-aligned <a href='undocumented#Oval'>Ovals</a> with the same height and width intersect a pair of <a href='SkPoint_Reference#Point'>Points</a>.
+<a href='#SkPath_ArcSize'>ArcSize</a> and <a href='#SkPath_Direction'>Direction</a> select one of the four <a href='undocumented#Oval'>Ovals</a>, by choosing the larger or smaller
+<a href='undocumented#Arc'>arc</a> between the <a href='SkPoint_Reference#Point'>Points</a>; and by choosing the <a href='undocumented#Arc'>arc</a> <a href='#SkPath_Direction'>Direction</a>, clockwise
+or counterclockwise.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kSmall_ArcSize'><code>SkPath::kSmall_ArcSize</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+smaller of Arc pair</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kLarge_ArcSize'><code>SkPath::kLarge_ArcSize</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+larger of Arc pair</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Path_ArcSize"><div><a href='undocumented#Arc'>Arc</a> begins at top of <a href='undocumented#Oval'>Oval</a> pair and ends at bottom. <a href='undocumented#Arc'>Arc</a> can take four routes to get there.
+Two routes are large, and two routes are counterclockwise. The one route both large
+and counterclockwise is blue.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_arcTo'>arcTo</a> <a href='#SkPath_Direction'>Direction</a>
+
+<a name='SkPath_arcTo_4'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_arcTo'>arcTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> rx, <a href='undocumented#SkScalar'>SkScalar</a> ry, <a href='undocumented#SkScalar'>SkScalar</a> xAxisRotate, <a href='#SkPath_ArcSize'>ArcSize</a> largeArc, <a href='#SkPath_Direction'>Direction</a> sweep,
+              <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y)
+</pre>
+
+Appends <a href='undocumented#Arc'>arc</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>. <a href='undocumented#Arc'>Arc</a> is implemented by one or more <a href='SkPath_Reference#Conic'>conics</a> weighted to
+describe part of <a href='undocumented#Oval'>oval</a> with radii (<a href='#SkPath_arcTo_4_rx'>rx</a>, <a href='#SkPath_arcTo_4_ry'>ry</a>) rotated by <a href='#SkPath_arcTo_4_xAxisRotate'>xAxisRotate</a> degrees. <a href='undocumented#Arc'>Arc</a>
+<a href='undocumented#Curve'>curves</a> from last <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> to (<a href='#SkPath_arcTo_4_x'>x</a>, <a href='#SkPath_arcTo_4_y'>y</a>), choosing one of four possible routes:
+clockwise or counterclockwise, and smaller or larger.
+
+<a href='undocumented#Arc'>Arc</a> <a href='#SkPath_arcTo_4_sweep'>sweep</a> is always less than 360 degrees. <a href='#SkPath_arcTo'>arcTo</a>() appends <a href='undocumented#Line'>line</a> to (<a href='#SkPath_arcTo_4_x'>x</a>, <a href='#SkPath_arcTo_4_y'>y</a>) if
+either radii are zero, or if last <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> equals (<a href='#SkPath_arcTo_4_x'>x</a>, <a href='#SkPath_arcTo_4_y'>y</a>). <a href='#SkPath_arcTo'>arcTo</a>() scales radii
+(<a href='#SkPath_arcTo_4_rx'>rx</a>, <a href='#SkPath_arcTo_4_ry'>ry</a>) to fit last <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> and (<a href='#SkPath_arcTo_4_x'>x</a>, <a href='#SkPath_arcTo_4_y'>y</a>) if both are greater than zero but
+too small.
+
+<a href='#SkPath_arcTo'>arcTo</a>() appends up to four <a href='SkPath_Reference#Conic'>conic</a> <a href='undocumented#Curve'>curves</a>.
+<a href='#SkPath_arcTo'>arcTo</a>() implements the functionality of  <a href='undocumented#SVG_Arc'>SVG arc</a>, although  <a href='undocumented#Sweep_Flag'>SVG sweep-flag</a> value
+is opposite the integer value of <a href='#SkPath_arcTo_4_sweep'>sweep</a>;  <a href='undocumented#Sweep_Flag'>SVG sweep-flag</a> uses 1 for clockwise,
+while <a href='#SkPath_kCW_Direction'>kCW_Direction</a> cast to int is zero.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_arcTo_4_rx'><code><strong>rx</strong></code></a></td>
+    <td>radius on x-axis before x-axis rotation</td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_4_ry'><code><strong>ry</strong></code></a></td>
+    <td>radius on y-axis before x-axis rotation</td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_4_xAxisRotate'><code><strong>xAxisRotate</strong></code></a></td>
+    <td>x-axis rotation in degrees; positive values are clockwise</td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_4_largeArc'><code><strong>largeArc</strong></code></a></td>
+    <td>chooses smaller or larger <a href='undocumented#Arc'>arc</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_4_sweep'><code><strong>sweep</strong></code></a></td>
+    <td>chooses clockwise or counterclockwise <a href='undocumented#Arc'>arc</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_4_x'><code><strong>x</strong></code></a></td>
+    <td>end of <a href='undocumented#Arc'>arc</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_4_y'><code><strong>y</strong></code></a></td>
+    <td>end of <a href='undocumented#Arc'>arc</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_arcTo_4"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_rArcTo'>rArcTo</a> <a href='#SkPath_ArcSize'>ArcSize</a> <a href='#SkPath_Direction'>Direction</a>
+
+<a name='SkPath_arcTo_5'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_arcTo'>arcTo</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> r, <a href='undocumented#SkScalar'>SkScalar</a> xAxisRotate, <a href='#SkPath_ArcSize'>ArcSize</a> largeArc, <a href='#SkPath_Direction'>Direction</a> sweep,
+              const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> xy)
+</pre>
+
+Appends <a href='undocumented#Arc'>arc</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>. <a href='undocumented#Arc'>Arc</a> is implemented by one or more <a href='SkPath_Reference#Conic'>conic</a> weighted to describe
+part of <a href='undocumented#Oval'>oval</a> with radii (<a href='#SkPath_arcTo_5_r'>r</a>.<a href='#SkPoint_fX'>fX</a>, <a href='#SkPath_arcTo_5_r'>r</a>.<a href='#SkPoint_fY'>fY</a>) rotated by <a href='#SkPath_arcTo_5_xAxisRotate'>xAxisRotate</a> degrees. <a href='undocumented#Arc'>Arc</a> <a href='undocumented#Curve'>curves</a>
+from last <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> to (<a href='#SkPath_arcTo_5_xy'>xy</a>.<a href='#SkPoint_fX'>fX</a>, <a href='#SkPath_arcTo_5_xy'>xy</a>.<a href='#SkPoint_fY'>fY</a>), choosing one of four possible routes:
+clockwise or counterclockwise,
+and smaller or larger.
+
+<a href='undocumented#Arc'>Arc</a> <a href='#SkPath_arcTo_5_sweep'>sweep</a> is always less than 360 degrees. <a href='#SkPath_arcTo'>arcTo</a>() appends <a href='undocumented#Line'>line</a> to <a href='#SkPath_arcTo_5_xy'>xy</a> if either
+radii are zero, or if last <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> equals (<a href='#SkPath_arcTo_5_xy'>xy</a>.<a href='#SkPoint_fX'>fX</a>, <a href='#SkPath_arcTo_5_xy'>xy</a>.<a href='#SkPoint_fY'>fY</a>). <a href='#SkPath_arcTo'>arcTo</a>() scales radii <a href='#SkPath_arcTo_5_r'>r</a> to
+fit last <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> and <a href='#SkPath_arcTo_5_xy'>xy</a> if both are greater than zero but too small to describe
+an <a href='undocumented#Arc'>arc</a>.
+
+<a href='#SkPath_arcTo'>arcTo</a>() appends up to four <a href='SkPath_Reference#Conic'>conic</a> <a href='undocumented#Curve'>curves</a>.
+<a href='#SkPath_arcTo'>arcTo</a>() implements the functionality of  <a href='undocumented#SVG_Arc'>SVG arc</a>, although  <a href='undocumented#Sweep_Flag'>SVG sweep-flag</a> value is
+opposite the integer value of <a href='#SkPath_arcTo_5_sweep'>sweep</a>;  <a href='undocumented#Sweep_Flag'>SVG sweep-flag</a> uses 1 for clockwise, while
+<a href='#SkPath_kCW_Direction'>kCW_Direction</a> cast to int is zero.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_arcTo_5_r'><code><strong>r</strong></code></a></td>
+    <td>radii on axes before x-axis rotation</td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_5_xAxisRotate'><code><strong>xAxisRotate</strong></code></a></td>
+    <td>x-axis rotation in degrees; positive values are clockwise</td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_5_largeArc'><code><strong>largeArc</strong></code></a></td>
+    <td>chooses smaller or larger <a href='undocumented#Arc'>arc</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_5_sweep'><code><strong>sweep</strong></code></a></td>
+    <td>chooses clockwise or counterclockwise <a href='undocumented#Arc'>arc</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_arcTo_5_xy'><code><strong>xy</strong></code></a></td>
+    <td>end of <a href='undocumented#Arc'>arc</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_rArcTo"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_rArcTo'>rArcTo</a> <a href='#SkPath_ArcSize'>ArcSize</a> <a href='#SkPath_Direction'>Direction</a>
+
+<a name='SkPath_rArcTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_rArcTo'>rArcTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> rx, <a href='undocumented#SkScalar'>SkScalar</a> ry, <a href='undocumented#SkScalar'>SkScalar</a> xAxisRotate, <a href='#SkPath_ArcSize'>ArcSize</a> largeArc, <a href='#SkPath_Direction'>Direction</a> sweep,
+               <a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Appends <a href='undocumented#Arc'>Arc</a> to <a href='SkPath_Reference#Path'>Path</a>, relative to last <a href='SkPath_Reference#Path'>Path</a> <a href='SkPoint_Reference#Point'>Point</a>. <a href='undocumented#Arc'>Arc</a> is implemented by one or
+more <a href='SkPath_Reference#Conic'>Conic</a>, weighted to describe part of <a href='undocumented#Oval'>Oval</a> with radii (<a href='#SkPath_rArcTo_rx'>rx</a>, <a href='#SkPath_rArcTo_ry'>ry</a>) rotated by
+<a href='#SkPath_rArcTo_xAxisRotate'>xAxisRotate</a> degrees. <a href='undocumented#Arc'>Arc</a> <a href='undocumented#Curve'>curves</a> from last <a href='SkPath_Reference#Path'>Path</a> <a href='SkPoint_Reference#Point'>Point</a> to relative end <a href='SkPoint_Reference#Point'>Point</a>
+(<a href='#SkPath_rArcTo_dx'>dx</a>, <a href='#SkPath_rArcTo_dy'>dy</a>), choosing one of four possible routes: clockwise or
+counterclockwise, and smaller or larger. If <a href='SkPath_Reference#Path'>Path</a> is empty, the start <a href='undocumented#Arc'>Arc</a> <a href='SkPoint_Reference#Point'>Point</a>
+is (0, 0).
+
+<a href='undocumented#Arc'>Arc</a> <a href='#SkPath_rArcTo_sweep'>sweep</a> is always less than 360 degrees. <a href='#SkPath_arcTo'>arcTo</a> appends <a href='undocumented#Line'>Line</a> to end <a href='SkPoint_Reference#Point'>Point</a>
+if either radii are zero, or if last <a href='SkPath_Reference#Path'>Path</a> <a href='SkPoint_Reference#Point'>Point</a> equals end <a href='SkPoint_Reference#Point'>Point</a>.
+<a href='#SkPath_arcTo'>arcTo</a> scales radii (<a href='#SkPath_rArcTo_rx'>rx</a>, <a href='#SkPath_rArcTo_ry'>ry</a>) to fit last <a href='SkPath_Reference#Path'>Path</a> <a href='SkPoint_Reference#Point'>Point</a> and end <a href='SkPoint_Reference#Point'>Point</a> if both are
+greater than zero but too small to describe an <a href='undocumented#Arc'>arc</a>.
+
+<a href='#SkPath_arcTo'>arcTo</a> appends up to four <a href='SkPath_Reference#Conic'>Conic</a> <a href='undocumented#Curve'>curves</a>.
+<a href='#SkPath_arcTo'>arcTo</a> implements the functionality of <a href='#SVG_Arc'>SVG_Arc</a>, although <a href='undocumented#SVG'>SVG</a> "sweep-flag" value is
+opposite the integer value of <a href='#SkPath_rArcTo_sweep'>sweep</a>; <a href='undocumented#SVG'>SVG</a> "sweep-flag" uses 1 for clockwise, while
+<a href='#SkPath_kCW_Direction'>kCW_Direction</a> cast to int is zero.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_rArcTo_rx'><code><strong>rx</strong></code></a></td>
+    <td>radius before x-axis rotation</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rArcTo_ry'><code><strong>ry</strong></code></a></td>
+    <td>radius before x-axis rotation</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rArcTo_xAxisRotate'><code><strong>xAxisRotate</strong></code></a></td>
+    <td>x-axis rotation in degrees; positive values are clockwise</td>
+  </tr>
+  <tr>    <td><a name='SkPath_rArcTo_largeArc'><code><strong>largeArc</strong></code></a></td>
+    <td>chooses smaller or larger <a href='undocumented#Arc'>Arc</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_rArcTo_sweep'><code><strong>sweep</strong></code></a></td>
+    <td>chooses clockwise or counterclockwise <a href='undocumented#Arc'>Arc</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_rArcTo_dx'><code><strong>dx</strong></code></a></td>
+    <td>x-axis offset end of <a href='undocumented#Arc'>Arc</a> from last <a href='SkPath_Reference#Path'>Path</a> <a href='SkPoint_Reference#Point'>Point</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_rArcTo_dy'><code><strong>dy</strong></code></a></td>
+    <td>y-axis offset end of <a href='undocumented#Arc'>Arc</a> from last <a href='SkPath_Reference#Path'>Path</a> <a href='SkPoint_Reference#Point'>Point</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#Path'>Path</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_rArcTo"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_arcTo'>arcTo</a> <a href='#SkPath_ArcSize'>ArcSize</a> <a href='#SkPath_Direction'>Direction</a>
+
+<a name='SkPath_close'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_close'>close()</a>
+</pre>
+
+Appends <a href='#SkPath_kClose_Verb'>kClose_Verb</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>. A closed <a href='SkPath_Overview#Contour'>contour</a> connects the first and last <a href='SkPoint_Reference#SkPoint'>SkPoint</a>
+with <a href='undocumented#Line'>line</a>, forming a continuous loop. Open and closed <a href='SkPath_Overview#Contour'>contour</a> draw the same
+with <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kFill_Style'>kFill_Style</a>. With <a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_kStroke_Style'>kStroke_Style</a>, open <a href='SkPath_Overview#Contour'>contour</a> draws
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Cap'>Cap</a> at <a href='SkPath_Overview#Contour'>contour</a> start and end; closed <a href='SkPath_Overview#Contour'>contour</a> draws
+<a href='SkPaint_Reference#SkPaint'>SkPaint</a>::<a href='#SkPaint_Join'>Join</a> at <a href='SkPath_Overview#Contour'>contour</a> start and end.
+
+<a href='#SkPath_close'>close()</a> has no effect if <a href='SkPath_Reference#SkPath'>SkPath</a> is empty or last <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> is <a href='#SkPath_kClose_Verb'>kClose_Verb</a>.
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_close"></fiddle-embed></div>
+
+### See Also
+
+<a name='SkPath_IsInverseFillType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static bool <a href='#SkPath_IsInverseFillType'>IsInverseFillType</a>(<a href='#SkPath_FillType'>FillType</a> fill)
+</pre>
+
+Returns true if <a href='#SkPath_IsInverseFillType_fill'>fill</a> is inverted and <a href='SkPath_Reference#Path'>Path</a> with <a href='#SkPath_IsInverseFillType_fill'>fill</a> represents area outside
+of its geometric bounds.
+
+| <a href='#SkPath_FillType'>FillType</a> | is inverse |
+| --- | ---  |
+| <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a> | false |
+| <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a> | false |
+| <a href='#SkPath_kInverseWinding_FillType'>kInverseWinding_FillType</a> | true |
+| <a href='#SkPath_kInverseEvenOdd_FillType'>kInverseEvenOdd_FillType</a> | true |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_IsInverseFillType_fill'><code><strong>fill</strong></code></a></td>
+    <td>one of: <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a>, <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a>,
+<a href='#SkPath_kInverseWinding_FillType'>kInverseWinding_FillType</a>, <a href='#SkPath_kInverseEvenOdd_FillType'>kInverseEvenOdd_FillType</a>
+</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkPath_Reference#Path'>Path</a> fills outside its bounds
+
+### Example
+
+<div><fiddle-embed name="@Path_IsInverseFillType">
+
+#### Example Output
+
+~~~~
+IsInverseFillType(kWinding_FillType) == false
+IsInverseFillType(kEvenOdd_FillType) == false
+IsInverseFillType(kInverseWinding_FillType) == true
+IsInverseFillType(kInverseEvenOdd_FillType) == true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_FillType'>FillType</a> <a href='#SkPath_getFillType'>getFillType</a> <a href='#SkPath_setFillType'>setFillType</a> <a href='#SkPath_ConvertToNonInverseFillType'>ConvertToNonInverseFillType</a>
+
+<a name='SkPath_ConvertToNonInverseFillType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='#SkPath_FillType'>FillType</a> <a href='#SkPath_ConvertToNonInverseFillType'>ConvertToNonInverseFillType</a>(<a href='#SkPath_FillType'>FillType</a> fill)
+</pre>
+
+Returns equivalent <a href='#Path_Fill_Type'>Fill_Type</a> representing <a href='SkPath_Reference#Path'>Path</a> <a href='#SkPath_ConvertToNonInverseFillType_fill'>fill</a> inside its bounds.
+
+| <a href='#SkPath_FillType'>FillType</a> | inside <a href='#SkPath_FillType'>FillType</a> |
+| --- | ---  |
+| <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a> | <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a> |
+| <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a> | <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a> |
+| <a href='#SkPath_kInverseWinding_FillType'>kInverseWinding_FillType</a> | <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a> |
+| <a href='#SkPath_kInverseEvenOdd_FillType'>kInverseEvenOdd_FillType</a> | <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a> |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_ConvertToNonInverseFillType_fill'><code><strong>fill</strong></code></a></td>
+    <td>one of: <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a>, <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a>,
+<a href='#SkPath_kInverseWinding_FillType'>kInverseWinding_FillType</a>, <a href='#SkPath_kInverseEvenOdd_FillType'>kInverseEvenOdd_FillType</a>
+</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='#SkPath_ConvertToNonInverseFillType_fill'>fill</a>, or <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a> or <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a> if <a href='#SkPath_ConvertToNonInverseFillType_fill'>fill</a> is inverted
+
+### Example
+
+<div><fiddle-embed name="@Path_ConvertToNonInverseFillType">
+
+#### Example Output
+
+~~~~
+ConvertToNonInverseFillType(kWinding_FillType) == kWinding_FillType
+ConvertToNonInverseFillType(kEvenOdd_FillType) == kEvenOdd_FillType
+ConvertToNonInverseFillType(kInverseWinding_FillType) == kWinding_FillType
+ConvertToNonInverseFillType(kInverseEvenOdd_FillType) == kEvenOdd_FillType
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_FillType'>FillType</a> <a href='#SkPath_getFillType'>getFillType</a> <a href='#SkPath_setFillType'>setFillType</a> <a href='#SkPath_IsInverseFillType'>IsInverseFillType</a>
+
+<a name='SkPath_ConvertConicToQuads'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static int <a href='#SkPath_ConvertConicToQuads'>ConvertConicToQuads</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p0, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p2, <a href='undocumented#SkScalar'>SkScalar</a> w,
+                               <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], int pow2)
+</pre>
+
+Approximates <a href='SkPath_Reference#Conic'>Conic</a> with <a href='SkPath_Reference#Quad'>Quad</a> array. <a href='SkPath_Reference#Conic'>Conic</a> is constructed from start <a href='SkPoint_Reference#Point'>Point</a> <a href='#SkPath_ConvertConicToQuads_p0'>p0</a>,
+control <a href='SkPoint_Reference#Point'>Point</a> <a href='#SkPath_ConvertConicToQuads_p1'>p1</a>, end <a href='SkPoint_Reference#Point'>Point</a> <a href='#SkPath_ConvertConicToQuads_p2'>p2</a>, and weight <a href='#SkPath_ConvertConicToQuads_w'>w</a>.
+<a href='SkPath_Reference#Quad'>Quad</a> array is stored in <a href='#SkPath_ConvertConicToQuads_pts'>pts</a>; this storage is supplied by caller.
+Maximum <a href='SkPath_Reference#Quad'>Quad</a> count is 2 to the <a href='#SkPath_ConvertConicToQuads_pow2'>pow2</a>.
+Every third <a href='SkPoint_Reference#Point'>point</a> in array shares last <a href='SkPoint_Reference#Point'>Point</a> of previous <a href='SkPath_Reference#Quad'>Quad</a> and first <a href='SkPoint_Reference#Point'>Point</a> of
+next <a href='SkPath_Reference#Quad'>Quad</a>. Maximum <a href='#SkPath_ConvertConicToQuads_pts'>pts</a> storage <a href='undocumented#Size'>size</a> is given by:
+<code>(1 + 2 * (1 << <a href='#SkPath_ConvertConicToQuads_pow2'>pow2</a>)) * <a href='undocumented#sizeof()'>sizeof</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a>)</code>.
+
+Returns <a href='SkPath_Reference#Quad'>Quad</a> count used the approximation, which may be smaller
+than the number requested.
+
+<a href='#Path_Conic_Weight'>Conic_Weight</a> determines the amount of influence <a href='SkPath_Reference#Conic'>Conic</a> control <a href='SkPoint_Reference#Point'>point</a> has on the <a href='undocumented#Curve'>curve</a>.
+<a href='#SkPath_ConvertConicToQuads_w'>w</a> less than one represents an elliptical section. <a href='#SkPath_ConvertConicToQuads_w'>w</a> greater than one represents
+a hyperbolic section. <a href='#SkPath_ConvertConicToQuads_w'>w</a> equal to one represents a parabolic section.
+
+Two <a href='SkPath_Reference#Quad'>Quad</a> <a href='undocumented#Curve'>curves</a> are sufficient to approximate an elliptical <a href='SkPath_Reference#Conic'>Conic</a> with a sweep
+of up to 90 degrees; in this case, set <a href='#SkPath_ConvertConicToQuads_pow2'>pow2</a> to one.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_ConvertConicToQuads_p0'><code><strong>p0</strong></code></a></td>
+    <td><a href='SkPath_Reference#Conic'>Conic</a> start <a href='SkPoint_Reference#Point'>Point</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_ConvertConicToQuads_p1'><code><strong>p1</strong></code></a></td>
+    <td><a href='SkPath_Reference#Conic'>Conic</a> control <a href='SkPoint_Reference#Point'>Point</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_ConvertConicToQuads_p2'><code><strong>p2</strong></code></a></td>
+    <td><a href='SkPath_Reference#Conic'>Conic</a> end <a href='SkPoint_Reference#Point'>Point</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_ConvertConicToQuads_w'><code><strong>w</strong></code></a></td>
+    <td><a href='SkPath_Reference#Conic'>Conic</a> weight</td>
+  </tr>
+  <tr>    <td><a name='SkPath_ConvertConicToQuads_pts'><code><strong>pts</strong></code></a></td>
+    <td>storage for <a href='SkPath_Reference#Quad'>Quad</a> array</td>
+  </tr>
+  <tr>    <td><a name='SkPath_ConvertConicToQuads_pow2'><code><strong>pow2</strong></code></a></td>
+    <td><a href='SkPath_Reference#Quad'>Quad</a> count, as power of two, normally 0 to 5 (1 to 32 <a href='SkPath_Reference#Quad'>Quad</a> <a href='undocumented#Curve'>curves</a>)</td>
+  </tr>
+</table>
+
+### Return Value
+
+number of <a href='SkPath_Reference#Quad'>Quad</a> <a href='undocumented#Curve'>curves</a> written to <a href='#SkPath_ConvertConicToQuads_pts'>pts</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_ConvertConicToQuads"><div>A pair of <a href='SkPath_Reference#Quad'>Quad</a> <a href='undocumented#Curve'>curves</a> are drawn in red on top of the elliptical <a href='SkPath_Reference#Conic'>Conic</a> <a href='undocumented#Curve'>curve</a> in black.
+The middle <a href='undocumented#Curve'>curve</a> is nearly circular. The top-right <a href='undocumented#Curve'>curve</a> is parabolic, which can
+be drawn exactly with a single <a href='SkPath_Reference#Quad'>Quad</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Reference#Conic'>Conic</a> <a href='SkPath_Reference#Quad'>Quad</a>
+
+<a name='SkPath_isRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_isRect'>isRect</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* <a href='SkRect_Reference#Rect'>rect</a>, bool* isClosed = nullptr, <a href='#SkPath_Direction'>Direction</a>* direction = nullptr)const
+</pre>
+
+Returns true if <a href='SkPath_Reference#SkPath'>SkPath</a> is equivalent to <a href='SkRect_Reference#SkRect'>SkRect</a> when filled.
+If false: <a href='#SkPath_isRect_rect'>rect</a>, <a href='#SkPath_isRect_isClosed'>isClosed</a>, and <a href='#SkPath_isRect_direction'>direction</a> are unchanged.
+If true: <a href='#SkPath_isRect_rect'>rect</a>, <a href='#SkPath_isRect_isClosed'>isClosed</a>, and <a href='#SkPath_isRect_direction'>direction</a> are written to if not nullptr.
+
+<a href='#SkPath_isRect_rect'>rect</a> may be smaller than the <a href='SkPath_Reference#SkPath'>SkPath</a> bounds. <a href='SkPath_Reference#SkPath'>SkPath</a> bounds may include <a href='#SkPath_kMove_Verb'>kMove_Verb</a> <a href='SkPoint_Reference#Point'>points</a>
+that do not alter the area drawn by the returned <a href='#SkPath_isRect_rect'>rect</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_isRect_rect'><code><strong>rect</strong></code></a></td>
+    <td>storage for bounds of <a href='SkRect_Reference#SkRect'>SkRect</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkPath_isRect_isClosed'><code><strong>isClosed</strong></code></a></td>
+    <td>storage set to true if <a href='SkPath_Reference#SkPath'>SkPath</a> is closed; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkPath_isRect_direction'><code><strong>direction</strong></code></a></td>
+    <td>storage set to <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkPath_isRect_direction'>direction</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkPath_Reference#SkPath'>SkPath</a> contains <a href='SkRect_Reference#SkRect'>SkRect</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_isRect"><div>After <a href='#SkPath_addRect'>addRect</a>, <a href='#SkPath_isRect'>isRect</a> returns true. Following <a href='#SkPath_moveTo'>moveTo</a> permits <a href='#SkPath_isRect'>isRect</a> to return true, but
+following <a href='#SkPath_lineTo'>lineTo</a> does not. <a href='#SkPath_addPoly'>addPoly</a> returns true even though <a href='#SkPath_isRect_rect'>rect</a> is not closed, and one
+side of <a href='#SkPath_isRect_rect'>rect</a> is made up of consecutive <a href='undocumented#Line'>line</a> segments.
+</div>
+
+#### Example Output
+
+~~~~
+empty is not rect
+addRect is rect (10, 20, 30, 40); is closed; direction CW
+moveTo is rect (10, 20, 30, 40); is closed; direction CW
+lineTo is not rect
+addPoly is rect (0, 0, 80, 80); is not closed; direction CCW
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_computeTightBounds'>computeTightBounds</a> <a href='#SkPath_conservativelyContainsRect'>conservativelyContainsRect</a> <a href='#SkPath_getBounds'>getBounds</a> <a href='#SkPath_isConvex'>isConvex</a> <a href='#SkPath_isLastContourClosed'>isLastContourClosed</a> <a href='#SkPath_isNestedFillRects'>isNestedFillRects</a>
+
+<a name='SkPath_isNestedFillRects'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_isNestedFillRects'>isNestedFillRects</a>(<a href='SkRect_Reference#SkRect'>SkRect</a> <a href='SkRect_Reference#Rect'>rect</a>[2], <a href='#SkPath_Direction'>Direction</a> dirs[2] = nullptr)const
+</pre>
+
+Returns true if <a href='SkPath_Reference#SkPath'>SkPath</a> is equivalent to nested <a href='SkRect_Reference#SkRect'>SkRect</a> pair when filled.
+If false, <a href='#SkPath_isNestedFillRects_rect'>rect</a> and <a href='#SkPath_isNestedFillRects_dirs'>dirs</a> are unchanged.
+If true, <a href='#SkPath_isNestedFillRects_rect'>rect</a> and <a href='#SkPath_isNestedFillRects_dirs'>dirs</a> are written to if not nullptr:
+setting <a href='#SkPath_isNestedFillRects_rect'>rect</a>[0] to outer <a href='SkRect_Reference#SkRect'>SkRect</a>, and <a href='#SkPath_isNestedFillRects_rect'>rect</a>[1] to inner <a href='SkRect_Reference#SkRect'>SkRect</a>;
+setting <a href='#SkPath_isNestedFillRects_dirs'>dirs</a>[0] to <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Direction'>Direction</a> of outer <a href='SkRect_Reference#SkRect'>SkRect</a>, and <a href='#SkPath_isNestedFillRects_dirs'>dirs</a>[1] to <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Direction'>Direction</a> of
+inner <a href='SkRect_Reference#SkRect'>SkRect</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_isNestedFillRects_rect'><code><strong>rect</strong></code></a></td>
+    <td>storage for <a href='SkRect_Reference#SkRect'>SkRect</a> pair; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkPath_isNestedFillRects_dirs'><code><strong>dirs</strong></code></a></td>
+    <td>storage for <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Direction'>Direction</a> pair; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkPath_Reference#SkPath'>SkPath</a> contains nested <a href='SkRect_Reference#SkRect'>SkRect</a> pair
+
+### Example
+
+<div><fiddle-embed name="77e4394caf9fa083c19c21c2462efe14">
+
+#### Example Output
+
+~~~~
+outer (7.5, 17.5, 32.5, 42.5); direction CW
+inner (12.5, 22.5, 27.5, 37.5); direction CCW
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_computeTightBounds'>computeTightBounds</a> <a href='#SkPath_conservativelyContainsRect'>conservativelyContainsRect</a> <a href='#SkPath_getBounds'>getBounds</a> <a href='#SkPath_isConvex'>isConvex</a> <a href='#SkPath_isLastContourClosed'>isLastContourClosed</a> <a href='#SkPath_isRect'>isRect</a>
+
+<a name='SkPath_addRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addRect'>addRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='#SkPath_Direction'>Direction</a> dir = <a href='#SkPath_kCW_Direction'>kCW_Direction</a>)
+</pre>
+
+Adds <a href='SkRect_Reference#SkRect'>SkRect</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>, appending <a href='#SkPath_kMove_Verb'>kMove_Verb</a>, three <a href='#SkPath_kLine_Verb'>kLine_Verb</a>, and <a href='#SkPath_kClose_Verb'>kClose_Verb</a>,
+starting with top-left corner of <a href='SkRect_Reference#SkRect'>SkRect</a>; followed by top-right, bottom-right,
+and bottom-left if <a href='#SkPath_addRect_dir'>dir</a> is <a href='#SkPath_kCW_Direction'>kCW_Direction</a>; or followed by bottom-left,
+bottom-right, and top-right if <a href='#SkPath_addRect_dir'>dir</a> is <a href='#SkPath_kCCW_Direction'>kCCW_Direction</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addRect_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to add as a closed <a href='SkPath_Overview#Contour'>contour</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRect_dir'><code><strong>dir</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Direction'>Direction</a> to wind added <a href='SkPath_Overview#Contour'>contour</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_addRect"><div>The left <a href='SkRect_Reference#Rect'>Rect</a> dashes starting at the top-left corner, to the right.
+The right <a href='SkRect_Reference#Rect'>Rect</a> dashes starting at the top-left corner, towards the bottom.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawRect'>drawRect</a> <a href='#SkPath_Direction'>Direction</a>
+
+<a name='SkPath_addRect_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addRect'>addRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='#SkPath_Direction'>Direction</a> dir, unsigned start)
+</pre>
+
+Adds <a href='SkRect_Reference#Rect'>Rect</a> to <a href='SkPath_Reference#Path'>Path</a>, appending <a href='#SkPath_kMove_Verb'>kMove_Verb</a>, three <a href='#SkPath_kLine_Verb'>kLine_Verb</a>, and <a href='#SkPath_kClose_Verb'>kClose_Verb</a>.
+If <a href='#SkPath_addRect_2_dir'>dir</a> is <a href='#SkPath_kCW_Direction'>kCW_Direction</a>, <a href='SkRect_Reference#Rect'>Rect</a> corners are added clockwise; if <a href='#SkPath_addRect_2_dir'>dir</a> is
+<a href='#SkPath_kCCW_Direction'>kCCW_Direction</a>, <a href='SkRect_Reference#Rect'>Rect</a> corners are added counterclockwise.
+<a href='#SkPath_addRect_2_start'>start</a> determines the first corner added.
+
+| <a href='#SkPath_addRect_2_start'>start</a> | first corner |
+| --- | ---  |
+| 0 | top-left |
+| 1 | top-right |
+| 2 | bottom-right |
+| 3 | bottom-left |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addRect_2_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkRect_Reference#Rect'>Rect</a> to add as a closed <a href='SkPath_Overview#Contour'>contour</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRect_2_dir'><code><strong>dir</strong></code></a></td>
+    <td><a href='#SkPath_Direction'>Direction</a> to wind added <a href='SkPath_Overview#Contour'>contour</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRect_2_start'><code><strong>start</strong></code></a></td>
+    <td>initial corner of <a href='SkRect_Reference#Rect'>Rect</a> to add</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#Path'>Path</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_addRect_2"><div>The arrow is just after the initial corner and <a href='SkPoint_Reference#Point'>points</a> towards the next
+corner appended to <a href='SkPath_Reference#Path'>Path</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawRect'>drawRect</a> <a href='#SkPath_Direction'>Direction</a>
+
+<a name='SkPath_addRect_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addRect'>addRect</a>(<a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top, <a href='undocumented#SkScalar'>SkScalar</a> right, <a href='undocumented#SkScalar'>SkScalar</a> bottom,
+                <a href='#SkPath_Direction'>Direction</a> dir = <a href='#SkPath_kCW_Direction'>kCW_Direction</a>)
+</pre>
+
+Adds <a href='SkRect_Reference#SkRect'>SkRect</a> (<a href='#SkPath_addRect_3_left'>left</a>, <a href='#SkPath_addRect_3_top'>top</a>, <a href='#SkPath_addRect_3_right'>right</a>, <a href='#SkPath_addRect_3_bottom'>bottom</a>) to <a href='SkPath_Reference#SkPath'>SkPath</a>,
+appending <a href='#SkPath_kMove_Verb'>kMove_Verb</a>, three <a href='#SkPath_kLine_Verb'>kLine_Verb</a>, and <a href='#SkPath_kClose_Verb'>kClose_Verb</a>,
+starting with top-left corner of <a href='SkRect_Reference#SkRect'>SkRect</a>; followed by top-right, bottom-right,
+and bottom-left if <a href='#SkPath_addRect_3_dir'>dir</a> is <a href='#SkPath_kCW_Direction'>kCW_Direction</a>; or followed by bottom-left,
+bottom-right, and top-right if <a href='#SkPath_addRect_3_dir'>dir</a> is <a href='#SkPath_kCCW_Direction'>kCCW_Direction</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addRect_3_left'><code><strong>left</strong></code></a></td>
+    <td>smaller x-axis value of <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRect_3_top'><code><strong>top</strong></code></a></td>
+    <td>smaller y-axis value of <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRect_3_right'><code><strong>right</strong></code></a></td>
+    <td>larger x-axis value of <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRect_3_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>larger y-axis value of <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRect_3_dir'><code><strong>dir</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Direction'>Direction</a> to wind added <a href='SkPath_Overview#Contour'>contour</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_addRect_3"><div>The <a href='#SkPath_addRect_3_left'>left</a> <a href='SkRect_Reference#Rect'>Rect</a> dashes start at the top-left corner, and continue to the <a href='#SkPath_addRect_3_right'>right</a>.
+The <a href='#SkPath_addRect_3_right'>right</a> <a href='SkRect_Reference#Rect'>Rect</a> dashes start at the top-left corner, and continue down.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawRect'>drawRect</a> <a href='#SkPath_Direction'>Direction</a>
+
+<a name='SkPath_addOval'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addOval'>addOval</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>, <a href='#SkPath_Direction'>Direction</a> dir = <a href='#SkPath_kCW_Direction'>kCW_Direction</a>)
+</pre>
+
+Adds <a href='#SkPath_addOval_oval'>oval</a> to <a href='SkPath_Reference#Path'>path</a>, appending <a href='#SkPath_kMove_Verb'>kMove_Verb</a>, four <a href='#SkPath_kConic_Verb'>kConic_Verb</a>, and <a href='#SkPath_kClose_Verb'>kClose_Verb</a>.
+<a href='undocumented#Oval'>Oval</a> is upright ellipse bounded by <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkPath_addOval_oval'>oval</a> with radii equal to half <a href='#SkPath_addOval_oval'>oval</a> width
+and half <a href='#SkPath_addOval_oval'>oval</a> height. <a href='undocumented#Oval'>Oval</a> begins at (<a href='#SkPath_addOval_oval'>oval</a>.<a href='#SkRect_fRight'>fRight</a>, <a href='#SkPath_addOval_oval'>oval</a>.<a href='#SkRect_centerY'>centerY</a>()) and continues
+clockwise if <a href='#SkPath_addOval_dir'>dir</a> is <a href='#SkPath_kCW_Direction'>kCW_Direction</a>, counterclockwise if <a href='#SkPath_addOval_dir'>dir</a> is <a href='#SkPath_kCCW_Direction'>kCCW_Direction</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addOval_oval'><code><strong>oval</strong></code></a></td>
+    <td>bounds of ellipse added</td>
+  </tr>
+  <tr>    <td><a name='SkPath_addOval_dir'><code><strong>dir</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Direction'>Direction</a> to wind ellipse</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_addOval"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawOval'>drawOval</a> <a href='#SkPath_Direction'>Direction</a> <a href='undocumented#Oval'>Oval</a>
+
+<a name='SkPath_addOval_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addOval'>addOval</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>, <a href='#SkPath_Direction'>Direction</a> dir, unsigned start)
+</pre>
+
+Adds <a href='undocumented#Oval'>Oval</a> to <a href='SkPath_Reference#Path'>Path</a>, appending <a href='#SkPath_kMove_Verb'>kMove_Verb</a>, four <a href='#SkPath_kConic_Verb'>kConic_Verb</a>, and <a href='#SkPath_kClose_Verb'>kClose_Verb</a>.
+<a href='undocumented#Oval'>Oval</a> is upright ellipse bounded by <a href='SkRect_Reference#Rect'>Rect</a> <a href='#SkPath_addOval_2_oval'>oval</a> with radii equal to half <a href='#SkPath_addOval_2_oval'>oval</a> width
+and half <a href='#SkPath_addOval_2_oval'>oval</a> height. <a href='undocumented#Oval'>Oval</a> begins at <a href='#SkPath_addOval_2_start'>start</a> and continues
+clockwise if <a href='#SkPath_addOval_2_dir'>dir</a> is <a href='#SkPath_kCW_Direction'>kCW_Direction</a>, counterclockwise if <a href='#SkPath_addOval_2_dir'>dir</a> is <a href='#SkPath_kCCW_Direction'>kCCW_Direction</a>.
+
+| <a href='#SkPath_addOval_2_start'>start</a> | <a href='SkPoint_Reference#Point'>Point</a> |
+| --- | ---  |
+| 0 | <a href='#SkPath_addOval_2_oval'>oval</a>.<a href='#SkRect_centerX'>centerX</a>(), <a href='#SkPath_addOval_2_oval'>oval</a>.<a href='#SkRect_fTop'>fTop</a> |
+| 1 | <a href='#SkPath_addOval_2_oval'>oval</a>.<a href='#SkRect_fRight'>fRight</a>, <a href='#SkPath_addOval_2_oval'>oval</a>.<a href='#SkRect_centerY'>centerY</a>() |
+| 2 | <a href='#SkPath_addOval_2_oval'>oval</a>.<a href='#SkRect_centerX'>centerX</a>(), <a href='#SkPath_addOval_2_oval'>oval</a>.<a href='#SkRect_fBottom'>fBottom</a> |
+| 3 | <a href='#SkPath_addOval_2_oval'>oval</a>.<a href='#SkRect_fLeft'>fLeft</a>, <a href='#SkPath_addOval_2_oval'>oval</a>.<a href='#SkRect_centerY'>centerY</a>() |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addOval_2_oval'><code><strong>oval</strong></code></a></td>
+    <td>bounds of ellipse added</td>
+  </tr>
+  <tr>    <td><a name='SkPath_addOval_2_dir'><code><strong>dir</strong></code></a></td>
+    <td><a href='#SkPath_Direction'>Direction</a> to wind ellipse</td>
+  </tr>
+  <tr>    <td><a name='SkPath_addOval_2_start'><code><strong>start</strong></code></a></td>
+    <td>index of initial <a href='SkPoint_Reference#Point'>point</a> of ellipse</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#Path'>Path</a>
+
+### Example
+
+<div><fiddle-embed name="f1122d6fffddac0167e96fab4b9a862f"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawOval'>drawOval</a> <a href='#SkPath_Direction'>Direction</a> <a href='undocumented#Oval'>Oval</a>
+
+<a name='SkPath_addCircle'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addCircle'>addCircle</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, <a href='undocumented#SkScalar'>SkScalar</a> radius, <a href='#SkPath_Direction'>Direction</a> dir = <a href='#SkPath_kCW_Direction'>kCW_Direction</a>)
+</pre>
+
+Adds <a href='undocumented#Circle'>Circle</a> centered at (<a href='#SkPath_addCircle_x'>x</a>, <a href='#SkPath_addCircle_y'>y</a>) of <a href='undocumented#Size'>size</a> <a href='#SkPath_addCircle_radius'>radius</a> to <a href='SkPath_Reference#Path'>Path</a>, appending <a href='#SkPath_kMove_Verb'>kMove_Verb</a>,
+four <a href='#SkPath_kConic_Verb'>kConic_Verb</a>, and <a href='#SkPath_kClose_Verb'>kClose_Verb</a>. <a href='undocumented#Circle'>Circle</a> begins at: <code>(<a href='#SkPath_addCircle_x'>x</a> + <a href='#SkPath_addCircle_radius'>radius</a>, <a href='#SkPath_addCircle_y'>y</a>)</code>, continuing
+clockwise if <a href='#SkPath_addCircle_dir'>dir</a> is <a href='#SkPath_kCW_Direction'>kCW_Direction</a>, and counterclockwise if <a href='#SkPath_addCircle_dir'>dir</a> is <a href='#SkPath_kCCW_Direction'>kCCW_Direction</a>.
+
+Has no effect if <a href='#SkPath_addCircle_radius'>radius</a> is zero or negative.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addCircle_x'><code><strong>x</strong></code></a></td>
+    <td>center of <a href='undocumented#Circle'>Circle</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addCircle_y'><code><strong>y</strong></code></a></td>
+    <td>center of <a href='undocumented#Circle'>Circle</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addCircle_radius'><code><strong>radius</strong></code></a></td>
+    <td>distance from center to edge</td>
+  </tr>
+  <tr>    <td><a name='SkPath_addCircle_dir'><code><strong>dir</strong></code></a></td>
+    <td><a href='#SkPath_Direction'>Direction</a> to wind <a href='undocumented#Circle'>Circle</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#Path'>Path</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_addCircle"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawCircle'>drawCircle</a> <a href='#SkPath_Direction'>Direction</a> <a href='undocumented#Circle'>Circle</a>
+
+<a name='SkPath_addArc'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addArc'>addArc</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>, <a href='undocumented#SkScalar'>SkScalar</a> startAngle, <a href='undocumented#SkScalar'>SkScalar</a> sweepAngle)
+</pre>
+
+Appends <a href='undocumented#Arc'>arc</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>, as the start of new <a href='SkPath_Overview#Contour'>contour</a>. <a href='undocumented#Arc'>Arc</a> added is part of ellipse
+bounded by <a href='#SkPath_addArc_oval'>oval</a>, from <a href='#SkPath_addArc_startAngle'>startAngle</a> through <a href='#SkPath_addArc_sweepAngle'>sweepAngle</a>. Both <a href='#SkPath_addArc_startAngle'>startAngle</a> and
+<a href='#SkPath_addArc_sweepAngle'>sweepAngle</a> are measured in degrees, where zero degrees is aligned with the
+positive x-axis, and positive sweeps extends <a href='undocumented#Arc'>arc</a> clockwise.
+
+If <a href='#SkPath_addArc_sweepAngle'>sweepAngle</a> <= -360, or <a href='#SkPath_addArc_sweepAngle'>sweepAngle</a> >= 360; and <a href='#SkPath_addArc_startAngle'>startAngle</a> modulo 90 is nearly
+zero, append <a href='#SkPath_addArc_oval'>oval</a> instead of <a href='undocumented#Arc'>arc</a>. Otherwise, <a href='#SkPath_addArc_sweepAngle'>sweepAngle</a> values are treated
+modulo 360, and <a href='undocumented#Arc'>arc</a> may or may not draw depending on numeric rounding.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addArc_oval'><code><strong>oval</strong></code></a></td>
+    <td>bounds of ellipse containing <a href='undocumented#Arc'>arc</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addArc_startAngle'><code><strong>startAngle</strong></code></a></td>
+    <td>starting angle of <a href='undocumented#Arc'>arc</a> in degrees</td>
+  </tr>
+  <tr>    <td><a name='SkPath_addArc_sweepAngle'><code><strong>sweepAngle</strong></code></a></td>
+    <td>sweep, in degrees. Positive is clockwise; treated modulo 360</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_addArc"><div>The middle row of the left and right columns draw differently from the entries
+above and below because <a href='#SkPath_addArc_sweepAngle'>sweepAngle</a> is outside of the range of +/-360,
+and <a href='#SkPath_addArc_startAngle'>startAngle</a> modulo 90 is not zero.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#Arc'>Arc</a> <a href='#SkPath_arcTo'>arcTo</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawArc'>drawArc</a>
+
+<a name='SkPath_addRoundRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addRoundRect'>addRoundRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='undocumented#SkScalar'>SkScalar</a> rx, <a href='undocumented#SkScalar'>SkScalar</a> ry, <a href='#SkPath_Direction'>Direction</a> dir = <a href='#SkPath_kCW_Direction'>kCW_Direction</a>)
+</pre>
+
+Appends <a href='SkRRect_Reference#SkRRect'>SkRRect</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>, creating a new closed <a href='SkPath_Overview#Contour'>contour</a>. <a href='SkRRect_Reference#SkRRect'>SkRRect</a> has bounds
+equal to <a href='#SkPath_addRoundRect_rect'>rect</a>; each corner is 90 degrees of an ellipse with radii (<a href='#SkPath_addRoundRect_rx'>rx</a>, <a href='#SkPath_addRoundRect_ry'>ry</a>). If
+<a href='#SkPath_addRoundRect_dir'>dir</a> is <a href='#SkPath_kCW_Direction'>kCW_Direction</a>, <a href='SkRRect_Reference#SkRRect'>SkRRect</a> starts at top-left of the lower-left corner and
+winds clockwise. If <a href='#SkPath_addRoundRect_dir'>dir</a> is <a href='#SkPath_kCCW_Direction'>kCCW_Direction</a>, <a href='SkRRect_Reference#SkRRect'>SkRRect</a> starts at the bottom-left
+of the upper-left corner and winds counterclockwise.
+
+If either <a href='#SkPath_addRoundRect_rx'>rx</a> or <a href='#SkPath_addRoundRect_ry'>ry</a> is too large, <a href='#SkPath_addRoundRect_rx'>rx</a> and <a href='#SkPath_addRoundRect_ry'>ry</a> are scaled uniformly until the
+corners fit. If <a href='#SkPath_addRoundRect_rx'>rx</a> or <a href='#SkPath_addRoundRect_ry'>ry</a> is less than or equal to zero, <a href='#SkPath_addRoundRect'>addRoundRect</a>() appends
+<a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkPath_addRoundRect_rect'>rect</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>.
+
+After appending, <a href='SkPath_Reference#SkPath'>SkPath</a> may be empty, or may contain: <a href='SkRect_Reference#SkRect'>SkRect</a>, <a href='undocumented#Oval'>oval</a>, or <a href='SkRRect_Reference#SkRRect'>SkRRect</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addRoundRect_rect'><code><strong>rect</strong></code></a></td>
+    <td>bounds of <a href='SkRRect_Reference#SkRRect'>SkRRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRoundRect_rx'><code><strong>rx</strong></code></a></td>
+    <td>x-axis radius of rounded corners on the <a href='SkRRect_Reference#SkRRect'>SkRRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRoundRect_ry'><code><strong>ry</strong></code></a></td>
+    <td>y-axis radius of rounded corners on the <a href='SkRRect_Reference#SkRRect'>SkRRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRoundRect_dir'><code><strong>dir</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Direction'>Direction</a> to wind <a href='SkRRect_Reference#SkRRect'>SkRRect</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_addRoundRect"><div>If either radius is zero, <a href='SkPath_Reference#Path'>path</a> contains <a href='SkRect_Reference#Rect'>Rect</a> and is drawn red.
+If sides are only radii, <a href='SkPath_Reference#Path'>path</a> contains <a href='undocumented#Oval'>Oval</a> and is drawn blue.
+All remaining <a href='SkPath_Reference#Path'>path</a> draws are convex, and are drawn in gray; no
+<a href='SkPath_Reference#Path'>paths</a> constructed from <a href='#SkPath_addRoundRect'>addRoundRect</a> are concave, so none are
+drawn in green.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_addRRect'>addRRect</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawRoundRect'>drawRoundRect</a>
+
+<a name='SkPath_addRoundRect_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addRoundRect'>addRoundRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, const <a href='undocumented#SkScalar'>SkScalar</a> radii[], <a href='#SkPath_Direction'>Direction</a> dir = <a href='#SkPath_kCW_Direction'>kCW_Direction</a>)
+</pre>
+
+Appends <a href='#RRect'>Round_Rect</a> to <a href='SkPath_Reference#Path'>Path</a>, creating a new closed <a href='SkPath_Overview#Contour'>Contour</a>. <a href='#RRect'>Round_Rect</a> has bounds
+equal to <a href='#SkPath_addRoundRect_2_rect'>rect</a>; each corner is 90 degrees of an ellipse with <a href='#SkPath_addRoundRect_2_radii'>radii</a> from the
+array.
+
+| <a href='#SkPath_addRoundRect_2_radii'>radii</a> index | location |
+| --- | ---  |
+| 0 | x-axis radius of top-left corner |
+| 1 | y-axis radius of top-left corner |
+| 2 | x-axis radius of top-right corner |
+| 3 | y-axis radius of top-right corner |
+| 4 | x-axis radius of bottom-right corner |
+| 5 | y-axis radius of bottom-right corner |
+| 6 | x-axis radius of bottom-left corner |
+| 7 | y-axis radius of bottom-left corner |
+
+If <a href='#SkPath_addRoundRect_2_dir'>dir</a> is <a href='#SkPath_kCW_Direction'>kCW_Direction</a>, <a href='#RRect'>Round_Rect</a> starts at top-left of the lower-left corner
+and winds clockwise. If <a href='#SkPath_addRoundRect_2_dir'>dir</a> is <a href='#SkPath_kCCW_Direction'>kCCW_Direction</a>, <a href='#RRect'>Round_Rect</a> starts at the
+bottom-left of the upper-left corner and winds counterclockwise.
+
+If both <a href='#SkPath_addRoundRect_2_radii'>radii</a> on any side of <a href='#SkPath_addRoundRect_2_rect'>rect</a> exceed its length, all <a href='#SkPath_addRoundRect_2_radii'>radii</a> are scaled
+uniformly until the corners fit. If either radius of a corner is less than or
+equal to zero, both are treated as zero.
+
+After appending, <a href='SkPath_Reference#Path'>Path</a> may be empty, or may contain: <a href='SkRect_Reference#Rect'>Rect</a>, <a href='undocumented#Oval'>Oval</a>, or <a href='#RRect'>Round_Rect</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addRoundRect_2_rect'><code><strong>rect</strong></code></a></td>
+    <td>bounds of <a href='#RRect'>Round_Rect</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRoundRect_2_radii'><code><strong>radii</strong></code></a></td>
+    <td>array of 8 <a href='undocumented#SkScalar'>SkScalar</a> values, a radius pair for each corner</td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRoundRect_2_dir'><code><strong>dir</strong></code></a></td>
+    <td><a href='#SkPath_Direction'>Direction</a> to wind <a href='#RRect'>Round_Rect</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#Path'>Path</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_addRoundRect_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_addRRect'>addRRect</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawRoundRect'>drawRoundRect</a>
+
+<a name='SkPath_addRRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addRRect'>addRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect, <a href='#SkPath_Direction'>Direction</a> dir = <a href='#SkPath_kCW_Direction'>kCW_Direction</a>)
+</pre>
+
+Adds <a href='#SkPath_addRRect_rrect'>rrect</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>, creating a new closed <a href='SkPath_Overview#Contour'>contour</a>. If
+<a href='#SkPath_addRRect_dir'>dir</a> is <a href='#SkPath_kCW_Direction'>kCW_Direction</a>, <a href='#SkPath_addRRect_rrect'>rrect</a> starts at top-left of the lower-left corner and
+winds clockwise. If <a href='#SkPath_addRRect_dir'>dir</a> is <a href='#SkPath_kCCW_Direction'>kCCW_Direction</a>, <a href='#SkPath_addRRect_rrect'>rrect</a> starts at the bottom-left
+of the upper-left corner and winds counterclockwise.
+
+After appending, <a href='SkPath_Reference#SkPath'>SkPath</a> may be empty, or may contain: <a href='SkRect_Reference#SkRect'>SkRect</a>, <a href='undocumented#Oval'>oval</a>, or <a href='SkRRect_Reference#SkRRect'>SkRRect</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addRRect_rrect'><code><strong>rrect</strong></code></a></td>
+    <td>bounds and radii of rounded rectangle</td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRRect_dir'><code><strong>dir</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Direction'>Direction</a> to wind <a href='SkRRect_Reference#SkRRect'>SkRRect</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_addRRect"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_addRoundRect'>addRoundRect</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawRRect'>drawRRect</a>
+
+<a name='SkPath_addRRect_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addRRect'>addRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect, <a href='#SkPath_Direction'>Direction</a> dir, unsigned start)
+</pre>
+
+Adds <a href='#SkPath_addRRect_2_rrect'>rrect</a> to <a href='SkPath_Reference#Path'>Path</a>, creating a new closed <a href='SkPath_Overview#Contour'>Contour</a>. If <a href='#SkPath_addRRect_2_dir'>dir</a> is <a href='#SkPath_kCW_Direction'>kCW_Direction</a>, <a href='#SkPath_addRRect_2_rrect'>rrect</a>
+winds clockwise; if <a href='#SkPath_addRRect_2_dir'>dir</a> is <a href='#SkPath_kCCW_Direction'>kCCW_Direction</a>, <a href='#SkPath_addRRect_2_rrect'>rrect</a> winds counterclockwise.
+<a href='#SkPath_addRRect_2_start'>start</a> determines the first <a href='SkPoint_Reference#Point'>point</a> of <a href='#SkPath_addRRect_2_rrect'>rrect</a> to add.
+
+| <a href='#SkPath_addRRect_2_start'>start</a> | location |
+| --- | ---  |
+| 0 | right of top-left corner |
+| 1 | left of top-right corner |
+| 2 | bottom of top-right corner |
+| 3 | top of bottom-right corner |
+| 4 | left of bottom-right corner |
+| 5 | right of bottom-left corner |
+| 6 | top of bottom-left corner |
+| 7 | bottom of top-left corner |
+
+After appending, <a href='SkPath_Reference#Path'>Path</a> may be empty, or may contain: <a href='SkRect_Reference#Rect'>Rect</a>, <a href='undocumented#Oval'>Oval</a>, or <a href='#RRect'>Round_Rect</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addRRect_2_rrect'><code><strong>rrect</strong></code></a></td>
+    <td>bounds and radii of rounded rectangle</td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRRect_2_dir'><code><strong>dir</strong></code></a></td>
+    <td><a href='#SkPath_Direction'>Direction</a> to wind <a href='#RRect'>Round_Rect</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addRRect_2_start'><code><strong>start</strong></code></a></td>
+    <td>index of initial <a href='SkPoint_Reference#Point'>point</a> of <a href='#RRect'>Round_Rect</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#Path'>Path</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_addRRect_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_addRoundRect'>addRoundRect</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawRRect'>drawRRect</a>
+
+<a name='SkPath_addPoly'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addPoly'>addPoly</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], int count, bool close)
+</pre>
+
+Adds <a href='SkPath_Overview#Contour'>contour</a> created from <a href='undocumented#Line'>line</a> array, adding (<a href='#SkPath_addPoly_count'>count</a> - 1) <a href='undocumented#Line'>line</a> segments.
+<a href='SkPath_Overview#Contour'>Contour</a> added starts at <a href='#SkPath_addPoly_pts'>pts</a>[0], then adds a <a href='undocumented#Line'>line</a> for every additional <a href='SkPoint_Reference#SkPoint'>SkPoint</a>
+in <a href='#SkPath_addPoly_pts'>pts</a> array. If <a href='#SkPath_addPoly_close'>close</a> is true, appends <a href='#SkPath_kClose_Verb'>kClose_Verb</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>, connecting
+<a href='#SkPath_addPoly_pts'>pts</a>[<a href='#SkPath_addPoly_count'>count</a> - 1] and <a href='#SkPath_addPoly_pts'>pts</a>[0].
+
+If <a href='#SkPath_addPoly_count'>count</a> is zero, append <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to <a href='SkPath_Reference#Path'>path</a>.
+Has no effect if <a href='#SkPath_addPoly_count'>count</a> is less than one.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addPoly_pts'><code><strong>pts</strong></code></a></td>
+    <td>array of <a href='undocumented#Line'>line</a> sharing end and start <a href='SkPoint_Reference#SkPoint'>SkPoint</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addPoly_count'><code><strong>count</strong></code></a></td>
+    <td>length of  <a href='SkPath_Reference#Point_Array'>SkPoint array</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addPoly_close'><code><strong>close</strong></code></a></td>
+    <td>true to add <a href='undocumented#Line'>line</a> connecting <a href='SkPath_Overview#Contour'>contour</a> end and start</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_addPoly"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawPoints'>drawPoints</a>
+
+<a name='SkPath_addPoly_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addPoly'>addPoly</a>(const std::initializer_list&lt;<a href='SkPoint_Reference#SkPoint'>SkPoint</a>&gt;& list, bool close)
+</pre>
+
+Adds <a href='SkPath_Overview#Contour'>contour</a> created from <a href='#SkPath_addPoly_2_list'>list</a>. <a href='SkPath_Overview#Contour'>Contour</a> added starts at <a href='#SkPath_addPoly_2_list'>list</a>[0], then adds a <a href='undocumented#Line'>line</a>
+for every additional <a href='SkPoint_Reference#SkPoint'>SkPoint</a> in <a href='#SkPath_addPoly_2_list'>list</a>. If <a href='#SkPath_addPoly_2_close'>close</a> is true, appends <a href='#SkPath_kClose_Verb'>kClose_Verb</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>,
+connecting last and first <a href='SkPoint_Reference#SkPoint'>SkPoint</a> in <a href='#SkPath_addPoly_2_list'>list</a>.
+
+If <a href='#SkPath_addPoly_2_list'>list</a> is empty, append <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to <a href='SkPath_Reference#Path'>path</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addPoly_2_list'><code><strong>list</strong></code></a></td>
+    <td>array of <a href='SkPoint_Reference#SkPoint'>SkPoint</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addPoly_2_close'><code><strong>close</strong></code></a></td>
+    <td>true to add <a href='undocumented#Line'>line</a> connecting <a href='SkPath_Overview#Contour'>contour</a> end and start</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_addPoly_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawPoints'>drawPoints</a>
+
+<a name='SkPath_AddPathMode'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkPath_AddPathMode'>AddPathMode</a> {
+        <a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a>,
+        <a href='#SkPath_kExtend_AddPathMode'>kExtend_AddPathMode</a>,
+    };
+</pre>
+
+<a href='#SkPath_AddPathMode'>AddPathMode</a> chooses how <a href='#SkPath_addPath'>addPath</a> appends. Adding one <a href='SkPath_Reference#Path'>Path</a> to another can extend
+the last <a href='SkPath_Overview#Contour'>Contour</a> or start a new <a href='SkPath_Overview#Contour'>Contour</a>.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kAppend_AddPathMode'><code>SkPath::kAppend_AddPathMode</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>#Line # appended to destination unaltered ##</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='SkPath_Reference#Path'>Path</a> <a href='SkPath_Reference#Verb'>Verbs</a>, <a href='SkPoint_Reference#Point'>Points</a>, and <a href='#Path_Conic_Weight'>Conic_Weights</a> are appended to destination unaltered.
+Since <a href='SkPath_Reference#Path'>Path</a> <a href='#Path_Verb_Array'>Verb_Array</a> begins with <a href='#SkPath_kMove_Verb'>kMove_Verb</a> if src is not empty, this
+starts a new <a href='SkPath_Overview#Contour'>Contour</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kExtend_AddPathMode'><code>SkPath::kExtend_AddPathMode</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>#Line # add line if prior Contour is not closed ##</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+If destination is closed or empty, start a new <a href='SkPath_Overview#Contour'>Contour</a>. If destination
+is not empty, add <a href='undocumented#Line'>Line</a> from <a href='#Path_Last_Point'>Last_Point</a> to added <a href='SkPath_Reference#Path'>Path</a> first <a href='SkPoint_Reference#Point'>Point</a>. Skip added
+<a href='SkPath_Reference#Path'>Path</a> initial <a href='#SkPath_kMove_Verb'>kMove_Verb</a>, then append remaining <a href='SkPath_Reference#Verb'>Verbs</a>, <a href='SkPoint_Reference#Point'>Points</a>, and <a href='#Path_Conic_Weight'>Conic_Weights</a>.
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Path_AddPathMode"><div>test is built from <a href='SkPath_Reference#Path'>path</a>, open on the top row, and closed on the bottom row.
+The left column uses <a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a>; the right uses <a href='#SkPath_kExtend_AddPathMode'>kExtend_AddPathMode</a>.
+The top right composition is made up of one <a href='SkPath_Overview#Contour'>contour</a>; the other three have two.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_addPath'>addPath</a> <a href='#SkPath_reverseAddPath'>reverseAddPath</a>
+
+<a name='SkPath_addPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addPath'>addPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& src, <a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy, <a href='#SkPath_AddPathMode'>AddPathMode</a> mode = <a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a>)
+</pre>
+
+Appends <a href='#SkPath_addPath_src'>src</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>, offset by (<a href='#SkPath_addPath_dx'>dx</a>, <a href='#SkPath_addPath_dy'>dy</a>).
+
+If <a href='#SkPath_addPath_mode'>mode</a> is <a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a>, <a href='#SkPath_addPath_src'>src</a>  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, and  <a href='SkPath_Reference#Conic_Weight'>conic weights</a> are
+added unaltered. If <a href='#SkPath_addPath_mode'>mode</a> is <a href='#SkPath_kExtend_AddPathMode'>kExtend_AddPathMode</a>, add <a href='undocumented#Line'>line</a> before appending
+<a href='SkPath_Reference#Verb'>verbs</a>, <a href='SkPoint_Reference#SkPoint'>SkPoint</a>, and  <a href='SkPath_Reference#Conic_Weight'>conic weights</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addPath_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPath_Reference#Verb'>verbs</a>, <a href='SkPoint_Reference#SkPoint'>SkPoint</a>, and  <a href='SkPath_Reference#Conic_Weight'>conic weights</a> to add</td>
+  </tr>
+  <tr>    <td><a name='SkPath_addPath_dx'><code><strong>dx</strong></code></a></td>
+    <td>offset added to <a href='#SkPath_addPath_src'>src</a>  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> x-axis coordinates</td>
+  </tr>
+  <tr>    <td><a name='SkPath_addPath_dy'><code><strong>dy</strong></code></a></td>
+    <td>offset added to <a href='#SkPath_addPath_src'>src</a>  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> y-axis coordinates</td>
+  </tr>
+  <tr>    <td><a name='SkPath_addPath_mode'><code><strong>mode</strong></code></a></td>
+    <td><a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a> or <a href='#SkPath_kExtend_AddPathMode'>kExtend_AddPathMode</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="c416bddfe286628974e1c7f0fd66f3f4"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_AddPathMode'>AddPathMode</a> <a href='#SkPath_offset'>offset</a> <a href='#SkPath_reverseAddPath'>reverseAddPath</a>
+
+<a name='SkPath_addPath_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addPath'>addPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& src, <a href='#SkPath_AddPathMode'>AddPathMode</a> mode = <a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a>)
+</pre>
+
+Appends <a href='#SkPath_addPath_2_src'>src</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>.
+
+If <a href='#SkPath_addPath_2_mode'>mode</a> is <a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a>, <a href='#SkPath_addPath_2_src'>src</a>  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, and  <a href='SkPath_Reference#Conic_Weight'>conic weights</a> are
+added unaltered. If <a href='#SkPath_addPath_2_mode'>mode</a> is <a href='#SkPath_kExtend_AddPathMode'>kExtend_AddPathMode</a>, add <a href='undocumented#Line'>line</a> before appending
+<a href='SkPath_Reference#Verb'>verbs</a>, <a href='SkPoint_Reference#SkPoint'>SkPoint</a>, and  <a href='SkPath_Reference#Conic_Weight'>conic weights</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addPath_2_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPath_Reference#Verb'>verbs</a>, <a href='SkPoint_Reference#SkPoint'>SkPoint</a>, and  <a href='SkPath_Reference#Conic_Weight'>conic weights</a> to add</td>
+  </tr>
+  <tr>    <td><a name='SkPath_addPath_2_mode'><code><strong>mode</strong></code></a></td>
+    <td><a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a> or <a href='#SkPath_kExtend_AddPathMode'>kExtend_AddPathMode</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_addPath_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_AddPathMode'>AddPathMode</a> <a href='#SkPath_reverseAddPath'>reverseAddPath</a>
+
+<a name='SkPath_addPath_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_addPath'>addPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& src, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='SkMatrix_Reference#Matrix'>matrix</a>, <a href='#SkPath_AddPathMode'>AddPathMode</a> mode = <a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a>)
+</pre>
+
+Appends <a href='#SkPath_addPath_3_src'>src</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>, transformed by <a href='#SkPath_addPath_3_matrix'>matrix</a>. Transformed <a href='undocumented#Curve'>curves</a> may have different
+<a href='SkPath_Reference#Verb'>verbs</a>, <a href='SkPoint_Reference#SkPoint'>SkPoint</a>, and  <a href='SkPath_Reference#Conic_Weight'>conic weights</a>.
+
+If <a href='#SkPath_addPath_3_mode'>mode</a> is <a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a>, <a href='#SkPath_addPath_3_src'>src</a>  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, and  <a href='SkPath_Reference#Conic_Weight'>conic weights</a> are
+added unaltered. If <a href='#SkPath_addPath_3_mode'>mode</a> is <a href='#SkPath_kExtend_AddPathMode'>kExtend_AddPathMode</a>, add <a href='undocumented#Line'>line</a> before appending
+<a href='SkPath_Reference#Verb'>verbs</a>, <a href='SkPoint_Reference#SkPoint'>SkPoint</a>, and  <a href='SkPath_Reference#Conic_Weight'>conic weights</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_addPath_3_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPath_Reference#Verb'>verbs</a>, <a href='SkPoint_Reference#SkPoint'>SkPoint</a>, and  <a href='SkPath_Reference#Conic_Weight'>conic weights</a> to add</td>
+  </tr>
+  <tr>    <td><a name='SkPath_addPath_3_matrix'><code><strong>matrix</strong></code></a></td>
+    <td>transform applied to <a href='#SkPath_addPath_3_src'>src</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_addPath_3_mode'><code><strong>mode</strong></code></a></td>
+    <td><a href='#SkPath_kAppend_AddPathMode'>kAppend_AddPathMode</a> or <a href='#SkPath_kExtend_AddPathMode'>kExtend_AddPathMode</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_addPath_3"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_AddPathMode'>AddPathMode</a> <a href='#SkPath_transform'>transform</a> <a href='#SkPath_offset'>offset</a> <a href='#SkPath_reverseAddPath'>reverseAddPath</a>
+
+<a name='SkPath_reverseAddPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='#SkPath_reverseAddPath'>reverseAddPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& src)
+</pre>
+
+Appends <a href='#SkPath_reverseAddPath_src'>src</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>, from back to front.
+Reversed <a href='#SkPath_reverseAddPath_src'>src</a> always appends a new <a href='SkPath_Overview#Contour'>contour</a> to <a href='SkPath_Reference#SkPath'>SkPath</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_reverseAddPath_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> <a href='SkPath_Reference#Verb'>verbs</a>, <a href='SkPoint_Reference#SkPoint'>SkPoint</a>, and  <a href='SkPath_Reference#Conic_Weight'>conic weights</a> to add</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_reverseAddPath"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_AddPathMode'>AddPathMode</a> <a href='#SkPath_transform'>transform</a> <a href='#SkPath_offset'>offset</a> <a href='#SkPath_addPath'>addPath</a>
+
+<a name='SkPath_offset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void offset(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy, <a href='SkPath_Reference#SkPath'>SkPath</a>* dst)const
+</pre>
+
+Offsets  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> by (<a href='#SkPath_offset_dx'>dx</a>, <a href='#SkPath_offset_dy'>dy</a>). Offset <a href='SkPath_Reference#SkPath'>SkPath</a> replaces <a href='#SkPath_offset_dst'>dst</a>.
+If <a href='#SkPath_offset_dst'>dst</a> is nullptr, <a href='SkPath_Reference#SkPath'>SkPath</a> is replaced by offset <a href='undocumented#Data'>data</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_offset_dx'><code><strong>dx</strong></code></a></td>
+    <td>offset added to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> x-axis coordinates</td>
+  </tr>
+  <tr>    <td><a name='SkPath_offset_dy'><code><strong>dy</strong></code></a></td>
+    <td>offset added to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> y-axis coordinates</td>
+  </tr>
+  <tr>    <td><a name='SkPath_offset_dst'><code><strong>dst</strong></code></a></td>
+    <td>overwritten, translated copy of <a href='SkPath_Reference#SkPath'>SkPath</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Path_offset"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_addPath'>addPath</a> <a href='#SkPath_transform'>transform</a>
+
+<a name='Transform'></a>
+
+<a name='SkPath_offset_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void offset(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Offsets  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> by (<a href='#SkPath_offset_2_dx'>dx</a>, <a href='#SkPath_offset_2_dy'>dy</a>). <a href='SkPath_Reference#SkPath'>SkPath</a> is replaced by offset <a href='undocumented#Data'>data</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_offset_2_dx'><code><strong>dx</strong></code></a></td>
+    <td>offset added to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> x-axis coordinates</td>
+  </tr>
+  <tr>    <td><a name='SkPath_offset_2_dy'><code><strong>dy</strong></code></a></td>
+    <td>offset added to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> y-axis coordinates</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Path_offset_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_addPath'>addPath</a> <a href='#SkPath_transform'>transform</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_translate'>translate()</a>
+
+<a name='SkPath_transform'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void transform(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='SkMatrix_Reference#Matrix'>matrix</a>, <a href='SkPath_Reference#SkPath'>SkPath</a>* dst)const
+</pre>
+
+Transforms  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, and weight by <a href='#SkPath_transform_matrix'>matrix</a>.
+transform may change <a href='SkPath_Reference#Verb'>verbs</a> and increase their number.
+Transformed <a href='SkPath_Reference#SkPath'>SkPath</a> replaces <a href='#SkPath_transform_dst'>dst</a>; if <a href='#SkPath_transform_dst'>dst</a> is nullptr, original <a href='undocumented#Data'>data</a>
+is replaced.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_transform_matrix'><code><strong>matrix</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to apply to <a href='SkPath_Reference#SkPath'>SkPath</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_transform_dst'><code><strong>dst</strong></code></a></td>
+    <td>overwritten, transformed copy of <a href='SkPath_Reference#SkPath'>SkPath</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Path_transform"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_addPath'>addPath</a> <a href='#SkPath_offset'>offset</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_concat'>concat()</a> <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+
+<a name='SkPath_transform_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void transform(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='SkMatrix_Reference#Matrix'>matrix</a>)
+</pre>
+
+Transforms  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, and weight by <a href='#SkPath_transform_2_matrix'>matrix</a>.
+transform may change <a href='SkPath_Reference#Verb'>verbs</a> and increase their number.
+<a href='SkPath_Reference#SkPath'>SkPath</a> is replaced by transformed <a href='undocumented#Data'>data</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_transform_2_matrix'><code><strong>matrix</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> to apply to <a href='SkPath_Reference#SkPath'>SkPath</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Path_transform_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_addPath'>addPath</a> <a href='#SkPath_offset'>offset</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_concat'>concat()</a> <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>
+
+<a name='Last_Point'></a>
+
+<a href='SkPath_Reference#Path'>Path</a> is defined cumulatively, often by adding a segment to the end of last
+<a href='SkPath_Overview#Contour'>Contour</a>. <a href='#Path_Last_Point'>Last_Point</a> of <a href='SkPath_Overview#Contour'>Contour</a> is shared as first <a href='SkPoint_Reference#Point'>Point</a> of added <a href='undocumented#Line'>Line</a> or <a href='undocumented#Curve'>Curve</a>.
+<a href='#Path_Last_Point'>Last_Point</a> can be read and written directly with <a href='#SkPath_getLastPt'>getLastPt</a> and <a href='#SkPath_setLastPt'>setLastPt</a>.
+
+<a name='SkPath_getLastPt'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_getLastPt'>getLastPt</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a>* lastPt)const
+</pre>
+
+Returns  <a href='#Last_Point'>last point</a> on <a href='SkPath_Reference#SkPath'>SkPath</a> in <a href='#SkPath_getLastPt_lastPt'>lastPt</a>. Returns false if  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> is empty,
+storing (0, 0) if <a href='#SkPath_getLastPt_lastPt'>lastPt</a> is not nullptr.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_getLastPt_lastPt'><code><strong>lastPt</strong></code></a></td>
+    <td>storage for final <a href='SkPoint_Reference#SkPoint'>SkPoint</a> in  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> contains one or more <a href='SkPoint_Reference#SkPoint'>SkPoint</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_getLastPt">
+
+#### Example Output
+
+~~~~
+last point: 35.2786, 52.9772
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_setLastPt'>setLastPt</a>
+
+<a name='SkPath_setLastPt'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_setLastPt'>setLastPt</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y)
+</pre>
+
+Sets  <a href='#Last_Point'>last point</a> to (<a href='#SkPath_setLastPt_x'>x</a>, <a href='#SkPath_setLastPt_y'>y</a>). If  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> is empty, append <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to
+<a href='#Verb_Array'>verb array</a> and append (<a href='#SkPath_setLastPt_x'>x</a>, <a href='#SkPath_setLastPt_y'>y</a>) to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_setLastPt_x'><code><strong>x</strong></code></a></td>
+    <td>set x-axis value of  <a href='#Last_Point'>last point</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_setLastPt_y'><code><strong>y</strong></code></a></td>
+    <td>set y-axis value of  <a href='#Last_Point'>last point</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="542c5afaea5f57baa11d0561dd402e18"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_getLastPt'>getLastPt</a>
+
+<a name='SkPath_setLastPt_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_setLastPt'>setLastPt</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p)
+</pre>
+
+Sets the  <a href='#Last_Point'>last point</a> on the <a href='SkPath_Reference#Path'>path</a>. If  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> is empty, append <a href='#SkPath_kMove_Verb'>kMove_Verb</a> to
+<a href='#Verb_Array'>verb array</a> and append <a href='#SkPath_setLastPt_2_p'>p</a> to  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_setLastPt_2_p'><code><strong>p</strong></code></a></td>
+    <td>set value of  <a href='#Last_Point'>last point</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="6fa5e8f9513b3225e106778592e27e94"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_getLastPt'>getLastPt</a>
+
+<a name='SkPath_SegmentMask'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkPath_SegmentMask'>SegmentMask</a> {
+        <a href='#SkPath_kLine_SegmentMask'>kLine_SegmentMask</a> = 1 << 0,
+        <a href='#SkPath_kQuad_SegmentMask'>kQuad_SegmentMask</a> = 1 << 1,
+        <a href='#SkPath_kConic_SegmentMask'>kConic_SegmentMask</a> = 1 << 2,
+        <a href='#SkPath_kCubic_SegmentMask'>kCubic_SegmentMask</a> = 1 << 3,
+    };
+</pre>
+
+<a href='#SkPath_SegmentMask'>SegmentMask</a> constants correspond to each drawing <a href='#SkPath_Verb'>Verb</a> type in <a href='SkPath_Reference#Path'>Path</a>; for
+instance, if <a href='SkPath_Reference#Path'>Path</a> only contains <a href='undocumented#Line'>Lines</a>, only the <a href='#SkPath_kLine_SegmentMask'>kLine_SegmentMask</a> bit is set.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kLine_SegmentMask'><code>SkPath::kLine_SegmentMask</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Set if <a href='#Path_Verb_Array'>Verb_Array</a> contains <a href='#SkPath_kLine_Verb'>kLine_Verb</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kQuad_SegmentMask'><code>SkPath::kQuad_SegmentMask</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Set if <a href='#Path_Verb_Array'>Verb_Array</a> contains <a href='#SkPath_kQuad_Verb'>kQuad_Verb</a>. Note that <a href='#SkPath_conicTo'>conicTo</a> may add a <a href='SkPath_Reference#Quad'>Quad</a>.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kConic_SegmentMask'><code>SkPath::kConic_SegmentMask</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>4</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Set if <a href='#Path_Verb_Array'>Verb_Array</a> contains <a href='#SkPath_kConic_Verb'>kConic_Verb</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPath_kCubic_SegmentMask'><code>SkPath::kCubic_SegmentMask</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>8</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Set if <a href='#Path_Verb_Array'>Verb_Array</a> contains <a href='#SkPath_kCubic_Verb'>kCubic_Verb</a>.
+</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Path_SegmentMask"><div>When <a href='#SkPath_conicTo'>conicTo</a> has a weight of one, <a href='SkPath_Reference#Quad'>Quad</a> is added to <a href='SkPath_Reference#Path'>Path</a>.
+</div>
+
+#### Example Output
+
+~~~~
+Path kConic_SegmentMask is clear
+Path kQuad_SegmentMask is set
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_getSegmentMasks'>getSegmentMasks</a> <a href='#SkPath_Verb'>Verb</a>
+
+<a name='SkPath_getSegmentMasks'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint32_t <a href='#SkPath_getSegmentMasks'>getSegmentMasks</a>()const
+</pre>
+
+Returns a mask, where each set bit corresponds to a <a href='#SkPath_SegmentMask'>SegmentMask</a> constant
+if <a href='SkPath_Reference#SkPath'>SkPath</a> contains one or more <a href='SkPath_Reference#Verb'>verbs</a> of that type.
+Returns zero if <a href='SkPath_Reference#SkPath'>SkPath</a> contains no <a href='undocumented#Line'>lines</a>, or <a href='undocumented#Curve'>curves</a>: <a href='SkPath_Reference#Quad'>quads</a>, <a href='SkPath_Reference#Conic'>conics</a>, or <a href='SkPath_Reference#Cubic'>cubics</a>.
+
+<a href='#SkPath_getSegmentMasks'>getSegmentMasks</a>() returns a cached result; it is very fast.
+
+### Return Value
+
+<a href='#SkPath_SegmentMask'>SegmentMask</a> bits or zero
+
+### Example
+
+<div><fiddle-embed name="@Path_getSegmentMasks">
+
+#### Example Output
+
+~~~~
+mask quad set
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_getSegmentMasks'>getSegmentMasks</a> <a href='#SkPath_Verb'>Verb</a>
+
+<a name='SkPath_contains'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool contains(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y)const
+</pre>
+
+Returns true if the <a href='SkPoint_Reference#Point'>point</a> (<a href='#SkPath_contains_x'>x</a>, <a href='#SkPath_contains_y'>y</a>) is contained by <a href='SkPath_Reference#Path'>Path</a>, taking into
+account <a href='#SkPath_FillType'>FillType</a>.
+
+| <a href='#SkPath_FillType'>FillType</a> | <a href='#SkPath_contains'>contains()</a> returns true if <a href='SkPoint_Reference#Point'>Point</a> is enclosed by |
+| --- | ---  |
+| <a href='#SkPath_kWinding_FillType'>kWinding_FillType</a> | a non-zero sum of <a href='SkPath_Overview#Contour'>Contour</a> <a href='SkPath_Reference#Direction'>Directions</a>. |
+| <a href='#SkPath_kEvenOdd_FillType'>kEvenOdd_FillType</a> | an odd number of <a href='SkPath_Overview#Contour'>Contours</a>. |
+| <a href='#SkPath_kInverseWinding_FillType'>kInverseWinding_FillType</a> | a zero sum of <a href='SkPath_Overview#Contour'>Contour</a> <a href='SkPath_Reference#Direction'>Directions</a>. |
+| <a href='#SkPath_kInverseEvenOdd_FillType'>kInverseEvenOdd_FillType</a> | and even number of <a href='SkPath_Overview#Contour'>Contours</a>. |
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_contains_x'><code><strong>x</strong></code></a></td>
+    <td>x-axis value of containment test</td>
+  </tr>
+  <tr>    <td><a name='SkPath_contains_y'><code><strong>y</strong></code></a></td>
+    <td>y-axis value of containment test</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkPoint_Reference#Point'>Point</a> is in <a href='SkPath_Reference#Path'>Path</a>
+
+### Example
+
+<div><fiddle-embed name="c0216b3f7ebd80b9589ae5728f08fc80"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_conservativelyContainsRect'>conservativelyContainsRect</a> <a href='#Path_Fill_Type'>Fill_Type</a> <a href='undocumented#Op'>Op</a>
+
+<a name='SkPath_dump'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_dump'>dump</a>(<a href='SkWStream_Reference#SkWStream'>SkWStream</a>* <a href='SkStream_Reference#Stream'>stream</a>, bool forceClose, bool dumpAsHex)const
+</pre>
+
+Writes <a href='undocumented#Text'>text</a> representation of <a href='SkPath_Reference#SkPath'>SkPath</a> to <a href='#SkPath_dump_stream'>stream</a>. If <a href='#SkPath_dump_stream'>stream</a> is nullptr, writes to
+standard output. Set <a href='#SkPath_dump_forceClose'>forceClose</a> to true to get edges used to fill <a href='SkPath_Reference#SkPath'>SkPath</a>.
+Set <a href='#SkPath_dump_dumpAsHex'>dumpAsHex</a> true to generate exact binary representations
+of floating <a href='SkPoint_Reference#Point'>point</a> numbers used in  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> and  <a href='SkPath_Reference#Conic_Weight'>conic weights</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_dump_stream'><code><strong>stream</strong></code></a></td>
+    <td>writable <a href='SkWStream_Reference#SkWStream'>SkWStream</a> receiving <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='undocumented#Text'>text</a> representation; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkPath_dump_forceClose'><code><strong>forceClose</strong></code></a></td>
+    <td>true if missing <a href='#SkPath_kClose_Verb'>kClose_Verb</a> is output</td>
+  </tr>
+  <tr>    <td><a name='SkPath_dump_dumpAsHex'><code><strong>dumpAsHex</strong></code></a></td>
+    <td>true if <a href='undocumented#SkScalar'>SkScalar</a> values are written as hexadecimal</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Path_dump">
+
+#### Example Output
+
+~~~~
+path.setFillType(SkPath::kWinding_FillType);
+path.moveTo(0, 0);
+path.quadTo(20, 30, 40, 50);
+path.setFillType(SkPath::kWinding_FillType);
+path.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0
+path.quadTo(SkBits2Float(0x41a00000), SkBits2Float(0x41f00000), SkBits2Float(0x42200000), SkBits2Float(0x42480000));  // 20, 30, 40, 50
+path.setFillType(SkPath::kWinding_FillType);
+path.moveTo(0, 0);
+path.quadTo(20, 30, 40, 50);
+path.lineTo(0, 0);
+path.close();
+path.setFillType(SkPath::kWinding_FillType);
+path.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0
+path.quadTo(SkBits2Float(0x41a00000), SkBits2Float(0x41f00000), SkBits2Float(0x42200000), SkBits2Float(0x42480000));  // 20, 30, 40, 50
+path.lineTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0
+path.close();
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_dumpHex'>dumpHex</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_dump'>dump()</a> <a href='SkRRect_Reference#SkRRect'>SkRRect</a>::<a href='#SkRRect_dump'>dump()</a> <a href='undocumented#SkPathMeasure'>SkPathMeasure</a>::<a href='#SkPathMeasure_dump'>dump()</a>
+
+<a name='SkPath_dump_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_dump'>dump()</a>const
+</pre>
+
+Writes <a href='undocumented#Text'>text</a> representation of <a href='SkPath_Reference#SkPath'>SkPath</a> to standard output. The representation may be
+directly compiled as C++ code. Floating <a href='SkPoint_Reference#Point'>point</a> values are written
+with limited precision; it may not be possible to reconstruct original <a href='SkPath_Reference#SkPath'>SkPath</a>
+from output.
+
+### Example
+
+<div><fiddle-embed name="@Path_dump_2">
+
+#### Example Output
+
+~~~~
+path.setFillType(SkPath::kWinding_FillType);
+path.moveTo(0, 0);
+path.lineTo(0.857143f, 0.666667f);
+path is not equal to copy
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_dumpHex'>dumpHex</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_dump'>dump()</a> <a href='SkRRect_Reference#SkRRect'>SkRRect</a>::<a href='#SkRRect_dump'>dump()</a> <a href='undocumented#SkPathMeasure'>SkPathMeasure</a>::<a href='#SkPathMeasure_dump'>dump()</a> <a href='#SkPath_writeToMemory'>writeToMemory</a>
+
+<a name='SkPath_dumpHex'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_dumpHex'>dumpHex</a>()const
+</pre>
+
+Writes <a href='undocumented#Text'>text</a> representation of <a href='SkPath_Reference#Path'>Path</a> to standard output. The representation may be
+directly compiled as C++ code. Floating <a href='SkPoint_Reference#Point'>point</a> values are written
+in hexadecimal to preserve their exact bit pattern. The output reconstructs the
+original <a href='SkPath_Reference#Path'>Path</a>.
+
+Use instead of <a href='#SkPath_dump'>dump()</a> when submitting
+<a href='https://bug.skia.org'>bug reports against Skia</a></a> .
+
+### Example
+
+<div><fiddle-embed name="@Path_dumpHex">
+
+#### Example Output
+
+~~~~
+path.setFillType(SkPath::kWinding_FillType);
+path.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0
+path.lineTo(SkBits2Float(0x3f5b6db7), SkBits2Float(0x3f2aaaab));  // 0.857143f, 0.666667f
+path is equal to copy
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_dump'>dump</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_dumpHex'>dumpHex</a> <a href='SkRRect_Reference#SkRRect'>SkRRect</a>::<a href='#SkRRect_dumpHex'>dumpHex</a> <a href='#SkPath_writeToMemory'>writeToMemory</a>
+
+<a name='SkPath_writeToMemory'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkPath_writeToMemory'>writeToMemory</a>(void* buffer)const
+</pre>
+
+Writes <a href='SkPath_Reference#SkPath'>SkPath</a> to <a href='#SkPath_writeToMemory_buffer'>buffer</a>, returning the number of bytes written.
+Pass nullptr to obtain the storage <a href='undocumented#Size'>size</a>.
+
+Writes <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_FillType'>FillType</a>,  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>,  <a href='#Conic_Weight'>conic weight</a>, and
+additionally writes computed information like <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Convexity'>Convexity</a> and bounds.
+
+Use only be used in concert with <a href='#SkPath_readFromMemory'>readFromMemory</a>();
+the format used for <a href='SkPath_Reference#SkPath'>SkPath</a> in memory is not guaranteed.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_writeToMemory_buffer'><code><strong>buffer</strong></code></a></td>
+    <td>storage for <a href='SkPath_Reference#SkPath'>SkPath</a>; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='undocumented#Size'>size</a> of storage required for <a href='SkPath_Reference#SkPath'>SkPath</a>; always a multiple of 4
+
+### Example
+
+<div><fiddle-embed name="@Path_writeToMemory">
+
+#### Example Output
+
+~~~~
+path is equal to copy
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_serialize'>serialize</a> <a href='#SkPath_readFromMemory'>readFromMemory</a> <a href='#SkPath_dump'>dump</a> <a href='#SkPath_dumpHex'>dumpHex</a>
+
+<a name='SkPath_serialize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkData'>SkData</a>&gt; <a href='#SkPath_serialize'>serialize()</a>const
+</pre>
+
+Writes <a href='SkPath_Reference#SkPath'>SkPath</a> to buffer, returning the buffer written to, wrapped in <a href='undocumented#SkData'>SkData</a>.
+
+<a href='#SkPath_serialize'>serialize()</a> writes <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_FillType'>FillType</a>, verb array, <a href='SkPoint_Reference#SkPoint'>SkPoint</a> array, <a href='SkPath_Reference#Conic'>conic</a> weight, and
+additionally writes computed information like <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Convexity'>Convexity</a> and bounds.
+
+<a href='#SkPath_serialize'>serialize()</a> should only be used in concert with <a href='#SkPath_readFromMemory'>readFromMemory</a>().
+The format used for <a href='SkPath_Reference#SkPath'>SkPath</a> in memory is not guaranteed.
+
+### Return Value
+
+<a href='SkPath_Reference#SkPath'>SkPath</a> <a href='undocumented#Data'>data</a> wrapped in <a href='undocumented#SkData'>SkData</a> buffer
+
+### Example
+
+<div><fiddle-embed name="@Path_serialize">
+
+#### Example Output
+
+~~~~
+path is equal to copy
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_writeToMemory'>writeToMemory</a> <a href='#SkPath_readFromMemory'>readFromMemory</a> <a href='#SkPath_dump'>dump</a> <a href='#SkPath_dumpHex'>dumpHex</a>
+
+<a name='SkPath_readFromMemory'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkPath_readFromMemory'>readFromMemory</a>(const void* buffer, size_t length)
+</pre>
+
+Initializes <a href='SkPath_Reference#SkPath'>SkPath</a> from <a href='#SkPath_readFromMemory_buffer'>buffer</a> of <a href='undocumented#Size'>size</a> <a href='#SkPath_readFromMemory_length'>length</a>. Returns zero if the <a href='#SkPath_readFromMemory_buffer'>buffer</a> is
+<a href='undocumented#Data'>data</a> is inconsistent, or the <a href='#SkPath_readFromMemory_length'>length</a> is too small.
+
+Reads <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_FillType'>FillType</a>,  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>,  <a href='#Conic_Weight'>conic weight</a>, and
+additionally reads computed information like <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Convexity'>Convexity</a> and bounds.
+
+Used only in concert with <a href='#SkPath_writeToMemory'>writeToMemory</a>();
+the format used for <a href='SkPath_Reference#SkPath'>SkPath</a> in memory is not guaranteed.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_readFromMemory_buffer'><code><strong>buffer</strong></code></a></td>
+    <td>storage for <a href='SkPath_Reference#SkPath'>SkPath</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_readFromMemory_length'><code><strong>length</strong></code></a></td>
+    <td><a href='#SkPath_readFromMemory_buffer'>buffer</a> <a href='undocumented#Size'>size</a> in bytes; must be multiple of 4</td>
+  </tr>
+</table>
+
+### Return Value
+
+number of bytes read, or zero on failure
+
+### Example
+
+<div><fiddle-embed name="@Path_readFromMemory">
+
+#### Example Output
+
+~~~~
+length = 32; returned by readFromMemory = 0
+length = 40; returned by readFromMemory = 36
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_writeToMemory'>writeToMemory</a>
+
+<a name='Generation_ID'></a>
+
+<a href='#Path_Generation_ID'>Generation_ID</a> provides a quick way to check if <a href='#Path_Verb_Array'>Verb_Array</a>, <a href='#Path_Point_Array'>Point_Array</a>, or
+<a href='#Path_Conic_Weight'>Conic_Weight</a> has changed. <a href='#Path_Generation_ID'>Generation_ID</a> is not a hash; identical <a href='SkPath_Reference#Path'>Paths</a> will
+not necessarily have matching <a href='#Path_Generation_ID'>Generation_IDs</a>.
+
+Empty <a href='SkPath_Reference#Path'>Paths</a> have a <a href='#Path_Generation_ID'>Generation_ID</a> of one.
+
+<a name='SkPath_getGenerationID'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint32_t <a href='#SkPath_getGenerationID'>getGenerationID</a>()const
+</pre>
+
+(See Skia bug 1762.)
+Returns a non-zero, globally unique value. A different value is returned
+if verb array, <a href='SkPoint_Reference#SkPoint'>SkPoint</a> array, or <a href='SkPath_Reference#Conic'>conic</a> weight changes.
+
+Setting <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_FillType'>FillType</a> does not change generation identifier.
+
+Each time the <a href='SkPath_Reference#Path'>path</a> is modified, a different generation identifier will be returned.
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_FillType'>FillType</a> does affect generation identifier on Android framework.
+
+### Return Value
+
+non-zero, globally unique value
+
+### Example
+
+<div><fiddle-embed name="@Path_getGenerationID">
+
+#### Example Output
+
+~~~~
+empty genID = 1
+1st lineTo genID = 2
+empty genID = 1
+2nd lineTo genID = 3
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_equal_operator'>operator==</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& a, const <a href='SkPath_Reference#SkPath'>SkPath</a>& b)
+
+<a name='SkPath_isValid'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_isValid'>isValid</a>()const
+</pre>
+
+Returns if <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='undocumented#Data'>data</a> is consistent. Corrupt <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='undocumented#Data'>data</a> is detected if
+internal values are out of range or internal storage does not match
+array dimensions.
+
+### Return Value
+
+true if <a href='SkPath_Reference#SkPath'>SkPath</a> <a href='undocumented#Data'>data</a> is consistent
+
+<a name='SkPath_Iter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    class <a href='#SkPath_Iter'>Iter</a> {
+
+        <a href='#SkPath_Iter_Iter'>Iter()</a>;
+        <a href='#SkPath_Iter_Iter'>Iter</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>, bool forceClose);
+        void <a href='#SkPath_Iter_setPath'>setPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>, bool forceClose);
+        <a href='#SkPath_Verb'>Verb</a> <a href='#SkPath_Iter_next'>next</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[4], bool doConsumeDegenerates = true, bool exact = false);
+        <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPath_Iter_conicWeight'>conicWeight</a>() const;
+        bool <a href='#SkPath_Iter_isCloseLine'>isCloseLine</a>() const;
+        bool <a href='#SkPath_Iter_isClosedContour'>isClosedContour</a>() const;
+    };
+
+</pre>
+
+Iterates through <a href='#Path_Verb_Array'>Verb_Array</a>, and associated <a href='#Path_Point_Array'>Point_Array</a> and <a href='#Path_Conic_Weight'>Conic_Weight</a>.
+Provides options to treat open <a href='SkPath_Overview#Contour'>Contours</a> as closed, and to ignore
+degenerate <a href='undocumented#Data'>data</a>.
+
+### Example
+
+<div><fiddle-embed name="2f53df9201769ab7e7c0e164a1334309"><div>Ignoring the actual <a href='SkPath_Reference#Verb'>Verbs</a> and replacing them with <a href='SkPath_Reference#Quad'>Quads</a> rounds the
+<a href='SkPath_Reference#Path'>path</a> of the <a href='undocumented#Glyph'>glyph</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_RawIter'>RawIter</a>
+
+<a name='SkPath_Iter_Iter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPath_Iter_Iter'>Iter()</a>
+</pre>
+
+Initializes <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Iter'>Iter</a> with an empty <a href='SkPath_Reference#SkPath'>SkPath</a>. <a href='#SkPath_Iter_next'>next()</a> on <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Iter'>Iter</a> returns
+<a href='#SkPath_kDone_Verb'>kDone_Verb</a>.
+Call <a href='#SkPath_Iter_setPath'>setPath</a> to initialize <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Iter'>Iter</a> at a later time.
+
+### Return Value
+
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Iter'>Iter</a> of empty <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_Iter_Iter">
+
+#### Example Output
+
+~~~~
+iter is done
+iter is done
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_Iter_setPath'>setPath</a>
+
+<a name='SkPath_Iter_const_SkPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPath_Iter'>Iter</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>, bool forceClose)
+</pre>
+
+Sets <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Iter'>Iter</a> to return elements of  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, and  <a href='#Conic_Weight'>conic weight</a> in
+<a href='#SkPath_Iter_const_SkPath_path'>path</a>. If <a href='#SkPath_Iter_const_SkPath_forceClose'>forceClose</a> is true, <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Iter'>Iter</a> will add <a href='#SkPath_kLine_Verb'>kLine_Verb</a> and <a href='#SkPath_kClose_Verb'>kClose_Verb</a> after each
+open <a href='SkPath_Overview#Contour'>contour</a>. <a href='#SkPath_Iter_const_SkPath_path'>path</a> is not altered.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_Iter_const_SkPath_path'><code><strong>path</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to iterate</td>
+  </tr>
+  <tr>    <td><a name='SkPath_Iter_const_SkPath_forceClose'><code><strong>forceClose</strong></code></a></td>
+    <td>true if open <a href='SkPath_Overview#Contour'>contours</a> generate <a href='#SkPath_kClose_Verb'>kClose_Verb</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Iter'>Iter</a> of <a href='#SkPath_Iter_const_SkPath_path'>path</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_Iter_const_SkPath">
+
+#### Example Output
+
+~~~~
+open:
+kMove_Verb {0, 0},
+kQuad_Verb {0, 0}, {10, 20}, {30, 40},
+kDone_Verb
+closed:
+kMove_Verb {0, 0},
+kQuad_Verb {0, 0}, {10, 20}, {30, 40},
+kLine_Verb {30, 40}, {0, 0},
+kClose_Verb {0, 0},
+kDone_Verb
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_Iter_setPath'>setPath</a>
+
+<a name='SkPath_Iter_setPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_Iter_setPath'>setPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>, bool forceClose)
+</pre>
+
+Sets <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Iter'>Iter</a> to return elements of  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, and  <a href='#Conic_Weight'>conic weight</a> in
+<a href='#SkPath_Iter_setPath_path'>path</a>. If <a href='#SkPath_Iter_setPath_forceClose'>forceClose</a> is true, <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Iter'>Iter</a> will add <a href='#SkPath_kLine_Verb'>kLine_Verb</a> and <a href='#SkPath_kClose_Verb'>kClose_Verb</a> after each
+open <a href='SkPath_Overview#Contour'>contour</a>. <a href='#SkPath_Iter_setPath_path'>path</a> is not altered.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_Iter_setPath_path'><code><strong>path</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to iterate</td>
+  </tr>
+  <tr>    <td><a name='SkPath_Iter_setPath_forceClose'><code><strong>forceClose</strong></code></a></td>
+    <td>true if open <a href='SkPath_Overview#Contour'>contours</a> generate <a href='#SkPath_kClose_Verb'>kClose_Verb</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Path_Iter_setPath">
+
+#### Example Output
+
+~~~~
+quad open:
+kMove_Verb {0, 0},
+kQuad_Verb {0, 0}, {10, 20}, {30, 40},
+kDone_Verb
+conic closed:
+kMove_Verb {0, 0},
+kConic_Verb {0, 0}, {1, 2}, {3, 4}, weight = 0.5
+kLine_Verb {3, 4}, {0, 0},
+kClose_Verb {0, 0},
+kDone_Verb
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_Iter_const_SkPath'>Iter(const SkPath& path, bool forceClose)</a>
+
+<a name='SkPath_Iter_next'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPath_Verb'>Verb</a> next(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[4], bool doConsumeDegenerates = true, bool exact = false)
+</pre>
+
+Returns next <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> in  <a href='#Verb_Array'>verb array</a>, and advances <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Iter'>Iter</a>.
+When  <a href='#Verb_Array'>verb array</a> is exhausted, returns <a href='#SkPath_kDone_Verb'>kDone_Verb</a>.
+
+Zero to four <a href='SkPoint_Reference#SkPoint'>SkPoint</a> are stored in <a href='#SkPath_Iter_next_pts'>pts</a>, depending on the returned <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a>.
+
+If <a href='#SkPath_Iter_next_doConsumeDegenerates'>doConsumeDegenerates</a> is true, skip consecutive <a href='#SkPath_kMove_Verb'>kMove_Verb</a> entries, returning
+only the last in the series; and skip very small <a href='undocumented#Line'>lines</a>, <a href='SkPath_Reference#Quad'>quads</a>, and <a href='SkPath_Reference#Conic'>conics</a>; and
+skip <a href='#SkPath_kClose_Verb'>kClose_Verb</a> following <a href='#SkPath_kMove_Verb'>kMove_Verb</a>.
+if <a href='#SkPath_Iter_next_doConsumeDegenerates'>doConsumeDegenerates</a> is true and <a href='#SkPath_Iter_next_exact'>exact</a> is true, only skip <a href='undocumented#Line'>lines</a>, <a href='SkPath_Reference#Quad'>quads</a>, and
+<a href='SkPath_Reference#Conic'>conics</a> with zero lengths.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_Iter_next_pts'><code><strong>pts</strong></code></a></td>
+    <td>storage for <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='undocumented#Data'>data</a> describing returned <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_Iter_next_doConsumeDegenerates'><code><strong>doConsumeDegenerates</strong></code></a></td>
+    <td>if true, skip degenerate <a href='SkPath_Reference#Verb'>verbs</a></td>
+  </tr>
+  <tr>    <td><a name='SkPath_Iter_next_exact'><code><strong>exact</strong></code></a></td>
+    <td>skip  zero length <a href='undocumented#Curve'>curves</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+next <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> from  <a href='#Verb_Array'>verb array</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_Iter_next"><div>skip degenerate skips the first in a <a href='#SkPath_kMove_Verb'>kMove_Verb</a> pair, the <a href='#SkPath_kMove_Verb'>kMove_Verb</a>
+followed by the <a href='#SkPath_kClose_Verb'>kClose_Verb</a>, the  zero length <a href='undocumented#Line'>Line</a> and the very small <a href='undocumented#Line'>Line</a>.
+
+skip degenerate if <a href='#SkPath_Iter_next_exact'>exact</a> skips the same as skip degenerate, but shows
+the very small <a href='undocumented#Line'>Line</a>.
+
+skip none shows all of the <a href='SkPath_Reference#Verb'>Verbs</a> and <a href='SkPoint_Reference#Point'>Points</a> in <a href='SkPath_Reference#Path'>Path</a>.
+</div>
+
+#### Example Output
+
+~~~~
+skip degenerate:
+kMove_Verb {20, 20},
+kQuad_Verb {20, 20}, {10, 20}, {30, 40},
+kDone_Verb
+skip degenerate if exact:
+kMove_Verb {20, 20},
+kQuad_Verb {20, 20}, {10, 20}, {30, 40},
+kMove_Verb {30, 30},
+kLine_Verb {30, 30}, {30.00001, 30},
+kDone_Verb
+skip none:
+kMove_Verb {10, 10},
+kMove_Verb {20, 20},
+kQuad_Verb {20, 20}, {10, 20}, {30, 40},
+kMove_Verb {1, 1},
+kClose_Verb {1, 1},
+kMove_Verb {30, 30},
+kLine_Verb {30, 30}, {30, 30},
+kMove_Verb {30, 30},
+kLine_Verb {30, 30}, {30.00001, 30},
+kDone_Verb
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_Verb'>Verb</a> <a href='#SkPath_IsLineDegenerate'>IsLineDegenerate</a> <a href='#SkPath_IsCubicDegenerate'>IsCubicDegenerate</a> <a href='#SkPath_IsQuadDegenerate'>IsQuadDegenerate</a>
+
+<a name='SkPath_Iter_conicWeight'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPath_Iter_conicWeight'>conicWeight</a>()const
+</pre>
+
+Returns <a href='SkPath_Reference#Conic'>conic</a> weight if <a href='#SkPath_Iter_next'>next()</a> returned <a href='#SkPath_kConic_Verb'>kConic_Verb</a>.
+
+If <a href='#SkPath_Iter_next'>next()</a> has not been called, or <a href='#SkPath_Iter_next'>next()</a> did not return <a href='#SkPath_kConic_Verb'>kConic_Verb</a>,
+result is undefined.
+
+### Return Value
+
+<a href='SkPath_Reference#Conic'>conic</a> weight for <a href='SkPath_Reference#Conic'>conic</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> returned by <a href='#SkPath_Iter_next'>next()</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_Iter_conicWeight">
+
+#### Example Output
+
+~~~~
+first verb is move
+next verb is conic
+conic points: {0,0}, {1,2}, {3,4}
+conic weight: 0.5
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Path_Conic_Weight'>Conic_Weight</a>
+
+<a name='SkPath_Iter_isCloseLine'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_Iter_isCloseLine'>isCloseLine</a>()const
+</pre>
+
+Returns true if last <a href='#SkPath_kLine_Verb'>kLine_Verb</a> returned by <a href='#SkPath_Iter_next'>next()</a> was generated
+by <a href='#SkPath_kClose_Verb'>kClose_Verb</a>. When true, the end <a href='SkPoint_Reference#Point'>point</a> returned by <a href='#SkPath_Iter_next'>next()</a> is
+also the start <a href='SkPoint_Reference#Point'>point</a> of <a href='SkPath_Overview#Contour'>contour</a>.
+
+If <a href='#SkPath_Iter_next'>next()</a> has not been called, or <a href='#SkPath_Iter_next'>next()</a> did not return <a href='#SkPath_kLine_Verb'>kLine_Verb</a>,
+result is undefined.
+
+### Return Value
+
+true if last <a href='#SkPath_kLine_Verb'>kLine_Verb</a> was generated by <a href='#SkPath_kClose_Verb'>kClose_Verb</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_Iter_isCloseLine">
+
+#### Example Output
+
+~~~~
+1st verb is move
+moveTo point: {6,7}
+2nd verb is conic
+3rd verb is line
+line points: {3,4}, {6,7}
+line generated by close
+4th verb is close
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_close'>close()</a>
+
+<a name='SkPath_Iter_isClosedContour'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPath_Iter_isClosedContour'>isClosedContour</a>()const
+</pre>
+
+Returns true if subsequent calls to <a href='#SkPath_Iter_next'>next()</a> return <a href='#SkPath_kClose_Verb'>kClose_Verb</a> before returning
+<a href='#SkPath_kMove_Verb'>kMove_Verb</a>. if true, <a href='SkPath_Overview#Contour'>contour</a> <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Iter'>Iter</a> is processing may end with <a href='#SkPath_kClose_Verb'>kClose_Verb</a>, or
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Iter'>Iter</a> may have been initialized with force close set to true.
+
+### Return Value
+
+true if <a href='SkPath_Overview#Contour'>contour</a> is closed
+
+### Example
+
+<div><fiddle-embed name="@Path_Iter_isClosedContour">
+
+#### Example Output
+
+~~~~
+without close(), forceClose is false: isClosedContour returns false
+with close(),    forceClose is false: isClosedContour returns true
+without close(), forceClose is true : isClosedContour returns true
+with close(),    forceClose is true : isClosedContour returns true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_Iter_const_SkPath'>Iter(const SkPath& path, bool forceClose)</a>
+
+<a name='SkPath_RawIter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    class <a href='#SkPath_RawIter'>RawIter</a> {
+
+        <a href='#SkPath_RawIter_RawIter'>RawIter()</a>;
+        <a href='#SkPath_RawIter_RawIter'>RawIter</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>);
+        void <a href='#SkPath_RawIter_setPath'>setPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>);
+        <a href='#SkPath_Verb'>Verb</a> <a href='#SkPath_RawIter_next'>next</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[4]);
+        <a href='#SkPath_Verb'>Verb</a> <a href='#SkPath_RawIter_peek'>peek()</a> const;
+        <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPath_RawIter_conicWeight'>conicWeight</a>() const;
+    };
+
+</pre>
+
+Iterates through <a href='#Path_Verb_Array'>Verb_Array</a>, and associated <a href='#Path_Point_Array'>Point_Array</a> and <a href='#Path_Conic_Weight'>Conic_Weight</a>.
+<a href='#Path_Verb_Array'>Verb_Array</a>, <a href='#Path_Point_Array'>Point_Array</a>, and <a href='#Path_Conic_Weight'>Conic_Weight</a> are returned unaltered.
+
+<a name='SkPath_RawIter_RawIter'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPath_RawIter_RawIter'>RawIter()</a>
+</pre>
+
+Initializes <a href='#SkPath_RawIter'>RawIter</a> with an empty <a href='SkPath_Reference#SkPath'>SkPath</a>. <a href='#SkPath_RawIter_next'>next()</a> on <a href='#SkPath_RawIter'>RawIter</a> returns <a href='#SkPath_kDone_Verb'>kDone_Verb</a>.
+Call <a href='#SkPath_RawIter_setPath'>setPath</a> to initialize <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Iter'>Iter</a> at a later time.
+
+### Return Value
+
+<a href='#SkPath_RawIter'>RawIter</a> of empty <a href='SkPath_Reference#SkPath'>SkPath</a>
+
+<a name='SkPath_RawIter_copy_const_SkPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPath_RawIter'>RawIter</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>)
+</pre>
+
+Sets <a href='#SkPath_RawIter'>RawIter</a> to return elements of  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, and  <a href='#Conic_Weight'>conic weight</a> in <a href='#SkPath_RawIter_copy_const_SkPath_path'>path</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_RawIter_copy_const_SkPath_path'><code><strong>path</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to iterate</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='#SkPath_RawIter'>RawIter</a> of <a href='#SkPath_RawIter_copy_const_SkPath_path'>path</a>
+
+<a name='SkPath_RawIter_setPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPath_RawIter_setPath'>setPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>)
+</pre>
+
+Sets <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Iter'>Iter</a> to return elements of  <a href='#Verb_Array'>verb array</a>,  <a href='SkPath_Reference#Point_Array'>SkPoint array</a>, and  <a href='#Conic_Weight'>conic weight</a> in
+<a href='#SkPath_RawIter_setPath_path'>path</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_RawIter_setPath_path'><code><strong>path</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to iterate</td>
+  </tr>
+</table>
+
+<a name='SkPath_RawIter_next'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPath_Verb'>Verb</a> next(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[4])
+</pre>
+
+Returns next <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> in  <a href='#Verb_Array'>verb array</a>, and advances <a href='#SkPath_RawIter'>RawIter</a>.
+When  <a href='#Verb_Array'>verb array</a> is exhausted, returns <a href='#SkPath_kDone_Verb'>kDone_Verb</a>.
+Zero to four <a href='SkPoint_Reference#SkPoint'>SkPoint</a> are stored in <a href='#SkPath_RawIter_next_pts'>pts</a>, depending on the returned <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPath_RawIter_next_pts'><code><strong>pts</strong></code></a></td>
+    <td>storage for <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='undocumented#Data'>data</a> describing returned <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+next <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> from  <a href='#Verb_Array'>verb array</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_RawIter_next">
+
+#### Example Output
+
+~~~~
+kMove_Verb {50, 60},
+kQuad_Verb {50, 60}, {10, 20}, {30, 40},
+kClose_Verb {50, 60},
+kMove_Verb {50, 60},
+kLine_Verb {50, 60}, {30, 30},
+kConic_Verb {30, 30}, {1, 2}, {3, 4}, weight = 0.5
+kCubic_Verb {3, 4}, {-1, -2}, {-3, -4}, {-5, -6},
+kDone_Verb
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_RawIter_peek'>peek()</a>
+
+<a name='SkPath_RawIter_peek'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPath_Verb'>Verb</a> <a href='#SkPath_RawIter_peek'>peek()</a>const
+</pre>
+
+Returns next <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a>, but does not advance <a href='#SkPath_RawIter'>RawIter</a>.
+
+### Return Value
+
+next <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_Verb'>Verb</a> from verb array
+
+### Example
+
+<div><fiddle-embed name="@Path_RawIter_peek">
+
+#### Example Output
+
+~~~~
+#Volatile
+peek Move == verb Move
+peek Quad == verb Quad
+peek Conic == verb Conic
+peek Cubic == verb Cubic
+peek Done == verb Done
+peek Done == verb Done
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPath_RawIter_next'>next</a>
+
+<a name='SkPath_RawIter_conicWeight'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPath_RawIter_conicWeight'>conicWeight</a>()const
+</pre>
+
+Returns <a href='SkPath_Reference#Conic'>conic</a> weight if <a href='#SkPath_RawIter_next'>next()</a> returned <a href='#SkPath_kConic_Verb'>kConic_Verb</a>.
+
+If <a href='#SkPath_RawIter_next'>next()</a> has not been called, or <a href='#SkPath_RawIter_next'>next()</a> did not return <a href='#SkPath_kConic_Verb'>kConic_Verb</a>,
+result is undefined.
+
+### Return Value
+
+<a href='SkPath_Reference#Conic'>conic</a> weight for <a href='SkPath_Reference#Conic'>conic</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> returned by <a href='#SkPath_RawIter_next'>next()</a>
+
+### Example
+
+<div><fiddle-embed name="@Path_RawIter_conicWeight">
+
+#### Example Output
+
+~~~~
+first verb is move
+next verb is conic
+conic points: {0,0}, {1,2}, {3,4}
+conic weight: 0.5
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Path_Conic_Weight'>Conic_Weight</a>
+
diff --git a/src/third_party/skia/site/user/api/SkPicture_Reference.md b/src/third_party/skia/site/user/api/SkPicture_Reference.md
new file mode 100644
index 0000000..e4faf7d
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkPicture_Reference.md
@@ -0,0 +1,477 @@
+SkPicture Reference
+===
+
+
+<a name='SkPicture'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkPicture_Reference#SkPicture'>SkPicture</a> : public <a href='undocumented#SkRefCnt'>SkRefCnt</a> {
+
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkPicture_Reference#SkPicture'>SkPicture</a>> <a href='#SkPicture_MakeFromStream'>MakeFromStream</a>(<a href='SkStream_Reference#SkStream'>SkStream</a>* <a href='SkStream_Reference#Stream'>stream</a>,
+                                           const <a href='undocumented#SkDeserialProcs'>SkDeserialProcs</a>* procs = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkPicture_Reference#SkPicture'>SkPicture</a>> <a href='#SkPicture_MakeFromData'>MakeFromData</a>(const <a href='undocumented#SkData'>SkData</a>* <a href='undocumented#Data'>data</a>,
+                                         const <a href='undocumented#SkDeserialProcs'>SkDeserialProcs</a>* procs = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkPicture_Reference#SkPicture'>SkPicture</a>> <a href='#SkPicture_MakeFromData'>MakeFromData</a>(const void* <a href='undocumented#Data'>data</a>, size_t <a href='undocumented#Size'>size</a>,
+                                         const <a href='undocumented#SkDeserialProcs'>SkDeserialProcs</a>* procs = nullptr);
+    virtual void <a href='#SkPicture_playback'>playback</a>(<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>* <a href='SkCanvas_Reference#Canvas'>canvas</a>, <a href='#SkPicture_AbortCallback'>AbortCallback</a>* callback = nullptr) const = 0;
+    virtual <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkPicture_cullRect'>cullRect</a>() const = 0;
+    uint32_t <a href='#SkPicture_uniqueID'>uniqueID</a>() const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkData'>SkData</a>> <a href='#SkPicture_serialize'>serialize</a>(const <a href='undocumented#SkSerialProcs'>SkSerialProcs</a>* procs = nullptr) const;
+    void <a href='#SkPicture_serialize'>serialize</a>(<a href='SkWStream_Reference#SkWStream'>SkWStream</a>* <a href='SkStream_Reference#Stream'>stream</a>, const <a href='undocumented#SkSerialProcs'>SkSerialProcs</a>* procs = nullptr) const;
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkPicture_Reference#SkPicture'>SkPicture</a>> <a href='#SkPicture_MakePlaceholder'>MakePlaceholder</a>(<a href='SkRect_Reference#SkRect'>SkRect</a> cull);
+    virtual int <a href='#SkPicture_approximateOpCount'>approximateOpCount</a>() const = 0;
+    virtual size_t <a href='#SkPicture_approximateBytesUsed'>approximateBytesUsed</a>() const = 0;
+};
+
+</pre>
+
+<a href='SkPicture_Reference#Picture'>Picture</a> records drawing commands made to <a href='SkCanvas_Reference#Canvas'>Canvas</a>. The command <a href='SkStream_Reference#Stream'>stream</a> may be
+played in whole or in part at a later time.
+
+<a href='SkPicture_Reference#Picture'>Picture</a> is an abstract class. <a href='SkPicture_Reference#Picture'>Picture</a> may be generated by <a href='#Picture_Recorder'>Picture_Recorder</a>
+or <a href='undocumented#Drawable'>Drawable</a>, or from <a href='SkPicture_Reference#Picture'>Picture</a> previously saved to <a href='undocumented#Data'>Data</a> or <a href='SkStream_Reference#Stream'>Stream</a>.
+
+<a href='SkPicture_Reference#Picture'>Picture</a> may contain any <a href='SkCanvas_Reference#Canvas'>Canvas</a> drawing command, as well as one or more
+<a href='#Canvas_Matrix'>Canvas_Matrix</a> or <a href='#Canvas_Clip'>Canvas_Clip</a>. <a href='SkPicture_Reference#Picture'>Picture</a> has a cull <a href='SkRect_Reference#Rect'>Rect</a>, which is used as
+a bounding box hint. To limit <a href='SkPicture_Reference#Picture'>Picture</a> bounds, use <a href='#Canvas_Clip'>Canvas_Clip</a> when
+recording or drawing <a href='SkPicture_Reference#Picture'>Picture</a>.
+
+<a name='SkPicture_AbortCallback'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    class <a href='#SkPicture_AbortCallback'>AbortCallback</a> {
+    public:
+        <a href='#SkPicture_AbortCallback_AbortCallback'>AbortCallback()</a> {}
+        virtual <a href='#SkPicture_AbortCallback_destructor'>~AbortCallback()</a> {}
+        virtual bool <a href='#SkPicture_AbortCallback_abort'>abort()</a> = 0;
+    };
+</pre>
+
+<a href='#SkPicture_AbortCallback'>AbortCallback</a> is an abstract class. An implementation of <a href='#SkPicture_AbortCallback'>AbortCallback</a> may
+passed as a parameter to <a href='SkPicture_Reference#SkPicture'>SkPicture</a>::<a href='#SkPicture_playback'>playback</a>, to stop it before all drawing
+commands have been processed.
+
+If <a href='#SkPicture_AbortCallback'>AbortCallback</a>::<a href='#SkPicture_AbortCallback_abort'>abort</a> returns true, <a href='SkPicture_Reference#SkPicture'>SkPicture</a>::<a href='#SkPicture_playback'>playback</a> is interrupted.
+
+<a name='SkPicture_AbortCallback_AbortCallback'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPicture_AbortCallback_AbortCallback'>AbortCallback()</a>
+</pre>
+
+Has no effect.
+
+### Return Value
+
+abstract class cannot be instantiated
+
+### See Also
+
+<a href='#SkPicture_playback'>playback</a>
+
+<a name='SkPicture_AbortCallback_destructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+virtual <a href='#SkPicture_AbortCallback_destructor'>~AbortCallback()</a>
+</pre>
+
+Has no effect.
+
+### See Also
+
+<a href='#SkPicture_playback'>playback</a>
+
+<a name='SkPicture_AbortCallback_abort'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+virtual bool <a href='#SkPicture_AbortCallback_abort'>abort()</a> = 0
+</pre>
+
+Stops <a href='SkPicture_Reference#SkPicture'>SkPicture</a> playback when some condition is met. A subclass of
+<a href='#SkPicture_AbortCallback'>AbortCallback</a> provides an override for <a href='#SkPicture_AbortCallback_abort'>abort()</a> that can stop <a href='SkPicture_Reference#SkPicture'>SkPicture</a>::<a href='#SkPicture_playback'>playback</a>.
+
+The part of <a href='SkPicture_Reference#SkPicture'>SkPicture</a> drawn when aborted is undefined. <a href='SkPicture_Reference#SkPicture'>SkPicture</a> instantiations are
+free to stop drawing at different <a href='SkPoint_Reference#Point'>points</a> during playback.
+
+If the abort happens inside one or more calls to <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_save'>save()</a>, stack
+of <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> <a href='SkMatrix_Reference#Matrix'>matrix</a> and <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> clip values is restored to its state before
+<a href='SkPicture_Reference#SkPicture'>SkPicture</a>::<a href='#SkPicture_playback'>playback</a> was called.
+
+### Return Value
+
+true to stop playback
+
+### See Also
+
+<a href='#SkPicture_playback'>playback</a>
+
+### Example
+
+<div><fiddle-embed name="@Picture_AbortCallback_abort"><div>JustOneDraw allows the black rectangle to draw but stops playback before the
+white rectangle appears.
+</div></fiddle-embed></div>
+
+<a name='SkPicture_MakeFromStream'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkPicture_Reference#SkPicture'>SkPicture</a>&gt; <a href='#SkPicture_MakeFromStream'>MakeFromStream</a>(<a href='SkStream_Reference#SkStream'>SkStream</a>* <a href='SkStream_Reference#Stream'>stream</a>, const <a href='undocumented#SkDeserialProcs'>SkDeserialProcs</a>* procs = nullptr)
+</pre>
+
+Recreates <a href='SkPicture_Reference#SkPicture'>SkPicture</a> that was serialized into a <a href='#SkPicture_MakeFromStream_stream'>stream</a>. Returns constructed <a href='SkPicture_Reference#SkPicture'>SkPicture</a>
+if successful; otherwise, returns nullptr. Fails if <a href='undocumented#Data'>data</a> does not permit
+constructing valid <a href='SkPicture_Reference#SkPicture'>SkPicture</a>.
+
+<a href='#SkPicture_MakeFromStream_procs'>procs</a>-><a href='#SkDeserialProcs_fPictureProc'>fPictureProc</a> permits supplying a custom function to decode <a href='SkPicture_Reference#SkPicture'>SkPicture</a>.
+If <a href='#SkPicture_MakeFromStream_procs'>procs</a>-><a href='#SkDeserialProcs_fPictureProc'>fPictureProc</a> is nullptr, default decoding is used. <a href='#SkPicture_MakeFromStream_procs'>procs</a>-><a href='#SkDeserialProcs_fPictureCtx'>fPictureCtx</a>
+may be used to provide user context to <a href='#SkPicture_MakeFromStream_procs'>procs</a>-><a href='#SkDeserialProcs_fPictureProc'>fPictureProc</a>; <a href='#SkPicture_MakeFromStream_procs'>procs</a>-><a href='#SkDeserialProcs_fPictureProc'>fPictureProc</a>
+is called with a pointer to <a href='undocumented#Data'>data</a>, <a href='undocumented#Data'>data</a> byte length, and user context.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPicture_MakeFromStream_stream'><code><strong>stream</strong></code></a></td>
+    <td>container for serial <a href='undocumented#Data'>data</a></td>
+  </tr>
+  <tr>    <td><a name='SkPicture_MakeFromStream_procs'><code><strong>procs</strong></code></a></td>
+    <td>custom serial <a href='undocumented#Data'>data</a> decoders; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkPicture_Reference#SkPicture'>SkPicture</a> constructed from <a href='#SkPicture_MakeFromStream_stream'>stream</a> <a href='undocumented#Data'>data</a>
+
+### Example
+
+<div><fiddle-embed name="@Picture_MakeFromStream"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPicture_MakeFromData'>MakeFromData</a> <a href='undocumented#SkPictureRecorder'>SkPictureRecorder</a>
+
+<a name='SkPicture_MakeFromData'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkPicture_Reference#SkPicture'>SkPicture</a>&gt; <a href='#SkPicture_MakeFromData'>MakeFromData</a>(const <a href='undocumented#SkData'>SkData</a>* <a href='undocumented#Data'>data</a>, const <a href='undocumented#SkDeserialProcs'>SkDeserialProcs</a>* procs = nullptr)
+</pre>
+
+Recreates <a href='SkPicture_Reference#SkPicture'>SkPicture</a> that was serialized into <a href='#SkPicture_MakeFromData_data'>data</a>. Returns constructed <a href='SkPicture_Reference#SkPicture'>SkPicture</a>
+if successful; otherwise, returns nullptr. Fails if <a href='#SkPicture_MakeFromData_data'>data</a> does not permit
+constructing valid <a href='SkPicture_Reference#SkPicture'>SkPicture</a>.
+
+<a href='#SkPicture_MakeFromData_procs'>procs</a>-><a href='#SkDeserialProcs_fPictureProc'>fPictureProc</a> permits supplying a custom function to decode <a href='SkPicture_Reference#SkPicture'>SkPicture</a>.
+If <a href='#SkPicture_MakeFromData_procs'>procs</a>-><a href='#SkDeserialProcs_fPictureProc'>fPictureProc</a> is nullptr, default decoding is used. <a href='#SkPicture_MakeFromData_procs'>procs</a>-><a href='#SkDeserialProcs_fPictureCtx'>fPictureCtx</a>
+may be used to provide user context to <a href='#SkPicture_MakeFromData_procs'>procs</a>-><a href='#SkDeserialProcs_fPictureProc'>fPictureProc</a>; <a href='#SkPicture_MakeFromData_procs'>procs</a>-><a href='#SkDeserialProcs_fPictureProc'>fPictureProc</a>
+is called with a pointer to <a href='#SkPicture_MakeFromData_data'>data</a>, <a href='#SkPicture_MakeFromData_data'>data</a> byte length, and user context.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPicture_MakeFromData_data'><code><strong>data</strong></code></a></td>
+    <td>container for serial <a href='#SkPicture_MakeFromData_data'>data</a></td>
+  </tr>
+  <tr>    <td><a name='SkPicture_MakeFromData_procs'><code><strong>procs</strong></code></a></td>
+    <td>custom serial <a href='#SkPicture_MakeFromData_data'>data</a> decoders; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkPicture_Reference#SkPicture'>SkPicture</a> constructed from <a href='#SkPicture_MakeFromData_data'>data</a>
+
+### Example
+
+<div><fiddle-embed name="@Picture_MakeFromData"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPicture_MakeFromStream'>MakeFromStream</a> <a href='undocumented#SkPictureRecorder'>SkPictureRecorder</a>
+
+<a name='SkPicture_MakeFromData_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkPicture_Reference#SkPicture'>SkPicture</a>&gt; <a href='#SkPicture_MakeFromData'>MakeFromData</a>(const void* <a href='undocumented#Data'>data</a>, size_t <a href='undocumented#Size'>size</a>,
+                                     const <a href='undocumented#SkDeserialProcs'>SkDeserialProcs</a>* procs = nullptr)
+</pre>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPicture_MakeFromData_2_data'><code><strong>data</strong></code></a></td>
+    <td>pointer to serial <a href='#SkPicture_MakeFromData_2_data'>data</a></td>
+  </tr>
+  <tr>    <td><a name='SkPicture_MakeFromData_2_size'><code><strong>size</strong></code></a></td>
+    <td><a href='#SkPicture_MakeFromData_2_size'>size</a> of <a href='#SkPicture_MakeFromData_2_data'>data</a></td>
+  </tr>
+  <tr>    <td><a name='SkPicture_MakeFromData_2_procs'><code><strong>procs</strong></code></a></td>
+    <td>custom serial <a href='#SkPicture_MakeFromData_2_data'>data</a> decoders; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkPicture_Reference#SkPicture'>SkPicture</a> constructed from <a href='#SkPicture_MakeFromData_2_data'>data</a>
+
+### Example
+
+<div><fiddle-embed name="@Picture_008"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPicture_MakeFromStream'>MakeFromStream</a> <a href='undocumented#SkPictureRecorder'>SkPictureRecorder</a>
+
+<a name='SkPicture_playback'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+virtual void playback(<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>* <a href='SkCanvas_Reference#Canvas'>canvas</a>, <a href='#SkPicture_AbortCallback'>AbortCallback</a>* callback = nullptr) const = 0
+</pre>
+
+Replays the drawing commands on the specified <a href='#SkPicture_playback_canvas'>canvas</a>. In the case that the
+commands are recorded, each command in the <a href='SkPicture_Reference#SkPicture'>SkPicture</a> is sent separately to <a href='#SkPicture_playback_canvas'>canvas</a>.
+
+To add a single command to draw <a href='SkPicture_Reference#SkPicture'>SkPicture</a> to recording <a href='#SkPicture_playback_canvas'>canvas</a>, call
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawPicture'>drawPicture</a> instead.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPicture_playback_canvas'><code><strong>canvas</strong></code></a></td>
+    <td>receiver of drawing commands</td>
+  </tr>
+  <tr>    <td><a name='SkPicture_playback_callback'><code><strong>callback</strong></code></a></td>
+    <td>allows interruption of playback</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Picture_playback"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawPicture'>drawPicture</a>
+
+<a name='SkPicture_cullRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+virtual <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkPicture_cullRect'>cullRect</a>() const = 0
+</pre>
+
+Returns cull <a href='SkRect_Reference#SkRect'>SkRect</a> for this <a href='SkPicture_Reference#Picture'>picture</a>, passed in when <a href='SkPicture_Reference#SkPicture'>SkPicture</a> was created.
+Returned <a href='SkRect_Reference#SkRect'>SkRect</a> does not specify clipping <a href='SkRect_Reference#SkRect'>SkRect</a> for <a href='SkPicture_Reference#SkPicture'>SkPicture</a>; cull is hint
+of <a href='SkPicture_Reference#SkPicture'>SkPicture</a> bounds.
+
+<a href='SkPicture_Reference#SkPicture'>SkPicture</a> is free to discard recorded drawing commands that fall outside
+cull.
+
+### Return Value
+
+bounds passed when <a href='SkPicture_Reference#SkPicture'>SkPicture</a> was created
+
+### Example
+
+<div><fiddle-embed name="@Picture_cullRect"><div><a href='SkPicture_Reference#Picture'>Picture</a> recorded bounds are smaller than contents; contents outside recorded
+bounds may be drawn, and are drawn in this example.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_clipRect'>clipRect</a>
+
+<a name='SkPicture_uniqueID'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint32_t <a href='#SkPicture_uniqueID'>uniqueID</a>()const
+</pre>
+
+Returns a non-zero value unique among <a href='SkPicture_Reference#SkPicture'>SkPicture</a> in Skia process.
+
+### Return Value
+
+identifier for <a href='SkPicture_Reference#SkPicture'>SkPicture</a>
+
+### Example
+
+<div><fiddle-embed name="@Picture_uniqueID">
+
+#### Example Output
+
+~~~~
+empty picture id = 1
+placeholder id = 2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#SkRefCnt'>SkRefCnt</a>
+
+<a name='SkPicture_serialize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkData'>SkData</a>&gt; <a href='#SkPicture_serialize'>serialize</a>(const <a href='undocumented#SkSerialProcs'>SkSerialProcs</a>* procs = nullptr)const
+</pre>
+
+Returns storage containing <a href='undocumented#SkData'>SkData</a> describing <a href='SkPicture_Reference#SkPicture'>SkPicture</a>, using optional custom
+encoders.
+
+<a href='#SkPicture_serialize_procs'>procs</a>-><a href='#SkSerialProcs_fPictureProc'>fPictureProc</a> permits supplying a custom function to encode <a href='SkPicture_Reference#SkPicture'>SkPicture</a>.
+If <a href='#SkPicture_serialize_procs'>procs</a>-><a href='#SkSerialProcs_fPictureProc'>fPictureProc</a> is nullptr, default encoding is used. <a href='#SkPicture_serialize_procs'>procs</a>-><a href='#SkSerialProcs_fPictureCtx'>fPictureCtx</a>
+may be used to provide user context to <a href='#SkPicture_serialize_procs'>procs</a>-><a href='#SkSerialProcs_fPictureProc'>fPictureProc</a>; <a href='#SkPicture_serialize_procs'>procs</a>-><a href='#SkSerialProcs_fPictureProc'>fPictureProc</a>
+is called with a pointer to <a href='SkPicture_Reference#SkPicture'>SkPicture</a> and user context.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPicture_serialize_procs'><code><strong>procs</strong></code></a></td>
+    <td>custom serial <a href='undocumented#Data'>data</a> encoders; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+storage containing serialized <a href='SkPicture_Reference#SkPicture'>SkPicture</a>
+
+### Example
+
+<div><fiddle-embed name="@Picture_serialize"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPicture_MakeFromData'>MakeFromData</a> <a href='undocumented#SkData'>SkData</a> <a href='undocumented#SkSerialProcs'>SkSerialProcs</a>
+
+<a name='SkPicture_serialize_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPicture_serialize'>serialize</a>(<a href='SkWStream_Reference#SkWStream'>SkWStream</a>* <a href='SkStream_Reference#Stream'>stream</a>, const <a href='undocumented#SkSerialProcs'>SkSerialProcs</a>* procs = nullptr)const
+</pre>
+
+Writes <a href='SkPicture_Reference#Picture'>picture</a> to <a href='#SkPicture_serialize_2_stream'>stream</a>, using optional custom encoders.
+
+<a href='#SkPicture_serialize_2_procs'>procs</a>-><a href='#SkSerialProcs_fPictureProc'>fPictureProc</a> permits supplying a custom function to encode <a href='SkPicture_Reference#SkPicture'>SkPicture</a>.
+If <a href='#SkPicture_serialize_2_procs'>procs</a>-><a href='#SkSerialProcs_fPictureProc'>fPictureProc</a> is nullptr, default encoding is used. <a href='#SkPicture_serialize_2_procs'>procs</a>-><a href='#SkSerialProcs_fPictureCtx'>fPictureCtx</a>
+may be used to provide user context to <a href='#SkPicture_serialize_2_procs'>procs</a>-><a href='#SkSerialProcs_fPictureProc'>fPictureProc</a>; <a href='#SkPicture_serialize_2_procs'>procs</a>-><a href='#SkSerialProcs_fPictureProc'>fPictureProc</a>
+is called with a pointer to <a href='SkPicture_Reference#SkPicture'>SkPicture</a> and user context.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPicture_serialize_2_stream'><code><strong>stream</strong></code></a></td>
+    <td>writable serial <a href='undocumented#Data'>data</a> <a href='#SkPicture_serialize_2_stream'>stream</a></td>
+  </tr>
+  <tr>    <td><a name='SkPicture_serialize_2_procs'><code><strong>procs</strong></code></a></td>
+    <td>custom serial <a href='undocumented#Data'>data</a> encoders; may be nullptr</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Picture_008"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPicture_MakeFromStream'>MakeFromStream</a> <a href='SkWStream_Reference#SkWStream'>SkWStream</a> <a href='undocumented#SkSerialProcs'>SkSerialProcs</a>
+
+<a name='SkPicture_MakePlaceholder'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkPicture_Reference#SkPicture'>SkPicture</a>&gt; <a href='#SkPicture_MakePlaceholder'>MakePlaceholder</a>(<a href='SkRect_Reference#SkRect'>SkRect</a> cull)
+</pre>
+
+Returns a placeholder <a href='SkPicture_Reference#SkPicture'>SkPicture</a>. Result does not draw, and contains only
+<a href='#SkPicture_MakePlaceholder_cull'>cull</a> <a href='SkRect_Reference#SkRect'>SkRect</a>, a hint of its bounds. Result is immutable; it cannot be changed
+later. Result identifier is unique.
+
+Returned placeholder can be intercepted during playback to insert other
+commands into <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> draw <a href='SkStream_Reference#Stream'>stream</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPicture_MakePlaceholder_cull'><code><strong>cull</strong></code></a></td>
+    <td>placeholder dimensions</td>
+  </tr>
+</table>
+
+### Return Value
+
+placeholder with unique identifier
+
+### Example
+
+<div><fiddle-embed name="@Picture_MakePlaceholder"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPicture_MakeFromStream'>MakeFromStream</a> <a href='#SkPicture_MakeFromData'>MakeFromData</a> <a href='#SkPicture_uniqueID'>uniqueID</a>
+
+<a name='SkPicture_approximateOpCount'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+virtual int <a href='#SkPicture_approximateOpCount'>approximateOpCount</a>() const = 0
+</pre>
+
+Returns the approximate number of operations in <a href='SkPicture_Reference#SkPicture'>SkPicture</a>. Returned value
+may be greater or less than the number of <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> calls
+recorded: some calls may be recorded as more than one operation, other
+calls may be optimized away.
+
+### Return Value
+
+approximate operation count
+
+### Example
+
+<div><fiddle-embed name="4b3d879118ef770d1f11a23c6493b2c4"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPicture_approximateBytesUsed'>approximateBytesUsed</a>
+
+<a name='SkPicture_approximateBytesUsed'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+virtual size_t <a href='#SkPicture_approximateBytesUsed'>approximateBytesUsed</a>() const = 0
+</pre>
+
+Returns the approximate byte <a href='undocumented#Size'>size</a> of <a href='SkPicture_Reference#SkPicture'>SkPicture</a>. Does not include large objects
+referenced by <a href='SkPicture_Reference#SkPicture'>SkPicture</a>.
+
+### Return Value
+
+approximate <a href='undocumented#Size'>size</a>
+
+### Example
+
+<div><fiddle-embed name="ececbda21218bd732394a305dba393a2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPicture_approximateOpCount'>approximateOpCount</a>
+
diff --git a/src/third_party/skia/site/user/api/SkPixmap_Reference.md b/src/third_party/skia/site/user/api/SkPixmap_Reference.md
new file mode 100644
index 0000000..95da559
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkPixmap_Reference.md
@@ -0,0 +1,1972 @@
+SkPixmap Reference
+===
+
+
+<a name='SkPixmap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> {
+
+    <a href='#SkPixmap_empty_constructor'>SkPixmap()</a>;
+    <a href='#SkPixmap_const_SkImageInfo_const_star'>SkPixmap</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, const void* addr, size_t <a href='#SkPixmap_rowBytes'>rowBytes</a>);
+    void <a href='#SkPixmap_reset'>reset()</a>;
+    void <a href='#SkPixmap_reset'>reset</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, const void* addr, size_t <a href='#SkPixmap_rowBytes'>rowBytes</a>);
+    void <a href='#SkPixmap_setColorSpace'>setColorSpace</a>(<a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> <a href='#SkPixmap_colorSpace'>colorSpace</a>);
+    bool <a href='#SkPixmap_extractSubset'>extractSubset</a>(<a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>* subset, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& area) const;
+    const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& <a href='#SkPixmap_info'>info()</a> const;
+    size_t <a href='#SkPixmap_rowBytes'>rowBytes</a>() const;
+    const void* <a href='#SkPixmap_addr'>addr()</a> const;
+    int <a href='#SkPixmap_width'>width()</a> const;
+    int <a href='#SkPixmap_height'>height()</a> const;
+    <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkPixmap_colorType'>colorType</a>() const;
+    <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkPixmap_alphaType'>alphaType</a>() const;
+    <a href='undocumented#SkColorSpace'>SkColorSpace</a>* <a href='#SkPixmap_colorSpace'>colorSpace</a>() const;
+    bool <a href='#SkPixmap_isOpaque'>isOpaque</a>() const;
+    <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkPixmap_bounds'>bounds()</a> const;
+    int <a href='#SkPixmap_rowBytesAsPixels'>rowBytesAsPixels</a>() const;
+    int <a href='#SkPixmap_shiftPerPixel'>shiftPerPixel</a>() const;
+    size_t <a href='#SkPixmap_computeByteSize'>computeByteSize</a>() const;
+    bool <a href='#SkPixmap_computeIsOpaque'>computeIsOpaque</a>() const;
+    <a href='SkColor_Reference#SkColor'>SkColor</a> <a href='#SkPixmap_getColor'>getColor</a>(int x, int y) const;
+    float <a href='#SkPixmap_getAlphaf'>getAlphaf</a>(int x, int y) const;
+    const void* <a href='#SkPixmap_addr'>addr</a>(int x, int y) const;
+    const uint8_t* <a href='#SkPixmap_addr8'>addr8</a>() const;
+    const uint16_t* <a href='#SkPixmap_addr16'>addr16</a>() const;
+    const uint32_t* <a href='#SkPixmap_addr32'>addr32</a>() const;
+    const uint64_t* <a href='#SkPixmap_addr64'>addr64</a>() const;
+    const uint16_t* <a href='#SkPixmap_addrF16'>addrF16</a>() const;
+    const uint8_t* <a href='#SkPixmap_addr8'>addr8</a>(int x, int y) const;
+    const uint16_t* <a href='#SkPixmap_addr16'>addr16</a>(int x, int y) const;
+    const uint32_t* <a href='#SkPixmap_addr32'>addr32</a>(int x, int y) const;
+    const uint64_t* <a href='#SkPixmap_addr64'>addr64</a>(int x, int y) const;
+    const uint16_t* <a href='#SkPixmap_addrF16'>addrF16</a>(int x, int y) const;
+    void* <a href='#SkPixmap_writable_addr'>writable_addr</a>() const;
+    void* <a href='#SkPixmap_writable_addr'>writable_addr</a>(int x, int y) const;
+    uint8_t* <a href='#SkPixmap_writable_addr8'>writable_addr8</a>(int x, int y) const;
+    uint16_t* <a href='#SkPixmap_writable_addr16'>writable_addr16</a>(int x, int y) const;
+    uint32_t* <a href='#SkPixmap_writable_addr32'>writable_addr32</a>(int x, int y) const;
+    uint64_t* <a href='#SkPixmap_writable_addr64'>writable_addr64</a>(int x, int y) const;
+    uint16_t* <a href='#SkPixmap_writable_addrF16'>writable_addrF16</a>(int x, int y) const;
+    bool <a href='#SkPixmap_readPixels'>readPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& dstInfo, void* dstPixels, size_t dstRowBytes) const;
+    bool <a href='#SkPixmap_readPixels'>readPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& dstInfo, void* dstPixels, size_t dstRowBytes, int srcX,
+                    int srcY) const;
+    bool <a href='#SkPixmap_readPixels'>readPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst, int srcX, int srcY) const;
+    bool <a href='#SkPixmap_readPixels'>readPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst) const;
+    bool <a href='#SkPixmap_scalePixels'>scalePixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst, <a href='undocumented#SkFilterQuality'>SkFilterQuality</a> filterQuality) const;
+    bool <a href='#SkPixmap_erase'>erase</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#Color'>color</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& subset) const;
+    bool <a href='#SkPixmap_erase'>erase</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#Color'>color</a>) const;
+    bool <a href='#SkPixmap_erase'>erase</a>(const <a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a>& <a href='SkColor_Reference#Color'>color</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>* subset = nullptr) const;
+};
+
+</pre>
+
+<a href='SkPixmap_Reference#Pixmap'>Pixmap</a> provides a utility to pair <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> with pixels and row bytes.
+<a href='SkPixmap_Reference#Pixmap'>Pixmap</a> is a low level class which provides convenience functions to access
+raster destinations. <a href='SkCanvas_Reference#Canvas'>Canvas</a> can not draw <a href='SkPixmap_Reference#Pixmap'>Pixmap</a>, nor does <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> provide
+a direct drawing destination.
+
+Use <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> to draw pixels referenced by <a href='SkPixmap_Reference#Pixmap'>Pixmap</a>; use <a href='SkSurface_Reference#Surface'>Surface</a> to draw into
+pixels referenced by <a href='SkPixmap_Reference#Pixmap'>Pixmap</a>.
+
+<a href='SkPixmap_Reference#Pixmap'>Pixmap</a> does not try to manage the lifetime of the <a href='undocumented#Pixel'>pixel</a> memory. Use <a href='#Pixel_Ref'>Pixel_Ref</a>
+to manage <a href='undocumented#Pixel'>pixel</a> memory; <a href='#Pixel_Ref'>Pixel_Ref</a> is safe across threads.
+
+<a name='Initialization'></a>
+
+<a name='SkPixmap_empty_constructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPixmap_empty_constructor'>SkPixmap()</a>
+</pre>
+
+Creates an empty <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> without pixels, with <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, with
+<a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, and with a width and height of zero. Use
+<a href='#SkPixmap_reset'>reset()</a> to associate pixels, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, width, and height
+after <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> has been created.
+
+### Return Value
+
+empty <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_empty_constructor">
+
+#### Example Output
+
+~~~~
+width:  0  height:  0  color: kUnknown_SkColorType  alpha: kUnknown_SkAlphaType
+width: 25  height: 35  color: kRGBA_8888_SkColorType  alpha: kOpaque_SkAlphaType
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_const_SkImageInfo_const_star'>SkPixmap</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& <a href='#SkPixmap_info'>info</a>, const void* <a href='#SkPixmap_addr'>addr</a>, size_t <a href='#SkPixmap_rowBytes'>rowBytes</a>) <a href='#SkPixmap_reset'>reset()</a> <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>
+
+<a name='SkPixmap_const_SkImageInfo_const_star'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkPixmap_const_SkImageInfo_const_star'>SkPixmap</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, const void* addr, size_t <a href='#SkPixmap_rowBytes'>rowBytes</a>)
+</pre>
+
+Creates <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> from <a href='#SkPixmap_const_SkImageInfo_const_star_info'>info</a> width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>.
+<a href='#SkPixmap_const_SkImageInfo_const_star_addr'>addr</a> <a href='SkPoint_Reference#Point'>points</a> to pixels, or nullptr. <a href='#SkPixmap_const_SkImageInfo_const_star_rowBytes'>rowBytes</a> should be <a href='#SkPixmap_const_SkImageInfo_const_star_info'>info</a>.<a href='#SkImageInfo_width'>width()</a> times
+<a href='#SkPixmap_const_SkImageInfo_const_star_info'>info</a>.<a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>(), or larger.
+
+No parameter checking is performed; it is up to the caller to ensure that
+<a href='#SkPixmap_const_SkImageInfo_const_star_addr'>addr</a> and <a href='#SkPixmap_const_SkImageInfo_const_star_rowBytes'>rowBytes</a> agree with <a href='#SkPixmap_const_SkImageInfo_const_star_info'>info</a>.
+
+The memory lifetime of pixels is managed by the caller. When <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> goes
+out of scope, <a href='#SkPixmap_const_SkImageInfo_const_star_addr'>addr</a> is unaffected.
+
+<a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> may be later modified by <a href='#SkPixmap_reset'>reset()</a> to change its <a href='undocumented#Size'>size</a>, <a href='undocumented#Pixel'>pixel</a> type, or
+storage.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_const_SkImageInfo_const_star_info'><code><strong>info</strong></code></a></td>
+    <td>width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> of <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_const_SkImageInfo_const_star_addr'><code><strong>addr</strong></code></a></td>
+    <td>pointer to pixels allocated by caller; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_const_SkImageInfo_const_star_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of one row of <a href='#SkPixmap_const_SkImageInfo_const_star_addr'>addr</a>; width times <a href='undocumented#Pixel'>pixel</a> <a href='undocumented#Size'>size</a>, or larger</td>
+  </tr>
+</table>
+
+### Return Value
+
+initialized <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_const_SkImageInfo_const_star"><div><a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_MakeRasterCopy'>MakeRasterCopy</a> takes const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& as an argument. The example
+constructs a <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> from the brace-delimited parameters.
+</div>
+
+#### Example Output
+
+~~~~
+image alpha only = false
+copy alpha only = true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_empty_constructor'>SkPixmap()</a> <a href='#SkPixmap_reset'>reset()</a> <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>
+
+<a name='SkPixmap_reset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPixmap_reset'>reset()</a>
+</pre>
+
+Sets width, height, row bytes to zero; <a href='undocumented#Pixel'>pixel</a> address to nullptr; <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> to
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>; and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> to <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>.
+
+The prior pixels are unaffected; it is up to the caller to release pixels
+memory if desired.
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_reset">
+
+#### Example Output
+
+~~~~
+width: 25  height: 35  color: kRGBA_8888_SkColorType  alpha: kOpaque_SkAlphaType
+width:  0  height:  0  color: kUnknown_SkColorType  alpha: kUnknown_SkAlphaType
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_empty_constructor'>SkPixmap()</a> <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>
+
+<a name='SkPixmap_reset_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void reset(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& info, const void* addr, size_t <a href='#SkPixmap_rowBytes'>rowBytes</a>)
+</pre>
+
+Sets width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> from <a href='#SkPixmap_reset_2_info'>info</a>.
+Sets <a href='undocumented#Pixel'>pixel</a> address from <a href='#SkPixmap_reset_2_addr'>addr</a>, which may be nullptr.
+Sets row bytes from <a href='#SkPixmap_reset_2_rowBytes'>rowBytes</a>, which should be <a href='#SkPixmap_reset_2_info'>info</a>.<a href='#SkImageInfo_width'>width()</a> times
+<a href='#SkPixmap_reset_2_info'>info</a>.<a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>(), or larger.
+
+Does not check <a href='#SkPixmap_reset_2_addr'>addr</a>. Asserts if built with SK_DEBUG defined and if <a href='#SkPixmap_reset_2_rowBytes'>rowBytes</a> is
+too small to hold one row of pixels.
+
+The memory lifetime pixels are managed by the caller. When <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> goes
+out of scope, <a href='#SkPixmap_reset_2_addr'>addr</a> is unaffected.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_reset_2_info'><code><strong>info</strong></code></a></td>
+    <td>width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> of <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_reset_2_addr'><code><strong>addr</strong></code></a></td>
+    <td>pointer to pixels allocated by caller; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_reset_2_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of one row of <a href='#SkPixmap_reset_2_addr'>addr</a>; width times <a href='undocumented#Pixel'>pixel</a> <a href='undocumented#Size'>size</a>, or larger</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_reset_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_const_SkImageInfo_const_star'>SkPixmap</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& <a href='#SkPixmap_reset_2_info'>info</a>, const void* <a href='#SkPixmap_reset_2_addr'>addr</a>, size_t <a href='#SkPixmap_reset_2_rowBytes'>rowBytes</a>) <a href='#SkPixmap_reset'>reset()</a> <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>
+
+<a name='SkPixmap_setColorSpace'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPixmap_setColorSpace'>setColorSpace</a>(<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; <a href='#SkPixmap_colorSpace'>colorSpace</a>)
+</pre>
+
+Changes <a href='undocumented#SkColorSpace'>SkColorSpace</a> in <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>; preserves width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, and
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> in <a href='SkImage_Reference#SkImage'>SkImage</a>, and leaves <a href='undocumented#Pixel'>pixel</a> address and row bytes unchanged.
+<a href='undocumented#SkColorSpace'>SkColorSpace</a>  <a href='undocumented#Reference_Count'>reference count</a> is incremented.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_setColorSpace_colorSpace'><code><strong>colorSpace</strong></code></a></td>
+    <td><a href='undocumented#SkColorSpace'>SkColorSpace</a> moved to <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="30d70aec4de17c831dba71e03dc9664a">
+
+#### Example Output
+
+~~~~
+is unique
+is not unique
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Color_Space'>Color_Space</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_makeColorSpace'>makeColorSpace</a>
+
+<a name='SkPixmap_extractSubset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPixmap_extractSubset'>extractSubset</a>(<a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>* subset, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& area)const
+</pre>
+
+Sets <a href='#SkPixmap_extractSubset_subset'>subset</a> width, height, <a href='undocumented#Pixel'>pixel</a> address to intersection of <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> with <a href='#SkPixmap_extractSubset_area'>area</a>,
+if intersection is not empty; and return true. Otherwise, leave <a href='#SkPixmap_extractSubset_subset'>subset</a> unchanged
+and return false.
+
+Failing to read the return value generates a compile time warning.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_extractSubset_subset'><code><strong>subset</strong></code></a></td>
+    <td>storage for width, height, <a href='undocumented#Pixel'>pixel</a> address of intersection</td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_extractSubset_area'><code><strong>area</strong></code></a></td>
+    <td>bounds to intersect with <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if intersection of <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> and <a href='#SkPixmap_extractSubset_area'>area</a> is not empty
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_extractSubset"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_reset'>reset()</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_intersect'>intersect</a>
+
+<a name='Image_Info_Access'></a>
+
+<a name='SkPixmap_info'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& <a href='#SkPixmap_info'>info()</a>const
+</pre>
+
+Returns width, height, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, and <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+
+### Return Value
+
+reference to <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_info">
+
+#### Example Output
+
+~~~~
+width: 384 height: 384 color: BGRA_8888 alpha: Opaque
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Image_Info'>Image_Info</a>
+
+<a name='SkPixmap_rowBytes'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkPixmap_rowBytes'>rowBytes</a>()const
+</pre>
+
+Returns row bytes, the interval from one <a href='undocumented#Pixel'>pixel</a> row to the next. Row bytes
+is at least as large as: <code><a href='#SkPixmap_width'>width()</a> * <a href='#SkPixmap_info'>info()</a>.<a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>()</code>.
+
+Returns zero if <a href='#SkPixmap_colorType'>colorType</a> is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
+It is up to the <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> creator to ensure that row bytes is a useful value.
+
+### Return Value
+
+byte length of <a href='undocumented#Pixel'>pixel</a> row
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_rowBytes">
+
+#### Example Output
+
+~~~~
+rowBytes: 2 minRowBytes: 4
+rowBytes: 8 minRowBytes: 4
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_info'>info()</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>
+
+<a name='SkPixmap_addr'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const void* <a href='#SkPixmap_addr'>addr()</a>const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> address, the base address corresponding to the <a href='undocumented#Pixel'>pixel</a> origin.
+
+It is up to the <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> creator to ensure that <a href='undocumented#Pixel'>pixel</a> address is a useful value.
+
+### Return Value
+
+<a href='undocumented#Pixel'>pixel</a> address
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_addr">
+
+#### Example Output
+
+~~~~
+#Volatile
+pixels address: 0x7f2a440bb010
+inset address:  0x7f2a440fb210
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_addr_2'>addr(int x, int y)</a> <a href='#SkPixmap_addr8'>addr8</a> <a href='#SkPixmap_addr16'>addr16</a> <a href='#SkPixmap_addr32'>addr32</a> <a href='#SkPixmap_addr64'>addr64</a> <a href='#SkPixmap_info'>info()</a> <a href='#SkPixmap_rowBytes'>rowBytes</a>()
+
+<a name='SkPixmap_width'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkPixmap_width'>width()</a>const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> count in each <a href='undocumented#Pixel'>pixel</a> row. Should be equal or less than:
+
+<code><a href='#SkPixmap_rowBytes'>rowBytes</a>() / <a href='#SkPixmap_info'>info()</a>.<a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>()</code>.
+
+### Return Value
+
+<a href='undocumented#Pixel'>pixel</a> width in <a href='#Image_Info'>Image_Info</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_width">
+
+#### Example Output
+
+~~~~
+pixmap width: 16  info width: 16
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_height'>height()</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_width'>width()</a>
+
+<a name='SkPixmap_height'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkPixmap_height'>height()</a>const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> row count.
+
+### Return Value
+
+<a href='undocumented#Pixel'>pixel</a> height in <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_height">
+
+#### Example Output
+
+~~~~
+pixmap height: 32  info height: 32
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_width'>width</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_height'>height</a>
+
+<a name='SkPixmap_colorType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='#SkPixmap_colorType'>colorType</a>()const
+</pre>
+
+Returns <a href='#Image_Info_Color_Type'>Color_Type</a>, one of: <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+.
+
+### Return Value
+
+<a href='#Image_Info_Color_Type'>Color_Type</a> in <a href='#Image_Info'>Image_Info</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_colorType">
+
+#### Example Output
+
+~~~~
+color type: kAlpha_8_SkColorType
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_alphaType'>alphaType</a>() <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_colorType'>colorType</a>
+
+<a name='SkPixmap_alphaType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> <a href='#SkPixmap_alphaType'>alphaType</a>()const
+</pre>
+
+Returns <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, one of: <a href='SkImageInfo_Reference#kUnknown_SkAlphaType'>kUnknown_SkAlphaType</a>, <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>,
+<a href='SkImageInfo_Reference#kUnpremul_SkAlphaType'>kUnpremul_SkAlphaType</a>
+.
+
+### Return Value
+
+<a href='#Image_Info_Alpha_Type'>Alpha_Type</a> in <a href='#Image_Info'>Image_Info</a>
+
+### Example
+
+<div><fiddle-embed name="@Bitmap_012">
+
+#### Example Output
+
+~~~~
+alpha type: kPremul_SkAlphaType
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_colorType'>colorType</a>() <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_alphaType'>alphaType</a>
+
+<a name='SkPixmap_colorSpace'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkColorSpace'>SkColorSpace</a>* <a href='#SkPixmap_colorSpace'>colorSpace</a>()const
+</pre>
+
+Returns <a href='undocumented#SkColorSpace'>SkColorSpace</a>, the range of colors, associated with <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>. The
+reference count of <a href='undocumented#SkColorSpace'>SkColorSpace</a> is unchanged. The returned <a href='undocumented#SkColorSpace'>SkColorSpace</a> is
+immutable.
+
+### Return Value
+
+<a href='undocumented#SkColorSpace'>SkColorSpace</a> in <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>, or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_colorSpace"><div><a href='undocumented#SkColorSpace'>SkColorSpace</a>::<a href='#SkColorSpace_MakeSRGBLinear'>MakeSRGBLinear</a> creates <a href='#Color_Space'>Color_Space</a> with linear gamma
+and an sRGB gamut. This <a href='#Color_Space'>Color_Space</a> gamma is not close to sRGB gamma.
+</div>
+
+#### Example Output
+
+~~~~
+gammaCloseToSRGB: false  gammaIsLinear: true  isSRGB: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#Color_Space'>Color_Space</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_colorSpace'>colorSpace</a>
+
+<a name='SkPixmap_isOpaque'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPixmap_isOpaque'>isOpaque</a>()const
+</pre>
+
+Returns true if <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>.
+Does not check if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> allows <a href='SkColor_Reference#Alpha'>alpha</a>, or if any <a href='undocumented#Pixel'>pixel</a> value has
+transparency.
+
+### Return Value
+
+true if <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> has opaque <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_isOpaque"><div><a href='#SkPixmap_isOpaque'>isOpaque</a> ignores whether all pixels are opaque or not.
+</div>
+
+#### Example Output
+
+~~~~
+isOpaque: false
+isOpaque: false
+isOpaque: true
+isOpaque: true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_computeIsOpaque'>computeIsOpaque</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_isOpaque'>isOpaque</a>
+
+<a name='SkPixmap_bounds'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkPixmap_bounds'>bounds()</a>const
+</pre>
+
+Returns <a href='SkIRect_Reference#SkIRect'>SkIRect</a> { 0, 0, <a href='#SkPixmap_width'>width()</a>, <a href='#SkPixmap_height'>height()</a> }.
+
+### Return Value
+
+integral rectangle from origin to <a href='#SkPixmap_width'>width()</a> and <a href='#SkPixmap_height'>height()</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_bounds">
+
+#### Example Output
+
+~~~~
+width: 0 height: 0 empty: true
+width: 0 height: 2 empty: true
+width: 2 height: 0 empty: true
+width: 2 height: 2 empty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_height'>height()</a> <a href='#SkPixmap_width'>width()</a> <a href='SkIRect_Reference#IRect'>IRect</a>
+
+<a name='SkPixmap_rowBytesAsPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkPixmap_rowBytesAsPixels'>rowBytesAsPixels</a>()const
+</pre>
+
+Returns number of pixels that fit on row. Should be greater than or equal to
+<a href='#SkPixmap_width'>width()</a>.
+
+### Return Value
+
+maximum pixels per row
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_rowBytesAsPixels">
+
+#### Example Output
+
+~~~~
+rowBytes: 4 rowBytesAsPixels: 1
+rowBytes: 5 rowBytesAsPixels: 1
+rowBytes: 6 rowBytesAsPixels: 1
+rowBytes: 7 rowBytesAsPixels: 1
+rowBytes: 8 rowBytesAsPixels: 2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_rowBytes'>rowBytes</a> <a href='#SkPixmap_shiftPerPixel'>shiftPerPixel</a> <a href='#SkPixmap_width'>width</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>
+
+<a name='SkPixmap_shiftPerPixel'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkPixmap_shiftPerPixel'>shiftPerPixel</a>()const
+</pre>
+
+Returns bit shift converting row bytes to row pixels.
+Returns zero for <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
+
+### Return Value
+
+one of: 0, 1, 2, 3; left shift to convert pixels to bytes
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_shiftPerPixel">
+
+#### Example Output
+
+~~~~
+color: kUnknown_SkColorType   bytesPerPixel: 0 shiftPerPixel: 0
+color: kAlpha_8_SkColorType   bytesPerPixel: 1 shiftPerPixel: 0
+color: kRGB_565_SkColorType   bytesPerPixel: 2 shiftPerPixel: 1
+color: kARGB_4444_SkColorType bytesPerPixel: 2 shiftPerPixel: 1
+color: kRGBA_8888_SkColorType bytesPerPixel: 4 shiftPerPixel: 2
+color: kBGRA_8888_SkColorType bytesPerPixel: 4 shiftPerPixel: 2
+color: kGray_8_SkColorType    bytesPerPixel: 1 shiftPerPixel: 0
+color: kRGBA_F16_SkColorType  bytesPerPixel: 8 shiftPerPixel: 3
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_rowBytes'>rowBytes</a> <a href='#SkPixmap_rowBytesAsPixels'>rowBytesAsPixels</a> <a href='#SkPixmap_width'>width</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_bytesPerPixel'>bytesPerPixel</a>
+
+<a name='SkPixmap_computeByteSize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkPixmap_computeByteSize'>computeByteSize</a>()const
+</pre>
+
+Returns minimum memory required for <a href='undocumented#Pixel'>pixel</a> storage.
+Does not include unused memory on last row when <a href='#SkPixmap_rowBytesAsPixels'>rowBytesAsPixels</a>() exceeds <a href='#SkPixmap_width'>width()</a>.
+Returns zero if result does not fit in size_t.
+Returns zero if <a href='#SkPixmap_height'>height()</a> or <a href='#SkPixmap_width'>width()</a> is 0.
+Returns <a href='#SkPixmap_height'>height()</a> times <a href='#SkPixmap_rowBytes'>rowBytes</a>() if <a href='#SkPixmap_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
+
+### Return Value
+
+<a href='undocumented#Size'>size</a> in bytes of <a href='SkImage_Reference#Image'>image</a> buffer
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_computeByteSize">
+
+#### Example Output
+
+~~~~
+width:       1 height:       1 computeByteSize:             4
+width:       1 height:    1000 computeByteSize:          4999
+width:       1 height: 1000000 computeByteSize:       4999999
+width:    1000 height:       1 computeByteSize:          4000
+width:    1000 height:    1000 computeByteSize:       4999000
+width:    1000 height: 1000000 computeByteSize:    4999999000
+width: 1000000 height:       1 computeByteSize:       4000000
+width: 1000000 height:    1000 computeByteSize:    4999000000
+width: 1000000 height: 1000000 computeByteSize: 4999999000000
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_computeByteSize'>computeByteSize</a>
+
+<a name='Reader'></a>
+
+<a name='SkPixmap_computeIsOpaque'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPixmap_computeIsOpaque'>computeIsOpaque</a>()const
+</pre>
+
+Returns true if all pixels are opaque. <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> determines how pixels
+are encoded, and whether <a href='undocumented#Pixel'>pixel</a> describes <a href='SkColor_Reference#Alpha'>alpha</a>. Returns true for <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>
+without <a href='SkColor_Reference#Alpha'>alpha</a> in each <a href='undocumented#Pixel'>pixel</a>; for other <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, returns true if all
+pixels have <a href='SkColor_Reference#Alpha'>alpha</a> values equivalent to 1.0 or greater.
+
+For <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a> or <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>: always
+returns true. For <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>: returns true if all <a href='undocumented#Pixel'>pixel</a> <a href='SkColor_Reference#Alpha'>alpha</a> values are 255.
+For <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> <a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>: returns true if all <a href='undocumented#Pixel'>pixel</a> <a href='SkColor_Reference#Alpha'>alpha</a> values are 15.
+For <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>: returns true if all <a href='undocumented#Pixel'>pixel</a> <a href='SkColor_Reference#Alpha'>alpha</a> values are 1.0 or
+greater.
+
+Returns false for <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
+
+### Return Value
+
+true if all pixels have opaque values or <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is opaque
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_computeIsOpaque">
+
+#### Example Output
+
+~~~~
+computeIsOpaque: false
+computeIsOpaque: true
+computeIsOpaque: false
+computeIsOpaque: true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_isOpaque'>isOpaque</a> <a href='#Image_Info_Color_Type'>Color_Type</a> <a href='SkColor_Reference#Alpha'>Alpha</a>
+
+<a name='SkPixmap_getColor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='#SkPixmap_getColor'>getColor</a>(int x, int y)const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> at (<a href='#SkPixmap_getColor_x'>x</a>, <a href='#SkPixmap_getColor_y'>y</a>) as <a href='undocumented#Unpremultiply'>unpremultiplied</a> <a href='SkColor_Reference#Color'>color</a>.
+Returns black with <a href='SkColor_Reference#Alpha'>alpha</a> if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>.
+
+Input is not validated: out of bounds values of <a href='#SkPixmap_getColor_x'>x</a> or <a href='#SkPixmap_getColor_y'>y</a> trigger an assert() if
+built with SK_DEBUG defined; and returns undefined values or may crash if
+SK_RELEASE is defined. Fails if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a> or
+<a href='undocumented#Pixel'>pixel</a> address is nullptr.
+
+<a href='undocumented#SkColorSpace'>SkColorSpace</a> in <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> is ignored. Some <a href='SkColor_Reference#Color'>color</a> precision may be lost in the
+conversion to <a href='undocumented#Unpremultiply'>unpremultiplied</a> <a href='SkColor_Reference#Color'>color</a>; original <a href='undocumented#Pixel'>pixel</a> <a href='undocumented#Data'>data</a> may have additional
+precision.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_getColor_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_getColor_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='undocumented#Pixel'>pixel</a> converted to <a href='undocumented#Unpremultiply'>unpremultiplied</a> <a href='SkColor_Reference#Color'>color</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_getColor">
+
+#### Example Output
+
+~~~~
+Premultiplied:
+(0, 0) 0x00000000 0x2a0e002a 0x55380055 0x7f7f007f
+(0, 1) 0x2a000e2a 0x551c1c55 0x7f542a7f 0xaaaa38aa
+(0, 2) 0x55003855 0x7f2a547f 0xaa7171aa 0xd4d48dd4
+(0, 3) 0x7f007f7f 0xaa38aaaa 0xd48dd4d4 0xffffffff
+Unpremultiplied:
+(0, 0) 0x00000000 0x2a5500ff 0x55a800ff 0x7fff00ff
+(0, 1) 0x2a0055ff 0x555454ff 0x7fa954ff 0xaaff54ff
+(0, 2) 0x5500a8ff 0x7f54a9ff 0xaaaaaaff 0xd4ffaaff
+(0, 3) 0x7f00ffff 0xaa54ffff 0xd4aaffff 0xffffffff
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_getAlphaf'>getAlphaf</a> <a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_readPixels'>readPixels</a>
+
+<a name='SkPixmap_getAlphaf'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+float <a href='#SkPixmap_getAlphaf'>getAlphaf</a>(int x, int y)const
+</pre>
+
+Looks up the <a href='undocumented#Pixel'>pixel</a> at (<a href='#SkPixmap_getAlphaf_x'>x</a>,<a href='#SkPixmap_getAlphaf_y'>y</a>) and return its <a href='SkColor_Reference#Alpha'>alpha</a> component, normalized to [0..1].
+This is roughly equivalent to <code>SkGetColorA(<a href='#SkPixmap_getColor'>getColor</a>())</code>, but can be more efficient
+(and more precise if the pixels store more than 8 bits per component).
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_getAlphaf_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_getAlphaf_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkColor_Reference#Alpha'>alpha</a> converted to normalized float
+
+### See Also
+
+<a href='#SkPixmap_getColor'>getColor</a>
+
+<a name='Readable_Address'></a>
+
+<a name='SkPixmap_addr_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const void* <a href='#SkPixmap_addr'>addr</a>(int x, int y)const
+</pre>
+
+Returns readable <a href='undocumented#Pixel'>pixel</a> address at (<a href='#SkPixmap_addr_2_x'>x</a>, <a href='#SkPixmap_addr_2_y'>y</a>). Returns nullptr if <a href='undocumented#SkPixelRef'>SkPixelRef</a> is nullptr.
+
+Input is not validated: out of bounds values of <a href='#SkPixmap_addr_2_x'>x</a> or <a href='#SkPixmap_addr_2_y'>y</a> trigger an assert() if
+built with SK_DEBUG defined. Returns nullptr if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
+
+Performs a lookup of <a href='undocumented#Pixel'>pixel</a> <a href='undocumented#Size'>size</a>; for better performance, call
+one of: <a href='#SkPixmap_addr8'>addr8</a>, <a href='#SkPixmap_addr16'>addr16</a>, <a href='#SkPixmap_addr32'>addr32</a>, <a href='#SkPixmap_addr64'>addr64</a>, or <a href='#SkPixmap_addrF16'>addrF16</a>().
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_addr_2_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_addr_2_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+readable generic pointer to <a href='undocumented#Pixel'>pixel</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_addr_2">
+
+#### Example Output
+
+~~~~
+pixmap.addr(1, 2) == &storage[1 + 2 * w]
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_addr8'>addr8</a> <a href='#SkPixmap_addr16'>addr16</a> <a href='#SkPixmap_addr32'>addr32</a> <a href='#SkPixmap_addr64'>addr64</a> <a href='#SkPixmap_addrF16'>addrF16</a> <a href='#SkPixmap_getColor'>getColor</a> <a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_getAddr'>getAddr</a>
+
+<a name='SkPixmap_addr8'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const uint8_t* <a href='#SkPixmap_addr8'>addr8</a>()const
+</pre>
+
+Returns readable base <a href='undocumented#Pixel'>pixel</a> address. Result is addressable as unsigned 8-bit bytes.
+Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a> or
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, and is built with SK_DEBUG defined.
+
+One byte corresponds to one <a href='undocumented#Pixel'>pixel</a>.
+
+### Return Value
+
+readable unsigned 8-bit pointer to pixels
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_addr8">
+
+#### Example Output
+
+~~~~
+pixmap.addr8() == storage
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addr16'>addr16</a> <a href='#SkPixmap_addr32'>addr32</a> <a href='#SkPixmap_addr64'>addr64</a> <a href='#SkPixmap_addrF16'>addrF16</a> <a href='#SkPixmap_getColor'>getColor</a> <a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addr8'>writable_addr8</a>
+
+<a name='SkPixmap_addr16'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const uint16_t* <a href='#SkPixmap_addr16'>addr16</a>()const
+</pre>
+
+Returns readable base <a href='undocumented#Pixel'>pixel</a> address. Result is addressable as unsigned 16-bit words.
+Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a> or
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, and is built with SK_DEBUG defined.
+
+One word corresponds to one <a href='undocumented#Pixel'>pixel</a>.
+
+### Return Value
+
+readable unsigned 16-bit pointer to pixels
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_addr16">
+
+#### Example Output
+
+~~~~
+pixmap.addr16() == storage
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addr8'>addr8</a> <a href='#SkPixmap_addr32'>addr32</a> <a href='#SkPixmap_addr64'>addr64</a> <a href='#SkPixmap_addrF16'>addrF16</a> <a href='#SkPixmap_getColor'>getColor</a> <a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addr16'>writable_addr16</a>
+
+<a name='SkPixmap_addr32'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const uint32_t* <a href='#SkPixmap_addr32'>addr32</a>()const
+</pre>
+
+Returns readable base <a href='undocumented#Pixel'>pixel</a> address. Result is addressable as unsigned 32-bit words.
+Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a> or
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, and is built with SK_DEBUG defined.
+
+One word corresponds to one <a href='undocumented#Pixel'>pixel</a>.
+
+### Return Value
+
+readable unsigned 32-bit pointer to pixels
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_addr32">
+
+#### Example Output
+
+~~~~
+pixmap.addr32() == storage
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addr8'>addr8</a> <a href='#SkPixmap_addr16'>addr16</a> <a href='#SkPixmap_addr64'>addr64</a> <a href='#SkPixmap_addrF16'>addrF16</a> <a href='#SkPixmap_getColor'>getColor</a> <a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addr32'>writable_addr32</a>
+
+<a name='SkPixmap_addr64'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const uint64_t* <a href='#SkPixmap_addr64'>addr64</a>()const
+</pre>
+
+Returns readable base <a href='undocumented#Pixel'>pixel</a> address. Result is addressable as unsigned 64-bit words.
+Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a> and is built
+with SK_DEBUG defined.
+
+One word corresponds to one <a href='undocumented#Pixel'>pixel</a>.
+
+### Return Value
+
+readable unsigned 64-bit pointer to pixels
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_addr64">
+
+#### Example Output
+
+~~~~
+pixmap.addr64() == storage
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addr8'>addr8</a> <a href='#SkPixmap_addr16'>addr16</a> <a href='#SkPixmap_addr32'>addr32</a> <a href='#SkPixmap_addrF16'>addrF16</a> <a href='#SkPixmap_getColor'>getColor</a> <a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addr64'>writable_addr64</a>
+
+<a name='SkPixmap_addrF16'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const uint16_t* <a href='#SkPixmap_addrF16'>addrF16</a>()const
+</pre>
+
+Returns readable base <a href='undocumented#Pixel'>pixel</a> address. Result is addressable as unsigned 16-bit words.
+Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a> and is built
+with SK_DEBUG defined.
+
+Each word represents one <a href='SkColor_Reference#Color'>color</a> component encoded as a half float.
+Four words correspond to one <a href='undocumented#Pixel'>pixel</a>.
+
+### Return Value
+
+readable unsigned 16-bit pointer to first component of pixels
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_addrF16">
+
+#### Example Output
+
+~~~~
+pixmap.addrF16() == storage
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addr8'>addr8</a> <a href='#SkPixmap_addr16'>addr16</a> <a href='#SkPixmap_addr32'>addr32</a> <a href='#SkPixmap_addr64'>addr64</a> <a href='#SkPixmap_getColor'>getColor</a> <a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addrF16'>writable_addrF16</a>
+
+<a name='SkPixmap_addr8_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const uint8_t* <a href='#SkPixmap_addr8'>addr8</a>(int x, int y)const
+</pre>
+
+Returns readable <a href='undocumented#Pixel'>pixel</a> address at (<a href='#SkPixmap_addr8_2_x'>x</a>, <a href='#SkPixmap_addr8_2_y'>y</a>).
+
+Input is not validated: out of bounds values of <a href='#SkPixmap_addr8_2_x'>x</a> or <a href='#SkPixmap_addr8_2_y'>y</a> trigger an assert() if
+built with SK_DEBUG defined.
+
+Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a> or
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, and is built with SK_DEBUG defined.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_addr8_2_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_addr8_2_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+readable unsigned 8-bit pointer to <a href='undocumented#Pixel'>pixel</a> at (<a href='#SkPixmap_addr8_2_x'>x</a>, <a href='#SkPixmap_addr8_2_y'>y</a>)
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_addr8_2">
+
+#### Example Output
+
+~~~~
+pixmap.addr8(1, 2) == &storage[1 + 2 * w]
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addr16'>addr16</a> <a href='#SkPixmap_addr32'>addr32</a> <a href='#SkPixmap_addr64'>addr64</a> <a href='#SkPixmap_addrF16'>addrF16</a> <a href='#SkPixmap_getColor'>getColor</a> <a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addr8'>writable_addr8</a>
+
+<a name='SkPixmap_addr16_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const uint16_t* <a href='#SkPixmap_addr16'>addr16</a>(int x, int y)const
+</pre>
+
+Returns readable <a href='undocumented#Pixel'>pixel</a> address at (<a href='#SkPixmap_addr16_2_x'>x</a>, <a href='#SkPixmap_addr16_2_y'>y</a>).
+
+Input is not validated: out of bounds values of <a href='#SkPixmap_addr16_2_x'>x</a> or <a href='#SkPixmap_addr16_2_y'>y</a> trigger an assert() if
+built with SK_DEBUG defined.
+
+Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a> or
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, and is built with SK_DEBUG defined.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_addr16_2_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_addr16_2_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+readable unsigned 16-bit pointer to <a href='undocumented#Pixel'>pixel</a> at (<a href='#SkPixmap_addr16_2_x'>x</a>, <a href='#SkPixmap_addr16_2_y'>y</a>)
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_addr16_2">
+
+#### Example Output
+
+~~~~
+pixmap.addr16(1, 2) == &storage[1 + 2 * w]
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addr8'>addr8</a> <a href='#SkPixmap_addr32'>addr32</a> <a href='#SkPixmap_addr64'>addr64</a> <a href='#SkPixmap_addrF16'>addrF16</a> <a href='#SkPixmap_getColor'>getColor</a> <a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addr16'>writable_addr16</a>
+
+<a name='SkPixmap_addr32_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const uint32_t* <a href='#SkPixmap_addr32'>addr32</a>(int x, int y)const
+</pre>
+
+Returns readable <a href='undocumented#Pixel'>pixel</a> address at (<a href='#SkPixmap_addr32_2_x'>x</a>, <a href='#SkPixmap_addr32_2_y'>y</a>).
+
+Input is not validated: out of bounds values of <a href='#SkPixmap_addr32_2_x'>x</a> or <a href='#SkPixmap_addr32_2_y'>y</a> trigger an assert() if
+built with SK_DEBUG defined.
+
+Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a> or
+<a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, and is built with SK_DEBUG defined.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_addr32_2_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_addr32_2_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+readable unsigned 32-bit pointer to <a href='undocumented#Pixel'>pixel</a> at (<a href='#SkPixmap_addr32_2_x'>x</a>, <a href='#SkPixmap_addr32_2_y'>y</a>)
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_addr32_2">
+
+#### Example Output
+
+~~~~
+pixmap.addr32(1, 2) == &storage[1 + 2 * w]
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addr8'>addr8</a> <a href='#SkPixmap_addr16'>addr16</a> <a href='#SkPixmap_addr64'>addr64</a> <a href='#SkPixmap_addrF16'>addrF16</a> <a href='#SkPixmap_getColor'>getColor</a> <a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addr64'>writable_addr64</a>
+
+<a name='SkPixmap_addr64_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const uint64_t* <a href='#SkPixmap_addr64'>addr64</a>(int x, int y)const
+</pre>
+
+Returns readable <a href='undocumented#Pixel'>pixel</a> address at (<a href='#SkPixmap_addr64_2_x'>x</a>, <a href='#SkPixmap_addr64_2_y'>y</a>).
+
+Input is not validated: out of bounds values of <a href='#SkPixmap_addr64_2_x'>x</a> or <a href='#SkPixmap_addr64_2_y'>y</a> trigger an assert() if
+built with SK_DEBUG defined.
+
+Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a> and is built
+with SK_DEBUG defined.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_addr64_2_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_addr64_2_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+readable unsigned 64-bit pointer to <a href='undocumented#Pixel'>pixel</a> at (<a href='#SkPixmap_addr64_2_x'>x</a>, <a href='#SkPixmap_addr64_2_y'>y</a>)
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_addr64_2">
+
+#### Example Output
+
+~~~~
+pixmap.addr64(1, 2) == &storage[1 + 2 * w]
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addr8'>addr8</a> <a href='#SkPixmap_addr16'>addr16</a> <a href='#SkPixmap_addr32'>addr32</a> <a href='#SkPixmap_addrF16'>addrF16</a> <a href='#SkPixmap_getColor'>getColor</a> <a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addr64'>writable_addr64</a>
+
+<a name='SkPixmap_addrF16_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const uint16_t* <a href='#SkPixmap_addrF16'>addrF16</a>(int x, int y)const
+</pre>
+
+Returns readable <a href='undocumented#Pixel'>pixel</a> address at (<a href='#SkPixmap_addrF16_2_x'>x</a>, <a href='#SkPixmap_addrF16_2_y'>y</a>).
+
+Input is not validated: out of bounds values of <a href='#SkPixmap_addrF16_2_x'>x</a> or <a href='#SkPixmap_addrF16_2_y'>y</a> trigger an assert() if
+built with SK_DEBUG defined.
+
+Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a> and is built
+with SK_DEBUG defined.
+
+Each unsigned 16-bit word represents one <a href='SkColor_Reference#Color'>color</a> component encoded as a half float.
+Four words correspond to one <a href='undocumented#Pixel'>pixel</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_addrF16_2_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_addrF16_2_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+readable unsigned 16-bit pointer to <a href='undocumented#Pixel'>pixel</a> component at (<a href='#SkPixmap_addrF16_2_x'>x</a>, <a href='#SkPixmap_addrF16_2_y'>y</a>)
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_addrF16_2">
+
+#### Example Output
+
+~~~~
+pixmap.addrF16(1, 2) == &storage[1 * wordsPerPixel + 2 * rowWords]
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addr8'>addr8</a> <a href='#SkPixmap_addr16'>addr16</a> <a href='#SkPixmap_addr32'>addr32</a> <a href='#SkPixmap_addr64'>addr64</a> <a href='#SkPixmap_getColor'>getColor</a> <a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addrF16'>writable_addrF16</a>
+
+<a name='Writable_Address'></a>
+
+<a name='SkPixmap_writable_addr'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void* <a href='#SkPixmap_writable_addr'>writable_addr</a>()const
+</pre>
+
+Returns writable base <a href='undocumented#Pixel'>pixel</a> address.
+
+### Return Value
+
+writable generic base pointer to pixels
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_writable_addr">
+
+#### Example Output
+
+~~~~
+pixmap.writable_addr() == (void *)storage
+pixmap.getColor(0, 1) == 0x00000000
+pixmap.getColor(0, 0) == 0xFFFFFFFF
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_writable_addr8'>writable_addr8</a> <a href='#SkPixmap_writable_addr16'>writable_addr16</a> <a href='#SkPixmap_writable_addr32'>writable_addr32</a> <a href='#SkPixmap_writable_addr64'>writable_addr64</a> <a href='#SkPixmap_writable_addrF16'>writable_addrF16</a> <a href='#SkPixmap_addr'>addr()</a>
+
+<a name='SkPixmap_writable_addr_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void* <a href='#SkPixmap_writable_addr'>writable_addr</a>(int x, int y)const
+</pre>
+
+Returns writable <a href='undocumented#Pixel'>pixel</a> address at (<a href='#SkPixmap_writable_addr_2_x'>x</a>, <a href='#SkPixmap_writable_addr_2_y'>y</a>).
+
+Input is not validated: out of bounds values of <a href='#SkPixmap_writable_addr_2_x'>x</a> or <a href='#SkPixmap_writable_addr_2_y'>y</a> trigger an assert() if
+built with SK_DEBUG defined. Returns zero if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_writable_addr_2_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_writable_addr_2_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+writable generic pointer to <a href='undocumented#Pixel'>pixel</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_writable_addr_2">
+
+#### Example Output
+
+~~~~
+pixmap.writable_addr() == (void *)storage
+pixmap.getColor(0, 0) == 0x00000000
+pixmap.getColor(1, 2) == 0xFFFFFFFF
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_writable_addr8'>writable_addr8</a> <a href='#SkPixmap_writable_addr16'>writable_addr16</a> <a href='#SkPixmap_writable_addr32'>writable_addr32</a> <a href='#SkPixmap_writable_addr64'>writable_addr64</a> <a href='#SkPixmap_writable_addrF16'>writable_addrF16</a> <a href='#SkPixmap_addr'>addr()</a>
+
+<a name='SkPixmap_writable_addr8'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint8_t* <a href='#SkPixmap_writable_addr8'>writable_addr8</a>(int x, int y)const
+</pre>
+
+Returns writable <a href='undocumented#Pixel'>pixel</a> address at (<a href='#SkPixmap_writable_addr8_x'>x</a>, <a href='#SkPixmap_writable_addr8_y'>y</a>). Result is addressable as unsigned
+8-bit bytes. Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>
+or <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, and is built with SK_DEBUG defined.
+
+One byte corresponds to one <a href='undocumented#Pixel'>pixel</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_writable_addr8_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_writable_addr8_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+writable unsigned 8-bit pointer to pixels
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_writable_addr8"><div>Altering pixels after drawing <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> is not guaranteed to affect subsequent
+drawing on all platforms. Adding a second <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_installPixels'>installPixels</a> after editing
+<a href='undocumented#Pixel'>pixel</a> memory is safer.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addr16'>writable_addr16</a> <a href='#SkPixmap_writable_addr32'>writable_addr32</a> <a href='#SkPixmap_writable_addr64'>writable_addr64</a> <a href='#SkPixmap_writable_addrF16'>writable_addrF16</a> <a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addr8'>addr8</a>
+
+<a name='SkPixmap_writable_addr16'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint16_t* <a href='#SkPixmap_writable_addr16'>writable_addr16</a>(int x, int y)const
+</pre>
+
+Returns <a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='undocumented#Pixel'>pixel</a> address at (<a href='#SkPixmap_writable_addr16_x'>x</a>, <a href='#SkPixmap_writable_addr16_y'>y</a>). Result is addressable as unsigned
+16-bit words. Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>
+or <a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, and is built with SK_DEBUG defined.
+
+One word corresponds to one <a href='undocumented#Pixel'>pixel</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_writable_addr16_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_writable_addr16_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+writable unsigned 16-bit pointer to <a href='undocumented#Pixel'>pixel</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_writable_addr16"><div>Draw a five by five <a href='SkBitmap_Reference#Bitmap'>bitmap</a>, and draw it again with a center black <a href='undocumented#Pixel'>pixel</a>.
+The low nibble of the 16-bit word is <a href='SkColor_Reference#Alpha'>Alpha</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addr8'>writable_addr8</a> <a href='#SkPixmap_writable_addr32'>writable_addr32</a> <a href='#SkPixmap_writable_addr64'>writable_addr64</a> <a href='#SkPixmap_writable_addrF16'>writable_addrF16</a> <a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addr16'>addr16</a>
+
+<a name='SkPixmap_writable_addr32'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint32_t* <a href='#SkPixmap_writable_addr32'>writable_addr32</a>(int x, int y)const
+</pre>
+
+Returns writable <a href='undocumented#Pixel'>pixel</a> address at (<a href='#SkPixmap_writable_addr32_x'>x</a>, <a href='#SkPixmap_writable_addr32_y'>y</a>). Result is addressable as unsigned
+32-bit words. Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not
+<a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a> or <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>, and is built with SK_DEBUG
+defined.
+
+One word corresponds to one <a href='undocumented#Pixel'>pixel</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_writable_addr32_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_writable_addr32_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+writable unsigned 32-bit pointer to <a href='undocumented#Pixel'>pixel</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_writable_addr32"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addr8'>writable_addr8</a> <a href='#SkPixmap_writable_addr16'>writable_addr16</a> <a href='#SkPixmap_writable_addr64'>writable_addr64</a> <a href='#SkPixmap_writable_addrF16'>writable_addrF16</a> <a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addr32'>addr32</a>
+
+<a name='SkPixmap_writable_addr64'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint64_t* <a href='#SkPixmap_writable_addr64'>writable_addr64</a>(int x, int y)const
+</pre>
+
+Returns writable <a href='undocumented#Pixel'>pixel</a> address at (<a href='#SkPixmap_writable_addr64_x'>x</a>, <a href='#SkPixmap_writable_addr64_y'>y</a>). Result is addressable as unsigned
+64-bit words. Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not
+<a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a> and is built with SK_DEBUG defined.
+
+One word corresponds to one <a href='undocumented#Pixel'>pixel</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_writable_addr64_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_writable_addr64_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+writable unsigned 64-bit pointer to <a href='undocumented#Pixel'>pixel</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_writable_addr64"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addr8'>writable_addr8</a> <a href='#SkPixmap_writable_addr16'>writable_addr16</a> <a href='#SkPixmap_writable_addr32'>writable_addr32</a> <a href='#SkPixmap_writable_addrF16'>writable_addrF16</a> <a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addr64'>addr64</a>
+
+<a name='SkPixmap_writable_addrF16'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint16_t* <a href='#SkPixmap_writable_addrF16'>writable_addrF16</a>(int x, int y)const
+</pre>
+
+Returns writable <a href='undocumented#Pixel'>pixel</a> address at (<a href='#SkPixmap_writable_addrF16_x'>x</a>, <a href='#SkPixmap_writable_addrF16_y'>y</a>). Result is addressable as unsigned
+16-bit words. Will trigger an assert() if <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> is not
+<a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a> and is built with SK_DEBUG defined.
+
+Each word represents one <a href='SkColor_Reference#Color'>color</a> component encoded as a half float.
+Four words correspond to one <a href='undocumented#Pixel'>pixel</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_writable_addrF16_x'><code><strong>x</strong></code></a></td>
+    <td>column index, zero or greater, and less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_writable_addrF16_y'><code><strong>y</strong></code></a></td>
+    <td>row index, zero or greater, and less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+writable unsigned 16-bit pointer to first component of <a href='undocumented#Pixel'>pixel</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_writable_addrF16"><div>Left <a href='SkBitmap_Reference#Bitmap'>bitmap</a> is drawn with two pixels defined in half float format. Right <a href='SkBitmap_Reference#Bitmap'>bitmap</a>
+is drawn after overwriting bottom half float <a href='SkColor_Reference#Color'>color</a> with top half float <a href='SkColor_Reference#Color'>color</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_writable_addr'>writable_addr</a> <a href='#SkPixmap_writable_addr8'>writable_addr8</a> <a href='#SkPixmap_writable_addr16'>writable_addr16</a> <a href='#SkPixmap_writable_addr32'>writable_addr32</a> <a href='#SkPixmap_writable_addr64'>writable_addr64</a> <a href='#SkPixmap_addr'>addr()</a> <a href='#SkPixmap_addrF16'>addrF16</a>
+
+<a name='Pixels'></a>
+
+<a name='SkPixmap_readPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPixmap_readPixels'>readPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& dstInfo, void* dstPixels, size_t dstRowBytes)const
+</pre>
+
+Copies a <a href='SkRect_Reference#SkRect'>SkRect</a> of pixels to <a href='#SkPixmap_readPixels_dstPixels'>dstPixels</a>. Copy starts at (0, 0), and does not
+exceed <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> (<a href='#SkPixmap_width'>width()</a>, <a href='#SkPixmap_height'>height()</a>).
+
+<a href='#SkPixmap_readPixels_dstInfo'>dstInfo</a> specifies width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, and
+<a href='undocumented#SkColorSpace'>SkColorSpace</a> of destination. <a href='#SkPixmap_readPixels_dstRowBytes'>dstRowBytes</a> specifics the gap from one destination
+row to the next. Returns true if pixels are copied. Returns false if
+<a href='#SkPixmap_readPixels_dstInfo'>dstInfo</a> address equals nullptr, or <a href='#SkPixmap_readPixels_dstRowBytes'>dstRowBytes</a> is less than <a href='#SkPixmap_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>().
+
+Pixels are copied only if <a href='undocumented#Pixel'>pixel</a> conversion is possible. If <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> <a href='#SkPixmap_colorType'>colorType</a>() is
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, or <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>; <a href='#SkPixmap_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorType'>colorType</a>() must match.
+If <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> <a href='#SkPixmap_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='#SkPixmap_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorSpace'>colorSpace</a>() must match.
+If <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> <a href='#SkPixmap_alphaType'>alphaType</a>() is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='#SkPixmap_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>() must
+match. If <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> <a href='#SkPixmap_colorSpace'>colorSpace</a>() is nullptr, <a href='#SkPixmap_readPixels_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorSpace'>colorSpace</a>() must match. Returns
+false if <a href='undocumented#Pixel'>pixel</a> conversion is not possible.
+
+Returns false if <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> <a href='#SkPixmap_width'>width()</a> or <a href='#SkPixmap_height'>height()</a> is zero or negative.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_readPixels_dstInfo'><code><strong>dstInfo</strong></code></a></td>
+    <td>destination width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_readPixels_dstPixels'><code><strong>dstPixels</strong></code></a></td>
+    <td>destination  <a href='undocumented#Pixel_Storage'>pixel storage</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_readPixels_dstRowBytes'><code><strong>dstRowBytes</strong></code></a></td>
+    <td>destination row length</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels are copied to <a href='#SkPixmap_readPixels_dstPixels'>dstPixels</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_readPixels"><div>Transferring the gradient from 8 bits per component to 4 bits per component
+creates visible banding.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_erase'>erase</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_readPixels'>readPixels</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_readPixels'>readPixels</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_readPixels'>readPixels</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_readPixels'>readPixels</a>
+
+<a name='SkPixmap_readPixels_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPixmap_readPixels'>readPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& dstInfo, void* dstPixels, size_t dstRowBytes, int srcX, int srcY)const
+</pre>
+
+Copies a <a href='SkRect_Reference#Rect'>Rect</a> of pixels to <a href='#SkPixmap_readPixels_2_dstPixels'>dstPixels</a>. Copy starts at (<a href='#SkPixmap_readPixels_2_srcX'>srcX</a>, <a href='#SkPixmap_readPixels_2_srcY'>srcY</a>), and does not
+exceed <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> (<a href='#SkPixmap_width'>width()</a>, <a href='#SkPixmap_height'>height()</a>).
+
+<a href='#SkPixmap_readPixels_2_dstInfo'>dstInfo</a> specifies width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>, <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, and
+<a href='#Color_Space'>Color_Space</a> of destination. <a href='#SkPixmap_readPixels_2_dstRowBytes'>dstRowBytes</a> specifics the gap from one destination
+row to the next. Returns true if pixels are copied. Returns false if
+<a href='#SkPixmap_readPixels_2_dstInfo'>dstInfo</a> has no address, or <a href='#SkPixmap_readPixels_2_dstRowBytes'>dstRowBytes</a> is less than <a href='#SkPixmap_readPixels_2_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>().
+
+Pixels are copied only if <a href='undocumented#Pixel'>pixel</a> conversion is possible. If <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> <a href='#SkPixmap_colorType'>colorType</a> is
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, or <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>; <a href='#SkPixmap_readPixels_2_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorType'>colorType</a>() must match.
+If <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> <a href='#SkPixmap_colorType'>colorType</a> is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='#SkPixmap_readPixels_2_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorSpace'>colorSpace</a>() must match.
+If <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> <a href='#SkPixmap_alphaType'>alphaType</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='#SkPixmap_readPixels_2_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>() must
+match. If <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> <a href='#SkPixmap_colorSpace'>colorSpace</a> is nullptr, <a href='#SkPixmap_readPixels_2_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorSpace'>colorSpace</a>() must match. Returns
+false if <a href='undocumented#Pixel'>pixel</a> conversion is not possible.
+
+<a href='#SkPixmap_readPixels_2_srcX'>srcX</a> and <a href='#SkPixmap_readPixels_2_srcY'>srcY</a> may be negative to copy only top or left of source. Returns
+false if <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> <a href='#SkPixmap_width'>width()</a> or <a href='#SkPixmap_height'>height()</a> is zero or negative. Returns false if:
+
+<code><a href='undocumented#abs()'>abs</a>(<a href='#SkPixmap_readPixels_2_srcX'>srcX</a>) >= <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> <a href='#SkPixmap_width'>width()</a></code>, or if <code><a href='undocumented#abs()'>abs</a>(<a href='#SkPixmap_readPixels_2_srcY'>srcY</a>) >= <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> <a href='#SkPixmap_height'>height()</a></code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_readPixels_2_dstInfo'><code><strong>dstInfo</strong></code></a></td>
+    <td>destination width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>, <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, <a href='#Color_Space'>Color_Space</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_readPixels_2_dstPixels'><code><strong>dstPixels</strong></code></a></td>
+    <td>destination  <a href='undocumented#Pixel_Storage'>pixel storage</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_readPixels_2_dstRowBytes'><code><strong>dstRowBytes</strong></code></a></td>
+    <td>destination row length</td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_readPixels_2_srcX'><code><strong>srcX</strong></code></a></td>
+    <td>column index whose absolute value is less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_readPixels_2_srcY'><code><strong>srcY</strong></code></a></td>
+    <td>row index whose absolute value is less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels are copied to <a href='#SkPixmap_readPixels_2_dstPixels'>dstPixels</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_readPixels_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_erase'>erase</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_readPixels'>readPixels</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_readPixels'>readPixels</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_readPixels'>readPixels</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_readPixels'>readPixels</a>
+
+<a name='SkPixmap_readPixels_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPixmap_readPixels'>readPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst, int srcX, int srcY)const
+</pre>
+
+Copies a <a href='SkRect_Reference#Rect'>Rect</a> of pixels to <a href='#SkPixmap_readPixels_3_dst'>dst</a>. Copy starts at (<a href='#SkPixmap_readPixels_3_srcX'>srcX</a>, <a href='#SkPixmap_readPixels_3_srcY'>srcY</a>), and does not
+exceed <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> (<a href='#SkPixmap_width'>width()</a>, <a href='#SkPixmap_height'>height()</a>). <a href='#SkPixmap_readPixels_3_dst'>dst</a> specifies width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>,
+<a href='#Image_Info_Alpha_Type'>Alpha_Type</a>, and <a href='#Color_Space'>Color_Space</a> of destination.  Returns true if pixels are copied.
+Returns false if <a href='#SkPixmap_readPixels_3_dst'>dst</a>.<a href='#SkPixmap_addr'>addr()</a> equals nullptr, or <a href='#SkPixmap_readPixels_3_dst'>dst</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() is less than
+<a href='#SkPixmap_readPixels_3_dst'>dst</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>.
+
+Pixels are copied only if <a href='undocumented#Pixel'>pixel</a> conversion is possible. If <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> <a href='#SkPixmap_colorType'>colorType</a> is
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, or <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>; <a href='#SkPixmap_readPixels_3_dst'>dst</a>.<a href='#SkPixmap_info'>info()</a>.<a href='#SkImageInfo_colorType'>colorType</a>() must match.
+If <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> <a href='#SkPixmap_colorType'>colorType</a> is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='#SkPixmap_readPixels_3_dst'>dst</a>.<a href='#SkPixmap_info'>info()</a>.<a href='#SkImageInfo_colorSpace'>colorSpace</a>() must match.
+If <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> <a href='#SkPixmap_alphaType'>alphaType</a> is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='#SkPixmap_readPixels_3_dst'>dst</a>.<a href='#SkPixmap_info'>info()</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>() must
+match. If <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> <a href='#SkPixmap_colorSpace'>colorSpace</a> is nullptr, <a href='#SkPixmap_readPixels_3_dst'>dst</a>.<a href='#SkPixmap_info'>info()</a>.<a href='#SkImageInfo_colorSpace'>colorSpace</a>() must match. Returns
+false if <a href='undocumented#Pixel'>pixel</a> conversion is not possible.
+
+<a href='#SkPixmap_readPixels_3_srcX'>srcX</a> and <a href='#SkPixmap_readPixels_3_srcY'>srcY</a> may be negative to copy only top or left of source. Returns
+false <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> <a href='#SkPixmap_width'>width()</a> or <a href='#SkPixmap_height'>height()</a> is zero or negative. Returns false if:
+
+<code><a href='undocumented#abs()'>abs</a>(<a href='#SkPixmap_readPixels_3_srcX'>srcX</a>) >= <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> <a href='#SkPixmap_width'>width()</a></code>, or if <code><a href='undocumented#abs()'>abs</a>(<a href='#SkPixmap_readPixels_3_srcY'>srcY</a>) >= <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> <a href='#SkPixmap_height'>height()</a></code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_readPixels_3_dst'><code><strong>dst</strong></code></a></td>
+    <td><a href='#Image_Info'>Image_Info</a> and <a href='undocumented#Pixel'>pixel</a> address to write to</td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_readPixels_3_srcX'><code><strong>srcX</strong></code></a></td>
+    <td>column index whose absolute value is less than <a href='#SkPixmap_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_readPixels_3_srcY'><code><strong>srcY</strong></code></a></td>
+    <td>row index whose absolute value is less than <a href='#SkPixmap_height'>height()</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels are copied to <a href='#SkPixmap_readPixels_3_dst'>dst</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_readPixels_3"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_erase'>erase</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_readPixels'>readPixels</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_readPixels'>readPixels</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_readPixels'>readPixels</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_readPixels'>readPixels</a>
+
+<a name='SkPixmap_readPixels_4'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPixmap_readPixels'>readPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst)const
+</pre>
+
+Copies pixels inside <a href='#SkPixmap_bounds'>bounds()</a> to <a href='#SkPixmap_readPixels_4_dst'>dst</a>. <a href='#SkPixmap_readPixels_4_dst'>dst</a> specifies width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>,
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, and <a href='undocumented#SkColorSpace'>SkColorSpace</a> of destination.  Returns true if pixels are copied.
+Returns false if <a href='#SkPixmap_readPixels_4_dst'>dst</a> address equals nullptr, or <a href='#SkPixmap_readPixels_4_dst'>dst</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() is less than
+<a href='#SkPixmap_readPixels_4_dst'>dst</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>.
+
+Pixels are copied only if <a href='undocumented#Pixel'>pixel</a> conversion is possible. If <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> <a href='#SkPixmap_colorType'>colorType</a>() is
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, or <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>; <a href='#SkPixmap_readPixels_4_dst'>dst</a> <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> must match.
+If <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> <a href='#SkPixmap_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='#SkPixmap_readPixels_4_dst'>dst</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a> must match.
+If <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> <a href='#SkPixmap_alphaType'>alphaType</a>() is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='#SkPixmap_readPixels_4_dst'>dst</a> <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> must
+match. If <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> <a href='#SkPixmap_colorSpace'>colorSpace</a>() is nullptr, <a href='#SkPixmap_readPixels_4_dst'>dst</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a> must match. Returns
+false if <a href='undocumented#Pixel'>pixel</a> conversion is not possible.
+
+Returns false if <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> <a href='#SkPixmap_width'>width()</a> or <a href='#SkPixmap_height'>height()</a> is zero or negative.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_readPixels_4_dst'><code><strong>dst</strong></code></a></td>
+    <td><a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> and <a href='undocumented#Pixel'>pixel</a> address to write to</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels are copied to <a href='#SkPixmap_readPixels_4_dst'>dst</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_readPixels_4"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPixmap_erase'>erase</a> <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_readPixels'>readPixels</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_readPixels'>readPixels</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_readPixels'>readPixels</a> <a href='SkSurface_Reference#SkSurface'>SkSurface</a>::<a href='#SkSurface_readPixels'>readPixels</a>
+
+<a name='SkPixmap_scalePixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPixmap_scalePixels'>scalePixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst, <a href='undocumented#SkFilterQuality'>SkFilterQuality</a> filterQuality)const
+</pre>
+
+Copies <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> to <a href='#SkPixmap_scalePixels_dst'>dst</a>, scaling pixels to fit <a href='#SkPixmap_scalePixels_dst'>dst</a>.<a href='#SkPixmap_width'>width()</a> and <a href='#SkPixmap_scalePixels_dst'>dst</a>.<a href='#SkPixmap_height'>height()</a>, and
+converting pixels to match <a href='#SkPixmap_scalePixels_dst'>dst</a>.<a href='#SkPixmap_colorType'>colorType</a>() and <a href='#SkPixmap_scalePixels_dst'>dst</a>.<a href='#SkPixmap_alphaType'>alphaType</a>(). Returns true if
+pixels are copied. Returns false if <a href='#SkPixmap_scalePixels_dst'>dst</a> address is nullptr, or <a href='#SkPixmap_scalePixels_dst'>dst</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() is
+less than <a href='#SkPixmap_scalePixels_dst'>dst</a> <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>::<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>.
+
+Pixels are copied only if <a href='undocumented#Pixel'>pixel</a> conversion is possible. If <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> <a href='#SkPixmap_colorType'>colorType</a>() is
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, or <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>; <a href='#SkPixmap_scalePixels_dst'>dst</a> <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> must match.
+If <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> <a href='#SkPixmap_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='#SkPixmap_scalePixels_dst'>dst</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a> must match.
+If <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> <a href='#SkPixmap_alphaType'>alphaType</a>() is <a href='SkImageInfo_Reference#kOpaque_SkAlphaType'>kOpaque_SkAlphaType</a>, <a href='#SkPixmap_scalePixels_dst'>dst</a> <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> must
+match. If <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> <a href='#SkPixmap_colorSpace'>colorSpace</a>() is nullptr, <a href='#SkPixmap_scalePixels_dst'>dst</a> <a href='undocumented#SkColorSpace'>SkColorSpace</a> must match. Returns
+false if <a href='undocumented#Pixel'>pixel</a> conversion is not possible.
+
+Returns false if <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a> <a href='#SkPixmap_width'>width()</a> or <a href='#SkPixmap_height'>height()</a> is zero or negative.
+
+Scales the <a href='SkImage_Reference#Image'>image</a>, with <a href='#SkPixmap_scalePixels_filterQuality'>filterQuality</a>, to match <a href='#SkPixmap_scalePixels_dst'>dst</a>.<a href='#SkPixmap_width'>width()</a> and <a href='#SkPixmap_scalePixels_dst'>dst</a>.<a href='#SkPixmap_height'>height()</a>.
+<a href='#SkPixmap_scalePixels_filterQuality'>filterQuality</a> <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a> is fastest, typically implemented with
+<a href='undocumented#Nearest_Neighbor'>nearest neighbor filter</a>. <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> is typically implemented with
+<a href='undocumented#Bilerp'>bilerp filter</a>. <a href='undocumented#kMedium_SkFilterQuality'>kMedium_SkFilterQuality</a> is typically implemented with
+<a href='undocumented#Bilerp'>bilerp filter</a>, and  <a href='undocumented#MipMap'>mip-map filter</a> when <a href='undocumented#Size'>size</a> is reduced.
+<a href='undocumented#kHigh_SkFilterQuality'>kHigh_SkFilterQuality</a> is slowest, typically implemented with  <a href='undocumented#BiCubic'>bicubic filter</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_scalePixels_dst'><code><strong>dst</strong></code></a></td>
+    <td><a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> and <a href='undocumented#Pixel'>pixel</a> address to write to</td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_scalePixels_filterQuality'><code><strong>filterQuality</strong></code></a></td>
+    <td>one of: <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a>,</td>
+  </tr>
+</table>
+
+<a href='undocumented#kMedium_SkFilterQuality'>kMedium_SkFilterQuality</a>, <a href='undocumented#kHigh_SkFilterQuality'>kHigh_SkFilterQuality</a>
+
+### Return Value
+
+true if pixels are scaled to fit <a href='#SkPixmap_scalePixels_dst'>dst</a>
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_scalePixels"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawBitmap'>drawBitmap</a> <a href='SkImage_Reference#SkImage'>SkImage</a>::<a href='#SkImage_scalePixels'>scalePixels</a>
+
+<a name='SkPixmap_erase'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPixmap_erase'>erase</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#Color'>color</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& subset)const
+</pre>
+
+Writes <a href='#SkPixmap_erase_color'>color</a> to pixels bounded by <a href='#SkPixmap_erase_subset'>subset</a>; returns true on success.
+Returns false if <a href='#SkPixmap_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, or if <a href='#SkPixmap_erase_subset'>subset</a> does
+not intersect <a href='#SkPixmap_bounds'>bounds()</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_erase_color'><code><strong>color</strong></code></a></td>
+    <td><a href='undocumented#Unpremultiply'>unpremultiplied</a> <a href='#SkPixmap_erase_color'>color</a> to write</td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_erase_subset'><code><strong>subset</strong></code></a></td>
+    <td>bounding integer <a href='SkRect_Reference#SkRect'>SkRect</a> of written pixels</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels are changed
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_erase"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_erase'>erase</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_clear'>clear</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawColor'>drawColor</a>
+
+<a name='SkPixmap_erase_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPixmap_erase'>erase</a>(<a href='SkColor_Reference#SkColor'>SkColor</a> <a href='SkColor_Reference#Color'>color</a>)const
+</pre>
+
+Writes <a href='#SkPixmap_erase_2_color'>color</a> to pixels inside <a href='#SkPixmap_bounds'>bounds()</a>; returns true on success.
+Returns false if <a href='#SkPixmap_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, or if <a href='#SkPixmap_bounds'>bounds()</a>
+is empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_erase_2_color'><code><strong>color</strong></code></a></td>
+    <td><a href='undocumented#Unpremultiply'>unpremultiplied</a> <a href='#SkPixmap_erase_2_color'>color</a> to write</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels are changed
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_erase_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_erase'>erase</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_clear'>clear</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawColor'>drawColor</a>
+
+<a name='SkPixmap_erase_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPixmap_erase'>erase</a>(const <a href='SkColor4f_Reference#SkColor4f'>SkColor4f</a>& <a href='SkColor_Reference#Color'>color</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>* subset = nullptr)const
+</pre>
+
+Writes <a href='#SkPixmap_erase_3_color'>color</a> to pixels bounded by <a href='#SkPixmap_erase_3_subset'>subset</a>; returns true on success.
+if <a href='#SkPixmap_erase_3_subset'>subset</a> is nullptr, writes colors pixels inside <a href='#SkPixmap_bounds'>bounds()</a>. Returns false if
+<a href='#SkPixmap_colorType'>colorType</a>() is <a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, if <a href='#SkPixmap_erase_3_subset'>subset</a> is not nullptr and does
+not intersect <a href='#SkPixmap_bounds'>bounds()</a>, or if <a href='#SkPixmap_erase_3_subset'>subset</a> is nullptr and <a href='#SkPixmap_bounds'>bounds()</a> is empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPixmap_erase_3_color'><code><strong>color</strong></code></a></td>
+    <td><a href='undocumented#Unpremultiply'>unpremultiplied</a> <a href='#SkPixmap_erase_3_color'>color</a> to write</td>
+  </tr>
+  <tr>    <td><a name='SkPixmap_erase_3_subset'><code><strong>subset</strong></code></a></td>
+    <td>bounding integer <a href='SkRect_Reference#SkRect'>SkRect</a> of pixels to write; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels are changed
+
+### Example
+
+<div><fiddle-embed name="@Pixmap_erase_3"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>::<a href='#SkBitmap_erase'>erase</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_clear'>clear</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawColor'>drawColor</a>
+
diff --git a/src/third_party/skia/site/user/api/SkPoint_Reference.md b/src/third_party/skia/site/user/api/SkPoint_Reference.md
new file mode 100644
index 0000000..2377e54
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkPoint_Reference.md
@@ -0,0 +1,1330 @@
+SkPoint Reference
+===
+
+
+<a name='SkPoint'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+struct <a href='SkPoint_Reference#SkPoint'>SkPoint</a> {
+
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_fX'>fX</a>;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_fY'>fY</a>;
+
+    static constexpr <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPoint_Make'>Make</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y);
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_x'>x()</a> const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_y'>y()</a> const;
+    bool <a href='#SkPoint_isZero'>isZero</a>() const;
+    void <a href='#SkPoint_set'>set</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y);
+    void <a href='#SkPoint_iset'>iset</a>(int32_t x, int32_t y);
+    void <a href='#SkPoint_iset'>iset</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& p);
+    void <a href='#SkPoint_setAbs'>setAbs</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& pt);
+    static void <a href='#SkPoint_Offset'>Offset</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='SkPoint_Reference#Point'>points</a>[], int count, const <a href='SkPoint_Reference#SkVector'>SkVector</a>& offset);
+    static void <a href='#SkPoint_Offset'>Offset</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='SkPoint_Reference#Point'>points</a>[], int count, <a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    void <a href='#SkPoint_offset'>offset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_length'>length()</a> const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_distanceToOrigin'>distanceToOrigin</a>() const;
+    bool <a href='#SkPoint_normalize'>normalize()</a>;
+    bool <a href='#SkPoint_setNormalize'>setNormalize</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y);
+    bool <a href='#SkPoint_setLength'>setLength</a>(<a href='undocumented#SkScalar'>SkScalar</a> length);
+    bool <a href='#SkPoint_setLength'>setLength</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, <a href='undocumented#SkScalar'>SkScalar</a> length);
+    void <a href='#SkPoint_scale'>scale</a>(<a href='undocumented#SkScalar'>SkScalar</a> scale, <a href='SkPoint_Reference#SkPoint'>SkPoint</a>* dst) const;
+    void <a href='#SkPoint_scale'>scale</a>(<a href='undocumented#SkScalar'>SkScalar</a> value);
+    void <a href='#SkPoint_negate'>negate()</a>;
+    <a href='SkPoint_Reference#SkPoint'>SkPoint</a> operator-() const;
+    void <a href='#SkPoint_addto_operator'>operator+=</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& v);
+    void <a href='#SkPoint_subtractfrom_operator'>operator-=</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& v);
+    <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPoint_multiply_operator'>operator*</a>(<a href='undocumented#SkScalar'>SkScalar</a> scale) const;
+    <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& <a href='#SkPoint_multiplyby_operator'>operator*=</a>(<a href='undocumented#SkScalar'>SkScalar</a> scale);
+    bool <a href='#SkPoint_isFinite'>isFinite</a>() const;
+    bool <a href='#SkPoint_equals'>equals</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y) const;
+    friend bool <a href='#SkPoint_equal_operator'>operator==</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& a, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& b);
+    friend bool <a href='#SkPoint_notequal_operator'>operator!=</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& a, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& b);
+    friend <a href='SkPoint_Reference#SkVector'>SkVector</a> <a href='#SkPoint_subtract_operator'>operator-</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& a, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& b);
+    friend <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPoint_add_operator'>operator+</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& a, const <a href='SkPoint_Reference#SkVector'>SkVector</a>& b);
+    static <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_Length'>Length</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y);
+    static <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_Normalize'>Normalize</a>(<a href='SkPoint_Reference#SkVector'>SkVector</a>* vec);
+    static <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_Distance'>Distance</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& a, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& b);
+    static <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_DotProduct'>DotProduct</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& a, const <a href='SkPoint_Reference#SkVector'>SkVector</a>& b);
+    static <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_CrossProduct'>CrossProduct</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& a, const <a href='SkPoint_Reference#SkVector'>SkVector</a>& b);
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_cross'>cross</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& vec) const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_dot'>dot</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& vec) const;
+};
+
+</pre>
+
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a> holds two 32-bit floating <a href='SkPoint_Reference#Point'>point</a> coordinates.<table style='border-collapse: collapse; width: 62.5em'>
+
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Type</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Member</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPoint_fX'><code>fX</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+x-axis value used by both <a href='SkPoint_Reference#Point'>Point</a> and <a href='SkPoint_Reference#Vector'>Vector</a>. May contain any value, including
+infinities and NaN.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPoint_fY'><code>fY</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+y-axis value used by both <a href='SkPoint_Reference#Point'>Point</a> and <a href='SkPoint_Reference#Vector'>Vector</a>. May contain any value, including
+infinities and NaN.
+</td>
+  </tr>
+</table>
+
+<a name='SkPoint_Make'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static constexpr <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPoint_Make'>Make</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y)
+</pre>
+
+Sets <a href='#SkPoint_fX'>fX</a> to <a href='#SkPoint_Make_x'>x</a>, <a href='#SkPoint_fY'>fY</a> to <a href='#SkPoint_Make_y'>y</a>. Used both to set <a href='SkPoint_Reference#SkPoint'>SkPoint</a> and <a href='SkPoint_Reference#Vector'>vector</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_Make_x'><code><strong>x</strong></code></a></td>
+    <td><a href='undocumented#SkScalar'>SkScalar</a> x-axis value of constructed <a href='SkPoint_Reference#SkPoint'>SkPoint</a> or <a href='SkPoint_Reference#Vector'>vector</a></td>
+  </tr>
+  <tr>    <td><a name='SkPoint_Make_y'><code><strong>y</strong></code></a></td>
+    <td><a href='undocumented#SkScalar'>SkScalar</a> y-axis value of constructed <a href='SkPoint_Reference#SkPoint'>SkPoint</a> or <a href='SkPoint_Reference#Vector'>vector</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a> (<a href='#SkPoint_Make_x'>x</a>, <a href='#SkPoint_Make_y'>y</a>)
+
+### Example
+
+<div><fiddle-embed name="@Point_Make">
+
+#### Example Output
+
+~~~~
+all equal
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_set'>set()</a> <a href='#SkPoint_iset'>iset()</a> <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>::<a href='#SkIPoint_Make'>Make</a>
+
+<a name='Property'></a>
+
+<a name='SkPoint_x'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_x'>x()</a>const
+</pre>
+
+Returns x-axis value of <a href='SkPoint_Reference#SkPoint'>SkPoint</a> or <a href='SkPoint_Reference#Vector'>vector</a>.
+
+### Return Value
+
+<a href='#SkPoint_fX'>fX</a>
+
+### Example
+
+<div><fiddle-embed name="@Point_x">
+
+#### Example Output
+
+~~~~
+pt1.fX == pt1.x()
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_y'>y()</a> <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>::<a href='#SkIPoint_x'>x()</a>
+
+<a name='SkPoint_y'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_y'>y()</a>const
+</pre>
+
+Returns y-axis value of <a href='SkPoint_Reference#SkPoint'>SkPoint</a> or <a href='SkPoint_Reference#Vector'>vector</a>.
+
+### Return Value
+
+<a href='#SkPoint_fY'>fY</a>
+
+### Example
+
+<div><fiddle-embed name="@Point_y">
+
+#### Example Output
+
+~~~~
+pt1.fY == pt1.y()
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_x'>x()</a> <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>::<a href='#SkIPoint_y'>y()</a>
+
+<a name='SkPoint_isZero'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPoint_isZero'>isZero</a>()const
+</pre>
+
+Returns true if <a href='#SkPoint_fX'>fX</a> and <a href='#SkPoint_fY'>fY</a> are both zero.
+
+### Return Value
+
+true if <a href='#SkPoint_fX'>fX</a> is zero and <a href='#SkPoint_fY'>fY</a> is zero
+
+### Example
+
+<div><fiddle-embed name="@Point_isZero">
+
+#### Example Output
+
+~~~~
+pt.fX=+0 pt.fY=-0
+pt.isZero() == true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_isFinite'>isFinite</a> <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>::<a href='#SkIPoint_isZero'>isZero</a>
+
+<a name='Set'></a>
+
+<a name='SkPoint_set'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void set(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y)
+</pre>
+
+Sets <a href='#SkPoint_fX'>fX</a> to <a href='#SkPoint_set_x'>x</a> and <a href='#SkPoint_fY'>fY</a> to <a href='#SkPoint_set_y'>y</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_set_x'><code><strong>x</strong></code></a></td>
+    <td>new value for <a href='#SkPoint_fX'>fX</a></td>
+  </tr>
+  <tr>    <td><a name='SkPoint_set_y'><code><strong>y</strong></code></a></td>
+    <td>new value for <a href='#SkPoint_fY'>fY</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Point_set">
+
+#### Example Output
+
+~~~~
+pt1 == pt2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_iset'>iset()</a> <a href='#SkPoint_Make'>Make</a>
+
+<a name='SkPoint_iset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPoint_iset'>iset</a>(int32_t x, int32_t y)
+</pre>
+
+Sets <a href='#SkPoint_fX'>fX</a> to <a href='#SkPoint_iset_x'>x</a> and <a href='#SkPoint_fY'>fY</a> to <a href='#SkPoint_iset_y'>y</a>, promoting integers to <a href='undocumented#SkScalar'>SkScalar</a> values.
+
+Assigning a large integer value directly to <a href='#SkPoint_fX'>fX</a> or <a href='#SkPoint_fY'>fY</a> may cause a compiler
+error, triggered by narrowing conversion of int to <a href='undocumented#SkScalar'>SkScalar</a>. This safely
+casts <a href='#SkPoint_iset_x'>x</a> and <a href='#SkPoint_iset_y'>y</a> to avoid the error.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_iset_x'><code><strong>x</strong></code></a></td>
+    <td>new value for <a href='#SkPoint_fX'>fX</a></td>
+  </tr>
+  <tr>    <td><a name='SkPoint_iset_y'><code><strong>y</strong></code></a></td>
+    <td>new value for <a href='#SkPoint_fY'>fY</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Point_iset"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_set'>set</a> <a href='#SkPoint_Make'>Make</a> <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>::<a href='#SkIPoint_set'>set</a>
+
+<a name='SkPoint_iset_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPoint_iset'>iset</a>(const <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>& p)
+</pre>
+
+Sets <a href='#SkPoint_fX'>fX</a> to <a href='#SkPoint_iset_2_p'>p</a>.<a href='#SkIPoint_fX'>fX</a> and <a href='#SkPoint_fY'>fY</a> to <a href='#SkPoint_iset_2_p'>p</a>.<a href='#SkIPoint_fY'>fY</a>, promoting integers to <a href='undocumented#SkScalar'>SkScalar</a> values.
+
+Assigning an <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> containing a large integer value directly to <a href='#SkPoint_fX'>fX</a> or <a href='#SkPoint_fY'>fY</a> may
+cause a compiler error, triggered by narrowing conversion of int to <a href='undocumented#SkScalar'>SkScalar</a>.
+This safely casts <a href='#SkPoint_iset_2_p'>p</a>.<a href='#SkIPoint_fX'>fX</a> and <a href='#SkPoint_iset_2_p'>p</a>.<a href='#SkIPoint_fY'>fY</a> to avoid the error.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_iset_2_p'><code><strong>p</strong></code></a></td>
+    <td><a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> members promoted to <a href='undocumented#SkScalar'>SkScalar</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Point_iset_2">
+
+#### Example Output
+
+~~~~
+iPt: -2147483647, 2147483647
+fPt: -2.14748e+09, 2.14748e+09
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_set'>set</a> <a href='#SkPoint_Make'>Make</a> <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>::<a href='#SkIPoint_set'>set</a>
+
+<a name='SkPoint_setAbs'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPoint_setAbs'>setAbs</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& pt)
+</pre>
+
+Sets <a href='#SkPoint_fX'>fX</a> to absolute value of <a href='#SkPoint_setAbs_pt'>pt</a>.<a href='#SkPoint_fX'>fX</a>; and <a href='#SkPoint_fY'>fY</a> to absolute value of <a href='#SkPoint_setAbs_pt'>pt</a>.<a href='#SkPoint_fY'>fY</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_setAbs_pt'><code><strong>pt</strong></code></a></td>
+    <td>members providing magnitude for <a href='#SkPoint_fX'>fX</a> and <a href='#SkPoint_fY'>fY</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Point_setAbs">
+
+#### Example Output
+
+~~~~
+pt: 0, -0  abs: 0, 0
+pt: -1, -2  abs: 1, 2
+pt: inf, -inf  abs: inf, inf
+pt: nan, -nan  abs: nan, nan
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_set'>set</a> <a href='#SkPoint_Make'>Make</a> <a href='#SkPoint_negate'>negate</a>
+
+<a name='Offset'></a>
+
+<a name='SkPoint_Offset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static void <a href='#SkPoint_Offset'>Offset</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='SkPoint_Reference#Point'>points</a>[], int count, const <a href='SkPoint_Reference#SkVector'>SkVector</a>& offset)
+</pre>
+
+Adds <a href='#SkPoint_Offset_offset'>offset</a> to each <a href='SkPoint_Reference#SkPoint'>SkPoint</a> in <a href='#SkPoint_Offset_points'>points</a> array with <a href='#SkPoint_Offset_count'>count</a> entries.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_Offset_points'><code><strong>points</strong></code></a></td>
+    <td><a href='SkPath_Reference#Point_Array'>SkPoint array</a></td>
+  </tr>
+  <tr>    <td><a name='SkPoint_Offset_count'><code><strong>count</strong></code></a></td>
+    <td>entries in array</td>
+  </tr>
+  <tr>    <td><a name='SkPoint_Offset_offset'><code><strong>offset</strong></code></a></td>
+    <td><a href='SkPoint_Reference#Vector'>vector</a> added to <a href='#SkPoint_Offset_points'>points</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Point_Offset"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_Offset_offset'>offset</a> <a href='#SkPoint_addto_operator'>operator+=</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& v)
+
+<a name='SkPoint_Offset_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static void <a href='#SkPoint_Offset'>Offset</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='SkPoint_Reference#Point'>points</a>[], int count, <a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Adds offset (<a href='#SkPoint_Offset_2_dx'>dx</a>, <a href='#SkPoint_Offset_2_dy'>dy</a>) to each <a href='SkPoint_Reference#SkPoint'>SkPoint</a> in <a href='#SkPoint_Offset_2_points'>points</a> array of length <a href='#SkPoint_Offset_2_count'>count</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_Offset_2_points'><code><strong>points</strong></code></a></td>
+    <td><a href='SkPath_Reference#Point_Array'>SkPoint array</a></td>
+  </tr>
+  <tr>    <td><a name='SkPoint_Offset_2_count'><code><strong>count</strong></code></a></td>
+    <td>entries in array</td>
+  </tr>
+  <tr>    <td><a name='SkPoint_Offset_2_dx'><code><strong>dx</strong></code></a></td>
+    <td>added to <a href='#SkPoint_fX'>fX</a> in <a href='#SkPoint_Offset_2_points'>points</a></td>
+  </tr>
+  <tr>    <td><a name='SkPoint_Offset_2_dy'><code><strong>dy</strong></code></a></td>
+    <td>added to <a href='#SkPoint_fY'>fY</a> in <a href='#SkPoint_Offset_2_points'>points</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Point_Offset_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_offset'>offset</a> <a href='#SkPoint_addto_operator'>operator+=</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& v)
+
+<a name='SkPoint_offset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void offset(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Adds offset (<a href='#SkPoint_offset_dx'>dx</a>, <a href='#SkPoint_offset_dy'>dy</a>) to <a href='SkPoint_Reference#SkPoint'>SkPoint</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_offset_dx'><code><strong>dx</strong></code></a></td>
+    <td>added to <a href='#SkPoint_fX'>fX</a></td>
+  </tr>
+  <tr>    <td><a name='SkPoint_offset_dy'><code><strong>dy</strong></code></a></td>
+    <td>added to <a href='#SkPoint_fY'>fY</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Point_offset_3"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_Offset'>Offset</a> <a href='#SkPoint_addto_operator'>operator+=</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& v)
+
+<a name='SkPoint_length'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_length'>length()</a>const
+</pre>
+
+Returns the Euclidean distance from origin, computed as:
+
+<a href='undocumented#sqrt()'>sqrt</a>(<a href='#SkPoint_fX'>fX</a> * <a href='#SkPoint_fX'>fX</a> + <a href='#SkPoint_fY'>fY</a> * <a href='#SkPoint_fY'>fY</a>)
+
+.
+
+### Return Value
+
+straight-line distance to origin
+
+### Example
+
+<div><fiddle-embed name="8363ab179447ee4b827679e20d3d81eb"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_distanceToOrigin'>distanceToOrigin</a> <a href='#SkPoint_Length'>Length</a> <a href='#SkPoint_setLength'>setLength</a> <a href='#SkPoint_Distance'>Distance</a>
+
+<a name='SkPoint_distanceToOrigin'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_distanceToOrigin'>distanceToOrigin</a>()const
+</pre>
+
+Returns the Euclidean distance from origin, computed as:
+
+<a href='undocumented#sqrt()'>sqrt</a>(<a href='#SkPoint_fX'>fX</a> * <a href='#SkPoint_fX'>fX</a> + <a href='#SkPoint_fY'>fY</a> * <a href='#SkPoint_fY'>fY</a>)
+
+.
+
+### Return Value
+
+straight-line distance to origin
+
+### Example
+
+<div><fiddle-embed name="812cf26d91b1cdcd2c6b9438a8172518"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_length'>length</a> <a href='#SkPoint_Length'>Length</a> <a href='#SkPoint_setLength'>setLength</a> <a href='#SkPoint_Distance'>Distance</a>
+
+<a name='SkPoint_normalize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPoint_normalize'>normalize()</a>
+</pre>
+
+Scales (<a href='#SkPoint_fX'>fX</a>, <a href='#SkPoint_fY'>fY</a>) so that <a href='#SkPoint_length'>length()</a> returns one, while preserving ratio of <a href='#SkPoint_fX'>fX</a> to <a href='#SkPoint_fY'>fY</a>,
+if possible. If prior length is nearly zero, sets <a href='SkPoint_Reference#Vector'>vector</a> to (0, 0) and returns
+false; otherwise returns true.
+
+### Return Value
+
+true if former length is not zero or nearly zero
+
+### Example
+
+<div><fiddle-embed name="@Point_normalize_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_Normalize'>Normalize</a> <a href='#SkPoint_setLength'>setLength</a> <a href='#SkPoint_length'>length</a> <a href='#SkPoint_Length'>Length</a>
+
+<a name='SkPoint_setNormalize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPoint_setNormalize'>setNormalize</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y)
+</pre>
+
+Sets <a href='SkPoint_Reference#Vector'>vector</a> to (<a href='#SkPoint_setNormalize_x'>x</a>, <a href='#SkPoint_setNormalize_y'>y</a>) scaled so <a href='#SkPoint_length'>length()</a> returns one, and so that
+(<a href='#SkPoint_fX'>fX</a>, <a href='#SkPoint_fY'>fY</a>) is proportional to (<a href='#SkPoint_setNormalize_x'>x</a>, <a href='#SkPoint_setNormalize_y'>y</a>).  If (<a href='#SkPoint_setNormalize_x'>x</a>, <a href='#SkPoint_setNormalize_y'>y</a>) length is nearly zero,
+sets <a href='SkPoint_Reference#Vector'>vector</a> to (0, 0) and returns false; otherwise returns true.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_setNormalize_x'><code><strong>x</strong></code></a></td>
+    <td>proportional value for <a href='#SkPoint_fX'>fX</a></td>
+  </tr>
+  <tr>    <td><a name='SkPoint_setNormalize_y'><code><strong>y</strong></code></a></td>
+    <td>proportional value for <a href='#SkPoint_fY'>fY</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if (<a href='#SkPoint_setNormalize_x'>x</a>, <a href='#SkPoint_setNormalize_y'>y</a>) length is not zero or nearly zero
+
+### Example
+
+<div><fiddle-embed name="@Point_setNormalize"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_normalize'>normalize</a> <a href='#SkPoint_setLength'>setLength</a>
+
+<a name='SkPoint_setLength'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPoint_setLength'>setLength</a>(<a href='undocumented#SkScalar'>SkScalar</a> length)
+</pre>
+
+Scales <a href='SkPoint_Reference#Vector'>vector</a> so that <a href='#SkPoint_distanceToOrigin'>distanceToOrigin</a>() returns <a href='#SkPoint_setLength_length'>length</a>, if possible. If former
+<a href='#SkPoint_setLength_length'>length</a> is nearly zero, sets <a href='SkPoint_Reference#Vector'>vector</a> to (0, 0) and return false; otherwise returns
+true.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_setLength_length'><code><strong>length</strong></code></a></td>
+    <td>straight-line distance to origin</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if former <a href='#SkPoint_setLength_length'>length</a> is not zero or nearly zero
+
+### Example
+
+<div><fiddle-embed name="@Point_setLength"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_setLength_length'>length</a> <a href='#SkPoint_Length'>Length</a> <a href='#SkPoint_setNormalize'>setNormalize</a> <a href='#SkPoint_setAbs'>setAbs</a>
+
+<a name='SkPoint_setLength_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPoint_setLength'>setLength</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, <a href='undocumented#SkScalar'>SkScalar</a> length)
+</pre>
+
+Sets <a href='SkPoint_Reference#Vector'>vector</a> to (<a href='#SkPoint_setLength_2_x'>x</a>, <a href='#SkPoint_setLength_2_y'>y</a>) scaled to <a href='#SkPoint_setLength_2_length'>length</a>, if possible. If former
+<a href='#SkPoint_setLength_2_length'>length</a> is nearly zero, sets <a href='SkPoint_Reference#Vector'>vector</a> to (0, 0) and return false; otherwise returns
+true.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_setLength_2_x'><code><strong>x</strong></code></a></td>
+    <td>proportional value for <a href='#SkPoint_fX'>fX</a></td>
+  </tr>
+  <tr>    <td><a name='SkPoint_setLength_2_y'><code><strong>y</strong></code></a></td>
+    <td>proportional value for <a href='#SkPoint_fY'>fY</a></td>
+  </tr>
+  <tr>    <td><a name='SkPoint_setLength_2_length'><code><strong>length</strong></code></a></td>
+    <td>straight-line distance to origin</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if (<a href='#SkPoint_setLength_2_x'>x</a>, <a href='#SkPoint_setLength_2_y'>y</a>) <a href='#SkPoint_setLength_2_length'>length</a> is not zero or nearly zero
+
+### Example
+
+<div><fiddle-embed name="@Point_setLength_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_setLength_2_length'>length</a> <a href='#SkPoint_Length'>Length</a> <a href='#SkPoint_setNormalize'>setNormalize</a> <a href='#SkPoint_setAbs'>setAbs</a>
+
+<a name='SkPoint_scale'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void scale(<a href='undocumented#SkScalar'>SkScalar</a> scale, <a href='SkPoint_Reference#SkPoint'>SkPoint</a>* dst)const
+</pre>
+
+Sets <a href='#SkPoint_scale_dst'>dst</a> to <a href='SkPoint_Reference#SkPoint'>SkPoint</a> times <a href='#SkPoint_scale_scale'>scale</a>. <a href='#SkPoint_scale_dst'>dst</a> may be <a href='SkPoint_Reference#SkPoint'>SkPoint</a> to modify <a href='SkPoint_Reference#SkPoint'>SkPoint</a> in place.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_scale_scale'><code><strong>scale</strong></code></a></td>
+    <td>factor to multiply <a href='SkPoint_Reference#SkPoint'>SkPoint</a> by</td>
+  </tr>
+  <tr>    <td><a name='SkPoint_scale_dst'><code><strong>dst</strong></code></a></td>
+    <td>storage for scaled <a href='SkPoint_Reference#SkPoint'>SkPoint</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Point_scale"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_multiply_operator'>operator*</a>(<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_scale_scale'>scale</a>) const <a href='#SkPoint_multiplyby_operator'>operator*=</a>(<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_scale_scale'>scale</a>) <a href='#SkPoint_setLength'>setLength</a>
+
+<a name='SkPoint_scale_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void scale(<a href='undocumented#SkScalar'>SkScalar</a> value)
+</pre>
+
+Scales <a href='SkPoint_Reference#SkPoint'>SkPoint</a> in place by scale.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_scale_2_value'><code><strong>value</strong></code></a></td>
+    <td>factor to multiply <a href='SkPoint_Reference#SkPoint'>SkPoint</a> by</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Point_scale_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_multiply_operator'>operator*</a>(<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_scale'>scale</a>) const <a href='#SkPoint_multiplyby_operator'>operator*=</a>(<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_scale'>scale</a>) <a href='#SkPoint_setLength'>setLength</a>
+
+<a name='SkPoint_negate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPoint_negate'>negate()</a>
+</pre>
+
+Changes the sign of <a href='#SkPoint_fX'>fX</a> and <a href='#SkPoint_fY'>fY</a>.
+
+### Example
+
+<div><fiddle-embed name="@Point_negate">
+
+#### Example Output
+
+~~~~
+pt: 0, -0  negate: -0, 0
+pt: -1, -2  negate: 1, 2
+pt: inf, -inf  negate: -inf, inf
+pt: nan, -nan  negate: -nan, nan
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+operator-() const <a href='#SkPoint_setAbs'>setAbs</a>
+
+<a name='SkPoint_minus_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a> operator-()const
+</pre>
+
+Returns <a href='SkPoint_Reference#SkPoint'>SkPoint</a> changing the signs of <a href='#SkPoint_fX'>fX</a> and <a href='#SkPoint_fY'>fY</a>.
+
+### Return Value
+
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a> as (-<a href='#SkPoint_fX'>fX</a>, -<a href='#SkPoint_fY'>fY</a>)
+
+### Example
+
+<div><fiddle-embed name="@Point_minus_operator">
+
+#### Example Output
+
+~~~~
+pt: 0, -0  negate: -0, 0
+pt: -1, -2  negate: 1, 2
+pt: inf, -inf  negate: -inf, inf
+pt: nan, -nan  negate: -nan, nan
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_negate'>negate</a> <a href='#SkPoint_subtract_operator'>operator-</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& a, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& b) <a href='#SkPoint_subtractfrom_operator'>operator-=</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& v) <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>::operator-() const
+
+<a name='SkPoint_addto_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPoint_addto_operator'>operator+=</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& v)
+</pre>
+
+Adds <a href='SkPoint_Reference#Vector'>Vector</a> <a href='#SkPoint_addto_operator_v'>v</a> to <a href='SkPoint_Reference#Point'>Point</a>. Sets <a href='SkPoint_Reference#Point'>Point</a> to: <code>(<a href='#SkPoint_fX'>fX</a> + <a href='#SkPoint_addto_operator_v'>v</a>.<a href='#SkPoint_fX'>fX</a>, <a href='#SkPoint_fY'>fY</a> + <a href='#SkPoint_addto_operator_v'>v</a>.<a href='#SkPoint_fY'>fY</a>)</code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_addto_operator_v'><code><strong>v</strong></code></a></td>
+    <td><a href='SkPoint_Reference#Vector'>Vector</a> to add</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Point_addto_operator"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_offset'>offset()</a> <a href='#SkPoint_add_operator'>operator+</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& a, const <a href='SkPoint_Reference#SkVector'>SkVector</a>& b) <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>::operator+=(const <a href='SkIPoint_Reference#SkIVector'>SkIVector</a>& <a href='#SkPoint_addto_operator_v'>v</a>)
+
+<a name='SkPoint_subtractfrom_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPoint_subtractfrom_operator'>operator-=</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& v)
+</pre>
+
+Subtracts <a href='SkPoint_Reference#Vector'>Vector</a> <a href='#SkPoint_subtractfrom_operator_v'>v</a> from <a href='SkPoint_Reference#Point'>Point</a>. Sets <a href='SkPoint_Reference#Point'>Point</a> to: <code>(<a href='#SkPoint_fX'>fX</a> - <a href='#SkPoint_subtractfrom_operator_v'>v</a>.<a href='#SkPoint_fX'>fX</a>, <a href='#SkPoint_fY'>fY</a> - <a href='#SkPoint_subtractfrom_operator_v'>v</a>.<a href='#SkPoint_fY'>fY</a>)</code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_subtractfrom_operator_v'><code><strong>v</strong></code></a></td>
+    <td><a href='SkPoint_Reference#Vector'>Vector</a> to subtract</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Point_subtractfrom_operator"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_offset'>offset()</a> <a href='#SkPoint_subtract_operator'>operator-</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& a, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& b) <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a>::operator-=(const <a href='SkIPoint_Reference#SkIVector'>SkIVector</a>& <a href='#SkPoint_subtractfrom_operator_v'>v</a>)
+
+<a name='SkPoint_multiply_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a> operator*(<a href='undocumented#SkScalar'>SkScalar</a> scale)const
+</pre>
+
+Returns <a href='SkPoint_Reference#SkPoint'>SkPoint</a> multiplied by <a href='#SkPoint_multiply_operator_scale'>scale</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_multiply_operator_scale'><code><strong>scale</strong></code></a></td>
+    <td><a href='undocumented#Scalar'>scalar</a> to multiply by</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a> as (<a href='#SkPoint_fX'>fX</a> * <a href='#SkPoint_multiply_operator_scale'>scale</a>, <a href='#SkPoint_fY'>fY</a> * <a href='#SkPoint_multiply_operator_scale'>scale</a>)
+
+### Example
+
+<div><fiddle-embed name="@Point_multiply_operator"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_multiplyby_operator'>operator*=</a>(<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_multiply_operator_scale'>scale</a>) <a href='#SkPoint_scale'>scale()</a> <a href='#SkPoint_setLength'>setLength</a> <a href='#SkPoint_setNormalize'>setNormalize</a>
+
+<a name='SkPoint_multiplyby_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a>& <a href='#SkPoint_multiplyby_operator'>operator*=</a>(<a href='undocumented#SkScalar'>SkScalar</a> scale)
+</pre>
+
+Multiplies <a href='SkPoint_Reference#Point'>Point</a> by <a href='#SkPoint_multiplyby_operator_scale'>scale</a>. Sets <a href='SkPoint_Reference#Point'>Point</a> to: <code>(<a href='#SkPoint_fX'>fX</a> * <a href='#SkPoint_multiplyby_operator_scale'>scale</a>, <a href='#SkPoint_fY'>fY</a> * <a href='#SkPoint_multiplyby_operator_scale'>scale</a>)</code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_multiplyby_operator_scale'><code><strong>scale</strong></code></a></td>
+    <td><a href='undocumented#Scalar'>Scalar</a> to multiply by</td>
+  </tr>
+</table>
+
+### Return Value
+
+reference to <a href='SkPoint_Reference#Point'>Point</a>
+
+### Example
+
+<div><fiddle-embed name="@Point_multiplyby_operator"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_multiply_operator'>operator*</a>(<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_multiplyby_operator_scale'>scale</a>) const <a href='#SkPoint_scale'>scale()</a> <a href='#SkPoint_setLength'>setLength</a> <a href='#SkPoint_setNormalize'>setNormalize</a>
+
+<a name='SkPoint_isFinite'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPoint_isFinite'>isFinite</a>()const
+</pre>
+
+Returns true if both <a href='#SkPoint_fX'>fX</a> and <a href='#SkPoint_fY'>fY</a> are measurable values.
+
+### Return Value
+
+true for values other than infinities and NaN
+
+### Example
+
+<div><fiddle-embed name="@Point_isFinite">
+
+#### Example Output
+
+~~~~
+pt: 0, -0  finite: true
+pt: -1, -2  finite: true
+pt: inf, 1  finite: false
+pt: nan, -1  finite: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_isFinite'>isFinite</a> <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_isFinite'>isFinite</a>
+
+<a name='SkPoint_equals'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool equals(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y)const
+</pre>
+
+Returns true if <a href='SkPoint_Reference#SkPoint'>SkPoint</a> is equivalent to <a href='SkPoint_Reference#SkPoint'>SkPoint</a> constructed from (<a href='#SkPoint_equals_x'>x</a>, <a href='#SkPoint_equals_y'>y</a>).
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_equals_x'><code><strong>x</strong></code></a></td>
+    <td>value compared with <a href='#SkPoint_fX'>fX</a></td>
+  </tr>
+  <tr>    <td><a name='SkPoint_equals_y'><code><strong>y</strong></code></a></td>
+    <td>value compared with <a href='#SkPoint_fY'>fY</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkPoint_Reference#SkPoint'>SkPoint</a> equals (<a href='#SkPoint_equals_x'>x</a>, <a href='#SkPoint_equals_y'>y</a>)
+
+### Example
+
+<div><fiddle-embed name="@Point_equals">
+
+#### Example Output
+
+~~~~
+pt: 0, -0  == pt
+pt: -1, -2  == pt
+pt: inf, 1  == pt
+pt: nan, -1  != pt
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_equal_operator'>operator==</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& a, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& b)
+
+<a name='SkPoint_equal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPoint_equal_operator'>operator==</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& a, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& b)
+</pre>
+
+Returns true if <a href='#SkPoint_equal_operator_a'>a</a> is equivalent to <a href='#SkPoint_equal_operator_b'>b</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_equal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkPoint_Reference#SkPoint'>SkPoint</a> to compare</td>
+  </tr>
+  <tr>    <td><a name='SkPoint_equal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkPoint_Reference#SkPoint'>SkPoint</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkPoint_equal_operator_a'>a</a>.<a href='#SkPoint_fX'>fX</a> == <a href='#SkPoint_equal_operator_b'>b</a>.<a href='#SkPoint_fX'>fX</a> and <a href='#SkPoint_equal_operator_a'>a</a>.<a href='#SkPoint_fY'>fY</a> == <a href='#SkPoint_equal_operator_b'>b</a>.<a href='#SkPoint_fY'>fY</a>
+
+### Example
+
+<div><fiddle-embed name="@Point_equal_operator">
+
+#### Example Output
+
+~~~~
+pt: 0, -0  == pt
+pt: -1, -2  == pt
+pt: inf, 1  == pt
+pt: nan, -1  != pt
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_equals'>equals()</a> <a href='#SkPoint_notequal_operator'>operator!=</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& <a href='#SkPoint_equal_operator_a'>a</a>, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& <a href='#SkPoint_equal_operator_b'>b</a>)
+
+<a name='SkPoint_notequal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPoint_notequal_operator'>operator!=</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& a, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& b)
+</pre>
+
+Returns true if <a href='#SkPoint_notequal_operator_a'>a</a> is not equivalent to <a href='#SkPoint_notequal_operator_b'>b</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_notequal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkPoint_Reference#SkPoint'>SkPoint</a> to compare</td>
+  </tr>
+  <tr>    <td><a name='SkPoint_notequal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkPoint_Reference#SkPoint'>SkPoint</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkPoint_notequal_operator_a'>a</a>.<a href='#SkPoint_fX'>fX</a> != <a href='#SkPoint_notequal_operator_b'>b</a>.<a href='#SkPoint_fX'>fX</a> or <a href='#SkPoint_notequal_operator_a'>a</a>.<a href='#SkPoint_fY'>fY</a> != <a href='#SkPoint_notequal_operator_b'>b</a>.<a href='#SkPoint_fY'>fY</a>
+
+### Example
+
+<div><fiddle-embed name="@Point_notequal_operator">
+
+#### Example Output
+
+~~~~
+pt: 0, -0  == pt
+pt: -1, -2  == pt
+pt: inf, 1  == pt
+pt: nan, -1  != pt
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_equal_operator'>operator==</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& <a href='#SkPoint_notequal_operator_a'>a</a>, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& <a href='#SkPoint_notequal_operator_b'>b</a>) <a href='#SkPoint_equals'>equals()</a>
+
+<a name='SkPoint_subtract_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPoint_Reference#SkVector'>SkVector</a> <a href='#SkPoint_subtract_operator'>operator-</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& a, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& b)
+</pre>
+
+Returns <a href='SkPoint_Reference#Vector'>Vector</a> from <a href='#SkPoint_subtract_operator_b'>b</a> to <a href='#SkPoint_subtract_operator_a'>a</a>, computed as <code>(<a href='#SkPoint_subtract_operator_a'>a</a>.<a href='#SkPoint_fX'>fX</a> - <a href='#SkPoint_subtract_operator_b'>b</a>.<a href='#SkPoint_fX'>fX</a>, <a href='#SkPoint_subtract_operator_a'>a</a>.<a href='#SkPoint_fY'>fY</a> - <a href='#SkPoint_subtract_operator_b'>b</a>.<a href='#SkPoint_fY'>fY</a>)</code>.
+
+Can also be used to subtract <a href='SkPoint_Reference#Vector'>Vector</a> from <a href='SkPoint_Reference#Point'>Point</a>, returning <a href='SkPoint_Reference#Point'>Point</a>.
+Can also be used to subtract <a href='SkPoint_Reference#Vector'>Vector</a> from <a href='SkPoint_Reference#Vector'>Vector</a>, returning <a href='SkPoint_Reference#Vector'>Vector</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_subtract_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkPoint_Reference#Point'>Point</a> to subtract from</td>
+  </tr>
+  <tr>    <td><a name='SkPoint_subtract_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkPoint_Reference#Point'>Point</a> to subtract</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkPoint_Reference#Vector'>Vector</a> from <a href='#SkPoint_subtract_operator_b'>b</a> to <a href='#SkPoint_subtract_operator_a'>a</a>
+
+### Example
+
+<div><fiddle-embed name="@Point_subtract_operator"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_subtractfrom_operator'>operator-=</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& v) <a href='#SkPoint_offset'>offset()</a>
+
+<a name='SkPoint_add_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkPoint_add_operator'>operator+</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& a, const <a href='SkPoint_Reference#SkVector'>SkVector</a>& b)
+</pre>
+
+Returns <a href='SkPoint_Reference#Point'>Point</a> resulting from <a href='SkPoint_Reference#Point'>Point</a> <a href='#SkPoint_add_operator_a'>a</a> offset by <a href='SkPoint_Reference#Vector'>Vector</a> <a href='#SkPoint_add_operator_b'>b</a>, computed as:
+<code>(<a href='#SkPoint_add_operator_a'>a</a>.<a href='#SkPoint_fX'>fX</a> + <a href='#SkPoint_add_operator_b'>b</a>.<a href='#SkPoint_fX'>fX</a>, <a href='#SkPoint_add_operator_a'>a</a>.<a href='#SkPoint_fY'>fY</a> + <a href='#SkPoint_add_operator_b'>b</a>.<a href='#SkPoint_fY'>fY</a>)</code>.
+
+Can also be used to offset <a href='SkPoint_Reference#Point'>Point</a> <a href='#SkPoint_add_operator_b'>b</a> by <a href='SkPoint_Reference#Vector'>Vector</a> <a href='#SkPoint_add_operator_a'>a</a>, returning <a href='SkPoint_Reference#Point'>Point</a>.
+Can also be used to add <a href='SkPoint_Reference#Vector'>Vector</a> to <a href='SkPoint_Reference#Vector'>Vector</a>, returning <a href='SkPoint_Reference#Vector'>Vector</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_add_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkPoint_Reference#Point'>Point</a> or <a href='SkPoint_Reference#Vector'>Vector</a> to add to</td>
+  </tr>
+  <tr>    <td><a name='SkPoint_add_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkPoint_Reference#Point'>Point</a> or <a href='SkPoint_Reference#Vector'>Vector</a> to add</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkPoint_Reference#Point'>Point</a> equal to <a href='#SkPoint_add_operator_a'>a</a> offset by <a href='#SkPoint_add_operator_b'>b</a>
+
+### Example
+
+<div><fiddle-embed name="@Point_add_operator"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_addto_operator'>operator+=</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& v) <a href='#SkPoint_offset'>offset()</a>
+
+<a name='SkPoint_Length'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_Length'>Length</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y)
+</pre>
+
+Returns the  <a href='undocumented#Euclidean_Distance'>Euclidean distance</a> from origin, computed as:
+
+<a href='undocumented#sqrt()'>sqrt</a>(<a href='#SkPoint_Length_x'>x</a> * <a href='#SkPoint_Length_x'>x</a> + <a href='#SkPoint_Length_y'>y</a> * <a href='#SkPoint_Length_y'>y</a>)
+
+.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_Length_x'><code><strong>x</strong></code></a></td>
+    <td>component of length</td>
+  </tr>
+  <tr>    <td><a name='SkPoint_Length_y'><code><strong>y</strong></code></a></td>
+    <td>component of length</td>
+  </tr>
+</table>
+
+### Return Value
+
+straight-line distance to origin
+
+### Example
+
+<div><fiddle-embed name="c98773d8b4509969d78cb8121e4b77f6"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_length'>length()</a> <a href='#SkPoint_Distance'>Distance</a> <a href='#SkPoint_setLength'>setLength</a>
+
+<a name='SkPoint_Normalize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_Normalize'>Normalize</a>(<a href='SkPoint_Reference#SkVector'>SkVector</a>* vec)
+</pre>
+
+Scales (<a href='#SkPoint_Normalize_vec'>vec</a>-><a href='#SkPoint_fX'>fX</a>, <a href='#SkPoint_Normalize_vec'>vec</a>-><a href='#SkPoint_fY'>fY</a>) so that <a href='#SkPoint_length'>length()</a> returns one, while preserving ratio of <a href='#SkPoint_Normalize_vec'>vec</a>-><a href='#SkPoint_fX'>fX</a>
+to <a href='#SkPoint_Normalize_vec'>vec</a>-><a href='#SkPoint_fY'>fY</a>, if possible. If original length is nearly zero, sets <a href='#SkPoint_Normalize_vec'>vec</a> to (0, 0) and returns
+zero; otherwise, returns length of <a href='#SkPoint_Normalize_vec'>vec</a> before <a href='#SkPoint_Normalize_vec'>vec</a> is scaled.
+
+Returned prior length may be <a href='undocumented#SK_ScalarInfinity'>SK_ScalarInfinity</a> if it can not be represented by <a href='undocumented#SkScalar'>SkScalar</a>.
+
+Note that <a href='#SkPoint_normalize'>normalize()</a> is faster if prior length is not required.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_Normalize_vec'><code><strong>vec</strong></code></a></td>
+    <td>normalized to unit length</td>
+  </tr>
+</table>
+
+### Return Value
+
+original <a href='#SkPoint_Normalize_vec'>vec</a> length
+
+### Example
+
+<div><fiddle-embed name="60a08f3ce75374fc815384616d114df7"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_normalize'>normalize()</a> <a href='#SkPoint_setLength'>setLength</a> <a href='#SkPoint_Length'>Length</a>
+
+<a name='SkPoint_Distance'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_Distance'>Distance</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& a, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& b)
+</pre>
+
+Returns the  <a href='undocumented#Euclidean_Distance'>Euclidean distance</a> between <a href='#SkPoint_Distance_a'>a</a> and <a href='#SkPoint_Distance_b'>b</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_Distance_a'><code><strong>a</strong></code></a></td>
+    <td><a href='undocumented#Line'>line</a> end <a href='SkPoint_Reference#Point'>point</a></td>
+  </tr>
+  <tr>    <td><a name='SkPoint_Distance_b'><code><strong>b</strong></code></a></td>
+    <td><a href='undocumented#Line'>line</a> end <a href='SkPoint_Reference#Point'>point</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+straight-line distance from <a href='#SkPoint_Distance_a'>a</a> to <a href='#SkPoint_Distance_b'>b</a>
+
+### Example
+
+<div><fiddle-embed name="9e0a2de2eb94dba4521d733e73f2bda5"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_length'>length()</a> <a href='#SkPoint_setLength'>setLength</a>
+
+<a name='SkPoint_DotProduct'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_DotProduct'>DotProduct</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& a, const <a href='SkPoint_Reference#SkVector'>SkVector</a>& b)
+</pre>
+
+Returns the dot product of <a href='SkPoint_Reference#Vector'>vector</a> <a href='#SkPoint_DotProduct_a'>a</a> and <a href='SkPoint_Reference#Vector'>vector</a> <a href='#SkPoint_DotProduct_b'>b</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_DotProduct_a'><code><strong>a</strong></code></a></td>
+    <td>left side of dot product</td>
+  </tr>
+  <tr>    <td><a name='SkPoint_DotProduct_b'><code><strong>b</strong></code></a></td>
+    <td>right side of dot product</td>
+  </tr>
+</table>
+
+### Return Value
+
+product of input magnitudes and cosine of the angle between them
+
+### Example
+
+<div><fiddle-embed name="496db0131a003162faba7d7f98b30340"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_dot'>dot</a> <a href='#SkPoint_CrossProduct'>CrossProduct</a>
+
+<a name='SkPoint_CrossProduct'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkPoint_CrossProduct'>CrossProduct</a>(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& a, const <a href='SkPoint_Reference#SkVector'>SkVector</a>& b)
+</pre>
+
+Returns the cross product of <a href='SkPoint_Reference#Vector'>vector</a> <a href='#SkPoint_CrossProduct_a'>a</a> and <a href='SkPoint_Reference#Vector'>vector</a> <a href='#SkPoint_CrossProduct_b'>b</a>.
+
+<a href='#SkPoint_CrossProduct_a'>a</a> and <a href='#SkPoint_CrossProduct_b'>b</a> form three-dimensional <a href='SkPoint_Reference#Vector'>vectors</a> with z-axis value equal to zero. The
+cross product is <a href='#SkPoint_CrossProduct_a'>a</a> three-dimensional <a href='SkPoint_Reference#Vector'>vector</a> with x-axis and y-axis values equal
+to zero. The cross product z-axis component is returned.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_CrossProduct_a'><code><strong>a</strong></code></a></td>
+    <td>left side of cross product</td>
+  </tr>
+  <tr>    <td><a name='SkPoint_CrossProduct_b'><code><strong>b</strong></code></a></td>
+    <td>right side of cross product</td>
+  </tr>
+</table>
+
+### Return Value
+
+area spanned by <a href='SkPoint_Reference#Vector'>vectors</a> signed by angle direction
+
+### Example
+
+<div><fiddle-embed name="8b8a4cd8a29d22bb9c5e63b70357bd65"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_cross'>cross</a> <a href='#SkPoint_DotProduct'>DotProduct</a>
+
+<a name='SkPoint_cross'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> cross(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& vec)const
+</pre>
+
+Returns the cross product of <a href='SkPoint_Reference#Vector'>vector</a> and <a href='#SkPoint_cross_vec'>vec</a>.
+
+<a href='SkPoint_Reference#Vector'>Vector</a> and <a href='#SkPoint_cross_vec'>vec</a> form three-dimensional <a href='SkPoint_Reference#Vector'>vectors</a> with z-axis value equal to zero.
+The cross product is a three-dimensional <a href='SkPoint_Reference#Vector'>vector</a> with x-axis and y-axis values
+equal to zero. The cross product z-axis component is returned.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_cross_vec'><code><strong>vec</strong></code></a></td>
+    <td>right side of cross product</td>
+  </tr>
+</table>
+
+### Return Value
+
+area spanned by <a href='SkPoint_Reference#Vector'>vectors</a> signed by angle direction
+
+### Example
+
+<div><fiddle-embed name="0bc7b3997357e499817278b78bdfbf1d"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_CrossProduct'>CrossProduct</a> <a href='#SkPoint_dot'>dot</a>
+
+<a name='SkPoint_dot'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> dot(const <a href='SkPoint_Reference#SkVector'>SkVector</a>& vec)const
+</pre>
+
+Returns the dot product of <a href='SkPoint_Reference#Vector'>vector</a> and <a href='SkPoint_Reference#Vector'>vector</a> <a href='#SkPoint_dot_vec'>vec</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkPoint_dot_vec'><code><strong>vec</strong></code></a></td>
+    <td>right side of dot product</td>
+  </tr>
+</table>
+
+### Return Value
+
+product of input magnitudes and cosine of the angle between them
+
+### Example
+
+<div><fiddle-embed name="56d01ccfedd71d3c504b09afa2875d38"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkPoint_DotProduct'>DotProduct</a> <a href='#SkPoint_cross'>cross</a>
+
+<a name='Vector'></a>
+
+<a name='SkVector'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    typedef <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='SkPoint_Reference#SkVector'>SkVector</a>;
+</pre>
+
+<a href='SkPoint_Reference#SkVector'>SkVector</a> provides an alternative name for <a href='SkPoint_Reference#SkPoint'>SkPoint</a>. <a href='SkPoint_Reference#SkVector'>SkVector</a> and <a href='SkPoint_Reference#SkPoint'>SkPoint</a> can
+be used interchangeably for all purposes.
\ No newline at end of file
diff --git a/src/third_party/skia/site/user/api/SkRRect_Reference.md b/src/third_party/skia/site/user/api/SkRRect_Reference.md
new file mode 100644
index 0000000..e4f111c
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkRRect_Reference.md
@@ -0,0 +1,1575 @@
+SkRRect Reference
+===
+
+
+<a name='SkRRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkRRect_Reference#SkRRect'>SkRRect</a> {
+public:
+    <a href='#SkRRect_empty_constructor'>SkRRect()</a> = default;
+    <a href='#SkRRect_copy_const_SkRRect'>SkRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect) = default;
+    <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& <a href='#SkRRect_copy_operator'>operator=</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect) = default;
+
+    enum <a href='#SkRRect_Type'>Type</a> {
+        <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>,
+        <a href='#SkRRect_kRect_Type'>kRect_Type</a>,
+        <a href='#SkRRect_kOval_Type'>kOval_Type</a>,
+        <a href='#SkRRect_kSimple_Type'>kSimple_Type</a>,
+        <a href='#SkRRect_kNinePatch_Type'>kNinePatch_Type</a>,
+        <a href='#SkRRect_kComplex_Type'>kComplex_Type</a>,
+        <a href='#SkRRect_kLastType'>kLastType</a>       = <a href='#SkRRect_kComplex_Type'>kComplex_Type</a>,
+    };
+
+    <a href='#SkRRect_Type'>Type</a> <a href='#SkRRect_getType'>getType</a>() const;
+    <a href='#SkRRect_Type'>Type</a> <a href='#SkRRect_type'>type()</a> const;
+    bool <a href='#SkRRect_isEmpty'>isEmpty</a>() const;
+    bool <a href='#SkRRect_isRect'>isRect</a>() const;
+    bool <a href='#SkRRect_isOval'>isOval</a>() const;
+    bool <a href='#SkRRect_isSimple'>isSimple</a>() const;
+    bool <a href='#SkRRect_isNinePatch'>isNinePatch</a>() const;
+    bool <a href='#SkRRect_isComplex'>isComplex</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRRect_width'>width()</a> const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRRect_height'>height()</a> const;
+    <a href='SkPoint_Reference#SkVector'>SkVector</a> <a href='#SkRRect_getSimpleRadii'>getSimpleRadii</a>() const;
+    void <a href='#SkRRect_setEmpty'>setEmpty</a>();
+    void <a href='#SkRRect_setRect'>setRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>);
+    static <a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='#SkRRect_MakeEmpty'>MakeEmpty</a>();
+    static <a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='#SkRRect_MakeRect'>MakeRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r);
+    static <a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='#SkRRect_MakeOval'>MakeOval</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>);
+    static <a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='#SkRRect_MakeRectXY'>MakeRectXY</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='undocumented#SkScalar'>SkScalar</a> xRad, <a href='undocumented#SkScalar'>SkScalar</a> yRad);
+    void <a href='#SkRRect_setOval'>setOval</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>);
+    void <a href='#SkRRect_setRectXY'>setRectXY</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='undocumented#SkScalar'>SkScalar</a> xRad, <a href='undocumented#SkScalar'>SkScalar</a> yRad);
+    void <a href='#SkRRect_setNinePatch'>setNinePatch</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='undocumented#SkScalar'>SkScalar</a> leftRad, <a href='undocumented#SkScalar'>SkScalar</a> topRad,
+                      <a href='undocumented#SkScalar'>SkScalar</a> rightRad, <a href='undocumented#SkScalar'>SkScalar</a> bottomRad);
+    void <a href='#SkRRect_setRectRadii'>setRectRadii</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, const <a href='SkPoint_Reference#SkVector'>SkVector</a> radii[4]);
+
+    enum <a href='#SkRRect_Corner'>Corner</a> {
+        <a href='#SkRRect_kUpperLeft_Corner'>kUpperLeft_Corner</a>,
+        <a href='#SkRRect_kUpperRight_Corner'>kUpperRight_Corner</a>,
+        <a href='#SkRRect_kLowerRight_Corner'>kLowerRight_Corner</a>,
+        <a href='#SkRRect_kLowerLeft_Corner'>kLowerLeft_Corner</a>,
+    };
+
+    const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='#SkRRect_rect'>rect()</a> const;
+    <a href='SkPoint_Reference#SkVector'>SkVector</a> <a href='#SkRRect_radii'>radii</a>(<a href='#SkRRect_Corner'>Corner</a> corner) const;
+    const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='#SkRRect_getBounds'>getBounds</a>() const;
+    friend bool <a href='#SkRRect_equal_operator'>operator==</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& a, const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& b);
+    friend bool <a href='#SkRRect_notequal_operator'>operator!=</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& a, const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& b);
+    void <a href='#SkRRect_inset'>inset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy, <a href='SkRRect_Reference#SkRRect'>SkRRect</a>* dst) const;
+    void <a href='#SkRRect_inset'>inset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    void <a href='#SkRRect_outset'>outset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy, <a href='SkRRect_Reference#SkRRect'>SkRRect</a>* dst) const;
+    void <a href='#SkRRect_outset'>outset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    void <a href='#SkRRect_offset'>offset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    <a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='#SkRRect_makeOffset'>makeOffset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy) const;
+    bool <a href='#SkRRect_contains'>contains</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>) const;
+    bool <a href='#SkRRect_isValid'>isValid</a>() const;
+
+    static constexpr size_t <a href='#SkRRect_kSizeInMemory'>kSizeInMemory</a> = 12 * <a href='undocumented#sizeof()'>sizeof</a>(<a href='undocumented#SkScalar'>SkScalar</a>);
+
+    size_t <a href='#SkRRect_writeToMemory'>writeToMemory</a>(void* buffer) const;
+    size_t <a href='#SkRRect_readFromMemory'>readFromMemory</a>(const void* buffer, size_t length);
+    bool <a href='#SkRRect_transform'>transform</a>(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='SkMatrix_Reference#Matrix'>matrix</a>, <a href='SkRRect_Reference#SkRRect'>SkRRect</a>* dst) const;
+    void <a href='#SkRRect_dump'>dump</a>(bool asHex) const;
+    void <a href='#SkRRect_dump'>dump()</a> const;
+    void <a href='#SkRRect_dumpHex'>dumpHex</a>() const;
+};
+</pre>
+
+<a href='SkRRect_Reference#SkRRect'>SkRRect</a> describes a rounded rectangle with a bounds and a pair of radii for each corner.
+The bounds and radii can be set so that <a href='SkRRect_Reference#SkRRect'>SkRRect</a> describes: a rectangle with sharp corners;
+a <a href='undocumented#Circle'>Circle</a>; an <a href='undocumented#Oval'>Oval</a>; or a rectangle with one or more rounded corners.
+
+<a href='SkRRect_Reference#SkRRect'>SkRRect</a> allows implementing CSS properties that describe rounded corners.
+<a href='SkRRect_Reference#SkRRect'>SkRRect</a> may have up to eight different radii, one for each axis on each of its four
+corners.
+
+<a href='SkRRect_Reference#SkRRect'>SkRRect</a> may modify the provided parameters when initializing bounds and radii.
+If either axis radii is zero or less: radii are stored as zero; corner is square.
+If corner <a href='undocumented#Curve'>curves</a> overlap, radii are proportionally reduced to fit within bounds.
+
+<a name='SkRRect_empty_constructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkRRect_empty_constructor'>SkRRect()</a>
+</pre>
+
+Initializes bounds at (0, 0), the origin, with zero width and height.
+Initializes corner radii to (0, 0), and sets type of <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>.
+
+### Return Value
+
+empty <a href='SkRRect_Reference#SkRRect'>SkRRect</a>
+
+### Example
+
+<div><fiddle-embed name="@RRect_empty_constructor"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_setEmpty'>setEmpty</a> <a href='#SkRRect_isEmpty'>isEmpty</a>
+
+<a name='SkRRect_copy_const_SkRRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkRRect_copy_const_SkRRect'>SkRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect)
+</pre>
+
+Initializes to copy of <a href='#SkRRect_copy_const_SkRRect_rrect'>rrect</a> bounds and corner radii.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_copy_const_SkRRect_rrect'><code><strong>rrect</strong></code></a></td>
+    <td>bounds and corner to copy</td>
+  </tr>
+</table>
+
+### Return Value
+
+copy of <a href='#SkRRect_copy_const_SkRRect_rrect'>rrect</a>
+
+### Example
+
+<div><fiddle-embed name="@RRect_copy_const_SkRRect"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_copy_operator'>operator=</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& <a href='#SkRRect_copy_const_SkRRect_rrect'>rrect</a>) <a href='#SkRRect_MakeRect'>MakeRect</a>
+
+<a name='SkRRect_copy_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkRRect_Reference#SkRRect'>SkRRect</a>& <a href='#SkRRect_copy_operator'>operator=</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& rrect)
+</pre>
+
+Copies <a href='#SkRRect_copy_operator_rrect'>rrect</a> bounds and corner radii.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_copy_operator_rrect'><code><strong>rrect</strong></code></a></td>
+    <td>bounds and corner to copy</td>
+  </tr>
+</table>
+
+### Return Value
+
+copy of <a href='#SkRRect_copy_operator_rrect'>rrect</a>
+
+### Example
+
+<div><fiddle-embed name="@RRect_copy_operator"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_copy_const_SkRRect'>SkRRect</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& <a href='#SkRRect_copy_operator_rrect'>rrect</a>) <a href='#SkRRect_MakeRect'>MakeRect</a>
+
+<a name='Type'></a>
+
+<a name='SkRRect_Type'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkRRect_Type'>Type</a> {
+        <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>,
+        <a href='#SkRRect_kRect_Type'>kRect_Type</a>,
+        <a href='#SkRRect_kOval_Type'>kOval_Type</a>,
+        <a href='#SkRRect_kSimple_Type'>kSimple_Type</a>,
+        <a href='#SkRRect_kNinePatch_Type'>kNinePatch_Type</a>,
+        <a href='#SkRRect_kComplex_Type'>kComplex_Type</a>,
+        <a href='#SkRRect_kLastType'>kLastType</a> = <a href='#SkRRect_kComplex_Type'>kComplex_Type</a>,
+    };
+</pre>
+
+<a href='#SkRRect_Type'>Type</a> describes possible specializations of <a href='#RRect'>Round_Rect</a>. Each <a href='#SkRRect_Type'>Type</a> is
+exclusive; a <a href='#RRect'>Round_Rect</a> may only have one type.
+
+<a href='#SkRRect_Type'>Type</a> members become progressively less restrictive; larger values of
+<a href='#SkRRect_Type'>Type</a> have more degrees of freedom than smaller values.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRRect_kEmpty_Type'><code>SkRRect::kEmpty_Type</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#RRect'>Round_Rect</a> has zero width or height. All radii are zero.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRRect_kRect_Type'><code>SkRRect::kRect_Type</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#RRect'>Round_Rect</a> has width and height. All radii are zero.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRRect_kOval_Type'><code>SkRRect::kOval_Type</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#RRect'>Round_Rect</a> has width and height. All four x-radii are equal,
+and at least half the width. All four y-radii are equal,
+and at least half the height.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRRect_kSimple_Type'><code>SkRRect::kSimple_Type</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#RRect'>Round_Rect</a> has width and height. All four x-radii are equal and
+greater than zero, and all four y-radii are equal and greater than
+zero. Either x-radii are less than half the width, or y-radii is
+less than half the height, or both.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRRect_kNinePatch_Type'><code>SkRRect::kNinePatch_Type</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>4</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#RRect'>Round_Rect</a> has width and height. Left x-radii are equal, top
+y-radii are equal, right x-radii are equal, and bottom y-radii
+are equal. The radii do not describe <a href='SkRect_Reference#Rect'>Rect</a>, <a href='undocumented#Oval'>Oval</a>, or simple type.
+
+The centers of the corner ellipses form an axis-aligned rectangle
+that divides the <a href='#RRect'>Round_Rect</a> into nine rectangular <a href='undocumented#Patch'>patches</a>; an
+interior rectangle, four edges, and four corners.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRRect_kComplex_Type'><code>SkRRect::kComplex_Type</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>5</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+both radii are non-zero.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRRect_kLastType'><code>SkRRect::kLastType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>5</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+largest Type value</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="a4233634c75b72fc7a2815ddb69bd669"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkRect_Reference#Rect'>Rect</a> <a href='SkPath_Reference#Path'>Path</a>
+
+<a name='SkRRect_getType'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkRRect_Type'>Type</a> <a href='#SkRRect_getType'>getType</a>()const
+</pre>
+
+Returns <a href='#SkRRect_Type'>Type</a>, one of: <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>, <a href='#SkRRect_kRect_Type'>kRect_Type</a>, <a href='#SkRRect_kOval_Type'>kOval_Type</a>, <a href='#SkRRect_kSimple_Type'>kSimple_Type</a>, <a href='#SkRRect_kNinePatch_Type'>kNinePatch_Type</a>,
+<a href='#SkRRect_kComplex_Type'>kComplex_Type</a>
+.
+
+### Return Value
+
+<a href='#SkRRect_Type'>Type</a>
+
+### Example
+
+<div><fiddle-embed name="ace8f4aebf90527d43e4b7291375c9ad"><div>rrect2 is not a <a href='SkRect_Reference#Rect'>Rect</a>; <a href='#SkRRect_inset'>inset()</a> has made it empty.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_Type'>Type</a> <a href='#SkRRect_type'>type</a>
+
+<a name='SkRRect_type'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkRRect_Type'>Type</a> <a href='#SkRRect_type'>type()</a>const
+</pre>
+
+Returns <a href='#SkRRect_Type'>Type</a>, one of: <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>, <a href='#SkRRect_kRect_Type'>kRect_Type</a>, <a href='#SkRRect_kOval_Type'>kOval_Type</a>, <a href='#SkRRect_kSimple_Type'>kSimple_Type</a>, <a href='#SkRRect_kNinePatch_Type'>kNinePatch_Type</a>,
+<a href='#SkRRect_kComplex_Type'>kComplex_Type</a>
+.
+
+### Return Value
+
+<a href='#SkRRect_Type'>Type</a>
+
+### Example
+
+<div><fiddle-embed name="1080805c8449406a4e26d694bc56d2dc"><div><a href='#SkRRect_inset'>inset()</a> has made rrect2 empty.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_Type'>Type</a> <a href='#SkRRect_getType'>getType</a>
+
+<a name='SkRRect_isEmpty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRRect_isEmpty'>isEmpty</a>()const
+</pre>
+
+### Example
+
+<div><fiddle-embed name="099d79ecfbdfb0a19c10deb7201859c3"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_isEmpty'>isEmpty</a> <a href='#SkRRect_height'>height</a> <a href='#SkRRect_width'>width</a>
+
+<a name='SkRRect_isRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRRect_isRect'>isRect</a>()const
+</pre>
+
+### Example
+
+<div><fiddle-embed name="bc931c9a6eb8ffe7ea8d3fb47e07a475"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_isEmpty'>isEmpty</a> <a href='#SkRRect_radii'>radii</a>
+
+<a name='SkRRect_isOval'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRRect_isOval'>isOval</a>()const
+</pre>
+
+### Example
+
+<div><fiddle-embed name="4dfdb28d8343958425f2c1323fe8170d"><div>The first radii are scaled down proportionately until both x-axis and y-axis fit
+within the bounds. After scaling, x-axis radius is smaller than half the width;
+left <a href='#RRect'>Round_Rect</a> is not an <a href='undocumented#Oval'>oval</a>. The second radii are equal to half the
+dimensions; right <a href='#RRect'>Round_Rect</a> is an <a href='undocumented#Oval'>oval</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_isEmpty'>isEmpty</a> <a href='#SkRRect_isSimple'>isSimple</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_drawOval'>drawOval</a>
+
+<a name='SkRRect_isSimple'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRRect_isSimple'>isSimple</a>()const
+</pre>
+
+### Example
+
+<div><fiddle-embed name="f6959ea422a7c6e98ddfad216a52c707"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_isEmpty'>isEmpty</a> <a href='#SkRRect_isRect'>isRect</a> <a href='#SkRRect_isOval'>isOval</a> <a href='#SkRRect_isNinePatch'>isNinePatch</a>
+
+<a name='SkRRect_isNinePatch'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRRect_isNinePatch'>isNinePatch</a>()const
+</pre>
+
+### Example
+
+<div><fiddle-embed name="429f6dfd4cf6287df3c3c77fa7681c99"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_isEmpty'>isEmpty</a> <a href='#SkRRect_isRect'>isRect</a> <a href='#SkRRect_isOval'>isOval</a> <a href='#SkRRect_isSimple'>isSimple</a> <a href='#SkRRect_isComplex'>isComplex</a>
+
+<a name='SkRRect_isComplex'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRRect_isComplex'>isComplex</a>()const
+</pre>
+
+### Example
+
+<div><fiddle-embed name="b62c183dc435d1fc091111fb2f3c3f8e"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_isEmpty'>isEmpty</a> <a href='#SkRRect_isRect'>isRect</a> <a href='#SkRRect_isOval'>isOval</a> <a href='#SkRRect_isSimple'>isSimple</a> <a href='#SkRRect_isNinePatch'>isNinePatch</a>
+
+<a name='SkRRect_width'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRRect_width'>width()</a>const
+</pre>
+
+Returns span on the x-axis. This does not check if result fits in 32-bit float;
+result may be infinity.
+
+### Return Value
+
+<a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fRight'>fRight</a> minus <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fLeft'>fLeft</a>
+
+### Example
+
+<div><fiddle-embed name="@RRect_width"><div><a href='SkRRect_Reference#SkRRect'>SkRRect</a>::<a href='#SkRRect_MakeRect'>MakeRect</a> sorts its input, so <a href='#SkRRect_width'>width()</a> is always zero or larger.
+</div>
+
+#### Example Output
+
+~~~~
+unsorted width: 5
+large width: inf
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_width'>width</a> <a href='#SkRRect_height'>height</a> <a href='#SkRRect_getBounds'>getBounds</a>
+
+<a name='SkRRect_height'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRRect_height'>height()</a>const
+</pre>
+
+Returns span on the y-axis. This does not check if result fits in 32-bit float;
+result may be infinity.
+
+### Return Value
+
+<a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fBottom'>fBottom</a> minus <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fTop'>fTop</a>
+
+### Example
+
+<div><fiddle-embed name="@RRect_height"><div><a href='SkRRect_Reference#SkRRect'>SkRRect</a>::<a href='#SkRRect_MakeRect'>MakeRect</a> sorts its input, so <a href='#SkRRect_height'>height()</a> is always zero or larger.
+</div>
+
+#### Example Output
+
+~~~~
+unsorted height: 5
+large height: inf
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_height'>height</a> <a href='#SkRRect_width'>width</a> <a href='#SkRRect_getBounds'>getBounds</a>
+
+<a name='SkRRect_getSimpleRadii'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPoint_Reference#SkVector'>SkVector</a> <a href='#SkRRect_getSimpleRadii'>getSimpleRadii</a>()const
+</pre>
+
+Returns top-left corner radii. If <a href='#SkRRect_type'>type()</a> returns <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>, <a href='#SkRRect_kRect_Type'>kRect_Type</a>,
+<a href='#SkRRect_kOval_Type'>kOval_Type</a>, or <a href='#SkRRect_kSimple_Type'>kSimple_Type</a>, returns a value representative of all corner radii.
+If <a href='#SkRRect_type'>type()</a> returns <a href='#SkRRect_kNinePatch_Type'>kNinePatch_Type</a> or <a href='#SkRRect_kComplex_Type'>kComplex_Type</a>, at least one of the
+remaining three corners has a different value.
+
+### Return Value
+
+corner radii for simple types
+
+### Example
+
+<div><fiddle-embed name="81345f7619a072bb2b0cf59810fe86d0"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_radii'>radii</a> <a href='#SkRRect_getBounds'>getBounds</a> <a href='#SkRRect_getType'>getType</a> <a href='#SkRRect_isSimple'>isSimple</a>
+
+<a name='SkRRect_setEmpty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRRect_setEmpty'>setEmpty</a>()
+</pre>
+
+Sets bounds to zero width and height at (0, 0), the origin. Sets
+corner radii to zero and sets type to <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>.
+
+### Example
+
+<div><fiddle-embed name="@RRect_setEmpty"><div>Nothing blue is drawn because <a href='#RRect'>Round_Rect</a> is set to empty.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_MakeEmpty'>MakeEmpty</a> <a href='#SkRRect_setRect'>setRect</a>
+
+<a name='SkRRect_setRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRRect_setRect'>setRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>)
+</pre>
+
+Sets bounds to sorted <a href='#SkRRect_setRect_rect'>rect</a>, and sets corner radii to zero.
+If set bounds has width and height, and sets type to <a href='#SkRRect_kRect_Type'>kRect_Type</a>;
+otherwise, sets type to <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_setRect_rect'><code><strong>rect</strong></code></a></td>
+    <td>bounds to set</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@RRect_setRect"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_MakeRect'>MakeRect</a> <a href='#SkRRect_setRectXY'>setRectXY</a>
+
+<a name='SkRRect_MakeEmpty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='#SkRRect_MakeEmpty'>MakeEmpty</a>()
+</pre>
+
+Initializes bounds at (0, 0), the origin, with zero width and height.
+Initializes corner radii to (0, 0), and sets type of <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>.
+
+### Return Value
+
+empty <a href='SkRRect_Reference#SkRRect'>SkRRect</a>
+
+### Example
+
+<div><fiddle-embed name="c6c6be3b3c137226adbb5b5af9203d27"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_empty_constructor'>SkRRect()</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_MakeEmpty'>MakeEmpty</a>
+
+<a name='SkRRect_MakeRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='#SkRRect_MakeRect'>MakeRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r)
+</pre>
+
+Initializes to copy of <a href='#SkRRect_MakeRect_r'>r</a> bounds and zeroes corner radii.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_MakeRect_r'><code><strong>r</strong></code></a></td>
+    <td>bounds to copy</td>
+  </tr>
+</table>
+
+### Return Value
+
+copy of <a href='#SkRRect_MakeRect_r'>r</a>
+
+### Example
+
+<div><fiddle-embed name="@RRect_MakeRect"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_setRect'>setRect</a> <a href='#SkRRect_MakeOval'>MakeOval</a> <a href='#SkRRect_MakeRectXY'>MakeRectXY</a>
+
+<a name='SkRRect_MakeOval'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='#SkRRect_MakeOval'>MakeOval</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>)
+</pre>
+
+Sets bounds to <a href='#SkRRect_MakeOval_oval'>oval</a>, x-axis radii to half <a href='#SkRRect_MakeOval_oval'>oval</a>.<a href='#SkRect_width'>width()</a>, and all y-axis radii
+to half <a href='#SkRRect_MakeOval_oval'>oval</a>.<a href='#SkRect_height'>height()</a>. If <a href='#SkRRect_MakeOval_oval'>oval</a> bounds is empty, sets to <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>.
+Otherwise, sets to <a href='#SkRRect_kOval_Type'>kOval_Type</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_MakeOval_oval'><code><strong>oval</strong></code></a></td>
+    <td>bounds of <a href='#SkRRect_MakeOval_oval'>oval</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='#SkRRect_MakeOval_oval'>oval</a>
+
+### Example
+
+<div><fiddle-embed name="@RRect_MakeOval"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_setOval'>setOval</a> <a href='#SkRRect_MakeRect'>MakeRect</a> <a href='#SkRRect_MakeRectXY'>MakeRectXY</a>
+
+<a name='SkRRect_MakeRectXY'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='#SkRRect_MakeRectXY'>MakeRectXY</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='undocumented#SkScalar'>SkScalar</a> xRad, <a href='undocumented#SkScalar'>SkScalar</a> yRad)
+</pre>
+
+Sets to rounded rectangle with the same radii for all four corners.
+If <a href='#SkRRect_MakeRectXY_rect'>rect</a> is empty, sets to <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>.
+Otherwise, if <a href='#SkRRect_MakeRectXY_xRad'>xRad</a> and <a href='#SkRRect_MakeRectXY_yRad'>yRad</a> are zero, sets to <a href='#SkRRect_kRect_Type'>kRect_Type</a>.
+Otherwise, if <a href='#SkRRect_MakeRectXY_xRad'>xRad</a> is at least half <a href='#SkRRect_MakeRectXY_rect'>rect</a>.<a href='#SkRect_width'>width()</a> and <a href='#SkRRect_MakeRectXY_yRad'>yRad</a> is at least half
+<a href='#SkRRect_MakeRectXY_rect'>rect</a>.<a href='#SkRect_height'>height()</a>, sets to <a href='#SkRRect_kOval_Type'>kOval_Type</a>.
+Otherwise, sets to <a href='#SkRRect_kSimple_Type'>kSimple_Type</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_MakeRectXY_rect'><code><strong>rect</strong></code></a></td>
+    <td>bounds of rounded rectangle</td>
+  </tr>
+  <tr>    <td><a name='SkRRect_MakeRectXY_xRad'><code><strong>xRad</strong></code></a></td>
+    <td>x-axis radius of corners</td>
+  </tr>
+  <tr>    <td><a name='SkRRect_MakeRectXY_yRad'><code><strong>yRad</strong></code></a></td>
+    <td>y-axis radius of corners</td>
+  </tr>
+</table>
+
+### Return Value
+
+rounded rectangle
+
+### Example
+
+<div><fiddle-embed name="@RRect_MakeRectXY"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_setRectXY'>setRectXY</a>
+
+<a name='SkRRect_setOval'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRRect_setOval'>setOval</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='undocumented#Oval'>oval</a>)
+</pre>
+
+Sets bounds to <a href='#SkRRect_setOval_oval'>oval</a>, x-axis radii to half <a href='#SkRRect_setOval_oval'>oval</a>.<a href='#SkRect_width'>width()</a>, and all y-axis radii
+to half <a href='#SkRRect_setOval_oval'>oval</a>.<a href='#SkRect_height'>height()</a>. If <a href='#SkRRect_setOval_oval'>oval</a> bounds is empty, sets to <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>.
+Otherwise, sets to <a href='#SkRRect_kOval_Type'>kOval_Type</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_setOval_oval'><code><strong>oval</strong></code></a></td>
+    <td>bounds of <a href='#SkRRect_setOval_oval'>oval</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@RRect_setOval"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_MakeOval'>MakeOval</a>
+
+<a name='SkRRect_setRectXY'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRRect_setRectXY'>setRectXY</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='undocumented#SkScalar'>SkScalar</a> xRad, <a href='undocumented#SkScalar'>SkScalar</a> yRad)
+</pre>
+
+Sets to rounded rectangle with the same radii for all four corners.
+If <a href='#SkRRect_setRectXY_rect'>rect</a> is empty, sets to <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>.
+Otherwise, if <a href='#SkRRect_setRectXY_xRad'>xRad</a> or <a href='#SkRRect_setRectXY_yRad'>yRad</a> is zero, sets to <a href='#SkRRect_kRect_Type'>kRect_Type</a>.
+Otherwise, if <a href='#SkRRect_setRectXY_xRad'>xRad</a> is at least half <a href='#SkRRect_setRectXY_rect'>rect</a>.<a href='#SkRect_width'>width()</a> and <a href='#SkRRect_setRectXY_yRad'>yRad</a> is at least half
+<a href='#SkRRect_setRectXY_rect'>rect</a>.<a href='#SkRect_height'>height()</a>, sets to <a href='#SkRRect_kOval_Type'>kOval_Type</a>.
+Otherwise, sets to <a href='#SkRRect_kSimple_Type'>kSimple_Type</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_setRectXY_rect'><code><strong>rect</strong></code></a></td>
+    <td>bounds of rounded rectangle</td>
+  </tr>
+  <tr>    <td><a name='SkRRect_setRectXY_xRad'><code><strong>xRad</strong></code></a></td>
+    <td>x-axis radius of corners</td>
+  </tr>
+  <tr>    <td><a name='SkRRect_setRectXY_yRad'><code><strong>yRad</strong></code></a></td>
+    <td>y-axis radius of corners</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@RRect_setRectXY"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_MakeRectXY'>MakeRectXY</a> <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_addRoundRect'>addRoundRect</a>
+
+<a name='SkRRect_setNinePatch'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRRect_setNinePatch'>setNinePatch</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='undocumented#SkScalar'>SkScalar</a> leftRad, <a href='undocumented#SkScalar'>SkScalar</a> topRad, <a href='undocumented#SkScalar'>SkScalar</a> rightRad,
+                  <a href='undocumented#SkScalar'>SkScalar</a> bottomRad)
+</pre>
+
+Sets bounds to <a href='#SkRRect_setNinePatch_rect'>rect</a>. Sets radii to (<a href='#SkRRect_setNinePatch_leftRad'>leftRad</a>, <a href='#SkRRect_setNinePatch_topRad'>topRad</a>), (<a href='#SkRRect_setNinePatch_rightRad'>rightRad</a>, <a href='#SkRRect_setNinePatch_topRad'>topRad</a>),
+(<a href='#SkRRect_setNinePatch_rightRad'>rightRad</a>, <a href='#SkRRect_setNinePatch_bottomRad'>bottomRad</a>), (<a href='#SkRRect_setNinePatch_leftRad'>leftRad</a>, <a href='#SkRRect_setNinePatch_bottomRad'>bottomRad</a>).
+
+If <a href='#SkRRect_setNinePatch_rect'>rect</a> is empty, sets to <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>.
+Otherwise, if <a href='#SkRRect_setNinePatch_leftRad'>leftRad</a> and <a href='#SkRRect_setNinePatch_rightRad'>rightRad</a> are zero, sets to <a href='#SkRRect_kRect_Type'>kRect_Type</a>.
+Otherwise, if <a href='#SkRRect_setNinePatch_topRad'>topRad</a> and <a href='#SkRRect_setNinePatch_bottomRad'>bottomRad</a> are zero, sets to <a href='#SkRRect_kRect_Type'>kRect_Type</a>.
+Otherwise, if <a href='#SkRRect_setNinePatch_leftRad'>leftRad</a> and <a href='#SkRRect_setNinePatch_rightRad'>rightRad</a> are equal and at least half <a href='#SkRRect_setNinePatch_rect'>rect</a>.<a href='#SkRect_width'>width()</a>, and
+<a href='#SkRRect_setNinePatch_topRad'>topRad</a> and <a href='#SkRRect_setNinePatch_bottomRad'>bottomRad</a> are equal at least half <a href='#SkRRect_setNinePatch_rect'>rect</a>.<a href='#SkRect_height'>height()</a>, sets to <a href='#SkRRect_kOval_Type'>kOval_Type</a>.
+Otherwise, if <a href='#SkRRect_setNinePatch_leftRad'>leftRad</a> and <a href='#SkRRect_setNinePatch_rightRad'>rightRad</a> are equal, and <a href='#SkRRect_setNinePatch_topRad'>topRad</a> and <a href='#SkRRect_setNinePatch_bottomRad'>bottomRad</a> are equal,
+sets to <a href='#SkRRect_kSimple_Type'>kSimple_Type</a>. Otherwise, sets to <a href='#SkRRect_kNinePatch_Type'>kNinePatch_Type</a>.
+
+Nine <a href='undocumented#Patch'>patch</a> refers to the nine parts defined by the radii: one center rectangle,
+four edge <a href='undocumented#Patch'>patches</a>, and four corner <a href='undocumented#Patch'>patches</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_setNinePatch_rect'><code><strong>rect</strong></code></a></td>
+    <td>bounds of rounded rectangle</td>
+  </tr>
+  <tr>    <td><a name='SkRRect_setNinePatch_leftRad'><code><strong>leftRad</strong></code></a></td>
+    <td>left-top and left-bottom x-axis radius</td>
+  </tr>
+  <tr>    <td><a name='SkRRect_setNinePatch_topRad'><code><strong>topRad</strong></code></a></td>
+    <td>left-top and right-top y-axis radius</td>
+  </tr>
+  <tr>    <td><a name='SkRRect_setNinePatch_rightRad'><code><strong>rightRad</strong></code></a></td>
+    <td>right-top and right-bottom x-axis radius</td>
+  </tr>
+  <tr>    <td><a name='SkRRect_setNinePatch_bottomRad'><code><strong>bottomRad</strong></code></a></td>
+    <td>left-bottom and right-bottom y-axis radius</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@RRect_setNinePatch"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_setRectRadii'>setRectRadii</a>
+
+<a name='SkRRect_setRectRadii'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRRect_setRectRadii'>setRectRadii</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, const <a href='SkPoint_Reference#SkVector'>SkVector</a> radii[4])
+</pre>
+
+Sets bounds to <a href='#SkRRect_setRectRadii_rect'>rect</a>. Sets <a href='#SkRRect_setRectRadii_radii'>radii</a> array for individual control of all for corners.
+
+If <a href='#SkRRect_setRectRadii_rect'>rect</a> is empty, sets to <a href='#SkRRect_kEmpty_Type'>kEmpty_Type</a>.
+Otherwise, if one of each corner <a href='#SkRRect_setRectRadii_radii'>radii</a> are zero, sets to <a href='#SkRRect_kRect_Type'>kRect_Type</a>.
+Otherwise, if all x-axis <a href='#SkRRect_setRectRadii_radii'>radii</a> are equal and at least half <a href='#SkRRect_setRectRadii_rect'>rect</a>.<a href='#SkRect_width'>width()</a>, and
+all y-axis <a href='#SkRRect_setRectRadii_radii'>radii</a> are equal at least half <a href='#SkRRect_setRectRadii_rect'>rect</a>.<a href='#SkRect_height'>height()</a>, sets to <a href='#SkRRect_kOval_Type'>kOval_Type</a>.
+Otherwise, if all x-axis <a href='#SkRRect_setRectRadii_radii'>radii</a> are equal, and all y-axis <a href='#SkRRect_setRectRadii_radii'>radii</a> are equal,
+sets to <a href='#SkRRect_kSimple_Type'>kSimple_Type</a>. Otherwise, sets to <a href='#SkRRect_kNinePatch_Type'>kNinePatch_Type</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_setRectRadii_rect'><code><strong>rect</strong></code></a></td>
+    <td>bounds of rounded rectangle</td>
+  </tr>
+  <tr>    <td><a name='SkRRect_setRectRadii_radii'><code><strong>radii</strong></code></a></td>
+    <td>corner x-axis and y-axis <a href='#SkRRect_setRectRadii_radii'>radii</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@RRect_setRectRadii"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_setNinePatch'>setNinePatch</a> <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_addRoundRect'>addRoundRect</a>
+
+<a name='SkRRect_Corner'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkRRect_Corner'>Corner</a> {
+        <a href='#SkRRect_kUpperLeft_Corner'>kUpperLeft_Corner</a>,
+        <a href='#SkRRect_kUpperRight_Corner'>kUpperRight_Corner</a>,
+        <a href='#SkRRect_kLowerRight_Corner'>kLowerRight_Corner</a>,
+        <a href='#SkRRect_kLowerLeft_Corner'>kLowerLeft_Corner</a>,
+    };
+</pre>
+
+The radii are stored: top-left, top-right, bottom-right, bottom-left.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRRect_kUpperLeft_Corner'><code>SkRRect::kUpperLeft_Corner</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+index of top-left corner radii</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRRect_kUpperRight_Corner'><code>SkRRect::kUpperRight_Corner</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+index of top-right corner radii</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRRect_kLowerRight_Corner'><code>SkRRect::kLowerRight_Corner</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+index of bottom-right corner radii</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRRect_kLowerLeft_Corner'><code>SkRRect::kLowerLeft_Corner</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+index of bottom-left corner radii</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@RRect_Corner"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_radii'>radii</a>
+
+<a name='SkRRect_rect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='#SkRRect_rect'>rect()</a>const
+</pre>
+
+Returns bounds. Bounds may have zero width or zero height. Bounds right is
+greater than or equal to left; bounds bottom is greater than or equal to top.
+Result is identical to <a href='#SkRRect_getBounds'>getBounds</a>().
+
+### Return Value
+
+bounding box
+
+### Example
+
+<div><fiddle-embed name="@RRect_rect">
+
+#### Example Output
+
+~~~~
+left bounds: (nan) 0
+left bounds: (inf) 0
+left bounds: (100) 60
+left bounds: (50) 50
+left bounds: (25) 25
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_getBounds'>getBounds</a>
+
+<a name='SkRRect_radii'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkPoint_Reference#SkVector'>SkVector</a> radii(<a href='#SkRRect_Corner'>Corner</a> corner)const
+</pre>
+
+Returns <a href='undocumented#Scalar'>scalar</a> pair for radius of <a href='undocumented#Curve'>curve</a> on x-axis and y-axis for one <a href='#SkRRect_radii_corner'>corner</a>.
+Both radii may be zero. If not zero, both are positive and finite.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_radii_corner'><code><strong>corner</strong></code></a></td>
+    <td>one of: <a href='#SkRRect_kUpperLeft_Corner'>kUpperLeft_Corner</a>, <a href='#SkRRect_kUpperRight_Corner'>kUpperRight_Corner</a>,</td>
+  </tr>
+</table>
+
+<a href='#SkRRect_kLowerRight_Corner'>kLowerRight_Corner</a>, <a href='#SkRRect_kLowerLeft_Corner'>kLowerLeft_Corner</a>
+
+### Return Value
+
+x-axis and y-axis radii for one <a href='#SkRRect_radii_corner'>corner</a>
+
+### Example
+
+<div><fiddle-embed name="@RRect_radii"><div>Finite values are scaled proportionately to fit; other values are set to zero.
+Scaled values cannot be larger than 25, half the bounding <a href='#RRect'>Round_Rect</a> width.
+Small scaled values are halved to scale in proportion to the y-axis <a href='#SkRRect_radii_corner'>corner</a>
+radius, which is twice the bounds height.
+</div>
+
+#### Example Output
+
+~~~~
+left corner: (nan) 0
+left corner: (inf) 0
+left corner: (100) 25
+left corner: (50) 25
+left corner: (25) 12.5
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_Corner'>Corner</a>
+
+<a name='SkRRect_getBounds'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='#SkRRect_getBounds'>getBounds</a>()const
+</pre>
+
+Returns bounds. Bounds may have zero width or zero height. Bounds right is
+greater than or equal to left; bounds bottom is greater than or equal to top.
+Result is identical to <a href='#SkRRect_rect'>rect()</a>.
+
+### Return Value
+
+bounding box
+
+### Example
+
+<div><fiddle-embed name="@RRect_getBounds"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_rect'>rect</a>
+
+<a name='SkRRect_equal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRRect_equal_operator'>operator==</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& a, const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& b)
+</pre>
+
+Returns true if bounds and radii in <a href='#SkRRect_equal_operator_a'>a</a> are equal to bounds and radii in <a href='#SkRRect_equal_operator_b'>b</a>.
+
+<a href='#SkRRect_equal_operator_a'>a</a> and <a href='#SkRRect_equal_operator_b'>b</a> are not equal if either contain NaN. <a href='#SkRRect_equal_operator_a'>a</a> and <a href='#SkRRect_equal_operator_b'>b</a> are equal if members
+contain zeroes with different signs.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_equal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> bounds and radii to compare</td>
+  </tr>
+  <tr>    <td><a name='SkRRect_equal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> bounds and radii to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if members are equal
+
+### Example
+
+<div><fiddle-embed name="df181af37f1d2b06f0f45af73df7b47d"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_notequal_operator'>operator!=</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& <a href='#SkRRect_equal_operator_a'>a</a>, const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& <a href='#SkRRect_equal_operator_b'>b</a>)
+
+<a name='SkRRect_notequal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRRect_notequal_operator'>operator!=</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& a, const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& b)
+</pre>
+
+Returns true if bounds and radii in <a href='#SkRRect_notequal_operator_a'>a</a> are not equal to bounds and radii in <a href='#SkRRect_notequal_operator_b'>b</a>.
+
+<a href='#SkRRect_notequal_operator_a'>a</a> and <a href='#SkRRect_notequal_operator_b'>b</a> are not equal if either contain NaN. <a href='#SkRRect_notequal_operator_a'>a</a> and <a href='#SkRRect_notequal_operator_b'>b</a> are equal if members
+contain zeroes with different signs.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_notequal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> bounds and radii to compare</td>
+  </tr>
+  <tr>    <td><a name='SkRRect_notequal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> bounds and radii to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if members are not equal
+
+### Example
+
+<div><fiddle-embed name="505e47b3e6474ebdecdc04c3c2af2c34"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_equal_operator'>operator==</a>(const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& <a href='#SkRRect_notequal_operator_a'>a</a>, const <a href='SkRRect_Reference#SkRRect'>SkRRect</a>& <a href='#SkRRect_notequal_operator_b'>b</a>)
+
+<a name='SkRRect_inset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void inset(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy, <a href='SkRRect_Reference#SkRRect'>SkRRect</a>* dst)const
+</pre>
+
+Copies <a href='SkRRect_Reference#SkRRect'>SkRRect</a> to <a href='#SkRRect_inset_dst'>dst</a>, then insets <a href='#SkRRect_inset_dst'>dst</a> bounds by <a href='#SkRRect_inset_dx'>dx</a> and <a href='#SkRRect_inset_dy'>dy</a>, and adjusts <a href='#SkRRect_inset_dst'>dst</a>
+radii by <a href='#SkRRect_inset_dx'>dx</a> and <a href='#SkRRect_inset_dy'>dy</a>. <a href='#SkRRect_inset_dx'>dx</a> and <a href='#SkRRect_inset_dy'>dy</a> may be positive, negative, or zero. <a href='#SkRRect_inset_dst'>dst</a> may be
+<a href='SkRRect_Reference#SkRRect'>SkRRect</a>.
+
+If either corner radius is zero, the corner has no curvature and is unchanged.
+Otherwise, if adjusted radius becomes negative, pins radius to zero.
+If <a href='#SkRRect_inset_dx'>dx</a> exceeds half <a href='#SkRRect_inset_dst'>dst</a> bounds width, <a href='#SkRRect_inset_dst'>dst</a> bounds left and right are set to
+bounds x-axis center. If <a href='#SkRRect_inset_dy'>dy</a> exceeds half <a href='#SkRRect_inset_dst'>dst</a> bounds height, <a href='#SkRRect_inset_dst'>dst</a> bounds top and
+bottom are set to bounds y-axis center.
+
+If <a href='#SkRRect_inset_dx'>dx</a> or <a href='#SkRRect_inset_dy'>dy</a> cause the bounds to become infinite, <a href='#SkRRect_inset_dst'>dst</a> bounds is zeroed.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_inset_dx'><code><strong>dx</strong></code></a></td>
+    <td>added to <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fLeft'>fLeft</a>, and subtracted from <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRRect_inset_dy'><code><strong>dy</strong></code></a></td>
+    <td>added to <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fTop'>fTop</a>, and subtracted from <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+  <tr>    <td><a name='SkRRect_inset_dst'><code><strong>dst</strong></code></a></td>
+    <td>insets bounds and radii</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@RRect_inset"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_outset'>outset</a> <a href='#SkRRect_offset'>offset</a> <a href='#SkRRect_makeOffset'>makeOffset</a>
+
+<a name='SkRRect_inset_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void inset(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Insets bounds by <a href='#SkRRect_inset_2_dx'>dx</a> and <a href='#SkRRect_inset_2_dy'>dy</a>, and adjusts radii by <a href='#SkRRect_inset_2_dx'>dx</a> and <a href='#SkRRect_inset_2_dy'>dy</a>. <a href='#SkRRect_inset_2_dx'>dx</a> and <a href='#SkRRect_inset_2_dy'>dy</a> may be
+positive, negative, or zero.
+
+If either corner radius is zero, the corner has no curvature and is unchanged.
+Otherwise, if adjusted radius becomes negative, pins radius to zero.
+If <a href='#SkRRect_inset_2_dx'>dx</a> exceeds half bounds width, bounds left and right are set to
+bounds x-axis center. If <a href='#SkRRect_inset_2_dy'>dy</a> exceeds half bounds height, bounds top and
+bottom are set to bounds y-axis center.
+
+If <a href='#SkRRect_inset_2_dx'>dx</a> or <a href='#SkRRect_inset_2_dy'>dy</a> cause the bounds to become infinite, bounds is zeroed.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_inset_2_dx'><code><strong>dx</strong></code></a></td>
+    <td>added to <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fLeft'>fLeft</a>, and subtracted from <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRRect_inset_2_dy'><code><strong>dy</strong></code></a></td>
+    <td>added to <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fTop'>fTop</a>, and subtracted from <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@RRect_inset_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_outset'>outset</a> <a href='#SkRRect_offset'>offset</a> <a href='#SkRRect_makeOffset'>makeOffset</a>
+
+<a name='SkRRect_outset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void outset(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy, <a href='SkRRect_Reference#SkRRect'>SkRRect</a>* dst)const
+</pre>
+
+Outsets <a href='#SkRRect_outset_dst'>dst</a> bounds by <a href='#SkRRect_outset_dx'>dx</a> and <a href='#SkRRect_outset_dy'>dy</a>, and adjusts radii by <a href='#SkRRect_outset_dx'>dx</a> and <a href='#SkRRect_outset_dy'>dy</a>. <a href='#SkRRect_outset_dx'>dx</a> and <a href='#SkRRect_outset_dy'>dy</a> may be
+positive, negative, or zero.
+
+If either corner radius is zero, the corner has no curvature and is unchanged.
+Otherwise, if adjusted radius becomes negative, pins radius to zero.
+If <a href='#SkRRect_outset_dx'>dx</a> exceeds half <a href='#SkRRect_outset_dst'>dst</a> bounds width, <a href='#SkRRect_outset_dst'>dst</a> bounds left and right are set to
+bounds x-axis center. If <a href='#SkRRect_outset_dy'>dy</a> exceeds half <a href='#SkRRect_outset_dst'>dst</a> bounds height, <a href='#SkRRect_outset_dst'>dst</a> bounds top and
+bottom are set to bounds y-axis center.
+
+If <a href='#SkRRect_outset_dx'>dx</a> or <a href='#SkRRect_outset_dy'>dy</a> cause the bounds to become infinite, <a href='#SkRRect_outset_dst'>dst</a> bounds is zeroed.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_outset_dx'><code><strong>dx</strong></code></a></td>
+    <td>subtracted from <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fLeft'>fLeft</a>, and added to <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRRect_outset_dy'><code><strong>dy</strong></code></a></td>
+    <td>subtracted from <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fTop'>fTop</a>, and added to <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+  <tr>    <td><a name='SkRRect_outset_dst'><code><strong>dst</strong></code></a></td>
+    <td>outset bounds and radii</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@RRect_outset"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_inset'>inset</a> <a href='#SkRRect_offset'>offset</a> <a href='#SkRRect_makeOffset'>makeOffset</a>
+
+<a name='SkRRect_outset_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void outset(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Outsets bounds by <a href='#SkRRect_outset_2_dx'>dx</a> and <a href='#SkRRect_outset_2_dy'>dy</a>, and adjusts radii by <a href='#SkRRect_outset_2_dx'>dx</a> and <a href='#SkRRect_outset_2_dy'>dy</a>. <a href='#SkRRect_outset_2_dx'>dx</a> and <a href='#SkRRect_outset_2_dy'>dy</a> may be
+positive, negative, or zero.
+
+If either corner radius is zero, the corner has no curvature and is unchanged.
+Otherwise, if adjusted radius becomes negative, pins radius to zero.
+If <a href='#SkRRect_outset_2_dx'>dx</a> exceeds half bounds width, bounds left and right are set to
+bounds x-axis center. If <a href='#SkRRect_outset_2_dy'>dy</a> exceeds half bounds height, bounds top and
+bottom are set to bounds y-axis center.
+
+If <a href='#SkRRect_outset_2_dx'>dx</a> or <a href='#SkRRect_outset_2_dy'>dy</a> cause the bounds to become infinite, bounds is zeroed.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_outset_2_dx'><code><strong>dx</strong></code></a></td>
+    <td>subtracted from <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fLeft'>fLeft</a>, and added to <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRRect_outset_2_dy'><code><strong>dy</strong></code></a></td>
+    <td>subtracted from <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fTop'>fTop</a>, and added to <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@RRect_outset_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_inset'>inset</a> <a href='#SkRRect_offset'>offset</a> <a href='#SkRRect_makeOffset'>makeOffset</a>
+
+<a name='SkRRect_offset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void offset(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Translates <a href='SkRRect_Reference#SkRRect'>SkRRect</a> by (<a href='#SkRRect_offset_dx'>dx</a>, <a href='#SkRRect_offset_dy'>dy</a>).
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_offset_dx'><code><strong>dx</strong></code></a></td>
+    <td>offset added to <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fLeft'>fLeft</a> and <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRRect_offset_dy'><code><strong>dy</strong></code></a></td>
+    <td>offset added to <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fTop'>fTop</a> and <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@RRect_offset"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_makeOffset'>makeOffset</a>  <a href='#SkRRect_inset'>inset outset</a>
+
+<a name='SkRRect_makeOffset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='#SkRRect_makeOffset'>makeOffset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)const
+</pre>
+
+Returns <a href='SkRRect_Reference#SkRRect'>SkRRect</a> translated by (<a href='#SkRRect_makeOffset_dx'>dx</a>, <a href='#SkRRect_makeOffset_dy'>dy</a>).
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_makeOffset_dx'><code><strong>dx</strong></code></a></td>
+    <td>offset added to <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fLeft'>fLeft</a> and <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRRect_makeOffset_dy'><code><strong>dy</strong></code></a></td>
+    <td>offset added to <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fTop'>fTop</a> and <a href='#SkRRect_rect'>rect()</a>.<a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkRRect_Reference#SkRRect'>SkRRect</a> bounds offset by (<a href='#SkRRect_makeOffset_dx'>dx</a>, <a href='#SkRRect_makeOffset_dy'>dy</a>), with unchanged corner radii
+
+### Example
+
+<div><fiddle-embed name="@RRect_makeOffset"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_offset'>offset</a>  <a href='#SkRRect_inset'>inset outset</a>
+
+<a name='SkRRect_contains'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool contains(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='SkRect_Reference#Rect'>rect</a>)const
+</pre>
+
+Returns true if <a href='#SkRRect_contains_rect'>rect</a> is inside the bounds and corner radii, and if
+<a href='SkRRect_Reference#SkRRect'>SkRRect</a> and <a href='#SkRRect_contains_rect'>rect</a> are not empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_contains_rect'><code><strong>rect</strong></code></a></td>
+    <td>area tested for containment</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkRRect_Reference#SkRRect'>SkRRect</a> contains <a href='#SkRRect_contains_rect'>rect</a>
+
+### Example
+
+<div><fiddle-embed name="0bb057140e4119234bdd2e8dd2f0fa19"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_contains'>contains</a>
+
+<a name='SkRRect_isValid'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRRect_isValid'>isValid</a>()const
+</pre>
+
+Returns true if bounds and radii values are finite and describe a <a href='SkRRect_Reference#SkRRect'>SkRRect</a>
+<a href='SkRRect_Reference#SkRRect'>SkRRect</a>::<a href='#SkRRect_Type'>Type</a> that matches <a href='#SkRRect_getType'>getType</a>(). All <a href='SkRRect_Reference#SkRRect'>SkRRect</a> methods construct valid types,
+even if the input values are not valid. Invalid <a href='SkRRect_Reference#SkRRect'>SkRRect</a> <a href='undocumented#Data'>data</a> can only
+be generated by corrupting memory.
+
+### Return Value
+
+true if bounds and radii match <a href='#SkRRect_type'>type()</a>
+
+### Example
+
+<div><fiddle-embed name="8cc1f21c98c0416f7724ad218f557a00"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_Type'>Type</a> <a href='#SkRRect_getType'>getType</a>
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRRect_kSizeInMemory'><code>SkRRect::kSizeInMemory</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>48</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Space required to write the contents of <a href='SkRRect_Reference#SkRRect'>SkRRect</a> into a buffer; always a multiple of four.
+</td>
+  </tr>
+</table>
+
+<a name='SkRRect_writeToMemory'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkRRect_writeToMemory'>writeToMemory</a>(void* buffer)const
+</pre>
+
+Writes <a href='SkRRect_Reference#SkRRect'>SkRRect</a> to <a href='#SkRRect_writeToMemory_buffer'>buffer</a>. Writes <a href='#SkRRect_kSizeInMemory'>kSizeInMemory</a> bytes, and returns
+<a href='#SkRRect_kSizeInMemory'>kSizeInMemory</a>, the number of bytes written.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_writeToMemory_buffer'><code><strong>buffer</strong></code></a></td>
+    <td>storage for <a href='SkRRect_Reference#SkRRect'>SkRRect</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+bytes written, <a href='#SkRRect_kSizeInMemory'>kSizeInMemory</a>
+
+### Example
+
+<div><fiddle-embed name="d6f5a3d21727ddc15e10ef4d5103ff91"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_readFromMemory'>readFromMemory</a>
+
+<a name='SkRRect_readFromMemory'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkRRect_readFromMemory'>readFromMemory</a>(const void* buffer, size_t length)
+</pre>
+
+Reads <a href='SkRRect_Reference#SkRRect'>SkRRect</a> from <a href='#SkRRect_readFromMemory_buffer'>buffer</a>, reading <a href='#SkRRect_kSizeInMemory'>kSizeInMemory</a> bytes.
+Returns <a href='#SkRRect_kSizeInMemory'>kSizeInMemory</a>, bytes read if <a href='#SkRRect_readFromMemory_length'>length</a> is at least <a href='#SkRRect_kSizeInMemory'>kSizeInMemory</a>.
+Otherwise, returns zero.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_readFromMemory_buffer'><code><strong>buffer</strong></code></a></td>
+    <td>memory to read from</td>
+  </tr>
+  <tr>    <td><a name='SkRRect_readFromMemory_length'><code><strong>length</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of <a href='#SkRRect_readFromMemory_buffer'>buffer</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+bytes read, or 0 if <a href='#SkRRect_readFromMemory_length'>length</a> is less than <a href='#SkRRect_kSizeInMemory'>kSizeInMemory</a>
+
+### Example
+
+<div><fiddle-embed name="50969745cf2b23544362f4cff5592b75"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_writeToMemory'>writeToMemory</a>
+
+<a name='SkRRect_transform'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool transform(const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>& <a href='SkMatrix_Reference#Matrix'>matrix</a>, <a href='SkRRect_Reference#SkRRect'>SkRRect</a>* dst)const
+</pre>
+
+Transforms by <a href='SkRRect_Reference#SkRRect'>SkRRect</a> by <a href='#SkRRect_transform_matrix'>matrix</a>, storing result in <a href='#SkRRect_transform_dst'>dst</a>.
+Returns true if <a href='SkRRect_Reference#SkRRect'>SkRRect</a> transformed can be represented by another <a href='SkRRect_Reference#SkRRect'>SkRRect</a>.
+Returns false if <a href='#SkRRect_transform_matrix'>matrix</a> contains transformations other than scale and translate.
+
+Asserts in debug builds if <a href='SkRRect_Reference#SkRRect'>SkRRect</a> equals <a href='#SkRRect_transform_dst'>dst</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_transform_matrix'><code><strong>matrix</strong></code></a></td>
+    <td><a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a> specifying the transform</td>
+  </tr>
+  <tr>    <td><a name='SkRRect_transform_dst'><code><strong>dst</strong></code></a></td>
+    <td><a href='SkRRect_Reference#SkRRect'>SkRRect</a> to store the result</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if transformation succeeded.
+
+### Example
+
+<div><fiddle-embed name="68a5d24f22e2d798608fce8a20e47fd0"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_transform'>transform</a>
+
+<a name='SkRRect_dump'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRRect_dump'>dump</a>(bool asHex)const
+</pre>
+
+Writes <a href='undocumented#Text'>text</a> representation of <a href='SkRRect_Reference#SkRRect'>SkRRect</a> to standard output.
+Set <a href='#SkRRect_dump_asHex'>asHex</a> true to generate exact binary representations
+of floating <a href='SkPoint_Reference#Point'>point</a> numbers.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRRect_dump_asHex'><code><strong>asHex</strong></code></a></td>
+    <td>true if <a href='undocumented#SkScalar'>SkScalar</a> values are written as hexadecimal</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@RRect_dump">
+
+#### Example Output
+
+~~~~
+SkRect::MakeLTRB(0.857143f, 0.666667f, 0.857143f, 0.666667f);
+const SkPoint corners[] = {
+{ 0, 0 },
+{ 0, 0 },
+{ 0, 0 },
+{ 0, 0 },
+};
+SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */
+SkBits2Float(0x3f2aaaab), /* 0.666667 */
+SkBits2Float(0x3f5b6db7), /* 0.857143 */
+SkBits2Float(0x3f2aaaab)  /* 0.666667 */);
+const SkPoint corners[] = {
+{ SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */
+{ SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */
+{ SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */
+{ SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */
+};
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_dumpHex'>dumpHex</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_dump'>dump</a> <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_dump'>dump</a> <a href='undocumented#SkPathMeasure'>SkPathMeasure</a>::<a href='#SkPathMeasure_dump'>dump</a>
+
+<a name='SkRRect_dump_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRRect_dump'>dump()</a>const
+</pre>
+
+Writes <a href='undocumented#Text'>text</a> representation of <a href='SkRRect_Reference#SkRRect'>SkRRect</a> to standard output. The representation
+may be directly compiled as C++ code. Floating <a href='SkPoint_Reference#Point'>point</a> values are written
+with limited precision; it may not be possible to reconstruct original
+<a href='SkRRect_Reference#SkRRect'>SkRRect</a> from output.
+
+### Example
+
+<div><fiddle-embed name="@RRect_dump_2">
+
+#### Example Output
+
+~~~~
+SkRect::MakeLTRB(0.857143f, 0.666667f, 0.857143f, 0.666667f);
+const SkPoint corners[] = {
+{ 0, 0 },
+{ 0, 0 },
+{ 0, 0 },
+{ 0, 0 },
+};
+rrect is not equal to copy
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_dumpHex'>dumpHex</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_dump'>dump</a> <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_dump'>dump</a> <a href='undocumented#SkPathMeasure'>SkPathMeasure</a>::<a href='#SkPathMeasure_dump'>dump</a>
+
+<a name='SkRRect_dumpHex'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRRect_dumpHex'>dumpHex</a>()const
+</pre>
+
+Writes <a href='undocumented#Text'>text</a> representation of <a href='SkRRect_Reference#SkRRect'>SkRRect</a> to standard output. The representation
+may be directly compiled as C++ code. Floating <a href='SkPoint_Reference#Point'>point</a> values are written
+in hexadecimal to preserve their exact bit pattern. The output reconstructs the
+original <a href='SkRRect_Reference#SkRRect'>SkRRect</a>.
+
+### Example
+
+<div><fiddle-embed name="@RRect_dumpHex">
+
+#### Example Output
+
+~~~~
+SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */
+SkBits2Float(0x3f2aaaab), /* 0.666667 */
+SkBits2Float(0x3f5b6db7), /* 0.857143 */
+SkBits2Float(0x3f2aaaab)  /* 0.666667 */);
+const SkPoint corners[] = {
+{ SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */
+{ SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */
+{ SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */
+{ SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */
+};
+rrect is equal to copy
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRRect_dump'>dump</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_dumpHex'>dumpHex</a> <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_dumpHex'>dumpHex</a>
+
diff --git a/src/third_party/skia/site/user/api/SkRect_Reference.md b/src/third_party/skia/site/user/api/SkRect_Reference.md
new file mode 100644
index 0000000..70408e2
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkRect_Reference.md
@@ -0,0 +1,2867 @@
+SkRect Reference
+===
+
+
+<a name='SkRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+struct <a href='SkRect_Reference#SkRect'>SkRect</a> {
+
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRect_fLeft'>fLeft</a>;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRect_fTop'>fTop</a>;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRect_fRight'>fRight</a>;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRect_fBottom'>fBottom</a>;
+
+    static constexpr <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_MakeEmpty'>MakeEmpty</a>();
+    static constexpr <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_MakeWH'>MakeWH</a>(<a href='undocumented#SkScalar'>SkScalar</a> w, <a href='undocumented#SkScalar'>SkScalar</a> h);
+    static <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_MakeIWH'>MakeIWH</a>(int w, int h);
+    static constexpr <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_MakeSize'>MakeSize</a>(const <a href='undocumented#SkSize'>SkSize</a>& <a href='undocumented#Size'>size</a>);
+    static constexpr <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_MakeLTRB'>MakeLTRB</a>(<a href='undocumented#SkScalar'>SkScalar</a> l, <a href='undocumented#SkScalar'>SkScalar</a> t, <a href='undocumented#SkScalar'>SkScalar</a> r,
+                                     <a href='undocumented#SkScalar'>SkScalar</a> b);
+    static constexpr <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_MakeXYWH'>MakeXYWH</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, <a href='undocumented#SkScalar'>SkScalar</a> w,
+                                     <a href='undocumented#SkScalar'>SkScalar</a> h);
+    static <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_Make'>Make</a>(const <a href='undocumented#SkISize'>SkISize</a>& <a href='undocumented#Size'>size</a>);
+    static <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_Make'>Make</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& irect);
+    bool <a href='#SkRect_isEmpty'>isEmpty</a>() const;
+    bool <a href='#SkRect_isSorted'>isSorted</a>() const;
+    bool <a href='#SkRect_isFinite'>isFinite</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRect_x'>x()</a> const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRect_y'>y()</a> const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRect_left'>left()</a> const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRect_top'>top()</a> const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRect_right'>right()</a> const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRect_bottom'>bottom()</a> const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRect_width'>width()</a> const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRect_height'>height()</a> const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRect_centerX'>centerX</a>() const;
+    <a href='undocumented#SkScalar'>SkScalar</a> <a href='#SkRect_centerY'>centerY</a>() const;
+    friend bool <a href='#SkRect_equal_operator'>operator==</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& a, const <a href='SkRect_Reference#SkRect'>SkRect</a>& b);
+    friend bool <a href='#SkRect_notequal_operator'>operator!=</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& a, const <a href='SkRect_Reference#SkRect'>SkRect</a>& b);
+    void <a href='#SkRect_toQuad'>toQuad</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='SkPath_Reference#Quad'>quad</a>[4]) const;
+    void <a href='#SkRect_setEmpty'>setEmpty</a>();
+    void <a href='#SkRect_set'>set</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& src);
+    void <a href='#SkRect_set'>set</a>(<a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top, <a href='undocumented#SkScalar'>SkScalar</a> right, <a href='undocumented#SkScalar'>SkScalar</a> bottom);
+    void <a href='#SkRect_setLTRB'>setLTRB</a>(<a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top, <a href='undocumented#SkScalar'>SkScalar</a> right, <a href='undocumented#SkScalar'>SkScalar</a> bottom);
+    void <a href='#SkRect_iset'>iset</a>(int left, int top, int right, int bottom);
+    void <a href='#SkRect_isetWH'>isetWH</a>(int width, int height);
+    void <a href='#SkRect_set'>set</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], int count);
+    void <a href='#SkRect_setBounds'>setBounds</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], int count);
+    bool <a href='#SkRect_setBoundsCheck'>setBoundsCheck</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], int count);
+    void <a href='#SkRect_setBoundsNoCheck'>setBoundsNoCheck</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], int count);
+    void <a href='#SkRect_set'>set</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p0, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1);
+    void <a href='#SkRect_setXYWH'>setXYWH</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, <a href='undocumented#SkScalar'>SkScalar</a> width, <a href='undocumented#SkScalar'>SkScalar</a> height);
+    void <a href='#SkRect_setWH'>setWH</a>(<a href='undocumented#SkScalar'>SkScalar</a> width, <a href='undocumented#SkScalar'>SkScalar</a> height);
+    <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_makeOffset'>makeOffset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy) const;
+    <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_makeInset'>makeInset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy) const;
+    <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_makeOutset'>makeOutset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy) const;
+    void <a href='#SkRect_offset'>offset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    void <a href='#SkRect_offset'>offset</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& delta);
+    void <a href='#SkRect_offsetTo'>offsetTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> newX, <a href='undocumented#SkScalar'>SkScalar</a> newY);
+    void <a href='#SkRect_inset'>inset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    void <a href='#SkRect_outset'>outset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy);
+    bool <a href='#SkRect_intersect'>intersect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r);
+    bool <a href='#SkRect_intersect'>intersect</a>(<a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top, <a href='undocumented#SkScalar'>SkScalar</a> right, <a href='undocumented#SkScalar'>SkScalar</a> bottom);
+    bool <a href='#SkRect_intersect'>intersect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& a, const <a href='SkRect_Reference#SkRect'>SkRect</a>& b);
+    bool <a href='#SkRect_intersects'>intersects</a>(<a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top, <a href='undocumented#SkScalar'>SkScalar</a> right, <a href='undocumented#SkScalar'>SkScalar</a> bottom) const;
+    bool <a href='#SkRect_intersects'>intersects</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r) const;
+    static bool <a href='#SkRect_Intersects'>Intersects</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& a, const <a href='SkRect_Reference#SkRect'>SkRect</a>& b);
+    void <a href='#SkRect_join'>join</a>(<a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top, <a href='undocumented#SkScalar'>SkScalar</a> right, <a href='undocumented#SkScalar'>SkScalar</a> bottom);
+    void <a href='#SkRect_join'>join</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r);
+    void <a href='#SkRect_joinNonEmptyArg'>joinNonEmptyArg</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r);
+    void <a href='#SkRect_joinPossiblyEmptyRect'>joinPossiblyEmptyRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r);
+    bool <a href='#SkRect_contains'>contains</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y) const;
+    bool <a href='#SkRect_contains'>contains</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r) const;
+    bool <a href='#SkRect_contains'>contains</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& r) const;
+    void <a href='#SkRect_round'>round</a>(<a href='SkIRect_Reference#SkIRect'>SkIRect</a>* dst) const;
+    void <a href='#SkRect_roundOut'>roundOut</a>(<a href='SkIRect_Reference#SkIRect'>SkIRect</a>* dst) const;
+    void <a href='#SkRect_roundOut'>roundOut</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* dst) const;
+    void <a href='#SkRect_roundIn'>roundIn</a>(<a href='SkIRect_Reference#SkIRect'>SkIRect</a>* dst) const;
+    <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkRect_round'>round()</a> const;
+    <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkRect_roundOut'>roundOut</a>() const;
+    void <a href='#SkRect_sort'>sort()</a>;
+    <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_makeSorted'>makeSorted</a>() const;
+    const <a href='undocumented#SkScalar'>SkScalar</a>* <a href='#SkRect_asScalars'>asScalars</a>() const;
+    void <a href='#SkRect_dump'>dump</a>(bool asHex) const;
+    void <a href='#SkRect_dump'>dump()</a> const;
+    void <a href='#SkRect_dumpHex'>dumpHex</a>() const;
+};
+
+</pre>
+
+<a href='SkRect_Reference#SkRect'>SkRect</a> holds four <a href='undocumented#SkScalar'>SkScalar</a> coordinates describing the upper and
+lower bounds of a rectangle. <a href='SkRect_Reference#SkRect'>SkRect</a> may be created from outer bounds or
+from position, width, and height. <a href='SkRect_Reference#SkRect'>SkRect</a> describes an area; if its right
+is less than or equal to its left, or if its bottom is less than or equal to
+its top, it is considered empty.
+
+<a href='SkRect_Reference#SkRect'>SkRect</a> can be constructed from int values to avoid compiler warnings that
+integer input cannot convert to <a href='undocumented#SkScalar'>SkScalar</a> without loss of precision.<table style='border-collapse: collapse; width: 62.5em'>
+
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Type</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Member</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRect_fLeft'><code>fLeft</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+May contain any value, including infinities and NaN. The smaller of the
+horizontal values when sorted. When equal to or greater than <a href='#SkRect_fRight'>fRight</a>, <a href='SkRect_Reference#Rect'>Rect</a> is empty.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRect_fTop'><code>fTop</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+May contain any value, including infinities and NaN. The smaller of the
+vertical values when sorted. When equal to or greater than <a href='#SkRect_fBottom'>fBottom</a>, <a href='SkRect_Reference#Rect'>Rect</a> is empty.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRect_fRight'><code>fRight</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+May contain any value, including infinities and NaN. The larger of the
+horizontal values when sorted. When equal to or less than <a href='#SkRect_fLeft'>fLeft</a>, <a href='SkRect_Reference#Rect'>Rect</a> is empty.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRect_fBottom'><code>fBottom</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+May contain any value, including infinities and NaN. The larger of the
+vertical values when sorted. When equal to or less than <a href='#SkRect_fTop'>fTop</a>, <a href='SkRect_Reference#Rect'>Rect</a> is empty.
+</td>
+  </tr>
+</table>
+
+<a name='SkRect_MakeEmpty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static constexpr <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_MakeEmpty'>MakeEmpty</a>()
+</pre>
+
+Returns constructed <a href='SkRect_Reference#SkRect'>SkRect</a> set to (0, 0, 0, 0).
+Many other rectangles are empty; if left is equal to or greater than right,
+or if top is equal to or greater than bottom. Setting all members to zero
+is a convenience, but does not designate a special empty rectangle.
+
+### Return Value
+
+bounds (0, 0, 0, 0)
+
+### Example
+
+<div><fiddle-embed name="@Rect_MakeEmpty">
+
+#### Example Output
+
+~~~~
+MakeEmpty isEmpty: true
+offset rect isEmpty: true
+inset rect isEmpty: true
+outset rect isEmpty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_isEmpty'>isEmpty</a> <a href='#SkRect_setEmpty'>setEmpty</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_MakeEmpty'>MakeEmpty</a>
+
+<a name='SkRect_MakeWH'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static constexpr <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_MakeWH'>MakeWH</a>(<a href='undocumented#SkScalar'>SkScalar</a> w, <a href='undocumented#SkScalar'>SkScalar</a> h)
+</pre>
+
+Returns constructed <a href='SkRect_Reference#SkRect'>SkRect</a> set to <a href='undocumented#SkScalar'>SkScalar</a> values (0, 0, <a href='#SkRect_MakeWH_w'>w</a>, <a href='#SkRect_MakeWH_h'>h</a>). Does not
+validate input; <a href='#SkRect_MakeWH_w'>w</a> or <a href='#SkRect_MakeWH_h'>h</a> may be negative.
+
+Passing integer values may generate a compiler warning since <a href='SkRect_Reference#SkRect'>SkRect</a> cannot
+represent 32-bit integers exactly. Use <a href='SkIRect_Reference#SkIRect'>SkIRect</a> for an exact integer rectangle.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_MakeWH_w'><code><strong>w</strong></code></a></td>
+    <td><a href='undocumented#SkScalar'>SkScalar</a> width of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_MakeWH_h'><code><strong>h</strong></code></a></td>
+    <td><a href='undocumented#SkScalar'>SkScalar</a> height of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+bounds (0, 0, <a href='#SkRect_MakeWH_w'>w</a>, <a href='#SkRect_MakeWH_h'>h</a>)
+
+### Example
+
+<div><fiddle-embed name="@Rect_MakeWH">
+
+#### Example Output
+
+~~~~
+all equal
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_MakeSize'>MakeSize</a> <a href='#SkRect_MakeXYWH'>MakeXYWH</a> <a href='#SkRect_MakeIWH'>MakeIWH</a> <a href='#SkRect_setWH'>setWH</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_MakeWH'>MakeWH</a>
+
+<a name='SkRect_MakeIWH'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_MakeIWH'>MakeIWH</a>(int w, int h)
+</pre>
+
+Returns constructed <a href='SkRect_Reference#SkRect'>SkRect</a> set to integer values (0, 0, <a href='#SkRect_MakeIWH_w'>w</a>, <a href='#SkRect_MakeIWH_h'>h</a>). Does not validate
+input; <a href='#SkRect_MakeIWH_w'>w</a> or <a href='#SkRect_MakeIWH_h'>h</a> may be negative.
+
+Use to avoid a compiler warning that input may lose precision when stored.
+Use <a href='SkIRect_Reference#SkIRect'>SkIRect</a> for an exact integer rectangle.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_MakeIWH_w'><code><strong>w</strong></code></a></td>
+    <td>integer width of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_MakeIWH_h'><code><strong>h</strong></code></a></td>
+    <td>integer height of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+bounds (0, 0, <a href='#SkRect_MakeIWH_w'>w</a>, <a href='#SkRect_MakeIWH_h'>h</a>)
+
+### Example
+
+<div><fiddle-embed name="@Rect_MakeIWH">
+
+#### Example Output
+
+~~~~
+i_rect width: 25 f_rect width:25
+i_rect width: 125000111 f_rect width:125000112
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_MakeXYWH'>MakeXYWH</a> <a href='#SkRect_MakeWH'>MakeWH</a> <a href='#SkRect_isetWH'>isetWH</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_MakeWH'>MakeWH</a>
+
+<a name='SkRect_MakeSize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static constexpr <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_MakeSize'>MakeSize</a>(const <a href='undocumented#SkSize'>SkSize</a>& <a href='undocumented#Size'>size</a>)
+</pre>
+
+Returns constructed <a href='SkRect_Reference#SkRect'>SkRect</a> set to (0, 0, <a href='#SkRect_MakeSize_size'>size</a>.<a href='#SkSize_width'>width()</a>, <a href='#SkRect_MakeSize_size'>size</a>.<a href='#SkSize_height'>height()</a>). Does not
+validate input; <a href='#SkRect_MakeSize_size'>size</a>.<a href='#SkSize_width'>width()</a> or <a href='#SkRect_MakeSize_size'>size</a>.<a href='#SkSize_height'>height()</a> may be negative.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_MakeSize_size'><code><strong>size</strong></code></a></td>
+    <td><a href='undocumented#SkScalar'>SkScalar</a> values for <a href='SkRect_Reference#SkRect'>SkRect</a> width and height</td>
+  </tr>
+</table>
+
+### Return Value
+
+bounds (0, 0, <a href='#SkRect_MakeSize_size'>size</a>.<a href='#SkSize_width'>width()</a>, <a href='#SkRect_MakeSize_size'>size</a>.<a href='#SkSize_height'>height()</a>)
+
+### Example
+
+<div><fiddle-embed name="@Rect_MakeSize">
+
+#### Example Output
+
+~~~~
+rect width: 25.5  height: 35.5
+floor width: 25  height: 35
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_MakeWH'>MakeWH</a> <a href='#SkRect_MakeXYWH'>MakeXYWH</a> <a href='#SkRect_MakeIWH'>MakeIWH</a> <a href='#SkRect_setWH'>setWH</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_MakeWH'>MakeWH</a>
+
+<a name='SkRect_MakeLTRB'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static constexpr <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_MakeLTRB'>MakeLTRB</a>(<a href='undocumented#SkScalar'>SkScalar</a> l, <a href='undocumented#SkScalar'>SkScalar</a> t, <a href='undocumented#SkScalar'>SkScalar</a> r, <a href='undocumented#SkScalar'>SkScalar</a> b)
+</pre>
+
+Returns constructed <a href='SkRect_Reference#SkRect'>SkRect</a> set to (<a href='#SkRect_MakeLTRB_l'>l</a>, <a href='#SkRect_MakeLTRB_t'>t</a>, <a href='#SkRect_MakeLTRB_r'>r</a>, <a href='#SkRect_MakeLTRB_b'>b</a>). Does not sort input; <a href='SkRect_Reference#SkRect'>SkRect</a> may
+result in <a href='#SkRect_fLeft'>fLeft</a> greater than <a href='#SkRect_fRight'>fRight</a>, or <a href='#SkRect_fTop'>fTop</a> greater than <a href='#SkRect_fBottom'>fBottom</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_MakeLTRB_l'><code><strong>l</strong></code></a></td>
+    <td><a href='undocumented#SkScalar'>SkScalar</a> stored in <a href='#SkRect_fLeft'>fLeft</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_MakeLTRB_t'><code><strong>t</strong></code></a></td>
+    <td><a href='undocumented#SkScalar'>SkScalar</a> stored in <a href='#SkRect_fTop'>fTop</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_MakeLTRB_r'><code><strong>r</strong></code></a></td>
+    <td><a href='undocumented#SkScalar'>SkScalar</a> stored in <a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_MakeLTRB_b'><code><strong>b</strong></code></a></td>
+    <td><a href='undocumented#SkScalar'>SkScalar</a> stored in <a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+bounds (<a href='#SkRect_MakeLTRB_l'>l</a>, <a href='#SkRect_MakeLTRB_t'>t</a>, <a href='#SkRect_MakeLTRB_r'>r</a>, <a href='#SkRect_MakeLTRB_b'>b</a>)
+
+### Example
+
+<div><fiddle-embed name="@Rect_MakeLTRB">
+
+#### Example Output
+
+~~~~
+rect: 5, 35, 15, 25  isEmpty: true
+rect: 5, 25, 15, 35  isEmpty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_MakeXYWH'>MakeXYWH</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_MakeLTRB'>MakeLTRB</a>
+
+<a name='SkRect_MakeXYWH'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static constexpr <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_MakeXYWH'>MakeXYWH</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, <a href='undocumented#SkScalar'>SkScalar</a> w, <a href='undocumented#SkScalar'>SkScalar</a> h)
+</pre>
+
+Returns constructed <a href='SkRect_Reference#Rect'>Rect</a> set to <code>(<a href='#SkRect_MakeXYWH_x'>x</a>, <a href='#SkRect_MakeXYWH_y'>y</a>, <a href='#SkRect_MakeXYWH_x'>x</a> + <a href='#SkRect_MakeXYWH_w'>w</a>, <a href='#SkRect_MakeXYWH_y'>y</a> + <a href='#SkRect_MakeXYWH_h'>h</a>)</code>.
+Does not validate input; <a href='#SkRect_MakeXYWH_w'>w</a> or <a href='#SkRect_MakeXYWH_h'>h</a> may be negative.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_MakeXYWH_x'><code><strong>x</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fLeft'>fLeft</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_MakeXYWH_y'><code><strong>y</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fTop'>fTop</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_MakeXYWH_w'><code><strong>w</strong></code></a></td>
+    <td>added to <a href='#SkRect_MakeXYWH_x'>x</a> and stored in <a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_MakeXYWH_h'><code><strong>h</strong></code></a></td>
+    <td>added to <a href='#SkRect_MakeXYWH_y'>y</a> and stored in <a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+bounds at (<a href='#SkRect_MakeXYWH_x'>x</a>, <a href='#SkRect_MakeXYWH_y'>y</a>) with width <a href='#SkRect_MakeXYWH_w'>w</a> and height <a href='#SkRect_MakeXYWH_h'>h</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_MakeXYWH">
+
+#### Example Output
+
+~~~~
+rect: 5, 35, -10, 60  isEmpty: true
+rect: -10, 35, 5, 60  isEmpty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_MakeLTRB'>MakeLTRB</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_MakeXYWH'>MakeXYWH</a>
+
+<a name='SkRect_Make'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_Make'>Make</a>(const <a href='undocumented#SkISize'>SkISize</a>& <a href='undocumented#Size'>size</a>)
+</pre>
+
+Returns constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a> set to (0, 0, <a href='#SkRect_Make_size'>size</a>.<a href='#SkISize_width'>width()</a>, <a href='#SkRect_Make_size'>size</a>.<a href='#SkISize_height'>height()</a>).
+Does not validate input; <a href='#SkRect_Make_size'>size</a>.<a href='#SkISize_width'>width()</a> or <a href='#SkRect_Make_size'>size</a>.<a href='#SkISize_height'>height()</a> may be negative.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_Make_size'><code><strong>size</strong></code></a></td>
+    <td>integer values for <a href='SkRect_Reference#SkRect'>SkRect</a> width and height</td>
+  </tr>
+</table>
+
+### Return Value
+
+bounds (0, 0, <a href='#SkRect_Make_size'>size</a>.<a href='#SkISize_width'>width()</a>, <a href='#SkRect_Make_size'>size</a>.<a href='#SkISize_height'>height()</a>)
+
+### Example
+
+<div><fiddle-embed name="@Rect_Make">
+
+#### Example Output
+
+~~~~
+rect1 == rect2
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_MakeWH'>MakeWH</a> <a href='#SkRect_MakeXYWH'>MakeXYWH</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_MakeIWH'>MakeIWH</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_MakeSize'>MakeSize</a>
+
+<a name='SkRect_Make_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_Make'>Make</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& irect)
+</pre>
+
+Returns constructed <a href='SkIRect_Reference#SkIRect'>SkIRect</a> set to <a href='#SkRect_Make_2_irect'>irect</a>, promoting integers to <a href='undocumented#Scalar'>scalar</a>.
+Does not validate input; <a href='#SkRect_fLeft'>fLeft</a> may be greater than <a href='#SkRect_fRight'>fRight</a>, <a href='#SkRect_fTop'>fTop</a> may be greater
+than <a href='#SkRect_fBottom'>fBottom</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_Make_2_irect'><code><strong>irect</strong></code></a></td>
+    <td>integer unsorted bounds</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='#SkRect_Make_2_irect'>irect</a> members converted to <a href='undocumented#SkScalar'>SkScalar</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_Make_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_MakeLTRB'>MakeLTRB</a>
+
+<a name='Property'></a>
+
+<a name='SkRect_isEmpty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRect_isEmpty'>isEmpty</a>()const
+</pre>
+
+Returns true if <a href='#SkRect_fLeft'>fLeft</a> is equal to or greater than <a href='#SkRect_fRight'>fRight</a>, or if <a href='#SkRect_fTop'>fTop</a> is equal
+to or greater than <a href='#SkRect_fBottom'>fBottom</a>. Call <a href='#SkRect_sort'>sort()</a> to reverse rectangles with negative
+<a href='#SkRect_width'>width()</a> or <a href='#SkRect_height'>height()</a>.
+
+### Return Value
+
+true if <a href='#SkRect_width'>width()</a> or <a href='#SkRect_height'>height()</a> are zero or negative
+
+### Example
+
+<div><fiddle-embed name="@Rect_isEmpty">
+
+#### Example Output
+
+~~~~
+rect: {20, 40, 10, 50} is empty
+sorted: {10, 40, 20, 50} is not empty
+rect: {20, 40, 20, 50} is empty
+sorted: {20, 40, 20, 50} is empty
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_MakeEmpty'>MakeEmpty</a> <a href='#SkRect_sort'>sort</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_isEmpty'>isEmpty</a>
+
+<a name='SkRect_isSorted'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRect_isSorted'>isSorted</a>()const
+</pre>
+
+Returns true if <a href='#SkRect_fLeft'>fLeft</a> is equal to or less than <a href='#SkRect_fRight'>fRight</a>, or if <a href='#SkRect_fTop'>fTop</a> is equal
+to or less than <a href='#SkRect_fBottom'>fBottom</a>. Call <a href='#SkRect_sort'>sort()</a> to reverse rectangles with negative
+<a href='#SkRect_width'>width()</a> or <a href='#SkRect_height'>height()</a>.
+
+### Return Value
+
+true if <a href='#SkRect_width'>width()</a> or <a href='#SkRect_height'>height()</a> are zero or positive
+
+### Example
+
+<div><fiddle-embed name="@Rect_isSorted">
+
+#### Example Output
+
+~~~~
+rect: {20, 40, 10, 50} is not sorted
+sorted: {10, 40, 20, 50} is sorted
+rect: {20, 40, 20, 50} is sorted
+sorted: {20, 40, 20, 50} is sorted
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_sort'>sort</a> <a href='#SkRect_makeSorted'>makeSorted</a> <a href='#SkRect_isEmpty'>isEmpty</a>
+
+<a name='SkRect_isFinite'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRect_isFinite'>isFinite</a>()const
+</pre>
+
+Returns true if all values in the rectangle are finite: <a href='undocumented#SK_ScalarMin'>SK_ScalarMin</a> or larger,
+and <a href='undocumented#SK_ScalarMax'>SK_ScalarMax</a> or smaller.
+
+### Return Value
+
+true if no member is infinite or NaN
+
+### Example
+
+<div><fiddle-embed name="@Rect_isFinite">
+
+#### Example Output
+
+~~~~
+largest is finite: true
+large width inf
+widest is finite: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#SkScalarIsFinite'>SkScalarIsFinite</a> <a href='undocumented#SkScalarIsNaN'>SkScalarIsNaN</a>
+
+<a name='SkRect_x'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a>    <a href='#SkRect_x'>x()</a>const
+</pre>
+
+Returns left edge of <a href='SkRect_Reference#SkRect'>SkRect</a>, if sorted. Call <a href='#SkRect_isSorted'>isSorted</a>() to see if <a href='SkRect_Reference#SkRect'>SkRect</a> is valid.
+Call <a href='#SkRect_sort'>sort()</a> to reverse <a href='#SkRect_fLeft'>fLeft</a> and <a href='#SkRect_fRight'>fRight</a> if needed.
+
+### Return Value
+
+<a href='#SkRect_fLeft'>fLeft</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_x">
+
+#### Example Output
+
+~~~~
+unsorted.fLeft: 15 unsorted.x(): 15
+sorted.fLeft: 10 sorted.x(): 10
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_fLeft'>fLeft</a> <a href='#SkRect_left'>left()</a> <a href='#SkRect_y'>y()</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_x'>x()</a>
+
+<a name='SkRect_y'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a>    <a href='#SkRect_y'>y()</a>const
+</pre>
+
+Returns top edge of <a href='SkRect_Reference#SkRect'>SkRect</a>, if sorted. Call <a href='#SkRect_isEmpty'>isEmpty</a>() to see if <a href='SkRect_Reference#SkRect'>SkRect</a> may be invalid,
+and <a href='#SkRect_sort'>sort()</a> to reverse <a href='#SkRect_fTop'>fTop</a> and <a href='#SkRect_fBottom'>fBottom</a> if needed.
+
+### Return Value
+
+<a href='#SkRect_fTop'>fTop</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_y">
+
+#### Example Output
+
+~~~~
+unsorted.fTop: 25 unsorted.y(): 25
+sorted.fTop: 5 sorted.y(): 5
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_fTop'>fTop</a> <a href='#SkRect_top'>top()</a> <a href='#SkRect_x'>x()</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_y'>y()</a>
+
+<a name='SkRect_left'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a>    <a href='#SkRect_left'>left()</a>const
+</pre>
+
+Returns left edge of <a href='SkRect_Reference#SkRect'>SkRect</a>, if sorted. Call <a href='#SkRect_isSorted'>isSorted</a>() to see if <a href='SkRect_Reference#SkRect'>SkRect</a> is valid.
+Call <a href='#SkRect_sort'>sort()</a> to reverse <a href='#SkRect_fLeft'>fLeft</a> and <a href='#SkRect_fRight'>fRight</a> if needed.
+
+### Return Value
+
+<a href='#SkRect_fLeft'>fLeft</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_left">
+
+#### Example Output
+
+~~~~
+unsorted.fLeft: 15 unsorted.left(): 15
+sorted.fLeft: 10 sorted.left(): 10
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_fLeft'>fLeft</a> <a href='#SkRect_x'>x()</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_left'>left()</a>
+
+<a name='SkRect_top'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a>    <a href='#SkRect_top'>top()</a>const
+</pre>
+
+Returns top edge of <a href='SkRect_Reference#SkRect'>SkRect</a>, if sorted. Call <a href='#SkRect_isEmpty'>isEmpty</a>() to see if <a href='SkRect_Reference#SkRect'>SkRect</a> may be invalid,
+and <a href='#SkRect_sort'>sort()</a> to reverse <a href='#SkRect_fTop'>fTop</a> and <a href='#SkRect_fBottom'>fBottom</a> if needed.
+
+### Return Value
+
+<a href='#SkRect_fTop'>fTop</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_top">
+
+#### Example Output
+
+~~~~
+unsorted.fTop: 25 unsorted.top(): 25
+sorted.fTop: 5 sorted.top(): 5
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_fTop'>fTop</a> <a href='#SkRect_y'>y()</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_top'>top()</a>
+
+<a name='SkRect_right'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a>    <a href='#SkRect_right'>right()</a>const
+</pre>
+
+Returns right edge of <a href='SkRect_Reference#SkRect'>SkRect</a>, if sorted. Call <a href='#SkRect_isSorted'>isSorted</a>() to see if <a href='SkRect_Reference#SkRect'>SkRect</a> is valid.
+Call <a href='#SkRect_sort'>sort()</a> to reverse <a href='#SkRect_fLeft'>fLeft</a> and <a href='#SkRect_fRight'>fRight</a> if needed.
+
+### Return Value
+
+<a href='#SkRect_fRight'>fRight</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_right">
+
+#### Example Output
+
+~~~~
+unsorted.fRight: 10 unsorted.right(): 10
+sorted.fRight: 15 sorted.right(): 15
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_fRight'>fRight</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_right'>right()</a>
+
+<a name='SkRect_bottom'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a>    <a href='#SkRect_bottom'>bottom()</a>const
+</pre>
+
+Returns bottom edge of <a href='SkRect_Reference#SkRect'>SkRect</a>, if sorted. Call <a href='#SkRect_isEmpty'>isEmpty</a>() to see if <a href='SkRect_Reference#SkRect'>SkRect</a> may be invalid,
+and <a href='#SkRect_sort'>sort()</a> to reverse <a href='#SkRect_fTop'>fTop</a> and <a href='#SkRect_fBottom'>fBottom</a> if needed.
+
+### Return Value
+
+<a href='#SkRect_fBottom'>fBottom</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_bottom">
+
+#### Example Output
+
+~~~~
+unsorted.fBottom: 5 unsorted.bottom(): 5
+sorted.fBottom: 25 sorted.bottom(): 25
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_fBottom'>fBottom</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_bottom'>bottom()</a>
+
+<a name='SkRect_width'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a>    <a href='#SkRect_width'>width()</a>const
+</pre>
+
+Returns span on the x-axis. This does not check if <a href='SkRect_Reference#SkRect'>SkRect</a> is sorted, or if
+result fits in 32-bit float; result may be negative or infinity.
+
+### Return Value
+
+<a href='#SkRect_fRight'>fRight</a> minus <a href='#SkRect_fLeft'>fLeft</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_width"><div>Compare with <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_width'>width()</a> example.
+</div>
+
+#### Example Output
+
+~~~~
+unsorted width: -5
+large width: 4294967296
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_height'>height()</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_width'>width()</a>
+
+<a name='SkRect_height'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a>    <a href='#SkRect_height'>height()</a>const
+</pre>
+
+Returns span on the y-axis. This does not check if <a href='SkRect_Reference#SkRect'>SkRect</a> is sorted, or if
+result fits in 32-bit float; result may be negative or infinity.
+
+### Return Value
+
+<a href='#SkRect_fBottom'>fBottom</a> minus <a href='#SkRect_fTop'>fTop</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_height"><div>Compare with <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_height'>height()</a> example.
+</div>
+
+#### Example Output
+
+~~~~
+unsorted height: -5
+large height: 4294967296
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_width'>width()</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_height'>height()</a>
+
+<a name='SkRect_centerX'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a>    <a href='#SkRect_centerX'>centerX</a>()const
+</pre>
+
+Returns average of left edge and right edge. Result does not change if <a href='SkRect_Reference#SkRect'>SkRect</a>
+is sorted. Result may overflow to infinity if <a href='SkRect_Reference#SkRect'>SkRect</a> is far from the origin.
+
+### Return Value
+
+midpoint on x-axis
+
+### Example
+
+<div><fiddle-embed name="@Rect_centerX">
+
+#### Example Output
+
+~~~~
+left:  20 right:  41 centerX: 30.5
+left:  20 right:  41 centerX: 30.5
+left: -20 right: -41 centerX: -30.5
+left: -41 right: -20 centerX: -30.5
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_centerY'>centerY</a>
+
+<a name='SkRect_centerY'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#SkScalar'>SkScalar</a>    <a href='#SkRect_centerY'>centerY</a>()const
+</pre>
+
+Returns average of top edge and bottom edge. Result does not change if <a href='SkRect_Reference#SkRect'>SkRect</a>
+is sorted.
+
+### Return Value
+
+midpoint on y-axis
+
+### Example
+
+<div><fiddle-embed name="@Rect_centerY">
+
+#### Example Output
+
+~~~~
+left: 2e+38 right: 3e+38 centerX: 2.5e+38 safe mid x: 2.5e+38
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_centerX'>centerX</a>
+
+<a name='Operators'></a>
+
+<a name='SkRect_equal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRect_equal_operator'>operator==</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& a, const <a href='SkRect_Reference#SkRect'>SkRect</a>& b)
+</pre>
+
+Returns true if all members in <a href='#SkRect_equal_operator_a'>a</a>: <a href='#SkRect_fLeft'>fLeft</a>, <a href='#SkRect_fTop'>fTop</a>, <a href='#SkRect_fRight'>fRight</a>, and <a href='#SkRect_fBottom'>fBottom</a>; are
+equal to the corresponding members in <a href='#SkRect_equal_operator_b'>b</a>.
+
+<a href='#SkRect_equal_operator_a'>a</a> and <a href='#SkRect_equal_operator_b'>b</a> are not equal if either contain NaN. <a href='#SkRect_equal_operator_a'>a</a> and <a href='#SkRect_equal_operator_b'>b</a> are equal if members
+contain zeroes with different signs.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_equal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to compare</td>
+  </tr>
+  <tr>    <td><a name='SkRect_equal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if members are equal
+
+### Example
+
+<div><fiddle-embed name="@Rect_equal_operator">
+
+#### Example Output
+
+~~~~
+tests are equal
+{0, 0, 2, 2} == {-0, -0, 2, 2} and are numerically equal
+{0, 0, 2, 2} == {-0, -0, 2, 2} and are numerically equal
+{0, 0, 2, 2} == {-0, -0, 2, 2} and are numerically equal
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_notequal_operator'>operator!=</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='#SkRect_equal_operator_a'>a</a>, const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='#SkRect_equal_operator_b'>b</a>)
+
+<a name='SkRect_notequal_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRect_notequal_operator'>operator!=</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& a, const <a href='SkRect_Reference#SkRect'>SkRect</a>& b)
+</pre>
+
+Returns true if any in <a href='#SkRect_notequal_operator_a'>a</a>: <a href='#SkRect_fLeft'>fLeft</a>, <a href='#SkRect_fTop'>fTop</a>, <a href='#SkRect_fRight'>fRight</a>, and <a href='#SkRect_fBottom'>fBottom</a>; does not
+equal the corresponding members in <a href='#SkRect_notequal_operator_b'>b</a>.
+
+<a href='#SkRect_notequal_operator_a'>a</a> and <a href='#SkRect_notequal_operator_b'>b</a> are not equal if either contain NaN. <a href='#SkRect_notequal_operator_a'>a</a> and <a href='#SkRect_notequal_operator_b'>b</a> are equal if members
+contain zeroes with different signs.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_notequal_operator_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to compare</td>
+  </tr>
+  <tr>    <td><a name='SkRect_notequal_operator_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if members are not equal
+
+### Example
+
+<div><fiddle-embed name="@Rect_notequal_operator">
+
+#### Example Output
+
+~~~~
+test with NaN is not equal to itself
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_equal_operator'>operator==</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='#SkRect_notequal_operator_a'>a</a>, const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='#SkRect_notequal_operator_b'>b</a>)
+
+<a name='As_Points'></a>
+
+<a name='SkRect_toQuad'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_toQuad'>toQuad</a>(<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='SkPath_Reference#Quad'>quad</a>[4])const
+</pre>
+
+Returns four <a href='SkPoint_Reference#Point'>points</a> in <a href='#SkRect_toQuad_quad'>quad</a> that enclose <a href='SkRect_Reference#SkRect'>SkRect</a> ordered as: top-left, top-right,
+bottom-right, bottom-left.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_toQuad_quad'><code><strong>quad</strong></code></a></td>
+    <td>storage for corners of <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_toQuad">
+
+#### Example Output
+
+~~~~
+rect: {1, 2, 3, 4}
+corners: {1, 2} {3, 2} {3, 4} {1, 4}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_addRect'>addRect</a>
+
+<a name='SkRect_setBounds'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_setBounds'>setBounds</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], int count)
+</pre>
+
+Sets to bounds of  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> with <a href='#SkRect_setBounds_count'>count</a> entries. If <a href='#SkRect_setBounds_count'>count</a> is zero or smaller,
+or if  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> contains an infinity or NaN, sets to (0, 0, 0, 0).
+
+Result is either empty or sorted: <a href='#SkRect_fLeft'>fLeft</a> is less than or equal to <a href='#SkRect_fRight'>fRight</a>, and
+<a href='#SkRect_fTop'>fTop</a> is less than or equal to <a href='#SkRect_fBottom'>fBottom</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_setBounds_pts'><code><strong>pts</strong></code></a></td>
+    <td><a href='SkPath_Reference#Point_Array'>SkPoint array</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_setBounds_count'><code><strong>count</strong></code></a></td>
+    <td>entries in array</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_setBounds">
+
+#### Example Output
+
+~~~~
+count: 0 rect: 0, 0, 0, 0
+added:   3, 4 count: 1 rect: 3, 4, 3, 4
+added:   1, 2 count: 2 rect: 1, 2, 3, 4
+added:   5, 6 count: 3 rect: 1, 2, 5, 6
+added: nan, 8 count: 4 rect: 0, 0, 0, 0
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_set'>set</a> <a href='#SkRect_setBoundsCheck'>setBoundsCheck</a> <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_addPoly'>addPoly</a>
+
+<a name='SkRect_setBoundsCheck'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRect_setBoundsCheck'>setBoundsCheck</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], int count)
+</pre>
+
+Sets to bounds of  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> with <a href='#SkRect_setBoundsCheck_count'>count</a> entries. Returns false if <a href='#SkRect_setBoundsCheck_count'>count</a> is
+zero or smaller, or if  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> contains an infinity or NaN; in these cases
+sets <a href='SkRect_Reference#SkRect'>SkRect</a> to (0, 0, 0, 0).
+
+Result is either empty or sorted: <a href='#SkRect_fLeft'>fLeft</a> is less than or equal to <a href='#SkRect_fRight'>fRight</a>, and
+<a href='#SkRect_fTop'>fTop</a> is less than or equal to <a href='#SkRect_fBottom'>fBottom</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_setBoundsCheck_pts'><code><strong>pts</strong></code></a></td>
+    <td><a href='SkPath_Reference#Point_Array'>SkPoint array</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_setBoundsCheck_count'><code><strong>count</strong></code></a></td>
+    <td>entries in array</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if all <a href='SkPoint_Reference#SkPoint'>SkPoint</a> values are finite
+
+### Example
+
+<div><fiddle-embed name="@Rect_setBoundsCheck">
+
+#### Example Output
+
+~~~~
+count: 0 rect: 0, 0, 0, 0 success: true
+added:   3, 4 count: 1 rect: 3, 4, 3, 4 success: true
+added:   1, 2 count: 2 rect: 1, 2, 3, 4 success: true
+added:   5, 6 count: 3 rect: 1, 2, 5, 6 success: true
+added: nan, 8 count: 4 rect: 0, 0, 0, 0 success: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_set'>set</a> <a href='#SkRect_setBounds'>setBounds</a> <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_addPoly'>addPoly</a>
+
+<a name='Set'></a>
+
+<a name='SkRect_setBoundsNoCheck'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_setBoundsNoCheck'>setBoundsNoCheck</a>(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], int count)
+</pre>
+
+Sets to bounds of <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkRect_setBoundsNoCheck_pts'>pts</a> array with <a href='#SkRect_setBoundsNoCheck_count'>count</a> entries. If any <a href='SkPoint_Reference#SkPoint'>SkPoint</a> in <a href='#SkRect_setBoundsNoCheck_pts'>pts</a>
+contains infinity or NaN, all <a href='SkRect_Reference#SkRect'>SkRect</a> dimensions are set to NaN.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_setBoundsNoCheck_pts'><code><strong>pts</strong></code></a></td>
+    <td><a href='SkPath_Reference#Point_Array'>SkPoint array</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_setBoundsNoCheck_count'><code><strong>count</strong></code></a></td>
+    <td>entries in array</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_setBoundsNoCheck"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_setBoundsCheck'>setBoundsCheck</a>
+
+<a name='SkRect_setEmpty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_setEmpty'>setEmpty</a>()
+</pre>
+
+Sets <a href='SkRect_Reference#SkRect'>SkRect</a> to (0, 0, 0, 0).
+
+Many other rectangles are empty; if left is equal to or greater than right,
+or if top is equal to or greater than bottom. Setting all members to zero
+is a convenience, but does not designate a special empty rectangle.
+
+### Example
+
+<div><fiddle-embed name="@Rect_setEmpty">
+
+#### Example Output
+
+~~~~
+rect: {3, 4, 1, 2} is empty
+rect: {0, 0, 0, 0} is empty
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_MakeEmpty'>MakeEmpty</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_setEmpty'>setEmpty</a>
+
+<a name='SkRect_set'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void set(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& src)
+</pre>
+
+Sets <a href='SkRect_Reference#SkRect'>SkRect</a> to <a href='#SkRect_set_src'>src</a>, promoting <a href='#SkRect_set_src'>src</a> members from integer to <a href='undocumented#Scalar'>scalar</a>.
+Very large values in <a href='#SkRect_set_src'>src</a> may lose precision.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_set_src'><code><strong>src</strong></code></a></td>
+    <td>integer <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_set">
+
+#### Example Output
+
+~~~~
+i_rect: {3, 4, 1, 2}
+f_rect: {3, 4, 1, 2}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_setLTRB'>setLTRB</a> <a href='undocumented#SkIntToScalar'>SkIntToScalar</a>
+
+<a name='SkRect_set_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void set(<a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top, <a href='undocumented#SkScalar'>SkScalar</a> right, <a href='undocumented#SkScalar'>SkScalar</a> bottom)
+</pre>
+
+Sets <a href='SkRect_Reference#SkRect'>SkRect</a> to (<a href='#SkRect_set_2_left'>left</a>, <a href='#SkRect_set_2_top'>top</a>, <a href='#SkRect_set_2_right'>right</a>, <a href='#SkRect_set_2_bottom'>bottom</a>).
+<a href='#SkRect_set_2_left'>left</a> and <a href='#SkRect_set_2_right'>right</a> are not sorted; <a href='#SkRect_set_2_left'>left</a> is not necessarily less than <a href='#SkRect_set_2_right'>right</a>.
+<a href='#SkRect_set_2_top'>top</a> and <a href='#SkRect_set_2_bottom'>bottom</a> are not sorted; <a href='#SkRect_set_2_top'>top</a> is not necessarily less than <a href='#SkRect_set_2_bottom'>bottom</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_set_2_left'><code><strong>left</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fLeft'>fLeft</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_set_2_top'><code><strong>top</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fTop'>fTop</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_set_2_right'><code><strong>right</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_set_2_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="9b29ea460d69b4d47323fd9e3e17721e">
+
+#### Example Output
+
+~~~~
+rect1: {3, 4, 1, 2}
+rect2: {3, 4, 1, 2}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_setLTRB'>setLTRB</a> <a href='#SkRect_setXYWH'>setXYWH</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_set'>set</a>
+
+<a name='SkRect_setLTRB'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_setLTRB'>setLTRB</a>(<a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top, <a href='undocumented#SkScalar'>SkScalar</a> right, <a href='undocumented#SkScalar'>SkScalar</a> bottom)
+</pre>
+
+Sets <a href='SkRect_Reference#SkRect'>SkRect</a> to (<a href='#SkRect_setLTRB_left'>left</a>, <a href='#SkRect_setLTRB_top'>top</a>, <a href='#SkRect_setLTRB_right'>right</a>, <a href='#SkRect_setLTRB_bottom'>bottom</a>).
+<a href='#SkRect_setLTRB_left'>left</a> and <a href='#SkRect_setLTRB_right'>right</a> are not sorted; <a href='#SkRect_setLTRB_left'>left</a> is not necessarily less than <a href='#SkRect_setLTRB_right'>right</a>.
+<a href='#SkRect_setLTRB_top'>top</a> and <a href='#SkRect_setLTRB_bottom'>bottom</a> are not sorted; <a href='#SkRect_setLTRB_top'>top</a> is not necessarily less than <a href='#SkRect_setLTRB_bottom'>bottom</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_setLTRB_left'><code><strong>left</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fLeft'>fLeft</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_setLTRB_top'><code><strong>top</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fTop'>fTop</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_setLTRB_right'><code><strong>right</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_setLTRB_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_setLTRB">
+
+#### Example Output
+
+~~~~
+rect1: {3, 4, 1, 2}
+rect2: {3, 4, 1, 2}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_set'>set</a> <a href='#SkRect_setXYWH'>setXYWH</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_set'>set</a>
+
+<a name='SkRect_set_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void set(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a> pts[], int count)
+</pre>
+
+Sets to bounds of  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> with <a href='#SkRect_set_3_count'>count</a> entries. If <a href='#SkRect_set_3_count'>count</a> is zero or smaller,
+or if  <a href='SkPath_Reference#Point_Array'>SkPoint array</a> contains an infinity or NaN, sets <a href='SkRect_Reference#SkRect'>SkRect</a> to (0, 0, 0, 0).
+
+Result is either empty or sorted: <a href='#SkRect_fLeft'>fLeft</a> is less than or equal to <a href='#SkRect_fRight'>fRight</a>, and
+<a href='#SkRect_fTop'>fTop</a> is less than or equal to <a href='#SkRect_fBottom'>fBottom</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_set_3_pts'><code><strong>pts</strong></code></a></td>
+    <td><a href='SkPath_Reference#Point_Array'>SkPoint array</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_set_3_count'><code><strong>count</strong></code></a></td>
+    <td>entries in array</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="94295fa5197e21256171b99b4023dd48">
+
+#### Example Output
+
+~~~~
+count: 0 rect: 0, 0, 0, 0
+added:   3, 4 count: 1 rect: 3, 4, 3, 4
+added:   1, 2 count: 2 rect: 1, 2, 3, 4
+added:   5, 6 count: 3 rect: 1, 2, 5, 6
+added: nan, 8 count: 4 rect: 0, 0, 0, 0
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_setBounds'>setBounds</a> <a href='#SkRect_setBoundsCheck'>setBoundsCheck</a> <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_addPoly'>addPoly</a>
+
+<a name='SkRect_set_4'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void set(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p0, const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& p1)
+</pre>
+
+Sets bounds to the smallest <a href='SkRect_Reference#SkRect'>SkRect</a> enclosing <a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='#SkRect_set_4_p0'>p0</a> and <a href='#SkRect_set_4_p1'>p1</a>. The result is
+sorted and may be empty. Does not check to see if values are finite.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_set_4_p0'><code><strong>p0</strong></code></a></td>
+    <td>corner to include</td>
+  </tr>
+  <tr>    <td><a name='SkRect_set_4_p1'><code><strong>p1</strong></code></a></td>
+    <td>corner to include</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_set_4"><div><a href='#SkRect_set_4_p0'>p0</a> and <a href='#SkRect_set_4_p1'>p1</a> may be swapped and have the same effect unless one contains NaN.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_setBounds'>setBounds</a> <a href='#SkRect_setBoundsCheck'>setBoundsCheck</a>
+
+<a name='SkRect_setXYWH'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_setXYWH'>setXYWH</a>(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, <a href='undocumented#SkScalar'>SkScalar</a> width, <a href='undocumented#SkScalar'>SkScalar</a> height)
+</pre>
+
+Sets <a href='SkRect_Reference#Rect'>Rect</a> to <code>(<a href='#SkRect_setXYWH_x'>x</a>, <a href='#SkRect_setXYWH_y'>y</a>, <a href='#SkRect_setXYWH_x'>x</a> + <a href='#SkRect_setXYWH_width'>width</a>, <a href='#SkRect_setXYWH_y'>y</a> + <a href='#SkRect_setXYWH_height'>height</a>)</code>.
+Does not validate input; <a href='#SkRect_setXYWH_width'>width</a> or <a href='#SkRect_setXYWH_height'>height</a> may be negative.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_setXYWH_x'><code><strong>x</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fLeft'>fLeft</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_setXYWH_y'><code><strong>y</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fTop'>fTop</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_setXYWH_width'><code><strong>width</strong></code></a></td>
+    <td>added to <a href='#SkRect_setXYWH_x'>x</a> and stored in <a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_setXYWH_height'><code><strong>height</strong></code></a></td>
+    <td>added to <a href='#SkRect_setXYWH_y'>y</a> and stored in <a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_setXYWH">
+
+#### Example Output
+
+~~~~
+rect: 5, 35, -10, 60  isEmpty: true
+rect: -10, 35, 5, 60  isEmpty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_MakeXYWH'>MakeXYWH</a> <a href='#SkRect_setLTRB'>setLTRB</a> <a href='#SkRect_set'>set</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_setXYWH'>setXYWH</a>
+
+<a name='SkRect_setWH'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_setWH'>setWH</a>(<a href='undocumented#SkScalar'>SkScalar</a> width, <a href='undocumented#SkScalar'>SkScalar</a> height)
+</pre>
+
+Sets <a href='SkRect_Reference#SkRect'>SkRect</a> to (0, 0, <a href='#SkRect_setWH_width'>width</a>, <a href='#SkRect_setWH_height'>height</a>). Does not validate input;
+<a href='#SkRect_setWH_width'>width</a> or <a href='#SkRect_setWH_height'>height</a> may be negative.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_setWH_width'><code><strong>width</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_setWH_height'><code><strong>height</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_setWH">
+
+#### Example Output
+
+~~~~
+rect: 0, 0, -15, 25  isEmpty: true
+rect: -15, 0, 0, 25  isEmpty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_MakeWH'>MakeWH</a> <a href='#SkRect_setXYWH'>setXYWH</a> <a href='#SkRect_isetWH'>isetWH</a>
+
+<a name='From_Integers'></a>
+
+<a name='SkRect_iset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_iset'>iset</a>(int left, int top, int right, int bottom)
+</pre>
+
+Sets <a href='SkRect_Reference#SkRect'>SkRect</a> to (<a href='#SkRect_iset_left'>left</a>, <a href='#SkRect_iset_top'>top</a>, <a href='#SkRect_iset_right'>right</a>, <a href='#SkRect_iset_bottom'>bottom</a>).
+All parameters are promoted from integer to <a href='undocumented#Scalar'>scalar</a>.
+<a href='#SkRect_iset_left'>left</a> and <a href='#SkRect_iset_right'>right</a> are not sorted; <a href='#SkRect_iset_left'>left</a> is not necessarily less than <a href='#SkRect_iset_right'>right</a>.
+<a href='#SkRect_iset_top'>top</a> and <a href='#SkRect_iset_bottom'>bottom</a> are not sorted; <a href='#SkRect_iset_top'>top</a> is not necessarily less than <a href='#SkRect_iset_bottom'>bottom</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_iset_left'><code><strong>left</strong></code></a></td>
+    <td>promoted to <a href='undocumented#SkScalar'>SkScalar</a> and stored in <a href='#SkRect_fLeft'>fLeft</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_iset_top'><code><strong>top</strong></code></a></td>
+    <td>promoted to <a href='undocumented#SkScalar'>SkScalar</a> and stored in <a href='#SkRect_fTop'>fTop</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_iset_right'><code><strong>right</strong></code></a></td>
+    <td>promoted to <a href='undocumented#SkScalar'>SkScalar</a> and stored in <a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_iset_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>promoted to <a href='undocumented#SkScalar'>SkScalar</a> and stored in <a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="18532f1aa90b76364fb8d7ea072f1892">
+
+#### Example Output
+
+~~~~
+rect1: {3, 4, 1, 2}
+rect2: {3, 4, 1, 2}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_set'>set</a> <a href='#SkRect_setLTRB'>setLTRB</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_set'>set</a> <a href='undocumented#SkIntToScalar'>SkIntToScalar</a>
+
+<a name='SkRect_isetWH'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_isetWH'>isetWH</a>(int width, int height)
+</pre>
+
+Sets <a href='SkRect_Reference#SkRect'>SkRect</a> to (0, 0, <a href='#SkRect_isetWH_width'>width</a>, <a href='#SkRect_isetWH_height'>height</a>).
+<a href='#SkRect_isetWH_width'>width</a> and <a href='#SkRect_isetWH_height'>height</a> may be zero or negative. <a href='#SkRect_isetWH_width'>width</a> and <a href='#SkRect_isetWH_height'>height</a> are promoted from
+integer to <a href='undocumented#SkScalar'>SkScalar</a>, large values may lose precision.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_isetWH_width'><code><strong>width</strong></code></a></td>
+    <td>promoted to <a href='undocumented#SkScalar'>SkScalar</a> and stored in <a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_isetWH_height'><code><strong>height</strong></code></a></td>
+    <td>promoted to <a href='undocumented#SkScalar'>SkScalar</a> and stored in <a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="ee6000080fc7123214ea404018cf9176">
+
+#### Example Output
+
+~~~~
+rect1: {0, 0, 1, 2}
+rect2: {0, 0, 1, 2}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_MakeWH'>MakeWH</a> <a href='#SkRect_MakeXYWH'>MakeXYWH</a> <a href='#SkRect_iset'>iset()</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>:<a href='#SkRect_MakeWH'>MakeWH</a>
+
+<a name='Inset_Outset_Offset'></a>
+
+<a name='SkRect_makeOffset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_makeOffset'>makeOffset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)const
+</pre>
+
+Returns <a href='SkRect_Reference#SkRect'>SkRect</a> offset by (<a href='#SkRect_makeOffset_dx'>dx</a>, <a href='#SkRect_makeOffset_dy'>dy</a>).
+
+If <a href='#SkRect_makeOffset_dx'>dx</a> is negative, <a href='SkRect_Reference#SkRect'>SkRect</a> returned is moved to the left.
+If <a href='#SkRect_makeOffset_dx'>dx</a> is positive, <a href='SkRect_Reference#SkRect'>SkRect</a> returned is moved to the right.
+If <a href='#SkRect_makeOffset_dy'>dy</a> is negative, <a href='SkRect_Reference#SkRect'>SkRect</a> returned is moved upward.
+If <a href='#SkRect_makeOffset_dy'>dy</a> is positive, <a href='SkRect_Reference#SkRect'>SkRect</a> returned is moved downward.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_makeOffset_dx'><code><strong>dx</strong></code></a></td>
+    <td>added to <a href='#SkRect_fLeft'>fLeft</a> and <a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_makeOffset_dy'><code><strong>dy</strong></code></a></td>
+    <td>added to <a href='#SkRect_fTop'>fTop</a> and <a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkRect_Reference#SkRect'>SkRect</a> offset on axes, with original width and height
+
+### Example
+
+<div><fiddle-embed name="@Rect_makeOffset">
+
+#### Example Output
+
+~~~~
+rect: 10, 50, 20, 60  isEmpty: false
+rect: 25, 82, 35, 92  isEmpty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_offset'>offset()</a> <a href='#SkRect_makeInset'>makeInset</a> <a href='#SkRect_makeOutset'>makeOutset</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_makeOffset'>makeOffset</a>
+
+<a name='SkRect_makeInset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_makeInset'>makeInset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)const
+</pre>
+
+Returns <a href='SkRect_Reference#SkRect'>SkRect</a>, inset by (<a href='#SkRect_makeInset_dx'>dx</a>, <a href='#SkRect_makeInset_dy'>dy</a>).
+
+If <a href='#SkRect_makeInset_dx'>dx</a> is negative, <a href='SkRect_Reference#SkRect'>SkRect</a> returned is wider.
+If <a href='#SkRect_makeInset_dx'>dx</a> is positive, <a href='SkRect_Reference#SkRect'>SkRect</a> returned is narrower.
+If <a href='#SkRect_makeInset_dy'>dy</a> is negative, <a href='SkRect_Reference#SkRect'>SkRect</a> returned is taller.
+If <a href='#SkRect_makeInset_dy'>dy</a> is positive, <a href='SkRect_Reference#SkRect'>SkRect</a> returned is shorter.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_makeInset_dx'><code><strong>dx</strong></code></a></td>
+    <td>added to <a href='#SkRect_fLeft'>fLeft</a> and subtracted from <a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_makeInset_dy'><code><strong>dy</strong></code></a></td>
+    <td>added to <a href='#SkRect_fTop'>fTop</a> and subtracted from <a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkRect_Reference#SkRect'>SkRect</a> inset symmetrically left and right, top and bottom
+
+### Example
+
+<div><fiddle-embed name="@Rect_makeInset">
+
+#### Example Output
+
+~~~~
+rect: 10, 50, 20, 60  isEmpty: false
+rect: 25, 82, 5, 28  isEmpty: true
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_inset'>inset()</a> <a href='#SkRect_makeOffset'>makeOffset</a> <a href='#SkRect_makeOutset'>makeOutset</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_makeInset'>makeInset</a>
+
+<a name='SkRect_makeOutset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_makeOutset'>makeOutset</a>(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)const
+</pre>
+
+Returns <a href='SkRect_Reference#SkRect'>SkRect</a>, outset by (<a href='#SkRect_makeOutset_dx'>dx</a>, <a href='#SkRect_makeOutset_dy'>dy</a>).
+
+If <a href='#SkRect_makeOutset_dx'>dx</a> is negative, <a href='SkRect_Reference#SkRect'>SkRect</a> returned is narrower.
+If <a href='#SkRect_makeOutset_dx'>dx</a> is positive, <a href='SkRect_Reference#SkRect'>SkRect</a> returned is wider.
+If <a href='#SkRect_makeOutset_dy'>dy</a> is negative, <a href='SkRect_Reference#SkRect'>SkRect</a> returned is shorter.
+If <a href='#SkRect_makeOutset_dy'>dy</a> is positive, <a href='SkRect_Reference#SkRect'>SkRect</a> returned is taller.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_makeOutset_dx'><code><strong>dx</strong></code></a></td>
+    <td>subtracted to <a href='#SkRect_fLeft'>fLeft</a> and added from <a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_makeOutset_dy'><code><strong>dy</strong></code></a></td>
+    <td>subtracted to <a href='#SkRect_fTop'>fTop</a> and added from <a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkRect_Reference#SkRect'>SkRect</a> outset symmetrically left and right, top and bottom
+
+### Example
+
+<div><fiddle-embed name="@Rect_makeOutset">
+
+#### Example Output
+
+~~~~
+rect: 10, 50, 20, 60  isEmpty: false
+rect: -5, 18, 35, 92  isEmpty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_outset'>outset()</a> <a href='#SkRect_makeOffset'>makeOffset</a> <a href='#SkRect_makeInset'>makeInset</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_makeOutset'>makeOutset</a>
+
+<a name='SkRect_offset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void offset(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Offsets <a href='SkRect_Reference#SkRect'>SkRect</a> by adding <a href='#SkRect_offset_dx'>dx</a> to <a href='#SkRect_fLeft'>fLeft</a>, <a href='#SkRect_fRight'>fRight</a>; and by adding <a href='#SkRect_offset_dy'>dy</a> to <a href='#SkRect_fTop'>fTop</a>, <a href='#SkRect_fBottom'>fBottom</a>.
+
+If <a href='#SkRect_offset_dx'>dx</a> is negative, moves <a href='SkRect_Reference#SkRect'>SkRect</a> to the left.
+If <a href='#SkRect_offset_dx'>dx</a> is positive, moves <a href='SkRect_Reference#SkRect'>SkRect</a> to the right.
+If <a href='#SkRect_offset_dy'>dy</a> is negative, moves <a href='SkRect_Reference#SkRect'>SkRect</a> upward.
+If <a href='#SkRect_offset_dy'>dy</a> is positive, moves <a href='SkRect_Reference#SkRect'>SkRect</a> downward.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_offset_dx'><code><strong>dx</strong></code></a></td>
+    <td>offset added to <a href='#SkRect_fLeft'>fLeft</a> and <a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_offset_dy'><code><strong>dy</strong></code></a></td>
+    <td>offset added to <a href='#SkRect_fTop'>fTop</a> and <a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_offset">
+
+#### Example Output
+
+~~~~
+rect: 15, 27, 55, 86
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_offsetTo'>offsetTo</a> <a href='#SkRect_makeOffset'>makeOffset</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_offset'>offset</a>
+
+<a name='SkRect_offset_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void offset(const <a href='SkPoint_Reference#SkPoint'>SkPoint</a>& delta)
+</pre>
+
+Offsets <a href='SkRect_Reference#SkRect'>SkRect</a> by adding <a href='#SkRect_offset_2_delta'>delta</a>.<a href='#SkPoint_fX'>fX</a> to <a href='#SkRect_fLeft'>fLeft</a>, <a href='#SkRect_fRight'>fRight</a>; and by adding <a href='#SkRect_offset_2_delta'>delta</a>.<a href='#SkPoint_fY'>fY</a> to
+<a href='#SkRect_fTop'>fTop</a>, <a href='#SkRect_fBottom'>fBottom</a>.
+
+If <a href='#SkRect_offset_2_delta'>delta</a>.<a href='#SkPoint_fX'>fX</a> is negative, moves <a href='SkRect_Reference#SkRect'>SkRect</a> to the left.
+If <a href='#SkRect_offset_2_delta'>delta</a>.<a href='#SkPoint_fX'>fX</a> is positive, moves <a href='SkRect_Reference#SkRect'>SkRect</a> to the right.
+If <a href='#SkRect_offset_2_delta'>delta</a>.<a href='#SkPoint_fY'>fY</a> is negative, moves <a href='SkRect_Reference#SkRect'>SkRect</a> upward.
+If <a href='#SkRect_offset_2_delta'>delta</a>.<a href='#SkPoint_fY'>fY</a> is positive, moves <a href='SkRect_Reference#SkRect'>SkRect</a> downward.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_offset_2_delta'><code><strong>delta</strong></code></a></td>
+    <td>added to <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_offset_2">
+
+#### Example Output
+
+~~~~
+rect: 15, 27, 55, 86
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_offsetTo'>offsetTo</a> <a href='#SkRect_makeOffset'>makeOffset</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_offset'>offset</a>
+
+<a name='SkRect_offsetTo'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_offsetTo'>offsetTo</a>(<a href='undocumented#SkScalar'>SkScalar</a> newX, <a href='undocumented#SkScalar'>SkScalar</a> newY)
+</pre>
+
+Offsets <a href='SkRect_Reference#SkRect'>SkRect</a> so that <a href='#SkRect_fLeft'>fLeft</a> equals <a href='#SkRect_offsetTo_newX'>newX</a>, and <a href='#SkRect_fTop'>fTop</a> equals <a href='#SkRect_offsetTo_newY'>newY</a>. width and height
+are unchanged.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_offsetTo_newX'><code><strong>newX</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fLeft'>fLeft</a>, preserving <a href='#SkRect_width'>width()</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_offsetTo_newY'><code><strong>newY</strong></code></a></td>
+    <td>stored in <a href='#SkRect_fTop'>fTop</a>, preserving <a href='#SkRect_height'>height()</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_offsetTo">
+
+#### Example Output
+
+~~~~
+rect: 15, 27, 55, 86
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_offset'>offset</a> <a href='#SkRect_makeOffset'>makeOffset</a> <a href='#SkRect_setXYWH'>setXYWH</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_offsetTo'>offsetTo</a>
+
+<a name='SkRect_inset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void inset(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Insets <a href='SkRect_Reference#SkRect'>SkRect</a> by (<a href='#SkRect_inset_dx'>dx</a>, <a href='#SkRect_inset_dy'>dy</a>).
+
+If <a href='#SkRect_inset_dx'>dx</a> is positive, makes <a href='SkRect_Reference#SkRect'>SkRect</a> narrower.
+If <a href='#SkRect_inset_dx'>dx</a> is negative, makes <a href='SkRect_Reference#SkRect'>SkRect</a> wider.
+If <a href='#SkRect_inset_dy'>dy</a> is positive, makes <a href='SkRect_Reference#SkRect'>SkRect</a> shorter.
+If <a href='#SkRect_inset_dy'>dy</a> is negative, makes <a href='SkRect_Reference#SkRect'>SkRect</a> taller.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_inset_dx'><code><strong>dx</strong></code></a></td>
+    <td>added to <a href='#SkRect_fLeft'>fLeft</a> and subtracted from <a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_inset_dy'><code><strong>dy</strong></code></a></td>
+    <td>added to <a href='#SkRect_fTop'>fTop</a> and subtracted from <a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_inset">
+
+#### Example Output
+
+~~~~
+rect: 15, 27, 45, 60
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_outset'>outset</a> <a href='#SkRect_makeInset'>makeInset</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_inset'>inset</a>
+
+<a name='SkRect_outset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void outset(<a href='undocumented#SkScalar'>SkScalar</a> dx, <a href='undocumented#SkScalar'>SkScalar</a> dy)
+</pre>
+
+Outsets <a href='SkRect_Reference#SkRect'>SkRect</a> by (<a href='#SkRect_outset_dx'>dx</a>, <a href='#SkRect_outset_dy'>dy</a>).
+
+If <a href='#SkRect_outset_dx'>dx</a> is positive, makes <a href='SkRect_Reference#SkRect'>SkRect</a> wider.
+If <a href='#SkRect_outset_dx'>dx</a> is negative, makes <a href='SkRect_Reference#SkRect'>SkRect</a> narrower.
+If <a href='#SkRect_outset_dy'>dy</a> is positive, makes <a href='SkRect_Reference#SkRect'>SkRect</a> taller.
+If <a href='#SkRect_outset_dy'>dy</a> is negative, makes <a href='SkRect_Reference#SkRect'>SkRect</a> shorter.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_outset_dx'><code><strong>dx</strong></code></a></td>
+    <td>subtracted to <a href='#SkRect_fLeft'>fLeft</a> and added from <a href='#SkRect_fRight'>fRight</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_outset_dy'><code><strong>dy</strong></code></a></td>
+    <td>subtracted to <a href='#SkRect_fTop'>fTop</a> and added from <a href='#SkRect_fBottom'>fBottom</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_outset">
+
+#### Example Output
+
+~~~~
+rect: 5, 1, 55, 86
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_inset'>inset</a> <a href='#SkRect_makeOutset'>makeOutset</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_outset'>outset</a>
+
+<a name='Intersection'></a>
+
+<a href='SkRect_Reference#Rect'>Rects</a> intersect when they enclose a common area. To intersect, each of the pair
+must describe area; <a href='#SkRect_fLeft'>fLeft</a> is less than <a href='#SkRect_fRight'>fRight</a>, and <a href='#SkRect_fTop'>fTop</a> is less than <a href='#SkRect_fBottom'>fBottom</a>;
+<a href='#SkRect_isEmpty'>isEmpty</a>() returns false. The intersection of <a href='SkRect_Reference#Rect'>Rect</a> pair can be described by:
+<code>(<a href='undocumented#max()'>max</a>(a.<a href='#SkRect_fLeft'>fLeft</a>, b.<a href='#SkRect_fLeft'>fLeft</a>), <a href='undocumented#max()'>max</a>(a.<a href='#SkRect_fTop'>fTop</a>, b.<a href='#SkRect_fTop'>fTop</a>),
+<a href='undocumented#min()'>min</a>(a.<a href='#SkRect_fRight'>fRight</a>, b.<a href='#SkRect_fRight'>fRight</a>), <a href='undocumented#min()'>min</a>(a.<a href='#SkRect_fBottom'>fBottom</a>, b.<a href='#SkRect_fBottom'>fBottom</a>))</code>.
+
+The intersection is only meaningful if the resulting <a href='SkRect_Reference#Rect'>Rect</a> is not empty and
+describes an area: <a href='#SkRect_fLeft'>fLeft</a> is less than <a href='#SkRect_fRight'>fRight</a>, and <a href='#SkRect_fTop'>fTop</a> is less than <a href='#SkRect_fBottom'>fBottom</a>.
+
+<a name='SkRect_contains'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool contains(<a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y)const
+</pre>
+
+Returns true if: <a href='#SkRect_fLeft'>fLeft</a> <= <a href='#SkRect_contains_x'>x</a> < <a href='#SkRect_fRight'>fRight</a> && <a href='#SkRect_fTop'>fTop</a> <= <a href='#SkRect_contains_y'>y</a> < <a href='#SkRect_fBottom'>fBottom</a>.
+Returns false if <a href='SkRect_Reference#SkRect'>SkRect</a> is empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_contains_x'><code><strong>x</strong></code></a></td>
+    <td>test <a href='SkPoint_Reference#SkPoint'>SkPoint</a> x-coordinate</td>
+  </tr>
+  <tr>    <td><a name='SkRect_contains_y'><code><strong>y</strong></code></a></td>
+    <td>test <a href='SkPoint_Reference#SkPoint'>SkPoint</a> y-coordinate</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if (<a href='#SkRect_contains_x'>x</a>, <a href='#SkRect_contains_y'>y</a>) is inside <a href='SkRect_Reference#SkRect'>SkRect</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_contains">
+
+#### Example Output
+
+~~~~
+rect: (30, 50, 40, 60) contains (30, 50)
+rect: (30, 50, 40, 60) does not contain (39, 49)
+rect: (30, 50, 40, 60) does not contain (29, 59)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_contains'>contains</a> <a href='SkRRect_Reference#SkRRect'>SkRRect</a>::<a href='#SkRRect_contains'>contains</a>
+
+<a name='SkRect_contains_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool contains(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r)const
+</pre>
+
+Returns true if <a href='SkRect_Reference#SkRect'>SkRect</a> contains <a href='#SkRect_contains_2_r'>r</a>.
+Returns false if <a href='SkRect_Reference#SkRect'>SkRect</a> is empty or <a href='#SkRect_contains_2_r'>r</a> is empty.
+
+<a href='SkRect_Reference#SkRect'>SkRect</a> contains <a href='#SkRect_contains_2_r'>r</a> when <a href='SkRect_Reference#SkRect'>SkRect</a> area completely includes <a href='#SkRect_contains_2_r'>r</a> area.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_contains_2_r'><code><strong>r</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> contained</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if all sides of <a href='SkRect_Reference#SkRect'>SkRect</a> are outside <a href='#SkRect_contains_2_r'>r</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_contains_2">
+
+#### Example Output
+
+~~~~
+rect: (30, 50, 40, 60) contains (30, 50, 31, 51)
+rect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)
+rect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_contains'>contains</a>
+
+<a name='SkRect_contains_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool contains(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& r)const
+</pre>
+
+Returns true if <a href='SkRect_Reference#SkRect'>SkRect</a> contains <a href='#SkRect_contains_3_r'>r</a>.
+Returns false if <a href='SkRect_Reference#SkRect'>SkRect</a> is empty or <a href='#SkRect_contains_3_r'>r</a> is empty.
+
+<a href='SkRect_Reference#SkRect'>SkRect</a> contains <a href='#SkRect_contains_3_r'>r</a> when <a href='SkRect_Reference#SkRect'>SkRect</a> area completely includes <a href='#SkRect_contains_3_r'>r</a> area.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_contains_3_r'><code><strong>r</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> contained</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if all sides of <a href='SkRect_Reference#SkRect'>SkRect</a> are outside <a href='#SkRect_contains_3_r'>r</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_contains_3">
+
+#### Example Output
+
+~~~~
+rect: (30, 50, 40, 60) contains (30, 50, 31, 51)
+rect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)
+rect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_contains'>contains</a>
+
+<a name='SkRect_intersect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool intersect(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r)
+</pre>
+
+Returns true if <a href='SkRect_Reference#SkRect'>SkRect</a> intersects <a href='#SkRect_intersect_r'>r</a>, and sets <a href='SkRect_Reference#SkRect'>SkRect</a> to intersection.
+Returns false if <a href='SkRect_Reference#SkRect'>SkRect</a> does not intersect <a href='#SkRect_intersect_r'>r</a>, and leaves <a href='SkRect_Reference#SkRect'>SkRect</a> unchanged.
+
+Returns false if either <a href='#SkRect_intersect_r'>r</a> or <a href='SkRect_Reference#SkRect'>SkRect</a> is empty, leaving <a href='SkRect_Reference#SkRect'>SkRect</a> unchanged.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_intersect_r'><code><strong>r</strong></code></a></td>
+    <td>limit of result</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkRect_intersect_r'>r</a> and <a href='SkRect_Reference#SkRect'>SkRect</a> have area in common
+
+### Example
+
+<div><fiddle-embed name="@Rect_intersect"><div>Two <a href='undocumented#SkDebugf'>SkDebugf</a> calls are required. If the calls are combined, their arguments
+may not be evaluated in left to right order: the printed intersection may
+be before or after the call to intersect.
+</div>
+
+#### Example Output
+
+~~~~
+intersection: 30, 60, 50, 80
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_intersects'>intersects</a> <a href='#SkRect_Intersects'>Intersects</a> <a href='#SkRect_join'>join</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_intersect'>intersect</a>
+
+<a name='SkRect_intersect_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool intersect(<a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top, <a href='undocumented#SkScalar'>SkScalar</a> right, <a href='undocumented#SkScalar'>SkScalar</a> bottom)
+</pre>
+
+Constructs <a href='SkRect_Reference#SkRect'>SkRect</a> to intersect from (<a href='#SkRect_intersect_2_left'>left</a>, <a href='#SkRect_intersect_2_top'>top</a>, <a href='#SkRect_intersect_2_right'>right</a>, <a href='#SkRect_intersect_2_bottom'>bottom</a>). Does not sort
+construction.
+
+Returns true if <a href='SkRect_Reference#SkRect'>SkRect</a> intersects construction, and sets <a href='SkRect_Reference#SkRect'>SkRect</a> to intersection.
+Returns false if <a href='SkRect_Reference#SkRect'>SkRect</a> does not intersect construction, and leaves <a href='SkRect_Reference#SkRect'>SkRect</a> unchanged.
+
+Returns false if either construction or <a href='SkRect_Reference#SkRect'>SkRect</a> is empty, leaving <a href='SkRect_Reference#SkRect'>SkRect</a> unchanged.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_intersect_2_left'><code><strong>left</strong></code></a></td>
+    <td>x-axis minimum of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_intersect_2_top'><code><strong>top</strong></code></a></td>
+    <td>y-axis minimum of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_intersect_2_right'><code><strong>right</strong></code></a></td>
+    <td>x-axis maximum of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_intersect_2_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>y-axis maximum of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if construction and <a href='SkRect_Reference#SkRect'>SkRect</a> have area in common
+
+### Example
+
+<div><fiddle-embed name="@Rect_intersect_2"><div>Two <a href='undocumented#SkDebugf'>SkDebugf</a> calls are required. If the calls are combined, their arguments
+may not be evaluated in <a href='#SkRect_intersect_2_left'>left</a> to <a href='#SkRect_intersect_2_right'>right</a> order: the printed intersection may
+be before or after the call to intersect.
+</div>
+
+#### Example Output
+
+~~~~
+intersection: 30, 60, 50, 80
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_intersects'>intersects</a> <a href='#SkRect_Intersects'>Intersects</a> <a href='#SkRect_join'>join</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_intersect'>intersect</a>
+
+<a name='SkRect_intersect_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool intersect(const <a href='SkRect_Reference#SkRect'>SkRect</a>& a, const <a href='SkRect_Reference#SkRect'>SkRect</a>& b)
+</pre>
+
+Returns true if <a href='#SkRect_intersect_3_a'>a</a> intersects <a href='#SkRect_intersect_3_b'>b</a>, and sets <a href='SkRect_Reference#SkRect'>SkRect</a> to intersection.
+Returns false if <a href='#SkRect_intersect_3_a'>a</a> does not intersect <a href='#SkRect_intersect_3_b'>b</a>, and leaves <a href='SkRect_Reference#SkRect'>SkRect</a> unchanged.
+
+Returns false if either <a href='#SkRect_intersect_3_a'>a</a> or <a href='#SkRect_intersect_3_b'>b</a> is empty, leaving <a href='SkRect_Reference#SkRect'>SkRect</a> unchanged.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_intersect_3_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to intersect</td>
+  </tr>
+  <tr>    <td><a name='SkRect_intersect_3_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to intersect</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkRect_intersect_3_a'>a</a> and <a href='#SkRect_intersect_3_b'>b</a> have area in common
+
+### Example
+
+<div><fiddle-embed name="@Rect_intersect_3">
+
+#### Example Output
+
+~~~~
+intersection: 30, 60, 50, 80
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_intersects'>intersects</a> <a href='#SkRect_Intersects'>Intersects</a> <a href='#SkRect_join'>join</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_intersect'>intersect</a>
+
+<a name='SkRect_intersects'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool intersects(<a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top, <a href='undocumented#SkScalar'>SkScalar</a> right, <a href='undocumented#SkScalar'>SkScalar</a> bottom)const
+</pre>
+
+Constructs <a href='SkRect_Reference#SkRect'>SkRect</a> to intersect from (<a href='#SkRect_intersects_left'>left</a>, <a href='#SkRect_intersects_top'>top</a>, <a href='#SkRect_intersects_right'>right</a>, <a href='#SkRect_intersects_bottom'>bottom</a>). Does not sort
+construction.
+
+Returns true if <a href='SkRect_Reference#SkRect'>SkRect</a> intersects construction.
+Returns false if either construction or <a href='SkRect_Reference#SkRect'>SkRect</a> is empty, or do not intersect.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_intersects_left'><code><strong>left</strong></code></a></td>
+    <td>x-axis minimum of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_intersects_top'><code><strong>top</strong></code></a></td>
+    <td>y-axis minimum of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_intersects_right'><code><strong>right</strong></code></a></td>
+    <td>x-axis maximum of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_intersects_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>y-axis maximum of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if construction and <a href='SkRect_Reference#SkRect'>SkRect</a> have area in common
+
+### Example
+
+<div><fiddle-embed name="@Rect_intersects_3">
+
+#### Example Output
+
+~~~~
+intersection
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_intersect'>intersect</a> <a href='#SkRect_Intersects'>Intersects</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_Intersects'>Intersects</a>
+
+<a name='SkRect_intersects_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool intersects(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r)const
+</pre>
+
+Returns true if <a href='SkRect_Reference#SkRect'>SkRect</a> intersects <a href='#SkRect_intersects_2_r'>r</a>.
+Returns false if either <a href='#SkRect_intersects_2_r'>r</a> or <a href='SkRect_Reference#SkRect'>SkRect</a> is empty, or do not intersect.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_intersects_2_r'><code><strong>r</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to intersect</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkRect_intersects_2_r'>r</a> and <a href='SkRect_Reference#SkRect'>SkRect</a> have area in common
+
+### Example
+
+<div><fiddle-embed name="@Rect_intersects_2">
+
+#### Example Output
+
+~~~~
+intersection
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_intersect'>intersect</a> <a href='#SkRect_Intersects'>Intersects</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_Intersects'>Intersects</a>
+
+<a name='SkRect_Intersects'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static bool <a href='#SkRect_Intersects'>Intersects</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& a, const <a href='SkRect_Reference#SkRect'>SkRect</a>& b)
+</pre>
+
+Returns true if <a href='#SkRect_Intersects_a'>a</a> intersects <a href='#SkRect_Intersects_b'>b</a>.
+Returns false if either <a href='#SkRect_Intersects_a'>a</a> or <a href='#SkRect_Intersects_b'>b</a> is empty, or do not intersect.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_Intersects_a'><code><strong>a</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to intersect</td>
+  </tr>
+  <tr>    <td><a name='SkRect_Intersects_b'><code><strong>b</strong></code></a></td>
+    <td><a href='SkRect_Reference#SkRect'>SkRect</a> to intersect</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkRect_Intersects_a'>a</a> and <a href='#SkRect_Intersects_b'>b</a> have area in common
+
+### Example
+
+<div><fiddle-embed name="@Rect_Intersects">
+
+#### Example Output
+
+~~~~
+intersection
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_intersect'>intersect</a> <a href='#SkRect_intersects'>intersects</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_Intersects'>Intersects</a>
+
+<a name='Join'></a>
+
+<a name='SkRect_join'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void join(<a href='undocumented#SkScalar'>SkScalar</a> left, <a href='undocumented#SkScalar'>SkScalar</a> top, <a href='undocumented#SkScalar'>SkScalar</a> right, <a href='undocumented#SkScalar'>SkScalar</a> bottom)
+</pre>
+
+Constructs <a href='SkRect_Reference#SkRect'>SkRect</a> to intersect from (<a href='#SkRect_join_left'>left</a>, <a href='#SkRect_join_top'>top</a>, <a href='#SkRect_join_right'>right</a>, <a href='#SkRect_join_bottom'>bottom</a>). Does not sort
+construction.
+
+Sets <a href='SkRect_Reference#SkRect'>SkRect</a> to the union of itself and the construction.
+
+Has no effect if construction is empty. Otherwise, if <a href='SkRect_Reference#SkRect'>SkRect</a> is empty, sets
+<a href='SkRect_Reference#SkRect'>SkRect</a> to construction.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_join_left'><code><strong>left</strong></code></a></td>
+    <td>x-axis minimum of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_join_top'><code><strong>top</strong></code></a></td>
+    <td>y-axis minimum of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_join_right'><code><strong>right</strong></code></a></td>
+    <td>x-axis maximum of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkRect_join_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>y-axis maximum of constructed <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_join">
+
+#### Example Output
+
+~~~~
+join: 10, 20, 55, 65
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_joinNonEmptyArg'>joinNonEmptyArg</a> <a href='#SkRect_joinPossiblyEmptyRect'>joinPossiblyEmptyRect</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_join'>join</a>
+
+<a name='SkRect_join_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void join(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r)
+</pre>
+
+Sets <a href='SkRect_Reference#SkRect'>SkRect</a> to the union of itself and <a href='#SkRect_join_2_r'>r</a>.
+
+Has no effect if <a href='#SkRect_join_2_r'>r</a> is empty. Otherwise, if <a href='SkRect_Reference#SkRect'>SkRect</a> is empty, sets
+<a href='SkRect_Reference#SkRect'>SkRect</a> to <a href='#SkRect_join_2_r'>r</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_join_2_r'><code><strong>r</strong></code></a></td>
+    <td>expansion <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_join_2">
+
+#### Example Output
+
+~~~~
+join: 10, 20, 55, 65
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_joinNonEmptyArg'>joinNonEmptyArg</a> <a href='#SkRect_joinPossiblyEmptyRect'>joinPossiblyEmptyRect</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_join'>join</a>
+
+<a name='SkRect_joinNonEmptyArg'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_joinNonEmptyArg'>joinNonEmptyArg</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r)
+</pre>
+
+Sets <a href='SkRect_Reference#SkRect'>SkRect</a> to the union of itself and <a href='#SkRect_joinNonEmptyArg_r'>r</a>.
+
+Asserts if <a href='#SkRect_joinNonEmptyArg_r'>r</a> is empty and SK_DEBUG is defined.
+If <a href='SkRect_Reference#SkRect'>SkRect</a> is empty, sets <a href='SkRect_Reference#SkRect'>SkRect</a> to <a href='#SkRect_joinNonEmptyArg_r'>r</a>.
+
+May produce incorrect results if <a href='#SkRect_joinNonEmptyArg_r'>r</a> is empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_joinNonEmptyArg_r'><code><strong>r</strong></code></a></td>
+    <td>expansion <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_joinNonEmptyArg"><div>Since <a href='SkRect_Reference#Rect'>Rect</a> is not sorted, first result is copy of toJoin.
+</div>
+
+#### Example Output
+
+~~~~
+rect: 50, 60, 55, 65
+sorted: 10, 0, 55, 100
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_join'>join</a> <a href='#SkRect_joinPossiblyEmptyRect'>joinPossiblyEmptyRect</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_join'>join</a>
+
+<a name='SkRect_joinPossiblyEmptyRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_joinPossiblyEmptyRect'>joinPossiblyEmptyRect</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& r)
+</pre>
+
+Sets <a href='SkRect_Reference#SkRect'>SkRect</a> to the union of itself and the construction.
+
+May produce incorrect results if <a href='SkRect_Reference#SkRect'>SkRect</a> or <a href='#SkRect_joinPossiblyEmptyRect_r'>r</a> is empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_joinPossiblyEmptyRect_r'><code><strong>r</strong></code></a></td>
+    <td>expansion <a href='SkRect_Reference#SkRect'>SkRect</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_joinPossiblyEmptyRect"><div>Since <a href='SkRect_Reference#Rect'>Rect</a> is not sorted, first result is not useful.
+</div>
+
+#### Example Output
+
+~~~~
+rect: 10, 60, 55, 65
+sorted: 10, 0, 55, 100
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_joinNonEmptyArg'>joinNonEmptyArg</a> <a href='#SkRect_join'>join</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_join'>join</a>
+
+<a name='Rounding'></a>
+
+<a name='SkRect_round'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void round(<a href='SkIRect_Reference#SkIRect'>SkIRect</a>* dst)const
+</pre>
+
+Sets <a href='SkIRect_Reference#IRect'>IRect</a> by adding 0.5 and discarding the fractional portion of <a href='SkRect_Reference#Rect'>Rect</a>
+members, using <code>(<a href='undocumented#SkScalarRoundToInt'>SkScalarRoundToInt</a>(<a href='#SkRect_fLeft'>fLeft</a>), <a href='undocumented#SkScalarRoundToInt'>SkScalarRoundToInt</a>(<a href='#SkRect_fTop'>fTop</a>),
+<a href='undocumented#SkScalarRoundToInt'>SkScalarRoundToInt</a>(<a href='#SkRect_fRight'>fRight</a>), <a href='undocumented#SkScalarRoundToInt'>SkScalarRoundToInt</a>(<a href='#SkRect_fBottom'>fBottom</a>))</code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_round_dst'><code><strong>dst</strong></code></a></td>
+    <td>storage for <a href='SkIRect_Reference#IRect'>IRect</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_round">
+
+#### Example Output
+
+~~~~
+round: 31, 51, 41, 61
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_roundIn'>roundIn</a> <a href='#SkRect_roundOut'>roundOut</a> <a href='undocumented#SkScalarRoundToInt'>SkScalarRoundToInt</a>
+
+<a name='SkRect_roundOut'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_roundOut'>roundOut</a>(<a href='SkIRect_Reference#SkIRect'>SkIRect</a>* dst)const
+</pre>
+
+Sets <a href='SkIRect_Reference#IRect'>IRect</a> by discarding the fractional portion of <a href='#SkRect_fLeft'>fLeft</a> and <a href='#SkRect_fTop'>fTop</a>; and rounding
+up <a href='#SkRect_fRight'>fRight</a> and <a href='#SkRect_fBottom'>fBottom</a>, using
+<code>(<a href='undocumented#SkScalarFloorToInt'>SkScalarFloorToInt</a>(<a href='#SkRect_fLeft'>fLeft</a>), <a href='undocumented#SkScalarFloorToInt'>SkScalarFloorToInt</a>(<a href='#SkRect_fTop'>fTop</a>),
+<a href='undocumented#SkScalarCeilToInt'>SkScalarCeilToInt</a>(<a href='#SkRect_fRight'>fRight</a>), <a href='undocumented#SkScalarCeilToInt'>SkScalarCeilToInt</a>(<a href='#SkRect_fBottom'>fBottom</a>))</code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_roundOut_dst'><code><strong>dst</strong></code></a></td>
+    <td>storage for <a href='SkIRect_Reference#IRect'>IRect</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_roundOut">
+
+#### Example Output
+
+~~~~
+round: 30, 50, 41, 61
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_roundIn'>roundIn</a> <a href='#SkRect_round'>round</a> <a href='undocumented#SkScalarRoundToInt'>SkScalarRoundToInt</a>
+
+<a name='SkRect_roundOut_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_roundOut'>roundOut</a>(<a href='SkRect_Reference#SkRect'>SkRect</a>* dst)const
+</pre>
+
+Sets <a href='SkRect_Reference#Rect'>Rect</a> by discarding the fractional portion of <a href='#SkRect_fLeft'>fLeft</a> and <a href='#SkRect_fTop'>fTop</a>; and rounding
+up <a href='#SkRect_fRight'>fRight</a> and <a href='#SkRect_fBottom'>fBottom</a>, using
+<code>(<a href='undocumented#SkScalarFloorToInt'>SkScalarFloorToInt</a>(<a href='#SkRect_fLeft'>fLeft</a>), <a href='undocumented#SkScalarFloorToInt'>SkScalarFloorToInt</a>(<a href='#SkRect_fTop'>fTop</a>),
+<a href='undocumented#SkScalarCeilToInt'>SkScalarCeilToInt</a>(<a href='#SkRect_fRight'>fRight</a>), <a href='undocumented#SkScalarCeilToInt'>SkScalarCeilToInt</a>(<a href='#SkRect_fBottom'>fBottom</a>))</code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_roundOut_2_dst'><code><strong>dst</strong></code></a></td>
+    <td>storage for <a href='SkRect_Reference#Rect'>Rect</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_roundOut_2">
+
+#### Example Output
+
+~~~~
+round: 30, 50, 41, 61
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_roundIn'>roundIn</a> <a href='#SkRect_round'>round</a> <a href='undocumented#SkScalarRoundToInt'>SkScalarRoundToInt</a>
+
+<a name='SkRect_roundIn'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_roundIn'>roundIn</a>(<a href='SkIRect_Reference#SkIRect'>SkIRect</a>* dst)const
+</pre>
+
+Sets <a href='SkRect_Reference#Rect'>Rect</a> by rounding up <a href='#SkRect_fLeft'>fLeft</a> and <a href='#SkRect_fTop'>fTop</a>; and discarding the fractional portion
+of <a href='#SkRect_fRight'>fRight</a> and <a href='#SkRect_fBottom'>fBottom</a>, using
+<code>(<a href='undocumented#SkScalarCeilToInt'>SkScalarCeilToInt</a>(<a href='#SkRect_fLeft'>fLeft</a>), <a href='undocumented#SkScalarCeilToInt'>SkScalarCeilToInt</a>(<a href='#SkRect_fTop'>fTop</a>),
+<a href='undocumented#SkScalarFloorToInt'>SkScalarFloorToInt</a>(<a href='#SkRect_fRight'>fRight</a>), <a href='undocumented#SkScalarFloorToInt'>SkScalarFloorToInt</a>(<a href='#SkRect_fBottom'>fBottom</a>))</code>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_roundIn_dst'><code><strong>dst</strong></code></a></td>
+    <td>storage for <a href='SkIRect_Reference#IRect'>IRect</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_roundIn">
+
+#### Example Output
+
+~~~~
+round: 31, 51, 40, 60
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_roundOut'>roundOut</a> <a href='#SkRect_round'>round</a> <a href='undocumented#SkScalarRoundToInt'>SkScalarRoundToInt</a>
+
+<a name='SkRect_round_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkRect_round'>round()</a>const
+</pre>
+
+Returns <a href='SkIRect_Reference#IRect'>IRect</a> by adding 0.5 and discarding the fractional portion of <a href='SkRect_Reference#Rect'>Rect</a>
+members, using <code>(<a href='undocumented#SkScalarRoundToInt'>SkScalarRoundToInt</a>(<a href='#SkRect_fLeft'>fLeft</a>), <a href='undocumented#SkScalarRoundToInt'>SkScalarRoundToInt</a>(<a href='#SkRect_fTop'>fTop</a>),
+<a href='undocumented#SkScalarRoundToInt'>SkScalarRoundToInt</a>(<a href='#SkRect_fRight'>fRight</a>), <a href='undocumented#SkScalarRoundToInt'>SkScalarRoundToInt</a>(<a href='#SkRect_fBottom'>fBottom</a>))</code>.
+
+### Return Value
+
+rounded <a href='SkIRect_Reference#IRect'>IRect</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_round_2">
+
+#### Example Output
+
+~~~~
+round: 31, 51, 41, 61
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_roundOut'>roundOut</a> <a href='#SkRect_roundIn'>roundIn</a> <a href='undocumented#SkScalarRoundToInt'>SkScalarRoundToInt</a>
+
+<a name='SkRect_roundOut_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='#SkRect_roundOut'>roundOut</a>()const
+</pre>
+
+Sets <a href='SkIRect_Reference#IRect'>IRect</a> by discarding the fractional portion of <a href='#SkRect_fLeft'>fLeft</a> and <a href='#SkRect_fTop'>fTop</a>; and rounding
+up <a href='#SkRect_fRight'>fRight</a> and <a href='#SkRect_fBottom'>fBottom</a>, using
+<code>(<a href='undocumented#SkScalarFloorToInt'>SkScalarFloorToInt</a>(<a href='#SkRect_fLeft'>fLeft</a>), <a href='undocumented#SkScalarFloorToInt'>SkScalarFloorToInt</a>(<a href='#SkRect_fTop'>fTop</a>),
+<a href='undocumented#SkScalarCeilToInt'>SkScalarCeilToInt</a>(<a href='#SkRect_fRight'>fRight</a>), <a href='undocumented#SkScalarCeilToInt'>SkScalarCeilToInt</a>(<a href='#SkRect_fBottom'>fBottom</a>))</code>.
+
+### Return Value
+
+rounded <a href='SkIRect_Reference#IRect'>IRect</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_roundOut_3">
+
+#### Example Output
+
+~~~~
+round: 30, 50, 41, 61
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_round'>round</a> <a href='#SkRect_roundIn'>roundIn</a> <a href='undocumented#SkScalarRoundToInt'>SkScalarRoundToInt</a>
+
+<a name='Sorting'></a>
+
+<a name='SkRect_sort'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_sort'>sort()</a>
+</pre>
+
+Swaps <a href='#SkRect_fLeft'>fLeft</a> and <a href='#SkRect_fRight'>fRight</a> if <a href='#SkRect_fLeft'>fLeft</a> is greater than <a href='#SkRect_fRight'>fRight</a>; and swaps
+<a href='#SkRect_fTop'>fTop</a> and <a href='#SkRect_fBottom'>fBottom</a> if <a href='#SkRect_fTop'>fTop</a> is greater than <a href='#SkRect_fBottom'>fBottom</a>. Result may be empty;
+and <a href='#SkRect_width'>width()</a> and <a href='#SkRect_height'>height()</a> will be zero or positive.
+
+### Example
+
+<div><fiddle-embed name="@Rect_sort">
+
+#### Example Output
+
+~~~~
+rect: 30.5, 50.5, 20.5, 10.5
+sorted: 20.5, 10.5, 30.5, 50.5
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_makeSorted'>makeSorted</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_sort'>sort</a> <a href='#SkRect_isSorted'>isSorted</a>
+
+<a name='SkRect_makeSorted'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkRect_makeSorted'>makeSorted</a>()const
+</pre>
+
+Returns <a href='SkRect_Reference#SkRect'>SkRect</a> with <a href='#SkRect_fLeft'>fLeft</a> and <a href='#SkRect_fRight'>fRight</a> swapped if <a href='#SkRect_fLeft'>fLeft</a> is greater than <a href='#SkRect_fRight'>fRight</a>; and
+with <a href='#SkRect_fTop'>fTop</a> and <a href='#SkRect_fBottom'>fBottom</a> swapped if <a href='#SkRect_fTop'>fTop</a> is greater than <a href='#SkRect_fBottom'>fBottom</a>. Result may be empty;
+and <a href='#SkRect_width'>width()</a> and <a href='#SkRect_height'>height()</a> will be zero or positive.
+
+### Return Value
+
+sorted <a href='SkRect_Reference#SkRect'>SkRect</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_makeSorted">
+
+#### Example Output
+
+~~~~
+rect: 30.5, 50.5, 20.5, 10.5
+sorted: 20.5, 10.5, 30.5, 50.5
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_sort'>sort</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_makeSorted'>makeSorted</a> <a href='#SkRect_isSorted'>isSorted</a>
+
+<a name='SkRect_asScalars'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='undocumented#SkScalar'>SkScalar</a>* <a href='#SkRect_asScalars'>asScalars</a>()const
+</pre>
+
+Returns pointer to first <a href='undocumented#Scalar'>scalar</a> in <a href='SkRect_Reference#SkRect'>SkRect</a>, to treat it as an array with four
+entries.
+
+### Return Value
+
+pointer to <a href='#SkRect_fLeft'>fLeft</a>
+
+### Example
+
+<div><fiddle-embed name="@Rect_asScalars">
+
+#### Example Output
+
+~~~~
+rect.asScalars() == &rect.fLeft
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_toQuad'>toQuad</a>
+
+<a name='SkRect_dump'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_dump'>dump</a>(bool asHex)const
+</pre>
+
+Writes <a href='undocumented#Text'>text</a> representation of <a href='SkRect_Reference#SkRect'>SkRect</a> to standard output. Set <a href='#SkRect_dump_asHex'>asHex</a> to true to
+generate exact binary representations of floating <a href='SkPoint_Reference#Point'>point</a> numbers.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRect_dump_asHex'><code><strong>asHex</strong></code></a></td>
+    <td>true if <a href='undocumented#SkScalar'>SkScalar</a> values are written as hexadecimal</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Rect_dump">
+
+#### Example Output
+
+~~~~
+SkRect::MakeLTRB(20, 30, 40, 50);
+SkRect::MakeLTRB(SkBits2Float(0x41a00000), /* 20.000000 */
+SkBits2Float(0x41f00000), /* 30.000000 */
+SkBits2Float(0x42200000), /* 40.000000 */
+SkBits2Float(0x42480000)  /* 50.000000 */);
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_dumpHex'>dumpHex</a>
+
+<a name='SkRect_dump_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_dump'>dump()</a>const
+</pre>
+
+Writes <a href='undocumented#Text'>text</a> representation of <a href='SkRect_Reference#SkRect'>SkRect</a> to standard output. The representation may be
+directly compiled as C++ code. Floating <a href='SkPoint_Reference#Point'>point</a> values are written
+with limited precision; it may not be possible to reconstruct original <a href='SkRect_Reference#SkRect'>SkRect</a>
+from output.
+
+### Example
+
+<div><fiddle-embed name="@Rect_dump_2">
+
+#### Example Output
+
+~~~~
+SkRect::MakeLTRB(0.857143f, 0.666667f, 2.6f, 7);
+rect is not equal to copy
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_dumpHex'>dumpHex</a>
+
+<a name='SkRect_dumpHex'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRect_dumpHex'>dumpHex</a>()const
+</pre>
+
+Writes <a href='undocumented#Text'>text</a> representation of <a href='SkRect_Reference#Rect'>Rect</a> to standard output. The representation may be
+directly compiled as C++ code. Floating <a href='SkPoint_Reference#Point'>point</a> values are written
+in hexadecimal to preserve their exact bit pattern. The output reconstructs the
+original <a href='SkRect_Reference#Rect'>Rect</a>.
+
+Use instead of <a href='#SkRect_dump'>dump()</a> when submitting
+<a href='https://bug.skia.org'>bug reports against Skia</a></a> .
+
+### Example
+
+<div><fiddle-embed name="@Rect_dumpHex">
+
+#### Example Output
+
+~~~~
+SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */
+SkBits2Float(0x3f2aaaab), /* 0.666667 */
+SkBits2Float(0x40266666), /* 2.600000 */
+SkBits2Float(0x40e00000)  /* 7.000000 */);
+rect is equal to copy
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRect_dump'>dump</a>
+
diff --git a/src/third_party/skia/site/user/api/SkRegion_Reference.md b/src/third_party/skia/site/user/api/SkRegion_Reference.md
new file mode 100644
index 0000000..a7f8b95
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkRegion_Reference.md
@@ -0,0 +1,2164 @@
+SkRegion Reference
+===
+<a href='SkRegion_Reference#Region'>Region</a> is a compressed one bit mask. <a href='SkRegion_Reference#Region'>Region</a> describes an <a href='undocumented#Alias'>aliased</a> clipping area
+on integer boundaries. <a href='SkRegion_Reference#Region'>Region</a> can also describe an array of integer rectangles.
+
+<a href='SkCanvas_Reference#Canvas'>Canvas</a> uses <a href='SkRegion_Reference#Region'>Region</a> to reduce the current clip. <a href='SkRegion_Reference#Region'>Region</a> may be drawn to <a href='SkCanvas_Reference#Canvas'>Canvas</a>;
+<a href='SkPaint_Reference#Paint'>Paint</a> determines if <a href='SkRegion_Reference#Region'>Region</a> is filled or stroked, its <a href='SkColor_Reference#Color'>Color</a>, and so on.
+
+<a href='SkRegion_Reference#Region'>Region</a> may be constructed from <a href='SkIRect_Reference#IRect'>IRect</a> array or <a href='SkPath_Reference#Path'>Path</a>. Diagonal <a href='undocumented#Line'>lines</a> and <a href='undocumented#Curve'>curves</a>
+in <a href='SkPath_Reference#Path'>Path</a> become integer rectangle edges. <a href='SkRegion_Reference#Region'>Regions</a> operators compute union,
+intersection, difference, and so on. <a href='SkCanvas_Reference#Canvas'>Canvas</a> allows only intersection and
+difference; successive clips can only reduce available <a href='SkCanvas_Reference#Canvas'>Canvas</a> area.
+
+<a name='SkRegion'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkRegion_Reference#SkRegion'>SkRegion</a> {
+
+    <a href='#SkRegion_empty_constructor'>SkRegion()</a>;
+    <a href='#SkRegion_copy_const_SkRegion'>SkRegion</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>);
+    explicit <a href='#SkRegion_copy_const_SkIRect'>SkRegion</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>);
+    <a href='#SkRegion_destructor'>~SkRegion()</a>;
+    <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='#SkRegion_copy_operator'>operator=</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>);
+    bool <a href='#SkRegion_equal1_operator'>operator==</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& other) const;
+    bool <a href='#SkRegion_notequal1_operator'>operator!=</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& other) const;
+    bool <a href='#SkRegion_set'>set</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& src);
+    void <a href='#SkRegion_swap'>swap</a>(<a href='SkRegion_Reference#SkRegion'>SkRegion</a>& other);
+    bool <a href='#SkRegion_isEmpty'>isEmpty</a>() const;
+    bool <a href='#SkRegion_isRect'>isRect</a>() const;
+    bool <a href='#SkRegion_isComplex'>isComplex</a>() const;
+    const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='#SkRegion_getBounds'>getBounds</a>() const;
+    int <a href='#SkRegion_computeRegionComplexity'>computeRegionComplexity</a>() const;
+    bool <a href='#SkRegion_getBoundaryPath'>getBoundaryPath</a>(<a href='SkPath_Reference#SkPath'>SkPath</a>* <a href='SkPath_Reference#Path'>path</a>) const;
+    bool <a href='#SkRegion_setEmpty'>setEmpty</a>();
+    bool <a href='#SkRegion_setRect'>setRect</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>);
+    bool <a href='#SkRegion_setRect'>setRect</a>(int32_t left, int32_t top, int32_t right, int32_t bottom);
+    bool <a href='#SkRegion_setRects'>setRects</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='SkRect_Reference#Rect'>rects</a>[], int count);
+    bool <a href='#SkRegion_setRegion'>setRegion</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>);
+    bool <a href='#SkRegion_setPath'>setPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>, const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& clip);
+    bool <a href='#SkRegion_intersects'>intersects</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>) const;
+    bool <a href='#SkRegion_intersects'>intersects</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& other) const;
+    bool <a href='#SkRegion_contains'>contains</a>(int32_t x, int32_t y) const;
+    bool <a href='#SkRegion_contains'>contains</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& other) const;
+    bool <a href='#SkRegion_contains'>contains</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& other) const;
+    bool <a href='#SkRegion_quickContains'>quickContains</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& r) const;
+    bool <a href='#SkRegion_quickContains'>quickContains</a>(int32_t left, int32_t top, int32_t right,
+                       int32_t bottom) const;
+    bool <a href='#SkRegion_quickReject'>quickReject</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>) const;
+    bool <a href='#SkRegion_quickReject'>quickReject</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& rgn) const;
+    void <a href='#SkRegion_translate'>translate</a>(int dx, int dy);
+    void <a href='#SkRegion_translate'>translate</a>(int dx, int dy, <a href='SkRegion_Reference#SkRegion'>SkRegion</a>* dst) const;
+
+    enum <a href='#SkRegion_Op'>Op</a> {
+        <a href='#SkRegion_kDifference_Op'>kDifference_Op</a>,
+        <a href='#SkRegion_kIntersect_Op'>kIntersect_Op</a>,
+        <a href='#SkRegion_kUnion_Op'>kUnion_Op</a>,
+        <a href='#SkRegion_kXOR_Op'>kXOR_Op</a>,
+        <a href='#SkRegion_kReverseDifference_Op'>kReverseDifference_Op</a>,
+        <a href='#SkRegion_kReplace_Op'>kReplace_Op</a>,
+        <a href='#SkRegion_kLastOp'>kLastOp</a> = <a href='#SkRegion_kReplace_Op'>kReplace_Op</a>,
+    };
+
+    static const int <a href='#SkRegion_kOpCnt'>kOpCnt</a> = <a href='#SkRegion_kLastOp'>kLastOp</a> + 1
+    bool <a href='#SkRegion_op'>op</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='#SkRegion_Op'>Op</a> op);
+    bool <a href='#SkRegion_op'>op</a>(int left, int top, int right, int bottom, <a href='#SkRegion_Op'>Op</a> op);
+    bool <a href='#SkRegion_op'>op</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& rgn, <a href='#SkRegion_Op'>Op</a> op);
+    bool <a href='#SkRegion_op'>op</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& rgn, <a href='#SkRegion_Op'>Op</a> op);
+    bool <a href='#SkRegion_op'>op</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& rgn, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='#SkRegion_Op'>Op</a> op);
+    bool <a href='#SkRegion_op'>op</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& rgna, const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& rgnb, <a href='#SkRegion_Op'>Op</a> op);
+    size_t <a href='#SkRegion_writeToMemory'>writeToMemory</a>(void* buffer) const;
+    size_t <a href='#SkRegion_readFromMemory'>readFromMemory</a>(const void* buffer, size_t length);
+};
+
+</pre>
+
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a> describes the set of pixels used to clip <a href='SkCanvas_Reference#Canvas'>Canvas</a>. <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is compact,
+efficiently storing a single integer rectangle, or a run length encoded array
+of rectangles. <a href='SkRegion_Reference#SkRegion'>SkRegion</a> may reduce the current <a href='#Canvas_Clip'>Canvas_Clip</a>, or may be drawn as
+one or more integer rectangles. <a href='SkRegion_Reference#SkRegion'>SkRegion</a> iterator returns the scan <a href='undocumented#Line'>lines</a> or
+rectangles contained by it, optionally intersecting a bounding rectangle.
+
+<a name='SkRegion_Iterator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    class <a href='#SkRegion_Iterator'>Iterator</a> {
+    public:
+        <a href='#SkRegion_Iterator_Iterator'>Iterator()</a>;
+        <a href='#SkRegion_Iterator_Iterator'>Iterator</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>);
+        bool <a href='#SkRegion_Iterator_rewind'>rewind()</a>;
+        void <a href='#SkRegion_Iterator_reset'>reset</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>);
+        bool <a href='#SkRegion_Iterator_done'>done()</a> const;
+        void <a href='#SkRegion_Iterator_next'>next()</a>;
+        const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='#SkRegion_Iterator_rect'>rect()</a>;
+        const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>* <a href='#SkRegion_Iterator_rgn'>rgn()</a>;
+    };
+</pre>
+
+Returns sequence of rectangles, sorted along y-axis, then x-axis, that make
+up <a href='SkRegion_Reference#Region'>Region</a>.
+
+<a name='SkRegion_Iterator_Iterator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkRegion_Iterator_Iterator'>Iterator()</a>
+</pre>
+
+Initializes <a href='SkRegion_Reference#SkRegion'>SkRegion</a>::<a href='#SkRegion_Iterator'>Iterator</a> with an empty <a href='SkRegion_Reference#SkRegion'>SkRegion</a>. <a href='#SkRegion_Iterator_done'>done()</a> on <a href='SkRegion_Reference#SkRegion'>SkRegion</a>::<a href='#SkRegion_Iterator'>Iterator</a>
+returns true.
+Call <a href='#SkRegion_Iterator_reset'>reset()</a> to initialized <a href='SkRegion_Reference#SkRegion'>SkRegion</a>::<a href='#SkRegion_Iterator'>Iterator</a> at a later time.
+
+### Return Value
+
+empty <a href='SkRegion_Reference#SkRegion'>SkRegion</a> iterator
+
+### Example
+
+<div><fiddle-embed name="@Region_Iterator_Iterator">
+
+#### Example Output
+
+~~~~
+rect={1,2,3,4}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_Iterator_reset'>reset</a> <a href='SkRegion_Reference#SkRegion'>SkRegion</a>
+
+<a name='SkRegion_Iterator_copy_const_SkRegion'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkRegion_Iterator'>Iterator</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>)
+</pre>
+
+Sets <a href='SkRegion_Reference#SkRegion'>SkRegion</a>::<a href='#SkRegion_Iterator'>Iterator</a> to return elements of <a href='SkIRect_Reference#SkIRect'>SkIRect</a> array in <a href='#SkRegion_Iterator_copy_const_SkRegion_region'>region</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_Iterator_copy_const_SkRegion_region'><code><strong>region</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> to iterate</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a> iterator
+
+### Example
+
+<div><fiddle-embed name="@Region_Iterator_copy_const_SkRegion">
+
+#### Example Output
+
+~~~~
+rect={1,2,3,4}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_Iterator_reset'>reset</a> <a href='SkRegion_Reference#SkRegion'>SkRegion</a> <a href='#SkRegion_Cliperator'>Cliperator</a> <a href='#SkRegion_Spanerator'>Spanerator</a>
+
+<a name='SkRegion_Iterator_rewind'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_Iterator_rewind'>rewind()</a>
+</pre>
+
+<a href='SkPoint_Reference#SkPoint'>SkPoint</a> <a href='SkRegion_Reference#SkRegion'>SkRegion</a>::<a href='#SkRegion_Iterator'>Iterator</a> to start of <a href='SkRegion_Reference#SkRegion'>SkRegion</a>.
+Returns true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> was set; otherwise, returns false.
+
+### Return Value
+
+true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> was set
+
+### Example
+
+<div><fiddle-embed name="@Region_Iterator_rewind">
+
+#### Example Output
+
+~~~~
+#Volatile
+empty iter rewind success=false
+empty iter rect={0,0,0,0}
+empty region rewind success=true
+empty region rect={0,0,0,0}
+after set rect rect={1,2,3,4}
+after rewind rewind success=true
+after rewind rect={1,2,3,4}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_Iterator_reset'>reset</a>
+
+<a name='SkRegion_Iterator_reset'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void reset(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>)
+</pre>
+
+Resets iterator, using the new <a href='SkRegion_Reference#SkRegion'>SkRegion</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_Iterator_reset_region'><code><strong>region</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> to iterate</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Region_Iterator_reset">
+
+#### Example Output
+
+~~~~
+empty region: done=true
+after set rect: done=true
+after reset: done=false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_Iterator_rewind'>rewind</a>
+
+<a name='SkRegion_Iterator_done'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_Iterator_done'>done()</a>const
+</pre>
+
+Returns true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a>::<a href='#SkRegion_Iterator'>Iterator</a> is pointing to final <a href='SkIRect_Reference#SkIRect'>SkIRect</a> in <a href='SkRegion_Reference#SkRegion'>SkRegion</a>.
+
+### Return Value
+
+true if <a href='undocumented#Data'>data</a> parsing is complete
+
+### Example
+
+<div><fiddle-embed name="@Region_Iterator_done">
+
+#### Example Output
+
+~~~~
+done=true
+done=false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_Iterator_next'>next</a> <a href='#SkRegion_Iterator_rect'>rect</a>
+
+<a name='SkRegion_Iterator_next'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRegion_Iterator_next'>next()</a>
+</pre>
+
+Advances <a href='SkRegion_Reference#SkRegion'>SkRegion</a>::<a href='#SkRegion_Iterator'>Iterator</a> to next <a href='SkIRect_Reference#SkIRect'>SkIRect</a> in <a href='SkRegion_Reference#SkRegion'>SkRegion</a> if it is not done.
+
+### Example
+
+<div><fiddle-embed name="@Region_Iterator_next">
+
+#### Example Output
+
+~~~~
+rect={1,2,3,4}
+rect={5,6,7,8}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_Iterator_done'>done</a> <a href='#SkRegion_Iterator_rect'>rect</a>
+
+<a name='SkRegion_Iterator_rect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='#SkRegion_Iterator_rect'>rect()</a>const
+</pre>
+
+Returns <a href='SkIRect_Reference#SkIRect'>SkIRect</a> element in <a href='SkRegion_Reference#SkRegion'>SkRegion</a>. Does not return predictable results if <a href='SkRegion_Reference#SkRegion'>SkRegion</a>
+is empty.
+
+### Return Value
+
+part of <a href='SkRegion_Reference#SkRegion'>SkRegion</a> as <a href='SkIRect_Reference#SkIRect'>SkIRect</a>
+
+### Example
+
+<div><fiddle-embed name="@Region_Iterator_rect">
+
+#### Example Output
+
+~~~~
+#Volatile
+rect={0,0,0,0}
+rect={1,2,3,4}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_Iterator_next'>next</a> <a href='#SkRegion_Iterator_done'>done</a>
+
+<a name='SkRegion_Iterator_rgn'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>* <a href='#SkRegion_Iterator_rgn'>rgn()</a>const
+</pre>
+
+Returns <a href='SkRegion_Reference#SkRegion'>SkRegion</a> if set; otherwise, returns nullptr.
+
+### Return Value
+
+iterated <a href='SkRegion_Reference#SkRegion'>SkRegion</a>
+
+### Example
+
+<div><fiddle-embed name="@Region_Iterator_rgn"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_Iterator'>Iterator</a> <a href='#SkRegion_Iterator_reset'>reset</a>
+
+<a name='SkRegion_Cliperator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    class <a href='#SkRegion_Cliperator'>Cliperator</a> {
+    public:
+        <a href='#SkRegion_Cliperator'>Cliperator</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& clip);
+        bool <a href='#SkRegion_Cliperator_done'>done()</a>;
+        void <a href='#SkRegion_Cliperator_next'>next()</a>;
+        const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='#SkRegion_Cliperator_rect'>rect()</a> const;
+    };
+</pre>
+
+Returns the sequence of rectangles, sorted along y-axis, then x-axis, that make
+up <a href='SkRegion_Reference#Region'>Region</a> intersected with the specified clip rectangle.
+
+<a name='SkRegion_Cliperator_const_SkRegion_const_SkIRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkRegion_Cliperator'>Cliperator</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& clip)
+</pre>
+
+Sets <a href='SkRegion_Reference#SkRegion'>SkRegion</a>::<a href='#SkRegion_Cliperator'>Cliperator</a> to return elements of <a href='SkIRect_Reference#SkIRect'>SkIRect</a> array in <a href='SkRegion_Reference#SkRegion'>SkRegion</a> within <a href='#SkRegion_Cliperator_const_SkRegion_const_SkIRect_clip'>clip</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_Cliperator_const_SkRegion_const_SkIRect_region'><code><strong>region</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> to iterate</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_Cliperator_const_SkRegion_const_SkIRect_clip'><code><strong>clip</strong></code></a></td>
+    <td>bounds of iteration</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a> iterator
+
+### Example
+
+<div><fiddle-embed name="@Region_Cliperator_const_SkRegion_const_SkIRect">
+
+#### Example Output
+
+~~~~
+rect={1,2,2,3}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a> <a href='#SkRegion_Iterator'>Iterator</a> <a href='#SkRegion_Spanerator'>Spanerator</a>
+
+<a name='SkRegion_Cliperator_done'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_Cliperator_done'>done()</a>
+</pre>
+
+Returns true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a>::<a href='#SkRegion_Cliperator'>Cliperator</a> is pointing to final <a href='SkIRect_Reference#SkIRect'>SkIRect</a> in <a href='SkRegion_Reference#SkRegion'>SkRegion</a>.
+
+### Return Value
+
+true if <a href='undocumented#Data'>data</a> parsing is complete
+
+### Example
+
+<div><fiddle-embed name="@Region_Cliperator_done">
+
+#### Example Output
+
+~~~~
+empty region done=true
+after add rect done=false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_Cliperator_next'>next</a> <a href='#SkRegion_Cliperator_rect'>rect</a>
+
+<a name='SkRegion_Cliperator_next'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void  <a href='#SkRegion_Cliperator_next'>next()</a>
+</pre>
+
+Advances iterator to next <a href='SkIRect_Reference#SkIRect'>SkIRect</a> in <a href='SkRegion_Reference#SkRegion'>SkRegion</a> contained by clip.
+
+### Example
+
+<div><fiddle-embed name="@Region_Cliperator_next">
+
+#### Example Output
+
+~~~~
+rect={1,3,3,4}
+rect={5,6,7,7}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_Cliperator_done'>done</a>
+
+<a name='SkRegion_Cliperator_rect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='#SkRegion_Cliperator_rect'>rect()</a>const
+</pre>
+
+Returns <a href='SkIRect_Reference#SkIRect'>SkIRect</a> element in <a href='SkRegion_Reference#SkRegion'>SkRegion</a>, intersected with clip passed to
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a>::<a href='#SkRegion_Cliperator'>Cliperator</a> constructor. Does not return predictable results if <a href='SkRegion_Reference#SkRegion'>SkRegion</a>
+is empty.
+
+### Return Value
+
+part of <a href='SkRegion_Reference#SkRegion'>SkRegion</a> inside clip as <a href='SkIRect_Reference#SkIRect'>SkIRect</a>
+
+### Example
+
+<div><fiddle-embed name="@Region_Cliperator_rect">
+
+#### Example Output
+
+~~~~
+#Volatile
+empty region rect={1094713344,1065353216,0,-1}
+after set rect rect={1,2,3,3}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_Cliperator_next'>next</a> <a href='#SkRegion_Cliperator_done'>done</a>
+
+<a name='SkRegion_Spanerator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    class <a href='#SkRegion_Spanerator'>Spanerator</a> {
+    public:
+        <a href='#SkRegion_Spanerator'>Spanerator</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>, int y, int left, int right);
+        bool <a href='#SkRegion_Spanerator_next'>next</a>(int* left, int* right);
+    };
+</pre>
+
+Returns the <a href='undocumented#Line'>line</a> segment ends within <a href='SkRegion_Reference#Region'>Region</a> that intersect a horizontal <a href='undocumented#Line'>line</a>.
+
+<a name='SkRegion_Spanerator_const_SkRegion_int_int_int'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkRegion_Spanerator'>Spanerator</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>, int y, int left, int right)
+</pre>
+
+Sets <a href='SkRegion_Reference#SkRegion'>SkRegion</a>::<a href='#SkRegion_Spanerator'>Spanerator</a> to return <a href='undocumented#Line'>line</a> segments in <a href='SkRegion_Reference#SkRegion'>SkRegion</a> on scan <a href='undocumented#Line'>line</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_Spanerator_const_SkRegion_int_int_int_region'><code><strong>region</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> to iterate</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_Spanerator_const_SkRegion_int_int_int_y'><code><strong>y</strong></code></a></td>
+    <td>horizontal <a href='undocumented#Line'>line</a> to intersect</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_Spanerator_const_SkRegion_int_int_int_left'><code><strong>left</strong></code></a></td>
+    <td>bounds of iteration</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_Spanerator_const_SkRegion_int_int_int_right'><code><strong>right</strong></code></a></td>
+    <td>bounds of iteration</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a> iterator
+
+### Example
+
+<div><fiddle-embed name="@Region_Spanerator_const_SkRegion_int_int_int"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a> <a href='#SkRegion_Iterator'>Iterator</a> <a href='#SkRegion_Cliperator'>Cliperator</a>
+
+<a name='SkRegion_Spanerator_next'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool next(int* left, int* right)
+</pre>
+
+Advances iterator to next span intersecting <a href='SkRegion_Reference#SkRegion'>SkRegion</a> within <a href='undocumented#Line'>line</a> segment provided
+in constructor. Returns true if interval was found.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_Spanerator_next_left'><code><strong>left</strong></code></a></td>
+    <td>pointer to span start; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_Spanerator_next_right'><code><strong>right</strong></code></a></td>
+    <td>pointer to span end; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if interval was found
+
+### Example
+
+<div><fiddle-embed name="@Region_Spanerator_next">
+
+#### Example Output
+
+~~~~
+empty region: result=false
+after set rect: result=true left=2 right=3
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+done
+
+<a name='SkRegion_empty_constructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkRegion_empty_constructor'>SkRegion()</a>
+</pre>
+
+Constructs an empty <a href='SkRegion_Reference#SkRegion'>SkRegion</a>. <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is set to empty bounds
+at (0, 0) with zero width and height.
+
+### Return Value
+
+empty <a href='SkRegion_Reference#SkRegion'>SkRegion</a>
+
+### Example
+
+<div><fiddle-embed name="@Region_empty_constructor">
+
+#### Example Output
+
+~~~~
+region bounds: {0, 0, 0, 0}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_setEmpty'>setEmpty</a>
+
+<a name='SkRegion_copy_const_SkRegion'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkRegion_copy_const_SkRegion'>SkRegion</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>)
+</pre>
+
+Constructs a copy of an existing <a href='#SkRegion_copy_const_SkRegion_region'>region</a>.
+Copy constructor makes two <a href='SkRegion_Reference#Region'>regions</a> identical by value. Internally, <a href='#SkRegion_copy_const_SkRegion_region'>region</a> and
+the returned result share pointer values. The underlying <a href='SkRect_Reference#SkRect'>SkRect</a> array is
+copied when modified.
+
+Creating a <a href='SkRegion_Reference#SkRegion'>SkRegion</a> copy is very efficient and never allocates memory.
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a> are always copied by value from the interface; the underlying shared
+pointers are not exposed.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_copy_const_SkRegion_region'><code><strong>region</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> to copy by value</td>
+  </tr>
+</table>
+
+### Return Value
+
+copy of <a href='SkRegion_Reference#SkRegion'>SkRegion</a>
+
+### Example
+
+<div><fiddle-embed name="@Region_copy_const_SkRegion">
+
+#### Example Output
+
+~~~~
+region bounds: {1,2,3,4}
+region2 bounds: {1,2,3,4}
+after region set empty:
+region bounds: {0,0,0,0}
+region2 bounds: {1,2,3,4}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_setRegion'>setRegion</a> <a href='#SkRegion_copy_operator'>operator=</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='#SkRegion_copy_const_SkRegion_region'>region</a>)
+
+<a name='SkRegion_copy_const_SkIRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+explicit <a href='#SkRegion_copy_const_SkIRect'>SkRegion</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>)
+</pre>
+
+Constructs a rectangular <a href='SkRegion_Reference#SkRegion'>SkRegion</a> matching the bounds of <a href='#SkRegion_copy_const_SkIRect_rect'>rect</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_copy_const_SkIRect_rect'><code><strong>rect</strong></code></a></td>
+    <td>bounds of constructed <a href='SkRegion_Reference#SkRegion'>SkRegion</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+rectangular <a href='SkRegion_Reference#SkRegion'>SkRegion</a>
+
+### Example
+
+<div><fiddle-embed name="@Region_copy_const_SkIRect"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_setRect'>setRect</a> <a href='#SkRegion_setRegion'>setRegion</a>
+
+<a name='SkRegion_destructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkRegion_destructor'>~SkRegion()</a>
+</pre>
+
+Releases ownership of any shared <a href='undocumented#Data'>data</a> and deletes <a href='undocumented#Data'>data</a> if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is sole owner.
+
+### Example
+
+<div><fiddle-embed name="@Region_destructor"><div>delete calls <a href='SkRegion_Reference#Region'>Region</a> destructor, but copy of original in region2 is unaffected.
+</div>
+
+#### Example Output
+
+~~~~
+region2 bounds: {1,2,3,4}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_empty_constructor'>SkRegion()</a> <a href='#SkRegion_copy_const_SkRegion'>SkRegion</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>) <a href='#SkRegion_copy_const_SkIRect'>SkRegion</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>) <a href='#SkRegion_copy_operator'>operator=</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>)
+
+<a name='SkRegion_copy_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='#SkRegion_copy_operator'>operator=</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>)
+</pre>
+
+Constructs a copy of an existing <a href='#SkRegion_copy_operator_region'>region</a>.
+Makes two <a href='SkRegion_Reference#Region'>regions</a> identical by value. Internally, <a href='#SkRegion_copy_operator_region'>region</a> and
+the returned result share pointer values. The underlying <a href='SkRect_Reference#SkRect'>SkRect</a> array is
+copied when modified.
+
+Creating a <a href='SkRegion_Reference#SkRegion'>SkRegion</a> copy is very efficient and never allocates memory.
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a> are always copied by value from the interface; the underlying shared
+pointers are not exposed.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_copy_operator_region'><code><strong>region</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> to copy by value</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a> to copy by value
+
+### Example
+
+<div><fiddle-embed name="@Region_copy_operator">
+
+#### Example Output
+
+~~~~
+region1 bounds: {1,2,3,4}
+region2 bounds: {1,2,3,4}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_set'>set</a> <a href='#SkRegion_swap'>swap</a> <a href='#SkRegion_copy_const_SkRegion'>SkRegion</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='#SkRegion_copy_operator_region'>region</a>)
+
+<a name='SkRegion_equal1_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool operator==(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& other)const
+</pre>
+
+Compares <a href='SkRegion_Reference#SkRegion'>SkRegion</a> and <a href='#SkRegion_equal1_operator_other'>other</a>; returns true if they enclose exactly
+the same area.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_equal1_operator_other'><code><strong>other</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> pair are equivalent
+
+### Example
+
+<div><fiddle-embed name="@Region_equal1_operator">
+
+#### Example Output
+
+~~~~
+empty one == two
+set rect one != two
+set empty one == two
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_notequal1_operator'>operator!=</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='#SkRegion_equal1_operator_other'>other</a>) const <a href='#SkRegion_copy_operator'>operator=</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>)
+
+<a name='SkRegion_notequal1_operator'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool operator!=(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& other)const
+</pre>
+
+Compares <a href='SkRegion_Reference#SkRegion'>SkRegion</a> and <a href='#SkRegion_notequal1_operator_other'>other</a>; returns true if they do not enclose the same area.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_notequal1_operator_other'><code><strong>other</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> to compare</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> pair are not equivalent
+
+### Example
+
+<div><fiddle-embed name="@Region_notequal1_operator">
+
+#### Example Output
+
+~~~~
+empty one == two
+set rect one != two
+union rect one == two
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_equal1_operator'>operator==</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='#SkRegion_notequal1_operator_other'>other</a>) const <a href='#SkRegion_copy_operator'>operator=</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>)
+
+<a name='SkRegion_set'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool set(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& src)
+</pre>
+
+Sets <a href='SkRegion_Reference#SkRegion'>SkRegion</a> to <a href='#SkRegion_set_src'>src</a>, and returns true if <a href='#SkRegion_set_src'>src</a> bounds is not empty.
+This makes <a href='SkRegion_Reference#SkRegion'>SkRegion</a> and <a href='#SkRegion_set_src'>src</a> identical by value. Internally,
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a> and <a href='#SkRegion_set_src'>src</a> share pointer values. The underlying <a href='SkRect_Reference#SkRect'>SkRect</a> array is
+copied when modified.
+
+Creating a <a href='SkRegion_Reference#SkRegion'>SkRegion</a> copy is very efficient and never allocates memory.
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a> are always copied by value from the interface; the underlying shared
+pointers are not exposed.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_set_src'><code><strong>src</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> to copy</td>
+  </tr>
+</table>
+
+### Return Value
+
+copy of <a href='#SkRegion_set_src'>src</a>
+
+### Example
+
+<div><fiddle-embed name="@Region_set">
+
+#### Example Output
+
+~~~~
+region1 bounds: {1,2,3,4}
+region2 bounds: {1,2,3,4}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_copy_operator'>operator=</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>) <a href='#SkRegion_swap'>swap</a> <a href='#SkRegion_copy_const_SkRegion'>SkRegion</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>)
+
+<a name='SkRegion_swap'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkRegion_swap'>swap</a>(<a href='SkRegion_Reference#SkRegion'>SkRegion</a>& other)
+</pre>
+
+Exchanges <a href='SkIRect_Reference#SkIRect'>SkIRect</a> array of <a href='SkRegion_Reference#SkRegion'>SkRegion</a> and <a href='#SkRegion_swap_other'>other</a>. <a href='#SkRegion_swap'>swap()</a> internally exchanges pointers,
+so it is lightweight and does not allocate memory.
+
+<a href='#SkRegion_swap'>swap()</a> usage has largely been replaced by <a href='#SkRegion_copy_operator'>operator=</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>).
+<a href='SkPath_Reference#SkPath'>SkPath</a> do not copy their content on assignment until they are written to,
+making assignment as efficient as <a href='#SkRegion_swap'>swap()</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_swap_other'><code><strong>other</strong></code></a></td>
+    <td><a href='#SkRegion_copy_operator'>operator=</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>) set</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Region_swap">
+
+#### Example Output
+
+~~~~
+region1 bounds: {0,0,0,0}
+region2 bounds: {1,2,3,4}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_copy_operator'>operator=</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>) <a href='#SkRegion_set'>set</a> <a href='#SkRegion_copy_const_SkRegion'>SkRegion</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>)
+
+<a name='SkRegion_isEmpty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_isEmpty'>isEmpty</a>()const
+</pre>
+
+Returns true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is empty.
+Empty <a href='SkRegion_Reference#SkRegion'>SkRegion</a> has bounds width or height less than or equal to zero.
+<a href='#SkRegion_empty_constructor'>SkRegion()</a> constructs empty <a href='SkRegion_Reference#SkRegion'>SkRegion</a>; <a href='#SkRegion_setEmpty'>setEmpty</a>()
+and <a href='#SkRegion_setRect'>setRect</a>() with dimensionless <a href='undocumented#Data'>data</a> make <a href='SkRegion_Reference#SkRegion'>SkRegion</a> empty.
+
+### Return Value
+
+true if bounds has no width or height
+
+### Example
+
+<div><fiddle-embed name="@Region_isEmpty">
+
+#### Example Output
+
+~~~~
+initial: region is empty
+set rect: region is not empty
+set empty: region is empty
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_isRect'>isRect</a> <a href='#SkRegion_isComplex'>isComplex</a> <a href='#SkRegion_equal1_operator'>operator==</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& other) const
+
+<a name='SkRegion_isRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_isRect'>isRect</a>()const
+</pre>
+
+Returns true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is one <a href='SkIRect_Reference#SkIRect'>SkIRect</a> with positive dimensions.
+
+### Return Value
+
+true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> contains one <a href='SkIRect_Reference#SkIRect'>SkIRect</a>
+
+### Example
+
+<div><fiddle-embed name="@Region_isRect">
+
+#### Example Output
+
+~~~~
+initial: region is not rect
+set rect: region is rect
+set empty: region is not rect
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_isEmpty'>isEmpty</a> <a href='#SkRegion_isComplex'>isComplex</a>
+
+<a name='SkRegion_isComplex'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_isComplex'>isComplex</a>()const
+</pre>
+
+Returns true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is described by more than one rectangle.
+
+### Return Value
+
+true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> contains more than one <a href='SkIRect_Reference#SkIRect'>SkIRect</a>
+
+### Example
+
+<div><fiddle-embed name="@Region_isComplex">
+
+#### Example Output
+
+~~~~
+initial: region is not complex
+set rect: region is not complex
+op rect: region is complex
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_isEmpty'>isEmpty</a> <a href='#SkRegion_isRect'>isRect</a>
+
+<a name='SkRegion_getBounds'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='#SkRegion_getBounds'>getBounds</a>()const
+</pre>
+
+Returns minimum and maximum axes values of <a href='SkIRect_Reference#SkIRect'>SkIRect</a> array.
+Returns (0, 0, 0, 0) if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is empty.
+
+### Return Value
+
+combined bounds of all <a href='SkIRect_Reference#SkIRect'>SkIRect</a> elements
+
+### Example
+
+<div><fiddle-embed name="@Region_getBounds">
+
+#### Example Output
+
+~~~~
+bounds: {1,2,4,5}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_isEmpty'>isEmpty</a> <a href='#SkRegion_isRect'>isRect</a>
+
+<a name='SkRegion_computeRegionComplexity'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkRegion_computeRegionComplexity'>computeRegionComplexity</a>()const
+</pre>
+
+Returns a value that increases with the number of
+elements in <a href='SkRegion_Reference#SkRegion'>SkRegion</a>. Returns zero if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is empty.
+Returns one if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> equals <a href='SkIRect_Reference#SkIRect'>SkIRect</a>; otherwise, returns
+value greater than one indicating that <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is complex.
+
+Call to compare <a href='SkRegion_Reference#SkRegion'>SkRegion</a> for relative complexity.
+
+### Return Value
+
+relative complexity
+
+### Example
+
+<div><fiddle-embed name="@Region_computeRegionComplexity">
+
+#### Example Output
+
+~~~~
+initial: region complexity 0
+set rect: region complexity 1
+op rect: region complexity 3
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_isRect'>isRect</a> <a href='#SkRegion_isComplex'>isComplex</a>
+
+<a name='SkRegion_getBoundaryPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_getBoundaryPath'>getBoundaryPath</a>(<a href='SkPath_Reference#SkPath'>SkPath</a>* <a href='SkPath_Reference#Path'>path</a>)const
+</pre>
+
+Appends outline of <a href='SkRegion_Reference#SkRegion'>SkRegion</a> to <a href='#SkRegion_getBoundaryPath_path'>path</a>.
+Returns true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is not empty; otherwise, returns false, and leaves <a href='#SkRegion_getBoundaryPath_path'>path</a>
+unmodified.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_getBoundaryPath_path'><code><strong>path</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> to append to</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkRegion_getBoundaryPath_path'>path</a> changed
+
+### Example
+
+<div><fiddle-embed name="@Region_getBoundaryPath"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_isEmpty'>isEmpty</a> <a href='#SkRegion_isComplex'>isComplex</a>
+
+<a name='SkRegion_setEmpty'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_setEmpty'>setEmpty</a>()
+</pre>
+
+Constructs an empty <a href='SkRegion_Reference#SkRegion'>SkRegion</a>. <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is set to empty bounds
+at (0, 0) with zero width and height. Always returns false.
+
+### Return Value
+
+false
+
+### Example
+
+<div><fiddle-embed name="@Region_setEmpty">
+
+#### Example Output
+
+~~~~
+region bounds: {1,2,3,4}
+after region set empty:
+region bounds: {0,0,0,0}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_empty_constructor'>SkRegion()</a>
+
+<a name='SkRegion_setRect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_setRect'>setRect</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>)
+</pre>
+
+Constructs a rectangular <a href='SkRegion_Reference#SkRegion'>SkRegion</a> matching the bounds of <a href='#SkRegion_setRect_rect'>rect</a>.
+If <a href='#SkRegion_setRect_rect'>rect</a> is empty, constructs empty and returns false.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_setRect_rect'><code><strong>rect</strong></code></a></td>
+    <td>bounds of constructed <a href='SkRegion_Reference#SkRegion'>SkRegion</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkRegion_setRect_rect'>rect</a> is not empty
+
+### Example
+
+<div><fiddle-embed name="@Region_setRect">
+
+#### Example Output
+
+~~~~
+region is not empty
+region is empty
+setEmpty: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_copy_const_SkIRect'>SkRegion</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='#SkRegion_setRect_rect'>rect</a>)
+
+<a name='SkRegion_setRect_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_setRect'>setRect</a>(int32_t left, int32_t top, int32_t right, int32_t bottom)
+</pre>
+
+Constructs <a href='SkRegion_Reference#SkRegion'>SkRegion</a> with bounds (<a href='#SkRegion_setRect_2_left'>left</a>, <a href='#SkRegion_setRect_2_top'>top</a>, <a href='#SkRegion_setRect_2_right'>right</a>, <a href='#SkRegion_setRect_2_bottom'>bottom</a>).
+Returns true if <a href='#SkRegion_setRect_2_left'>left</a> is less than <a href='#SkRegion_setRect_2_right'>right</a> and <a href='#SkRegion_setRect_2_top'>top</a> is less than <a href='#SkRegion_setRect_2_bottom'>bottom</a>; otherwise,
+constructs empty <a href='SkRegion_Reference#SkRegion'>SkRegion</a> and returns false.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_setRect_2_left'><code><strong>left</strong></code></a></td>
+    <td>edge of bounds on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_setRect_2_top'><code><strong>top</strong></code></a></td>
+    <td>edge of bounds on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_setRect_2_right'><code><strong>right</strong></code></a></td>
+    <td>edge of bounds on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_setRect_2_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>edge of bounds on y-axis</td>
+  </tr>
+</table>
+
+### Return Value
+
+rectangular <a href='SkRegion_Reference#SkRegion'>SkRegion</a>
+
+### Example
+
+<div><fiddle-embed name="5b31a1b077818a8150ad50f3b19e7bfe">
+
+#### Example Output
+
+~~~~
+set to: 1,2,3,4: success:true {1,2,3,4}
+set to: 3,2,1,4: success:false {0,0,0,0}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_copy_const_SkIRect'>SkRegion</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>)
+
+<a name='SkRegion_setRects'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_setRects'>setRects</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a> <a href='SkRect_Reference#Rect'>rects</a>[], int count)
+</pre>
+
+Constructs <a href='SkRegion_Reference#SkRegion'>SkRegion</a> as the union of <a href='SkIRect_Reference#SkIRect'>SkIRect</a> in <a href='#SkRegion_setRects_rects'>rects</a> array. If <a href='#SkRegion_setRects_count'>count</a> is
+zero, constructs empty <a href='SkRegion_Reference#SkRegion'>SkRegion</a>. Returns false if constructed <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is empty.
+
+May be faster than repeated calls to <a href='#SkRegion_op'>op()</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_setRects_rects'><code><strong>rects</strong></code></a></td>
+    <td>array of <a href='SkIRect_Reference#SkIRect'>SkIRect</a></td>
+  </tr>
+  <tr>    <td><a name='SkRegion_setRects_count'><code><strong>count</strong></code></a></td>
+    <td>array <a href='undocumented#Size'>size</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if constructed <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is not empty
+
+### Example
+
+<div><fiddle-embed name="@Region_setRects"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_setRect'>setRect</a> <a href='#SkRegion_op'>op</a>
+
+<a name='SkRegion_setRegion'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_setRegion'>setRegion</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='SkRegion_Reference#Region'>region</a>)
+</pre>
+
+Constructs a copy of an existing <a href='#SkRegion_setRegion_region'>region</a>.
+Makes two <a href='SkRegion_Reference#Region'>regions</a> identical by value. Internally, <a href='#SkRegion_setRegion_region'>region</a> and
+the returned result share pointer values. The underlying <a href='SkRect_Reference#SkRect'>SkRect</a> array is
+copied when modified.
+
+Creating a <a href='SkRegion_Reference#SkRegion'>SkRegion</a> copy is very efficient and never allocates memory.
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a> are always copied by value from the interface; the underlying shared
+pointers are not exposed.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_setRegion_region'><code><strong>region</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> to copy by value</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkRegion_Reference#SkRegion'>SkRegion</a> to copy by value
+
+### Example
+
+<div><fiddle-embed name="@Region_setRegion">
+
+#### Example Output
+
+~~~~
+region bounds: {1,2,3,4}
+region2 bounds: {1,2,3,4}
+after region set empty:
+region bounds: {1,2,3,4}
+region2 bounds: {0,0,0,0}
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_copy_const_SkRegion'>SkRegion</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& <a href='#SkRegion_setRegion_region'>region</a>)
+
+<a name='SkRegion_setPath'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_setPath'>setPath</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& <a href='SkPath_Reference#Path'>path</a>, const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& clip)
+</pre>
+
+Constructs <a href='SkRegion_Reference#SkRegion'>SkRegion</a> to match outline of <a href='#SkRegion_setPath_path'>path</a> within <a href='#SkRegion_setPath_clip'>clip</a>.
+Returns false if constructed <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is empty.
+
+Constructed <a href='SkRegion_Reference#SkRegion'>SkRegion</a> draws the same pixels as <a href='#SkRegion_setPath_path'>path</a> through <a href='#SkRegion_setPath_clip'>clip</a> when
+<a href='SkPaint_Reference#Anti_Alias'>anti-aliasing</a> is disabled.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_setPath_path'><code><strong>path</strong></code></a></td>
+    <td><a href='SkPath_Reference#SkPath'>SkPath</a> providing outline</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_setPath_clip'><code><strong>clip</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> containing <a href='#SkRegion_setPath_path'>path</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+true if constructed <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is not empty
+
+### Example
+
+<div><fiddle-embed name="45b9ea2247b9ca7f10aa22ea29a426f4"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_setRects'>setRects</a> <a href='#SkRegion_op'>op</a>
+
+<a name='SkRegion_intersects'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool intersects(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>)const
+</pre>
+
+Returns true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> intersects <a href='#SkRegion_intersects_rect'>rect</a>.
+Returns false if either <a href='#SkRegion_intersects_rect'>rect</a> or <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is empty, or do not intersect.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_intersects_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersect</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkRegion_intersects_rect'>rect</a> and <a href='SkRegion_Reference#SkRegion'>SkRegion</a> have area in common
+
+### Example
+
+<div><fiddle-embed name="42bde0ef8c2ee372751428cd6e21c1ca"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_contains'>contains</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_intersects'>intersects</a>
+
+<a name='SkRegion_intersects_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool intersects(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& other)const
+</pre>
+
+Returns true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> intersects <a href='#SkRegion_intersects_2_other'>other</a>.
+Returns false if either <a href='#SkRegion_intersects_2_other'>other</a> or <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is empty, or do not intersect.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_intersects_2_other'><code><strong>other</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> to intersect</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkRegion_intersects_2_other'>other</a> and <a href='SkRegion_Reference#SkRegion'>SkRegion</a> have area in common
+
+### Example
+
+<div><fiddle-embed name="4263d79ac0e7df02e90948fdde9fa965"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_contains'>contains</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_intersects'>intersects</a>
+
+<a name='SkRegion_contains'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool contains(int32_t x, int32_t y)const
+</pre>
+
+Returns true if <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> (<a href='#SkRegion_contains_x'>x</a>, <a href='#SkRegion_contains_y'>y</a>) is inside <a href='SkRegion_Reference#SkRegion'>SkRegion</a>.
+Returns false if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_contains_x'><code><strong>x</strong></code></a></td>
+    <td>test <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> x-coordinate</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_contains_y'><code><strong>y</strong></code></a></td>
+    <td>test <a href='SkIPoint_Reference#SkIPoint'>SkIPoint</a> y-coordinate</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if (<a href='#SkRegion_contains_x'>x</a>, <a href='#SkRegion_contains_y'>y</a>) is inside <a href='SkRegion_Reference#SkRegion'>SkRegion</a>
+
+### Example
+
+<div><fiddle-embed name="e3899c2715c332bfc7648d5f2b9eefc6"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_intersects'>intersects</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_contains'>contains</a>
+
+<a name='SkRegion_contains_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool contains(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& other)const
+</pre>
+
+Returns true if <a href='#SkRegion_contains_2_other'>other</a> is completely inside <a href='SkRegion_Reference#SkRegion'>SkRegion</a>.
+Returns false if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> or <a href='#SkRegion_contains_2_other'>other</a> is empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_contains_2_other'><code><strong>other</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to contain</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkRegion_contains_2_other'>other</a> is inside <a href='SkRegion_Reference#SkRegion'>SkRegion</a>
+
+### Example
+
+<div><fiddle-embed name="100b4cbd5dd7406804e40035833a433c"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_intersects'>intersects</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_contains'>contains</a>
+
+<a name='SkRegion_contains_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool contains(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& other)const
+</pre>
+
+Returns true if <a href='#SkRegion_contains_3_other'>other</a> is completely inside <a href='SkRegion_Reference#SkRegion'>SkRegion</a>.
+Returns false if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> or <a href='#SkRegion_contains_3_other'>other</a> is empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_contains_3_other'><code><strong>other</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> to contain</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkRegion_contains_3_other'>other</a> is inside <a href='SkRegion_Reference#SkRegion'>SkRegion</a>
+
+### Example
+
+<div><fiddle-embed name="46de22da2f3e08a8d7f064634fc1c7b5"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_intersects'>intersects</a> <a href='SkRect_Reference#SkRect'>SkRect</a>::<a href='#SkRect_contains'>contains</a>
+
+<a name='SkRegion_quickContains'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_quickContains'>quickContains</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& r)const
+</pre>
+
+Returns true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is a single rectangle and contains <a href='#SkRegion_quickContains_r'>r</a>.
+May return false even though <a href='SkRegion_Reference#SkRegion'>SkRegion</a> contains <a href='#SkRegion_quickContains_r'>r</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_quickContains_r'><code><strong>r</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to contain</td>
+  </tr>
+</table>
+
+### Return Value
+
+true quickly if <a href='#SkRegion_quickContains_r'>r</a> <a href='SkPoint_Reference#Point'>points</a> are equal or inside
+
+### Example
+
+<div><fiddle-embed name="@Region_quickContains">
+
+#### Example Output
+
+~~~~
+quickContains 1: true
+quickContains 2: true
+quickContains 3: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_contains'>contains</a> <a href='#SkRegion_quickReject'>quickReject</a> <a href='#SkRegion_intersects'>intersects</a>
+
+<a name='SkRegion_quickContains_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_quickContains'>quickContains</a>(int32_t left, int32_t top, int32_t right, int32_t bottom)const
+</pre>
+
+Returns true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is a single rectangle and contains <a href='SkIRect_Reference#SkIRect'>SkIRect</a>
+(<a href='#SkRegion_quickContains_2_left'>left</a>, <a href='#SkRegion_quickContains_2_top'>top</a>, <a href='#SkRegion_quickContains_2_right'>right</a>, <a href='#SkRegion_quickContains_2_bottom'>bottom</a>).
+Returns false if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is empty or <a href='SkIRect_Reference#SkIRect'>SkIRect</a> (<a href='#SkRegion_quickContains_2_left'>left</a>, <a href='#SkRegion_quickContains_2_top'>top</a>, <a href='#SkRegion_quickContains_2_right'>right</a>, <a href='#SkRegion_quickContains_2_bottom'>bottom</a>) is empty.
+May return false even though <a href='SkRegion_Reference#SkRegion'>SkRegion</a> contains (<a href='#SkRegion_quickContains_2_left'>left</a>, <a href='#SkRegion_quickContains_2_top'>top</a>, <a href='#SkRegion_quickContains_2_right'>right</a>, <a href='#SkRegion_quickContains_2_bottom'>bottom</a>).
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_quickContains_2_left'><code><strong>left</strong></code></a></td>
+    <td>edge of bounds on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_quickContains_2_top'><code><strong>top</strong></code></a></td>
+    <td>edge of bounds on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_quickContains_2_right'><code><strong>right</strong></code></a></td>
+    <td>edge of bounds on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_quickContains_2_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>edge of bounds on y-axis</td>
+  </tr>
+</table>
+
+### Return Value
+
+true quickly if <a href='SkIRect_Reference#SkIRect'>SkIRect</a> are equal or inside
+
+### Example
+
+<div><fiddle-embed name="eb6d290887e1a3a0b051b4d7b012f5e1">
+
+#### Example Output
+
+~~~~
+quickContains 1: true
+quickContains 2: true
+quickContains 3: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_contains'>contains</a> <a href='#SkRegion_quickReject'>quickReject</a> <a href='#SkRegion_intersects'>intersects</a>
+
+<a name='SkRegion_quickReject'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_quickReject'>quickReject</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>)const
+</pre>
+
+Returns true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> does not intersect <a href='#SkRegion_quickReject_rect'>rect</a>.
+Returns true if <a href='#SkRegion_quickReject_rect'>rect</a> is empty or <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is empty.
+May return false even though <a href='SkRegion_Reference#SkRegion'>SkRegion</a> does not intersect <a href='#SkRegion_quickReject_rect'>rect</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_quickReject_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> to intersect</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkRegion_quickReject_rect'>rect</a> does not intersect
+
+### Example
+
+<div><fiddle-embed name="@Region_quickReject">
+
+#### Example Output
+
+~~~~
+quickReject 1: true
+quickReject 2: true
+quickReject 3: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_quickContains'>quickContains</a> <a href='#SkRegion_contains'>contains</a> <a href='#SkRegion_intersects'>intersects</a>
+
+<a name='SkRegion_quickReject_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_quickReject'>quickReject</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& rgn)const
+</pre>
+
+Returns true if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> does not intersect <a href='#SkRegion_quickReject_2_rgn'>rgn</a>.
+Returns true if <a href='#SkRegion_quickReject_2_rgn'>rgn</a> is empty or <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is empty.
+May return false even though <a href='SkRegion_Reference#SkRegion'>SkRegion</a> does not intersect <a href='#SkRegion_quickReject_2_rgn'>rgn</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_quickReject_2_rgn'><code><strong>rgn</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> to intersect</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='#SkRegion_quickReject_2_rgn'>rgn</a> does not intersect
+
+### Example
+
+<div><fiddle-embed name="@Region_quickReject_2">
+
+#### Example Output
+
+~~~~
+quickReject 1: true
+quickReject 2: true
+quickReject 3: false
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_quickContains'>quickContains</a> <a href='#SkRegion_contains'>contains</a> <a href='#SkRegion_intersects'>intersects</a>
+
+<a name='SkRegion_translate'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void translate(int dx, int dy)
+</pre>
+
+Offsets <a href='SkRegion_Reference#SkRegion'>SkRegion</a> by <a href='SkIPoint_Reference#IVector'>ivector</a> (<a href='#SkRegion_translate_dx'>dx</a>, <a href='#SkRegion_translate_dy'>dy</a>). Has no effect if <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_translate_dx'><code><strong>dx</strong></code></a></td>
+    <td>x-axis offset</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_translate_dy'><code><strong>dy</strong></code></a></td>
+    <td>y-axis offset</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Region_translate"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_translate'>translate</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_offset'>offset</a> <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_offset'>offset</a>
+
+<a name='SkRegion_translate_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void translate(int dx, int dy, <a href='SkRegion_Reference#SkRegion'>SkRegion</a>* dst)const
+</pre>
+
+Offsets <a href='SkRegion_Reference#SkRegion'>SkRegion</a> by <a href='SkIPoint_Reference#IVector'>ivector</a> (<a href='#SkRegion_translate_2_dx'>dx</a>, <a href='#SkRegion_translate_2_dy'>dy</a>), writing result to <a href='#SkRegion_translate_2_dst'>dst</a>. <a href='SkRegion_Reference#SkRegion'>SkRegion</a> may be passed
+as <a href='#SkRegion_translate_2_dst'>dst</a> parameter, translating <a href='SkRegion_Reference#SkRegion'>SkRegion</a> in place. Has no effect if <a href='#SkRegion_translate_2_dst'>dst</a> is nullptr.
+If <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is empty, sets <a href='#SkRegion_translate_2_dst'>dst</a> to empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_translate_2_dx'><code><strong>dx</strong></code></a></td>
+    <td>x-axis offset</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_translate_2_dy'><code><strong>dy</strong></code></a></td>
+    <td>y-axis offset</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_translate_2_dst'><code><strong>dst</strong></code></a></td>
+    <td>translated result</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Region_translate_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_translate'>translate</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a>::<a href='#SkIRect_offset'>offset</a> <a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_offset'>offset</a>
+
+<a name='SkRegion_Op'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkRegion_Op'>Op</a> {
+        <a href='#SkRegion_kDifference_Op'>kDifference_Op</a>,
+        <a href='#SkRegion_kIntersect_Op'>kIntersect_Op</a>,
+        <a href='#SkRegion_kUnion_Op'>kUnion_Op</a>,
+        <a href='#SkRegion_kXOR_Op'>kXOR_Op</a>,
+        <a href='#SkRegion_kReverseDifference_Op'>kReverseDifference_Op</a>,
+        <a href='#SkRegion_kReplace_Op'>kReplace_Op</a>,
+        <a href='#SkRegion_kLastOp'>kLastOp</a> = <a href='#SkRegion_kReplace_Op'>kReplace_Op</a>,
+    };
+</pre>
+
+The logical operations that can be performed when combining two <a href='SkRegion_Reference#Region'>Regions</a>.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRegion_kDifference_Op'><code>SkRegion::kDifference_Op</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Subtracts operand <a href='SkRegion_Reference#Region'>Region</a> from target <a href='SkRegion_Reference#Region'>Region</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRegion_kIntersect_Op'><code>SkRegion::kIntersect_Op</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Intersects operand <a href='SkRegion_Reference#Region'>Region</a> and target <a href='SkRegion_Reference#Region'>Region</a>.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRegion_kUnion_Op'><code>SkRegion::kUnion_Op</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Unions operand <a href='SkRegion_Reference#Region'>Region</a> and target <a href='SkRegion_Reference#Region'>Region</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRegion_kXOR_Op'><code>SkRegion::kXOR_Op</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces target <a href='SkRegion_Reference#Region'>Region</a> with area exclusive to both <a href='SkRegion_Reference#Region'>Regions</a>.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRegion_kReverseDifference_Op'><code>SkRegion::kReverseDifference_Op</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>4</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Subtracts target <a href='SkRegion_Reference#Region'>Region</a> from operand <a href='SkRegion_Reference#Region'>Region</a>.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRegion_kReplace_Op'><code>SkRegion::kReplace_Op</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>5</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Replaces target <a href='SkRegion_Reference#Region'>Region</a> with operand <a href='SkRegion_Reference#Region'>Region</a>.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRegion_kLastOp'><code>SkRegion::kLastOp</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>5</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+last operator</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="026dd8b180fe8e43f477fce43e9217b3"></fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#SkPathOp'>SkPathOp</a>
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRegion_kOpCnt'><code>SkRegion::kOpCnt</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>6</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+May be used to verify that <a href='#SkRegion_Op'>Op</a> is a legal value.</td>
+  </tr>
+</table>
+
+<a name='SkRegion_op'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_op'>op</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='#SkRegion_Op'>Op</a> op)
+</pre>
+
+Replaces <a href='SkRegion_Reference#SkRegion'>SkRegion</a> with the result of <a href='SkRegion_Reference#SkRegion'>SkRegion</a> <a href='#SkRegion_op_op'>op</a> <a href='#SkRegion_op_rect'>rect</a>.
+Returns true if replaced <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is not empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_op_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> operand</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_op_op'><code><strong>op</strong></code></a></td>
+    <td>operator, one of:</td>
+  </tr>
+</table>
+
+<a href='#SkRegion_kDifference_Op'>kDifference_Op</a>, <a href='#SkRegion_kIntersect_Op'>kIntersect_Op</a>, <a href='#SkRegion_kUnion_Op'>kUnion_Op</a>, <a href='#SkRegion_kXOR_Op'>kXOR_Op</a>, <a href='#SkRegion_kReverseDifference_Op'>kReverseDifference_Op</a>,
+<a href='#SkRegion_kReplace_Op'>kReplace_Op</a>
+
+### Return Value
+
+false if result is empty
+
+### Example
+
+<div><fiddle-embed name="1790b2e054c536a54601138365700ac3"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_setRects'>setRects</a> <a href='#SkRegion_Op'>Op</a>
+
+<a name='SkRegion_op_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_op'>op</a>(int left, int top, int right, int bottom, <a href='#SkRegion_Op'>Op</a> op)
+</pre>
+
+Replaces <a href='SkRegion_Reference#SkRegion'>SkRegion</a> with the result of <a href='SkRegion_Reference#SkRegion'>SkRegion</a> <a href='#SkRegion_op_2_op'>op</a> <a href='SkIRect_Reference#SkIRect'>SkIRect</a> (<a href='#SkRegion_op_2_left'>left</a>, <a href='#SkRegion_op_2_top'>top</a>, <a href='#SkRegion_op_2_right'>right</a>, <a href='#SkRegion_op_2_bottom'>bottom</a>).
+Returns true if replaced <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is not empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_op_2_left'><code><strong>left</strong></code></a></td>
+    <td>edge of bounds on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_op_2_top'><code><strong>top</strong></code></a></td>
+    <td>edge of bounds on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_op_2_right'><code><strong>right</strong></code></a></td>
+    <td>edge of bounds on x-axis</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_op_2_bottom'><code><strong>bottom</strong></code></a></td>
+    <td>edge of bounds on y-axis</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_op_2_op'><code><strong>op</strong></code></a></td>
+    <td>operator, one of:</td>
+  </tr>
+</table>
+
+<a href='#SkRegion_kDifference_Op'>kDifference_Op</a>, <a href='#SkRegion_kIntersect_Op'>kIntersect_Op</a>, <a href='#SkRegion_kUnion_Op'>kUnion_Op</a>, <a href='#SkRegion_kXOR_Op'>kXOR_Op</a>, <a href='#SkRegion_kReverseDifference_Op'>kReverseDifference_Op</a>,
+<a href='#SkRegion_kReplace_Op'>kReplace_Op</a>
+
+### Return Value
+
+false if result is empty
+
+### Example
+
+<div><fiddle-embed name="2e3497890d523235f96680716c321098"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_setRects'>setRects</a> <a href='#SkRegion_Op'>Op</a>
+
+<a name='SkRegion_op_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_op'>op</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& rgn, <a href='#SkRegion_Op'>Op</a> op)
+</pre>
+
+Replaces <a href='SkRegion_Reference#SkRegion'>SkRegion</a> with the result of <a href='SkRegion_Reference#SkRegion'>SkRegion</a> <a href='#SkRegion_op_3_op'>op</a> <a href='#SkRegion_op_3_rgn'>rgn</a>.
+Returns true if replaced <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is not empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_op_3_rgn'><code><strong>rgn</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> operand</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_op_3_op'><code><strong>op</strong></code></a></td>
+    <td>operator, one of:</td>
+  </tr>
+</table>
+
+<a href='#SkRegion_kDifference_Op'>kDifference_Op</a>, <a href='#SkRegion_kIntersect_Op'>kIntersect_Op</a>, <a href='#SkRegion_kUnion_Op'>kUnion_Op</a>, <a href='#SkRegion_kXOR_Op'>kXOR_Op</a>, <a href='#SkRegion_kReverseDifference_Op'>kReverseDifference_Op</a>,
+<a href='#SkRegion_kReplace_Op'>kReplace_Op</a>
+
+### Return Value
+
+false if result is empty
+
+### Example
+
+<div><fiddle-embed name="65f4eccea3514ed7e37b5067e15efddb"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_setRects'>setRects</a> <a href='#SkRegion_Op'>Op</a>
+
+<a name='SkRegion_op_4'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_op'>op</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& rgn, <a href='#SkRegion_Op'>Op</a> op)
+</pre>
+
+Replaces <a href='SkRegion_Reference#SkRegion'>SkRegion</a> with the result of <a href='#SkRegion_op_4_rect'>rect</a> <a href='#SkRegion_op_4_op'>op</a> <a href='#SkRegion_op_4_rgn'>rgn</a>.
+Returns true if replaced <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is not empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_op_4_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> operand</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_op_4_rgn'><code><strong>rgn</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> operand</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_op_4_op'><code><strong>op</strong></code></a></td>
+    <td>operator, one of:</td>
+  </tr>
+</table>
+
+<a href='#SkRegion_kDifference_Op'>kDifference_Op</a>, <a href='#SkRegion_kIntersect_Op'>kIntersect_Op</a>, <a href='#SkRegion_kUnion_Op'>kUnion_Op</a>, <a href='#SkRegion_kXOR_Op'>kXOR_Op</a>, <a href='#SkRegion_kReverseDifference_Op'>kReverseDifference_Op</a>,
+<a href='#SkRegion_kReplace_Op'>kReplace_Op</a>
+
+### Return Value
+
+false if result is empty
+
+### Example
+
+<div><fiddle-embed name="3f964be1e1fd2fbb977b655d3a928f0a"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_setRects'>setRects</a> <a href='#SkRegion_Op'>Op</a>
+
+<a name='SkRegion_op_5'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_op'>op</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& rgn, const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& <a href='SkRect_Reference#Rect'>rect</a>, <a href='#SkRegion_Op'>Op</a> op)
+</pre>
+
+Replaces <a href='SkRegion_Reference#SkRegion'>SkRegion</a> with the result of <a href='#SkRegion_op_5_rgn'>rgn</a> <a href='#SkRegion_op_5_op'>op</a> <a href='#SkRegion_op_5_rect'>rect</a>.
+Returns true if replaced <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is not empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_op_5_rgn'><code><strong>rgn</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> operand</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_op_5_rect'><code><strong>rect</strong></code></a></td>
+    <td><a href='SkIRect_Reference#SkIRect'>SkIRect</a> operand</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_op_5_op'><code><strong>op</strong></code></a></td>
+    <td>operator, one of:</td>
+  </tr>
+</table>
+
+<a href='#SkRegion_kDifference_Op'>kDifference_Op</a>, <a href='#SkRegion_kIntersect_Op'>kIntersect_Op</a>, <a href='#SkRegion_kUnion_Op'>kUnion_Op</a>, <a href='#SkRegion_kXOR_Op'>kXOR_Op</a>, <a href='#SkRegion_kReverseDifference_Op'>kReverseDifference_Op</a>,
+<a href='#SkRegion_kReplace_Op'>kReplace_Op</a>
+
+### Return Value
+
+false if result is empty
+
+### Example
+
+<div><fiddle-embed name="e623208dd44f0b24499ac5f1593d1b39"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_setRects'>setRects</a> <a href='#SkRegion_Op'>Op</a>
+
+<a name='SkRegion_op_6'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkRegion_op'>op</a>(const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& rgna, const <a href='SkRegion_Reference#SkRegion'>SkRegion</a>& rgnb, <a href='#SkRegion_Op'>Op</a> op)
+</pre>
+
+Replaces <a href='SkRegion_Reference#SkRegion'>SkRegion</a> with the result of <a href='#SkRegion_op_6_rgna'>rgna</a> <a href='#SkRegion_op_6_op'>op</a> <a href='#SkRegion_op_6_rgnb'>rgnb</a>.
+Returns true if replaced <a href='SkRegion_Reference#SkRegion'>SkRegion</a> is not empty.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_op_6_rgna'><code><strong>rgna</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> operand</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_op_6_rgnb'><code><strong>rgnb</strong></code></a></td>
+    <td><a href='SkRegion_Reference#SkRegion'>SkRegion</a> operand</td>
+  </tr>
+  <tr>    <td><a name='SkRegion_op_6_op'><code><strong>op</strong></code></a></td>
+    <td>operator, one of:</td>
+  </tr>
+</table>
+
+<a href='#SkRegion_kDifference_Op'>kDifference_Op</a>, <a href='#SkRegion_kIntersect_Op'>kIntersect_Op</a>, <a href='#SkRegion_kUnion_Op'>kUnion_Op</a>, <a href='#SkRegion_kXOR_Op'>kXOR_Op</a>, <a href='#SkRegion_kReverseDifference_Op'>kReverseDifference_Op</a>,
+<a href='#SkRegion_kReplace_Op'>kReplace_Op</a>
+
+### Return Value
+
+false if result is empty
+
+### Example
+
+<div><fiddle-embed name="13de1a6fcb2302a2a30278cb88d3e17d"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_setRects'>setRects</a> <a href='#SkRegion_Op'>Op</a>
+
+<a name='SkRegion_writeToMemory'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkRegion_writeToMemory'>writeToMemory</a>(void* buffer)const
+</pre>
+
+Writes <a href='SkRegion_Reference#SkRegion'>SkRegion</a> to <a href='#SkRegion_writeToMemory_buffer'>buffer</a>, and returns number of bytes written.
+If <a href='#SkRegion_writeToMemory_buffer'>buffer</a> is nullptr, returns number number of bytes that would be written.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_writeToMemory_buffer'><code><strong>buffer</strong></code></a></td>
+    <td>storage for binary <a href='undocumented#Data'>data</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='undocumented#Size'>size</a> of <a href='SkRegion_Reference#SkRegion'>SkRegion</a>
+
+### Example
+
+<div><fiddle-embed name="1419d2a8c22c355ab46240865d056ee5"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_readFromMemory'>readFromMemory</a>
+
+<a name='SkRegion_readFromMemory'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkRegion_readFromMemory'>readFromMemory</a>(const void* buffer, size_t length)
+</pre>
+
+Constructs <a href='SkRegion_Reference#SkRegion'>SkRegion</a> from <a href='#SkRegion_readFromMemory_buffer'>buffer</a> of <a href='undocumented#Size'>size</a> <a href='#SkRegion_readFromMemory_length'>length</a>. Returns bytes read.
+Returned value will be multiple of four or zero if <a href='#SkRegion_readFromMemory_length'>length</a> was too small.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkRegion_readFromMemory_buffer'><code><strong>buffer</strong></code></a></td>
+    <td>storage for binary <a href='undocumented#Data'>data</a></td>
+  </tr>
+  <tr>    <td><a name='SkRegion_readFromMemory_length'><code><strong>length</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of <a href='#SkRegion_readFromMemory_buffer'>buffer</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+bytes read
+
+### Example
+
+<div><fiddle-embed name="@Region_readFromMemory"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkRegion_writeToMemory'>writeToMemory</a>
+
diff --git a/src/third_party/skia/site/user/api/SkSurface_Reference.md b/src/third_party/skia/site/user/api/SkSurface_Reference.md
new file mode 100644
index 0000000..8b5a71d
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkSurface_Reference.md
@@ -0,0 +1,1863 @@
+SkSurface Reference
+===
+
+
+<a name='SkSurface'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkSurface_Reference#SkSurface'>SkSurface</a> : public <a href='undocumented#SkRefCnt'>SkRefCnt</a> {
+
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkSurface_MakeRasterDirect'>MakeRasterDirect</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo, void* pixels,
+                                             size_t rowBytes,
+                                             const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkSurface_MakeRasterDirectReleaseProc'>MakeRasterDirectReleaseProc</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo, void* pixels,
+                                    size_t rowBytes,
+                                    void (*releaseProc)(void* pixels, void* context),
+                                    void* context, const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkSurface_MakeRaster'>MakeRaster</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo, size_t rowBytes,
+                                       const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkSurface_MakeRaster'>MakeRaster</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo,
+                                       const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* props = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkSurface_MakeRasterN32Premul'>MakeRasterN32Premul</a>(int width, int height,
+                                                const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps = nullptr);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkSurface_MakeFromBackendTexture'>MakeFromBackendTexture</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                                   const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+                                                   <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> origin, int sampleCnt,
+                                                   <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> colorType,
+                                                   <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> colorSpace,
+                                                   const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkSurface_MakeFromBackendRenderTarget'>MakeFromBackendRenderTarget</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                                const <a href='undocumented#GrBackendRenderTarget'>GrBackendRenderTarget</a>& backendRenderTarget,
+                                                <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> origin,
+                                                <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> colorType,
+                                                <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> colorSpace,
+                                                const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget'>MakeFromBackendTextureAsRenderTarget</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                                            const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+                                                            <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> origin,
+                                                            int sampleCnt,
+                                                            <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> colorType,
+                                                            <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkColorSpace'>SkColorSpace</a>> colorSpace,
+                                                            const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkSurface_MakeRenderTarget'>MakeRenderTarget</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='undocumented#SkBudgeted'>SkBudgeted</a> budgeted,
+                                             const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo,
+                                             int sampleCount, <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> surfaceOrigin,
+                                             const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps,
+                                             bool shouldCreateWithMips = false);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkSurface_MakeRenderTarget'>MakeRenderTarget</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='undocumented#SkBudgeted'>SkBudgeted</a> budgeted,
+                                             const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo, int sampleCount,
+                                             const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* props);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkSurface_MakeRenderTarget'>MakeRenderTarget</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='undocumented#SkBudgeted'>SkBudgeted</a> budgeted,
+                                             const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkSurface_MakeRenderTarget'>MakeRenderTarget</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                             const <a href='undocumented#SkSurfaceCharacterization'>SkSurfaceCharacterization</a>& characterization,
+                                             <a href='undocumented#SkBudgeted'>SkBudgeted</a> budgeted);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkSurface_MakeNull'>MakeNull</a>(int width, int height);
+    int <a href='#SkSurface_width'>width()</a> const;
+    int <a href='#SkSurface_height'>height()</a> const;
+    uint32_t <a href='#SkSurface_generationID'>generationID</a>();
+
+    enum <a href='#SkSurface_ContentChangeMode'>ContentChangeMode</a> {
+        <a href='#SkSurface_kDiscard_ContentChangeMode'>kDiscard_ContentChangeMode</a>,
+        <a href='#SkSurface_kRetain_ContentChangeMode'>kRetain_ContentChangeMode</a>,
+    };
+
+    void <a href='#SkSurface_notifyContentWillChange'>notifyContentWillChange</a>(<a href='#SkSurface_ContentChangeMode'>ContentChangeMode</a> mode);
+
+    enum <a href='#SkSurface_BackendHandleAccess'>BackendHandleAccess</a> {
+        <a href='#SkSurface_kFlushRead_BackendHandleAccess'>kFlushRead_BackendHandleAccess</a>,
+        <a href='#SkSurface_kFlushWrite_BackendHandleAccess'>kFlushWrite_BackendHandleAccess</a>,
+        <a href='#SkSurface_kDiscardWrite_BackendHandleAccess'>kDiscardWrite_BackendHandleAccess</a>,
+    };
+
+    <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> <a href='#SkSurface_getBackendTexture'>getBackendTexture</a>(<a href='#SkSurface_BackendHandleAccess'>BackendHandleAccess</a> backendHandleAccess);
+    <a href='undocumented#GrBackendRenderTarget'>GrBackendRenderTarget</a> <a href='#SkSurface_getBackendRenderTarget'>getBackendRenderTarget</a>(<a href='#SkSurface_BackendHandleAccess'>BackendHandleAccess</a> backendHandleAccess);
+    <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>* <a href='#SkSurface_getCanvas'>getCanvas</a>();
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a>> <a href='#SkSurface_makeSurface'>makeSurface</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo);
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkSurface_makeImageSnapshot'>makeImageSnapshot</a>();
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkImage_Reference#SkImage'>SkImage</a>> <a href='#SkSurface_makeImageSnapshot'>makeImageSnapshot</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& bounds);
+    void <a href='#SkSurface_draw'>draw</a>(<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>* <a href='SkCanvas_Reference#Canvas'>canvas</a>, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>);
+    bool <a href='#SkSurface_peekPixels'>peekPixels</a>(<a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>* <a href='SkPixmap_Reference#Pixmap'>pixmap</a>);
+    bool <a href='#SkSurface_readPixels'>readPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst, int srcX, int srcY);
+    bool <a href='#SkSurface_readPixels'>readPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& dstInfo, void* dstPixels, size_t dstRowBytes,
+                    int srcX, int srcY);
+    bool <a href='#SkSurface_readPixels'>readPixels</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& dst, int srcX, int srcY);
+    void <a href='#SkSurface_writePixels'>writePixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& src, int dstX, int dstY);
+    void <a href='#SkSurface_writePixels'>writePixels</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& src, int dstX, int dstY);
+    const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>& <a href='#SkSurface_props'>props()</a> const;
+    void <a href='#SkSurface_flush'>flush()</a>;
+    <a href='undocumented#GrSemaphoresSubmitted'>GrSemaphoresSubmitted</a> <a href='#SkSurface_flushAndSignalSemaphores'>flushAndSignalSemaphores</a>(int numSemaphores,
+                                                   <a href='undocumented#GrBackendSemaphore'>GrBackendSemaphore</a> signalSemaphores[]);
+    bool <a href='#SkSurface_wait'>wait</a>(int numSemaphores, const <a href='undocumented#GrBackendSemaphore'>GrBackendSemaphore</a>* waitSemaphores);
+    bool <a href='#SkSurface_characterize'>characterize</a>(<a href='undocumented#SkSurfaceCharacterization'>SkSurfaceCharacterization</a>* characterization) const;
+    bool <a href='#SkSurface_draw'>draw</a>(<a href='undocumented#SkDeferredDisplayList'>SkDeferredDisplayList</a>* deferredDisplayList);
+};
+
+</pre>
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> is responsible for managing the pixels that a <a href='SkCanvas_Reference#Canvas'>canvas</a> draws into. The pixels can be
+allocated either in CPU memory, if a  <a href='undocumented#Raster_Surface'>raster surface</a>; or on the GPU, for a <a href='undocumented#GrRenderTarget'>GrRenderTarget</a> <a href='SkSurface_Reference#Surface'>surface</a>.
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> takes care of allocating a <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> that will draw into the <a href='SkSurface_Reference#Surface'>surface</a>. Call
+<a href='SkSurface_Reference#Surface'>surface</a>-><a href='#SkSurface_getCanvas'>getCanvas</a>() to use that <a href='SkCanvas_Reference#Canvas'>canvas</a>. The caller should not delete the returned <a href='SkCanvas_Reference#Canvas'>canvas</a>;
+it is owned by <a href='SkSurface_Reference#Surface'>surface</a>.
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> always has non-zero dimensions. If there is a request for a new <a href='SkSurface_Reference#Surface'>surface</a>, and either
+of the requested dimensions are zero, then nullptr will be returned.
+
+<a name='SkSurface_MakeRasterDirect'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkSurface_MakeRasterDirect'>MakeRasterDirect</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo, void* pixels, size_t rowBytes,
+                                         const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps = nullptr)
+</pre>
+
+Allocates raster <a href='SkSurface_Reference#SkSurface'>SkSurface</a>. <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> returned by <a href='SkSurface_Reference#SkSurface'>SkSurface</a> draws directly into <a href='#SkSurface_MakeRasterDirect_pixels'>pixels</a>.
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> is returned if all parameters are valid.
+Valid parameters include:
+info dimensions are greater than zero;
+info contains <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> supported by  <a href='undocumented#Raster_Surface'>raster surface</a>;
+<a href='#SkSurface_MakeRasterDirect_pixels'>pixels</a> is not nullptr;
+<a href='#SkSurface_MakeRasterDirect_rowBytes'>rowBytes</a> is large enough to contain info width <a href='#SkSurface_MakeRasterDirect_pixels'>pixels</a> of <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>.
+
+<a href='undocumented#Pixel'>Pixel</a> buffer <a href='undocumented#Size'>size</a> should be info height times computed <a href='#SkSurface_MakeRasterDirect_rowBytes'>rowBytes</a>.
+Pixels are not initialized.
+To access <a href='#SkSurface_MakeRasterDirect_pixels'>pixels</a> after drawing, call <a href='#SkSurface_flush'>flush()</a> or <a href='#SkSurface_peekPixels'>peekPixels</a>().
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRasterDirect_imageInfo'><code><strong>imageInfo</strong></code></a></td>
+    <td>width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a>,</td>
+  </tr>
+</table>
+
+of  <a href='undocumented#Raster_Surface'>raster surface</a>; width and height must be greater than zero
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRasterDirect_pixels'><code><strong>pixels</strong></code></a></td>
+    <td>pointer to destination <a href='#SkSurface_MakeRasterDirect_pixels'>pixels</a> buffer</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRasterDirect_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td>interval from one <a href='SkSurface_Reference#SkSurface'>SkSurface</a> row to the next</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRasterDirect_surfaceProps'><code><strong>surfaceProps</strong></code></a></td>
+    <td>LCD striping orientation and setting for <a href='undocumented#Device'>device</a> independent fonts;</td>
+  </tr>
+</table>
+
+may be nullptr
+
+### Return Value
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> if all parameters are valid; otherwise, nullptr
+
+### Example
+
+<div><fiddle-embed name="@Surface_MakeRasterDirect">
+
+#### Example Output
+
+~~~~
+---
+-x-
+---
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_MakeRasterDirectReleaseProc'>MakeRasterDirectReleaseProc</a> <a href='#SkSurface_MakeRaster'>MakeRaster</a> <a href='#SkSurface_MakeRasterN32Premul'>MakeRasterN32Premul</a> <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>::<a href='#SkCanvas_MakeRasterDirect'>MakeRasterDirect</a>
+
+<a name='SkSurface_MakeRasterDirectReleaseProc'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkSurface_MakeRasterDirectReleaseProc'>MakeRasterDirectReleaseProc</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo, void* pixels,
+                                           size_t rowBytes, void (*releaseProc) (void* pixels,
+                                           void* context) , void* context,
+                                           const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps = nullptr)
+</pre>
+
+Allocates raster <a href='SkSurface_Reference#SkSurface'>SkSurface</a>. <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> returned by <a href='SkSurface_Reference#SkSurface'>SkSurface</a> draws directly into <a href='#SkSurface_MakeRasterDirectReleaseProc_pixels'>pixels</a>.
+<a href='#SkSurface_MakeRasterDirectReleaseProc_releaseProc'>releaseProc</a> is called with <a href='#SkSurface_MakeRasterDirectReleaseProc_pixels'>pixels</a> and <a href='#SkSurface_MakeRasterDirectReleaseProc_context'>context</a> when <a href='SkSurface_Reference#SkSurface'>SkSurface</a> is deleted.
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> is returned if all parameters are valid.
+Valid parameters include:
+info dimensions are greater than zero;
+info contains <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> supported by  <a href='undocumented#Raster_Surface'>raster surface</a>;
+<a href='#SkSurface_MakeRasterDirectReleaseProc_pixels'>pixels</a> is not nullptr;
+<a href='#SkSurface_MakeRasterDirectReleaseProc_rowBytes'>rowBytes</a> is large enough to contain info width <a href='#SkSurface_MakeRasterDirectReleaseProc_pixels'>pixels</a> of <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>.
+
+<a href='undocumented#Pixel'>Pixel</a> buffer <a href='undocumented#Size'>size</a> should be info height times computed <a href='#SkSurface_MakeRasterDirectReleaseProc_rowBytes'>rowBytes</a>.
+Pixels are not initialized.
+To access <a href='#SkSurface_MakeRasterDirectReleaseProc_pixels'>pixels</a> after drawing, call <a href='#SkSurface_flush'>flush()</a> or <a href='#SkSurface_peekPixels'>peekPixels</a>().
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRasterDirectReleaseProc_imageInfo'><code><strong>imageInfo</strong></code></a></td>
+    <td>width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a>,</td>
+  </tr>
+</table>
+
+of  <a href='undocumented#Raster_Surface'>raster surface</a>; width and height must be greater than zero
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRasterDirectReleaseProc_pixels'><code><strong>pixels</strong></code></a></td>
+    <td>pointer to destination <a href='#SkSurface_MakeRasterDirectReleaseProc_pixels'>pixels</a> buffer</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRasterDirectReleaseProc_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td>interval from one <a href='SkSurface_Reference#SkSurface'>SkSurface</a> row to the next</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRasterDirectReleaseProc_releaseProc'><code><strong>releaseProc</strong></code></a></td>
+    <td>called when <a href='SkSurface_Reference#SkSurface'>SkSurface</a> is deleted; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRasterDirectReleaseProc_context'><code><strong>context</strong></code></a></td>
+    <td>passed to <a href='#SkSurface_MakeRasterDirectReleaseProc_releaseProc'>releaseProc</a>; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRasterDirectReleaseProc_surfaceProps'><code><strong>surfaceProps</strong></code></a></td>
+    <td>LCD striping orientation and setting for <a href='undocumented#Device'>device</a> independent fonts;</td>
+  </tr>
+</table>
+
+may be nullptr
+
+### Return Value
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> if all parameters are valid; otherwise, nullptr
+
+### Example
+
+<div><fiddle-embed name="@Surface_MakeRasterDirectReleaseProc">
+
+#### Example Output
+
+~~~~
+---
+-x-
+---
+expected release context
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_MakeRasterDirect'>MakeRasterDirect</a> <a href='#SkSurface_MakeRasterN32Premul'>MakeRasterN32Premul</a> <a href='#SkSurface_MakeRaster'>MakeRaster</a>
+
+<a name='SkSurface_MakeRaster'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkSurface_MakeRaster'>MakeRaster</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo, size_t rowBytes,
+                                   const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps)
+</pre>
+
+Allocates raster <a href='SkSurface_Reference#SkSurface'>SkSurface</a>. <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> returned by <a href='SkSurface_Reference#SkSurface'>SkSurface</a> draws directly into pixels.
+Allocates and zeroes <a href='undocumented#Pixel'>pixel</a> memory. <a href='undocumented#Pixel'>Pixel</a> memory <a href='undocumented#Size'>size</a> is <a href='#SkSurface_MakeRaster_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_height'>height()</a> times
+<a href='#SkSurface_MakeRaster_rowBytes'>rowBytes</a>, or times <a href='#SkSurface_MakeRaster_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>() if <a href='#SkSurface_MakeRaster_rowBytes'>rowBytes</a> is zero.
+<a href='undocumented#Pixel'>Pixel</a> memory is deleted when <a href='SkSurface_Reference#SkSurface'>SkSurface</a> is deleted.
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> is returned if all parameters are valid.
+Valid parameters include:
+info dimensions are greater than zero;
+info contains <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> supported by  <a href='undocumented#Raster_Surface'>raster surface</a>;
+<a href='#SkSurface_MakeRaster_rowBytes'>rowBytes</a> is large enough to contain info width pixels of <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, or is zero.
+
+If <a href='#SkSurface_MakeRaster_rowBytes'>rowBytes</a> is not zero, subsequent images returned by <a href='#SkSurface_makeImageSnapshot'>makeImageSnapshot</a>()
+have the same <a href='#SkSurface_MakeRaster_rowBytes'>rowBytes</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRaster_imageInfo'><code><strong>imageInfo</strong></code></a></td>
+    <td>width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a>,</td>
+  </tr>
+</table>
+
+of  <a href='undocumented#Raster_Surface'>raster surface</a>; width and height must be greater than zero
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRaster_rowBytes'><code><strong>rowBytes</strong></code></a></td>
+    <td>interval from one <a href='SkSurface_Reference#SkSurface'>SkSurface</a> row to the next; may be zero</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRaster_surfaceProps'><code><strong>surfaceProps</strong></code></a></td>
+    <td>LCD striping orientation and setting for <a href='undocumented#Device'>device</a> independent fonts;</td>
+  </tr>
+</table>
+
+may be nullptr
+
+### Return Value
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> if all parameters are valid; otherwise, nullptr
+
+### Example
+
+<div><fiddle-embed name="@Surface_MakeRaster">
+
+#### Example Output
+
+~~~~
+---
+-x-
+---
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_MakeRasterDirect'>MakeRasterDirect</a> <a href='#SkSurface_MakeRasterN32Premul'>MakeRasterN32Premul</a> <a href='#SkSurface_MakeRasterDirectReleaseProc'>MakeRasterDirectReleaseProc</a>
+
+<a name='SkSurface_MakeRaster_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkSurface_MakeRaster'>MakeRaster</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo,
+                                   const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* props = nullptr)
+</pre>
+
+Allocates raster <a href='SkSurface_Reference#SkSurface'>SkSurface</a>. <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> returned by <a href='SkSurface_Reference#SkSurface'>SkSurface</a> draws directly into pixels.
+Allocates and zeroes <a href='undocumented#Pixel'>pixel</a> memory. <a href='undocumented#Pixel'>Pixel</a> memory <a href='undocumented#Size'>size</a> is <a href='#SkSurface_MakeRaster_2_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_height'>height()</a> times
+<a href='#SkSurface_MakeRaster_2_imageInfo'>imageInfo</a>.<a href='#SkImageInfo_minRowBytes'>minRowBytes</a>().
+<a href='undocumented#Pixel'>Pixel</a> memory is deleted when <a href='SkSurface_Reference#SkSurface'>SkSurface</a> is deleted.
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> is returned if all parameters are valid.
+Valid parameters include:
+info dimensions are greater than zero;
+info contains <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> supported by  <a href='undocumented#Raster_Surface'>raster surface</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRaster_2_imageInfo'><code><strong>imageInfo</strong></code></a></td>
+    <td>width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a>,</td>
+  </tr>
+</table>
+
+of  <a href='undocumented#Raster_Surface'>raster surface</a>; width and height must be greater than zero
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRaster_2_props'><code><strong>props</strong></code></a></td>
+    <td>LCD striping orientation and setting for <a href='undocumented#Device'>device</a> independent fonts;</td>
+  </tr>
+</table>
+
+may be nullptr
+
+### Return Value
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> if all parameters are valid; otherwise, nullptr
+
+### Example
+
+<div><fiddle-embed name="@Surface_MakeRaster_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_MakeRasterDirect'>MakeRasterDirect</a> <a href='#SkSurface_MakeRasterN32Premul'>MakeRasterN32Premul</a> <a href='#SkSurface_MakeRasterDirectReleaseProc'>MakeRasterDirectReleaseProc</a>
+
+<a name='SkSurface_MakeRasterN32Premul'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkSurface_MakeRasterN32Premul'>MakeRasterN32Premul</a>(int width, int height,
+                                            const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps = nullptr)
+</pre>
+
+Allocates raster <a href='SkSurface_Reference#SkSurface'>SkSurface</a>. <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> returned by <a href='SkSurface_Reference#SkSurface'>SkSurface</a> draws directly into pixels.
+Allocates and zeroes <a href='undocumented#Pixel'>pixel</a> memory. <a href='undocumented#Pixel'>Pixel</a> memory <a href='undocumented#Size'>size</a> is <a href='#SkSurface_MakeRasterN32Premul_height'>height</a> times <a href='#SkSurface_MakeRasterN32Premul_width'>width</a> times
+four. <a href='undocumented#Pixel'>Pixel</a> memory is deleted when <a href='SkSurface_Reference#SkSurface'>SkSurface</a> is deleted.
+
+Internally, sets <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='#SkSurface_MakeRasterN32Premul_width'>width</a>, <a href='#SkSurface_MakeRasterN32Premul_height'>height</a>, native  <a href='SkImageInfo_Reference#Color_Type'>color type</a>, and
+<a href='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>.
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> is returned if <a href='#SkSurface_MakeRasterN32Premul_width'>width</a> and <a href='#SkSurface_MakeRasterN32Premul_height'>height</a> are greater than zero.
+
+Use to create <a href='SkSurface_Reference#SkSurface'>SkSurface</a> that matches <a href='SkColor_Reference#SkPMColor'>SkPMColor</a>, the native <a href='undocumented#Pixel'>pixel</a> arrangement on
+the platform. <a href='SkSurface_Reference#SkSurface'>SkSurface</a> drawn to output <a href='undocumented#Device'>device</a> skips converting its <a href='undocumented#Pixel'>pixel</a> format.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRasterN32Premul_width'><code><strong>width</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> column count; must be greater than zero</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRasterN32Premul_height'><code><strong>height</strong></code></a></td>
+    <td><a href='undocumented#Pixel'>pixel</a> row count; must be greater than zero</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRasterN32Premul_surfaceProps'><code><strong>surfaceProps</strong></code></a></td>
+    <td>LCD striping orientation and setting for <a href='undocumented#Device'>device</a> independent</td>
+  </tr>
+</table>
+
+fonts; may be nullptr
+
+### Return Value
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> if all parameters are valid; otherwise, nullptr
+
+### Example
+
+<div><fiddle-embed name="@Surface_MakeRasterN32Premul">
+
+#### Example Output
+
+~~~~
+---
+-x-
+---
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_MakeRasterDirect'>MakeRasterDirect</a> <a href='#SkSurface_MakeRasterN32Premul'>MakeRasterN32Premul</a> <a href='#SkSurface_MakeRasterDirectReleaseProc'>MakeRasterDirectReleaseProc</a>
+
+<a name='SkSurface_MakeFromBackendTexture'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkSurface_MakeFromBackendTexture'>MakeFromBackendTexture</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                               const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+                                               <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> origin, int sampleCnt,
+                                               <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> colorType,
+                                               <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; colorSpace,
+                                               const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps)
+</pre>
+
+Wraps a GPU-backed <a href='undocumented#Texture'>texture</a> into <a href='SkSurface_Reference#SkSurface'>SkSurface</a>. Caller must ensure the <a href='undocumented#Texture'>texture</a> is
+valid for the lifetime of returned <a href='SkSurface_Reference#SkSurface'>SkSurface</a>. If <a href='#SkSurface_MakeFromBackendTexture_sampleCnt'>sampleCnt</a> greater than zero,
+creates an intermediate MSAA <a href='SkSurface_Reference#SkSurface'>SkSurface</a> which is used for drawing <a href='#SkSurface_MakeFromBackendTexture_backendTexture'>backendTexture</a>.
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> is returned if all parameters are valid. <a href='#SkSurface_MakeFromBackendTexture_backendTexture'>backendTexture</a> is valid if
+its <a href='undocumented#Pixel'>pixel</a> configuration agrees with <a href='#SkSurface_MakeFromBackendTexture_colorSpace'>colorSpace</a> and <a href='#SkSurface_MakeFromBackendTexture_context'>context</a>; for instance, if
+<a href='#SkSurface_MakeFromBackendTexture_backendTexture'>backendTexture</a> has an sRGB configuration, then <a href='#SkSurface_MakeFromBackendTexture_context'>context</a> must support sRGB,
+and <a href='#SkSurface_MakeFromBackendTexture_colorSpace'>colorSpace</a> must be present. Further, <a href='#SkSurface_MakeFromBackendTexture_backendTexture'>backendTexture</a> width and height must
+not exceed <a href='#SkSurface_MakeFromBackendTexture_context'>context</a> capabilities, and the <a href='#SkSurface_MakeFromBackendTexture_context'>context</a> must be able to support
+back-end textures.
+
+If SK_SUPPORT_GPU is defined as zero, has no effect and returns nullptr.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeFromBackendTexture_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeFromBackendTexture_backendTexture'><code><strong>backendTexture</strong></code></a></td>
+    <td><a href='undocumented#Texture'>texture</a> residing on GPU</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeFromBackendTexture_origin'><code><strong>origin</strong></code></a></td>
+    <td>one of: <a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>, <a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeFromBackendTexture_sampleCnt'><code><strong>sampleCnt</strong></code></a></td>
+    <td>samples per <a href='undocumented#Pixel'>pixel</a>, or 0 to disable full scene <a href='SkPaint_Reference#Anti_Alias'>anti-aliasing</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeFromBackendTexture_colorType'><code><strong>colorType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>, <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeFromBackendTexture_colorSpace'><code><strong>colorSpace</strong></code></a></td>
+    <td>range of colors; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeFromBackendTexture_surfaceProps'><code><strong>surfaceProps</strong></code></a></td>
+    <td>LCD striping orientation and setting for <a href='undocumented#Device'>device</a> independent</td>
+  </tr>
+</table>
+
+fonts; may be nullptr
+
+### Return Value
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> if all parameters are valid; otherwise, nullptr
+
+### Example
+
+<div><fiddle-embed name="d3aec071998f871809f515e58abb1b0e" gpu="true" cpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#GrBackendTexture'>GrBackendTexture</a> <a href='#SkSurface_MakeFromBackendRenderTarget'>MakeFromBackendRenderTarget</a> <a href='#SkSurface_MakeRenderTarget'>MakeRenderTarget</a>
+
+<a name='SkSurface_MakeFromBackendRenderTarget'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkSurface_MakeFromBackendRenderTarget'>MakeFromBackendRenderTarget</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                                   const <a href='undocumented#GrBackendRenderTarget'>GrBackendRenderTarget</a>& backendRenderTarget,
+                                                   <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> origin, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> colorType,
+                                                   <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; colorSpace,
+                                                   const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps)
+</pre>
+
+Wraps a GPU-backed buffer into <a href='SkSurface_Reference#SkSurface'>SkSurface</a>. Caller must ensure <a href='#SkSurface_MakeFromBackendRenderTarget_backendRenderTarget'>backendRenderTarget</a>
+is valid for the lifetime of returned <a href='SkSurface_Reference#SkSurface'>SkSurface</a>.
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> is returned if all parameters are valid. <a href='#SkSurface_MakeFromBackendRenderTarget_backendRenderTarget'>backendRenderTarget</a> is valid if
+its <a href='undocumented#Pixel'>pixel</a> configuration agrees with <a href='#SkSurface_MakeFromBackendRenderTarget_colorSpace'>colorSpace</a> and <a href='#SkSurface_MakeFromBackendRenderTarget_context'>context</a>; for instance, if
+<a href='#SkSurface_MakeFromBackendRenderTarget_backendRenderTarget'>backendRenderTarget</a> has an sRGB configuration, then <a href='#SkSurface_MakeFromBackendRenderTarget_context'>context</a> must support sRGB,
+and <a href='#SkSurface_MakeFromBackendRenderTarget_colorSpace'>colorSpace</a> must be present. Further, <a href='#SkSurface_MakeFromBackendRenderTarget_backendRenderTarget'>backendRenderTarget</a> width and height must
+not exceed <a href='#SkSurface_MakeFromBackendRenderTarget_context'>context</a> capabilities, and the <a href='#SkSurface_MakeFromBackendRenderTarget_context'>context</a> must be able to support
+back-end render targets.
+
+If SK_SUPPORT_GPU is defined as zero, has no effect and returns nullptr.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeFromBackendRenderTarget_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeFromBackendRenderTarget_backendRenderTarget'><code><strong>backendRenderTarget</strong></code></a></td>
+    <td>GPU intermediate memory buffer</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeFromBackendRenderTarget_origin'><code><strong>origin</strong></code></a></td>
+    <td>one of: <a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>, <a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeFromBackendRenderTarget_colorType'><code><strong>colorType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>, <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeFromBackendRenderTarget_colorSpace'><code><strong>colorSpace</strong></code></a></td>
+    <td>range of colors</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeFromBackendRenderTarget_surfaceProps'><code><strong>surfaceProps</strong></code></a></td>
+    <td>LCD striping orientation and setting for <a href='undocumented#Device'>device</a> independent</td>
+  </tr>
+</table>
+
+fonts; may be nullptr
+
+### Return Value
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> if all parameters are valid; otherwise, nullptr
+
+### Example
+
+<pre style="padding: 1em 1em 1em 1em; font-size: 13px width: 62.5em; background-color: #f0f0f0">
+
+    SkPaint paint;
+    paint.setTextSize(32);
+    GrContext* context = canvas->getGrContext();
+    if (!context) {
+         canvas->drawString("GPU only!", 20, 40, paint);
+         return;
+    }
+    sk_sp<SkSurface> gpuSurface = SkSurface::MakeFromBackendRenderTarget(context,
+            backEndRenderTarget, kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
+            nullptr, nullptr);
+    auto surfaceCanvas = gpuSurface->getCanvas();
+    surfaceCanvas->drawString("GPU rocks!", 20, 40, paint);
+    sk_sp<SkImage> image(gpuSurface->makeImageSnapshot());
+    canvas->drawImage(image, 0, 0);
+
+</pre>
+
+### See Also
+
+<a href='#SkSurface_MakeFromBackendTexture'>MakeFromBackendTexture</a> <a href='#SkSurface_MakeRenderTarget'>MakeRenderTarget</a>
+
+<a name='SkSurface_MakeFromBackendTextureAsRenderTarget'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget'>MakeFromBackendTextureAsRenderTarget</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                            const <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>& backendTexture,
+                                            <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> origin, int sampleCnt,
+                                            <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> colorType, <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkColorSpace'>SkColorSpace</a>&gt; colorSpace,
+                                            const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps)
+</pre>
+
+Wraps a GPU-backed <a href='undocumented#Texture'>texture</a> into <a href='SkSurface_Reference#SkSurface'>SkSurface</a>. Caller must ensure <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget_backendTexture'>backendTexture</a> is
+valid for the lifetime of returned <a href='SkSurface_Reference#SkSurface'>SkSurface</a>. If <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget_sampleCnt'>sampleCnt</a> greater than zero,
+creates an intermediate MSAA <a href='SkSurface_Reference#SkSurface'>SkSurface</a> which is used for drawing <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget_backendTexture'>backendTexture</a>.
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> is returned if all parameters are valid. <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget_backendTexture'>backendTexture</a> is valid if
+its <a href='undocumented#Pixel'>pixel</a> configuration agrees with <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget_colorSpace'>colorSpace</a> and <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget_context'>context</a>; for instance, if
+<a href='#SkSurface_MakeFromBackendTextureAsRenderTarget_backendTexture'>backendTexture</a> has an sRGB configuration, then <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget_context'>context</a> must support sRGB,
+and <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget_colorSpace'>colorSpace</a> must be present. Further, <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget_backendTexture'>backendTexture</a> width and height must
+not exceed <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget_context'>context</a> capabilities.
+
+Returned <a href='SkSurface_Reference#SkSurface'>SkSurface</a> is available only for drawing into, and cannot generate an
+<a href='SkImage_Reference#SkImage'>SkImage</a>.
+
+If SK_SUPPORT_GPU is defined as zero, has no effect and returns nullptr.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeFromBackendTextureAsRenderTarget_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeFromBackendTextureAsRenderTarget_backendTexture'><code><strong>backendTexture</strong></code></a></td>
+    <td><a href='undocumented#Texture'>texture</a> residing on GPU</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeFromBackendTextureAsRenderTarget_origin'><code><strong>origin</strong></code></a></td>
+    <td>one of: <a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>, <a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeFromBackendTextureAsRenderTarget_sampleCnt'><code><strong>sampleCnt</strong></code></a></td>
+    <td>samples per <a href='undocumented#Pixel'>pixel</a>, or 0 to disable full scene <a href='SkPaint_Reference#Anti_Alias'>anti-aliasing</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeFromBackendTextureAsRenderTarget_colorType'><code><strong>colorType</strong></code></a></td>
+    <td>one of:</td>
+  </tr>
+</table>
+
+<a href='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>, <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_565_SkColorType'>kRGB_565_SkColorType</a>,
+<a href='SkImageInfo_Reference#kARGB_4444_SkColorType'>kARGB_4444_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_8888_SkColorType'>kRGBA_8888_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGB_888x_SkColorType'>kRGB_888x_SkColorType</a>, <a href='SkImageInfo_Reference#kBGRA_8888_SkColorType'>kBGRA_8888_SkColorType</a>,
+<a href='SkImageInfo_Reference#kRGBA_1010102_SkColorType'>kRGBA_1010102_SkColorType</a>, <a href='SkImageInfo_Reference#kRGB_101010x_SkColorType'>kRGB_101010x_SkColorType</a>,
+<a href='SkImageInfo_Reference#kGray_8_SkColorType'>kGray_8_SkColorType</a>, <a href='SkImageInfo_Reference#kRGBA_F16_SkColorType'>kRGBA_F16_SkColorType</a>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeFromBackendTextureAsRenderTarget_colorSpace'><code><strong>colorSpace</strong></code></a></td>
+    <td>range of colors; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeFromBackendTextureAsRenderTarget_surfaceProps'><code><strong>surfaceProps</strong></code></a></td>
+    <td>LCD striping orientation and setting for <a href='undocumented#Device'>device</a> independent</td>
+  </tr>
+</table>
+
+fonts; may be nullptr
+
+### Return Value
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> if all parameters are valid; otherwise, nullptr
+
+### Example
+
+<div><fiddle-embed name="5e87093b9cbe95124ae14cbe77091eb7" gpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_MakeFromBackendRenderTarget'>MakeFromBackendRenderTarget</a> <a href='#SkSurface_MakeRenderTarget'>MakeRenderTarget</a>
+
+<a name='SkSurface_MakeRenderTarget'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkSurface_MakeRenderTarget'>MakeRenderTarget</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='undocumented#SkBudgeted'>SkBudgeted</a> budgeted,
+                                         const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo, int sampleCount,
+                                         <a href='undocumented#GrSurfaceOrigin'>GrSurfaceOrigin</a> surfaceOrigin,
+                                         const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* surfaceProps,
+                                         bool shouldCreateWithMips = false)
+</pre>
+
+Returns <a href='SkSurface_Reference#SkSurface'>SkSurface</a> on GPU indicated by <a href='#SkSurface_MakeRenderTarget_context'>context</a>. Allocates memory for
+pixels, based on the width, height, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> in <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>.  <a href='#SkSurface_MakeRenderTarget_budgeted'>budgeted</a>
+selects whether allocation for pixels is tracked by <a href='#SkSurface_MakeRenderTarget_context'>context</a>. <a href='#SkSurface_MakeRenderTarget_imageInfo'>imageInfo</a>
+describes the <a href='undocumented#Pixel'>pixel</a> format in <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, and transparency in
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, and <a href='SkColor_Reference#Color'>color</a> matching in <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+
+<a href='#SkSurface_MakeRenderTarget_sampleCount'>sampleCount</a> requests the number of samples per <a href='undocumented#Pixel'>pixel</a>.
+Pass zero to disable  <a href='undocumented#Multi_Sample_Anti_Aliasing'>multi-sample anti-aliasing</a>.  The request is rounded
+up to the next supported count, or rounded down if it is larger than the
+maximum supported count.
+
+<a href='#SkSurface_MakeRenderTarget_surfaceOrigin'>surfaceOrigin</a> pins either the top-left or the bottom-left corner to the origin.
+
+<a href='#SkSurface_MakeRenderTarget_shouldCreateWithMips'>shouldCreateWithMips</a> hints that <a href='SkImage_Reference#SkImage'>SkImage</a> returned by <a href='#SkSurface_makeImageSnapshot'>makeImageSnapshot</a>() is  <a href='undocumented#Mip_Map'>mip map</a>.
+
+If SK_SUPPORT_GPU is defined as zero, has no effect and returns nullptr.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRenderTarget_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRenderTarget_budgeted'><code><strong>budgeted</strong></code></a></td>
+    <td>one of: <a href='undocumented#SkBudgeted'>SkBudgeted</a>::<a href='#SkBudgeted_kNo'>kNo</a>, <a href='undocumented#SkBudgeted'>SkBudgeted</a>::<a href='#SkBudgeted_kYes'>kYes</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRenderTarget_imageInfo'><code><strong>imageInfo</strong></code></a></td>
+    <td>width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a>;</td>
+  </tr>
+</table>
+
+width, or height, or both, may be zero
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRenderTarget_sampleCount'><code><strong>sampleCount</strong></code></a></td>
+    <td>samples per <a href='undocumented#Pixel'>pixel</a>, or 0 to disable full scene <a href='SkPaint_Reference#Anti_Alias'>anti-aliasing</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRenderTarget_surfaceOrigin'><code><strong>surfaceOrigin</strong></code></a></td>
+    <td>one of: <a href='undocumented#kBottomLeft_GrSurfaceOrigin'>kBottomLeft_GrSurfaceOrigin</a>, <a href='undocumented#kTopLeft_GrSurfaceOrigin'>kTopLeft_GrSurfaceOrigin</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRenderTarget_surfaceProps'><code><strong>surfaceProps</strong></code></a></td>
+    <td>LCD striping orientation and setting for <a href='undocumented#Device'>device</a> independent</td>
+  </tr>
+</table>
+
+fonts; may be nullptr
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRenderTarget_shouldCreateWithMips'><code><strong>shouldCreateWithMips</strong></code></a></td>
+    <td>hint that <a href='SkSurface_Reference#SkSurface'>SkSurface</a> will host  <a href='undocumented#Mip_Map'>mip map</a> images</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> if all parameters are valid; otherwise, nullptr
+
+### Example
+
+<div><fiddle-embed name="67b6609471a3f1ed0f4b1657004cdecb" gpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_MakeFromBackendRenderTarget'>MakeFromBackendRenderTarget</a> <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget'>MakeFromBackendTextureAsRenderTarget</a>
+
+<a name='SkSurface_MakeRenderTarget_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkSurface_MakeRenderTarget'>MakeRenderTarget</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='undocumented#SkBudgeted'>SkBudgeted</a> budgeted,
+                                         const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo, int sampleCount,
+                                         const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>* props)
+</pre>
+
+Returns <a href='SkSurface_Reference#SkSurface'>SkSurface</a> on GPU indicated by <a href='#SkSurface_MakeRenderTarget_2_context'>context</a>. Allocates memory for
+pixels, based on the width, height, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> in <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>.  <a href='#SkSurface_MakeRenderTarget_2_budgeted'>budgeted</a>
+selects whether allocation for pixels is tracked by <a href='#SkSurface_MakeRenderTarget_2_context'>context</a>. <a href='#SkSurface_MakeRenderTarget_2_imageInfo'>imageInfo</a>
+describes the <a href='undocumented#Pixel'>pixel</a> format in <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, and transparency in
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, and <a href='SkColor_Reference#Color'>color</a> matching in <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+
+<a href='#SkSurface_MakeRenderTarget_2_sampleCount'>sampleCount</a> requests the number of samples per <a href='undocumented#Pixel'>pixel</a>.
+Pass zero to disable  <a href='undocumented#Multi_Sample_Anti_Aliasing'>multi-sample anti-aliasing</a>.  The request is rounded
+up to the next supported count, or rounded down if it is larger than the
+maximum supported count.
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> bottom-left corner is pinned to the origin.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRenderTarget_2_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRenderTarget_2_budgeted'><code><strong>budgeted</strong></code></a></td>
+    <td>one of: <a href='undocumented#SkBudgeted'>SkBudgeted</a>::<a href='#SkBudgeted_kNo'>kNo</a>, <a href='undocumented#SkBudgeted'>SkBudgeted</a>::<a href='#SkBudgeted_kYes'>kYes</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRenderTarget_2_imageInfo'><code><strong>imageInfo</strong></code></a></td>
+    <td>width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a>,</td>
+  </tr>
+</table>
+
+of  <a href='undocumented#Raster_Surface'>raster surface</a>; width, or height, or both, may be zero
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRenderTarget_2_sampleCount'><code><strong>sampleCount</strong></code></a></td>
+    <td>samples per <a href='undocumented#Pixel'>pixel</a>, or 0 to disable  <a href='undocumented#Multi_Sample_Anti_Aliasing'>multi-sample anti-aliasing</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRenderTarget_2_props'><code><strong>props</strong></code></a></td>
+    <td>LCD striping orientation and setting for <a href='undocumented#Device'>device</a> independent</td>
+  </tr>
+</table>
+
+fonts; may be nullptr
+
+### Return Value
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> if all parameters are valid; otherwise, nullptr
+
+### Example
+
+<div><fiddle-embed name="640321e8ecfb3f9329f3bc6e1f02485f" gpu="true" cpu="true"><div>LCD <a href='undocumented#Text'>text</a> takes advantage of raster striping to improve resolution. Only one of
+the four combinations is correct, depending on whether monitor LCD striping is
+horizontal or vertical, and whether the order of the stripes is red blue green
+or red green blue.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_MakeFromBackendRenderTarget'>MakeFromBackendRenderTarget</a> <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget'>MakeFromBackendTextureAsRenderTarget</a>
+
+<a name='SkSurface_MakeRenderTarget_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkSurface_MakeRenderTarget'>MakeRenderTarget</a>(<a href='undocumented#GrContext'>GrContext</a>* context, <a href='undocumented#SkBudgeted'>SkBudgeted</a> budgeted,
+                                         const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo)
+</pre>
+
+Returns <a href='SkSurface_Reference#SkSurface'>SkSurface</a> on GPU indicated by <a href='#SkSurface_MakeRenderTarget_3_context'>context</a>. Allocates memory for
+pixels, based on the width, height, and <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> in <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>.  <a href='#SkSurface_MakeRenderTarget_3_budgeted'>budgeted</a>
+selects whether allocation for pixels is tracked by <a href='#SkSurface_MakeRenderTarget_3_context'>context</a>. <a href='#SkSurface_MakeRenderTarget_3_imageInfo'>imageInfo</a>
+describes the <a href='undocumented#Pixel'>pixel</a> format in <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, and transparency in
+<a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, and <a href='SkColor_Reference#Color'>color</a> matching in <a href='undocumented#SkColorSpace'>SkColorSpace</a>.
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> bottom-left corner is pinned to the origin.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRenderTarget_3_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRenderTarget_3_budgeted'><code><strong>budgeted</strong></code></a></td>
+    <td>one of: <a href='undocumented#SkBudgeted'>SkBudgeted</a>::<a href='#SkBudgeted_kNo'>kNo</a>, <a href='undocumented#SkBudgeted'>SkBudgeted</a>::<a href='#SkBudgeted_kYes'>kYes</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRenderTarget_3_imageInfo'><code><strong>imageInfo</strong></code></a></td>
+    <td>width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a>,</td>
+  </tr>
+</table>
+
+of  <a href='undocumented#Raster_Surface'>raster surface</a>; width, or height, or both, may be zero
+
+### Return Value
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> if all parameters are valid; otherwise, nullptr
+
+### Example
+
+<div><fiddle-embed name="5c7629c15e9ac93f098335e72560fa2e" gpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_MakeFromBackendRenderTarget'>MakeFromBackendRenderTarget</a> <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget'>MakeFromBackendTextureAsRenderTarget</a>
+
+<a name='SkSurface_MakeRenderTarget_4'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkSurface_MakeRenderTarget'>MakeRenderTarget</a>(<a href='undocumented#GrContext'>GrContext</a>* context,
+                                         const <a href='undocumented#SkSurfaceCharacterization'>SkSurfaceCharacterization</a>& characterization,
+                                         <a href='undocumented#SkBudgeted'>SkBudgeted</a> budgeted)
+</pre>
+
+Returns <a href='SkSurface_Reference#SkSurface'>SkSurface</a> on GPU indicated by <a href='#SkSurface_MakeRenderTarget_4_context'>context</a> that is compatible with the provided
+<a href='#SkSurface_MakeRenderTarget_4_characterization'>characterization</a>. <a href='#SkSurface_MakeRenderTarget_4_budgeted'>budgeted</a> selects whether allocation for pixels is tracked by <a href='#SkSurface_MakeRenderTarget_4_context'>context</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeRenderTarget_4_context'><code><strong>context</strong></code></a></td>
+    <td><a href='undocumented#GPU_Context'>GPU context</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRenderTarget_4_characterization'><code><strong>characterization</strong></code></a></td>
+    <td>description of the desired <a href='SkSurface_Reference#SkSurface'>SkSurface</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeRenderTarget_4_budgeted'><code><strong>budgeted</strong></code></a></td>
+    <td>one of: <a href='undocumented#SkBudgeted'>SkBudgeted</a>::<a href='#SkBudgeted_kNo'>kNo</a>, <a href='undocumented#SkBudgeted'>SkBudgeted</a>::<a href='#SkBudgeted_kYes'>kYes</a></td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> if all parameters are valid; otherwise, nullptr
+
+### See Also
+
+<a href='#SkSurface_MakeFromBackendRenderTarget'>MakeFromBackendRenderTarget</a> <a href='#SkSurface_MakeFromBackendTextureAsRenderTarget'>MakeFromBackendTextureAsRenderTarget</a>
+
+<a name='SkSurface_MakeNull'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkSurface_MakeNull'>MakeNull</a>(int width, int height)
+</pre>
+
+Returns <a href='SkSurface_Reference#SkSurface'>SkSurface</a> without backing pixels. Drawing to <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> returned from <a href='SkSurface_Reference#SkSurface'>SkSurface</a>
+has no effect. Calling <a href='#SkSurface_makeImageSnapshot'>makeImageSnapshot</a>() on returned <a href='SkSurface_Reference#SkSurface'>SkSurface</a> returns nullptr.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_MakeNull_width'><code><strong>width</strong></code></a></td>
+    <td>one or greater</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_MakeNull_height'><code><strong>height</strong></code></a></td>
+    <td>one or greater</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkSurface_Reference#SkSurface'>SkSurface</a> if <a href='#SkSurface_MakeNull_width'>width</a> and <a href='#SkSurface_MakeNull_height'>height</a> are positive; otherwise, nullptr
+
+### Example
+
+<div><fiddle-embed name="@Surface_MakeNull">
+
+#### Example Output
+
+~~~~
+SkSurface::MakeNull(0, 0) == nullptr
+surf->makeImageSnapshot() == nullptr
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_MakeRaster'>MakeRaster</a> <a href='#SkSurface_MakeRenderTarget'>MakeRenderTarget</a>
+
+<a name='Property'></a>
+
+<a name='SkSurface_width'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkSurface_width'>width()</a>const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> count in each row; may be zero or greater.
+
+### Return Value
+
+number of <a href='undocumented#Pixel'>pixel</a> columns
+
+### Example
+
+<div><fiddle-embed name="@Surface_width">
+
+#### Example Output
+
+~~~~
+surface width=37  canvas width=37
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_height'>height()</a>
+
+<a name='SkSurface_height'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkSurface_height'>height()</a>const
+</pre>
+
+Returns <a href='undocumented#Pixel'>pixel</a> row count; may be zero or greater.
+
+### Return Value
+
+number of <a href='undocumented#Pixel'>pixel</a> rows
+
+### Example
+
+<div><fiddle-embed name="@Surface_height">
+
+#### Example Output
+
+~~~~
+surface height=1000  canvas height=1000
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_width'>width()</a>
+
+<a name='SkSurface_generationID'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint32_t <a href='#SkSurface_generationID'>generationID</a>()
+</pre>
+
+Returns unique value identifying the content of <a href='SkSurface_Reference#SkSurface'>SkSurface</a>. Returned value changes
+each time the content changes. Content is changed by drawing, or by calling
+<a href='#SkSurface_notifyContentWillChange'>notifyContentWillChange</a>().
+
+### Return Value
+
+unique content identifier
+
+### Example
+
+<div><fiddle-embed name="@Surface_notifyContentWillChange">
+
+#### Example Output
+
+~~~~
+surface generationID: 1
+surface generationID: 2
+surface generationID: 3
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_notifyContentWillChange'>notifyContentWillChange</a> <a href='#SkSurface_ContentChangeMode'>ContentChangeMode</a> <a href='#SkSurface_getCanvas'>getCanvas</a>
+
+<a name='SkSurface_ContentChangeMode'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkSurface_ContentChangeMode'>ContentChangeMode</a> {
+        <a href='#SkSurface_kDiscard_ContentChangeMode'>kDiscard_ContentChangeMode</a>,
+        <a href='#SkSurface_kRetain_ContentChangeMode'>kRetain_ContentChangeMode</a>,
+    };
+</pre>
+
+<a href='#SkSurface_ContentChangeMode'>ContentChangeMode</a> members are parameters to <a href='#SkSurface_notifyContentWillChange'>notifyContentWillChange</a>.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkSurface_kDiscard_ContentChangeMode'><code>SkSurface::kDiscard_ContentChangeMode</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>#Line # discards surface on change ##</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Pass to <a href='#SkSurface_notifyContentWillChange'>notifyContentWillChange</a> to discard <a href='SkSurface_Reference#Surface'>surface</a> contents when
+the <a href='SkSurface_Reference#Surface'>surface</a> is cleared or overwritten.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkSurface_kRetain_ContentChangeMode'><code>SkSurface::kRetain_ContentChangeMode</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>#Line # preserves surface on change ##</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Pass to <a href='#SkSurface_notifyContentWillChange'>notifyContentWillChange</a> when to preserve <a href='SkSurface_Reference#Surface'>surface</a> contents.
+If a snapshot has been generated, this copies the <a href='SkSurface_Reference#Surface'>Surface</a> contents.
+</td>
+  </tr>
+</table>
+
+### See Also
+
+<a href='#SkSurface_notifyContentWillChange'>notifyContentWillChange</a> <a href='#SkSurface_generationID'>generationID</a>
+
+<a name='Miscellaneous'></a>
+
+<a name='SkSurface_notifyContentWillChange'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkSurface_notifyContentWillChange'>notifyContentWillChange</a>(<a href='#SkSurface_ContentChangeMode'>ContentChangeMode</a> mode)
+</pre>
+
+Notifies that <a href='SkSurface_Reference#SkSurface'>SkSurface</a> contents will be changed by code outside of Skia.
+Subsequent calls to <a href='#SkSurface_generationID'>generationID</a>() return a different value.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_notifyContentWillChange_mode'><code><strong>mode</strong></code></a></td>
+    <td>one of: <a href='#SkSurface_kDiscard_ContentChangeMode'>kDiscard_ContentChangeMode</a>, <a href='#SkSurface_kRetain_ContentChangeMode'>kRetain_ContentChangeMode</a></td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Surface_notifyContentWillChange"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_ContentChangeMode'>ContentChangeMode</a> <a href='#SkSurface_generationID'>generationID</a>
+
+<a name='SkSurface_BackendHandleAccess'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    enum <a href='#SkSurface_BackendHandleAccess'>BackendHandleAccess</a> {
+        <a href='#SkSurface_kFlushRead_BackendHandleAccess'>kFlushRead_BackendHandleAccess</a>,
+        <a href='#SkSurface_kFlushWrite_BackendHandleAccess'>kFlushWrite_BackendHandleAccess</a>,
+        <a href='#SkSurface_kDiscardWrite_BackendHandleAccess'>kDiscardWrite_BackendHandleAccess</a>,
+    };
+
+    static const <a href='#SkSurface_BackendHandleAccess'>BackendHandleAccess</a> kFlushRead_TextureHandleAccess =
+            <a href='#SkSurface_kFlushRead_BackendHandleAccess'>kFlushRead_BackendHandleAccess</a>;
+    static const <a href='#SkSurface_BackendHandleAccess'>BackendHandleAccess</a> kFlushWrite_TextureHandleAccess =
+            <a href='#SkSurface_kFlushWrite_BackendHandleAccess'>kFlushWrite_BackendHandleAccess</a>;
+    static const <a href='#SkSurface_BackendHandleAccess'>BackendHandleAccess</a> kDiscardWrite_TextureHandleAccess =
+            <a href='#SkSurface_kDiscardWrite_BackendHandleAccess'>kDiscardWrite_BackendHandleAccess</a>;
+</pre>
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkSurface_kFlushRead_BackendHandleAccess'><code>SkSurface::kFlushRead_BackendHandleAccess</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Caller may read from the back-end object.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkSurface_kFlushWrite_BackendHandleAccess'><code>SkSurface::kFlushWrite_BackendHandleAccess</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Caller may write to the back-end object.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkSurface_kDiscardWrite_BackendHandleAccess'><code>SkSurface::kDiscardWrite_BackendHandleAccess</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Caller must overwrite the entire back-end object.
+</td>
+  </tr>
+</table>
+
+### See Also
+
+<a href='#SkSurface_getBackendTexture'>getBackendTexture</a> <a href='#SkSurface_getBackendRenderTarget'>getBackendRenderTarget</a>
+
+<a name='SkSurface_getBackendTexture'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#GrBackendTexture'>GrBackendTexture</a> <a href='#SkSurface_getBackendTexture'>getBackendTexture</a>(<a href='#SkSurface_BackendHandleAccess'>BackendHandleAccess</a> backendHandleAccess)
+</pre>
+
+Retrieves the back-end <a href='undocumented#Texture'>texture</a>. If <a href='SkSurface_Reference#SkSurface'>SkSurface</a> has no back-end <a href='undocumented#Texture'>texture</a>, an invalid
+object is returned. Call <a href='undocumented#GrBackendTexture'>GrBackendTexture</a>::<a href='#GrBackendTexture_isValid'>isValid</a> to determine if the result
+is valid.
+
+The returned <a href='undocumented#GrBackendTexture'>GrBackendTexture</a> should be discarded if the <a href='SkSurface_Reference#SkSurface'>SkSurface</a> is drawn to or deleted.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_getBackendTexture_backendHandleAccess'><code><strong>backendHandleAccess</strong></code></a></td>
+    <td>one of:  <a href='#SkSurface_kFlushRead_BackendHandleAccess'>kFlushRead_BackendHandleAccess</a>,</td>
+  </tr>
+</table>
+
+<a href='#SkSurface_kFlushWrite_BackendHandleAccess'>kFlushWrite_BackendHandleAccess</a>,
+<a href='#SkSurface_kDiscardWrite_BackendHandleAccess'>kDiscardWrite_BackendHandleAccess</a>
+
+### Return Value
+
+<a href='undocumented#GPU_Texture'>GPU texture</a> reference; invalid on failure
+
+### See Also
+
+<a href='undocumented#GrBackendTexture'>GrBackendTexture</a> <a href='#SkSurface_BackendHandleAccess'>BackendHandleAccess</a> <a href='#SkSurface_getBackendRenderTarget'>getBackendRenderTarget</a>
+
+<a name='SkSurface_getBackendRenderTarget'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#GrBackendRenderTarget'>GrBackendRenderTarget</a> <a href='#SkSurface_getBackendRenderTarget'>getBackendRenderTarget</a>(<a href='#SkSurface_BackendHandleAccess'>BackendHandleAccess</a> backendHandleAccess)
+</pre>
+
+Retrieves the back-end  <a href='undocumented#Render_Target'>render target</a>. If <a href='SkSurface_Reference#SkSurface'>SkSurface</a> has no back-end  <a href='undocumented#Render_Target'>render target</a>, an invalid
+object is returned. Call <a href='undocumented#GrBackendRenderTarget'>GrBackendRenderTarget</a>::<a href='#GrBackendRenderTarget_isValid'>isValid</a> to determine if the result
+is valid.
+
+The returned <a href='undocumented#GrBackendRenderTarget'>GrBackendRenderTarget</a> should be discarded if the <a href='SkSurface_Reference#SkSurface'>SkSurface</a> is drawn to
+or deleted.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_getBackendRenderTarget_backendHandleAccess'><code><strong>backendHandleAccess</strong></code></a></td>
+    <td>one of:  <a href='#SkSurface_kFlushRead_BackendHandleAccess'>kFlushRead_BackendHandleAccess</a>,</td>
+  </tr>
+</table>
+
+<a href='#SkSurface_kFlushWrite_BackendHandleAccess'>kFlushWrite_BackendHandleAccess</a>,
+<a href='#SkSurface_kDiscardWrite_BackendHandleAccess'>kDiscardWrite_BackendHandleAccess</a>
+
+### Return Value
+
+GPU  <a href='undocumented#Render_Target'>render target</a> reference; invalid on failure
+
+### See Also
+
+<a href='undocumented#GrBackendRenderTarget'>GrBackendRenderTarget</a> <a href='#SkSurface_BackendHandleAccess'>BackendHandleAccess</a> <a href='#SkSurface_getBackendTexture'>getBackendTexture</a>
+
+<a name='SkSurface_getCanvas'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>* <a href='#SkSurface_getCanvas'>getCanvas</a>()
+</pre>
+
+Returns <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> that draws into <a href='SkSurface_Reference#SkSurface'>SkSurface</a>. Subsequent calls return the same <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>.
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> returned is managed and owned by <a href='SkSurface_Reference#SkSurface'>SkSurface</a>, and is deleted when <a href='SkSurface_Reference#SkSurface'>SkSurface</a>
+is deleted.
+
+### Return Value
+
+drawing <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> for <a href='SkSurface_Reference#SkSurface'>SkSurface</a>
+
+### Example
+
+<div><fiddle-embed name="33d0c5ad5a4810e533ae1010e29f8b75"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_makeSurface'>makeSurface</a> <a href='#SkSurface_makeImageSnapshot'>makeImageSnapshot</a> <a href='#SkSurface_draw'>draw</a>
+
+<a name='SkSurface_makeSurface'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkSurface_Reference#SkSurface'>SkSurface</a>&gt; <a href='#SkSurface_makeSurface'>makeSurface</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& imageInfo)
+</pre>
+
+Returns a compatible <a href='SkSurface_Reference#SkSurface'>SkSurface</a>, or nullptr. Returned <a href='SkSurface_Reference#SkSurface'>SkSurface</a> contains
+the same raster, GPU, or null properties as the original. Returned <a href='SkSurface_Reference#SkSurface'>SkSurface</a>
+does not share the same pixels.
+
+Returns nullptr if <a href='#SkSurface_makeSurface_imageInfo'>imageInfo</a> width or height are zero, or if <a href='#SkSurface_makeSurface_imageInfo'>imageInfo</a>
+is incompatible with <a href='SkSurface_Reference#SkSurface'>SkSurface</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_makeSurface_imageInfo'><code><strong>imageInfo</strong></code></a></td>
+    <td>width, height, <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a>, <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a>, <a href='undocumented#SkColorSpace'>SkColorSpace</a>,</td>
+  </tr>
+</table>
+
+of <a href='SkSurface_Reference#SkSurface'>SkSurface</a>; width and height must be greater than zero
+
+### Return Value
+
+compatible <a href='SkSurface_Reference#SkSurface'>SkSurface</a> or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Surface_makeSurface"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_makeImageSnapshot'>makeImageSnapshot</a> <a href='#SkSurface_getCanvas'>getCanvas</a> <a href='#SkSurface_draw'>draw</a>
+
+<a name='SkSurface_makeImageSnapshot'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkSurface_makeImageSnapshot'>makeImageSnapshot</a>()
+</pre>
+
+Returns <a href='SkImage_Reference#SkImage'>SkImage</a> capturing <a href='SkSurface_Reference#SkSurface'>SkSurface</a> contents. Subsequent drawing to <a href='SkSurface_Reference#SkSurface'>SkSurface</a> contents
+are not captured. <a href='SkImage_Reference#SkImage'>SkImage</a> allocation is accounted for if <a href='SkSurface_Reference#SkSurface'>SkSurface</a> was created with
+<a href='undocumented#SkBudgeted'>SkBudgeted</a>::<a href='#SkBudgeted_kYes'>kYes</a>.
+
+### Return Value
+
+<a href='SkImage_Reference#SkImage'>SkImage</a> initialized with <a href='SkSurface_Reference#SkSurface'>SkSurface</a> contents
+
+### Example
+
+<div><fiddle-embed name="@Surface_makeImageSnapshot"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_draw'>draw</a> <a href='#SkSurface_getCanvas'>getCanvas</a>
+
+<a name='SkSurface_makeImageSnapshot_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkImage_Reference#SkImage'>SkImage</a>&gt; <a href='#SkSurface_makeImageSnapshot'>makeImageSnapshot</a>(const <a href='SkIRect_Reference#SkIRect'>SkIRect</a>& bounds)
+</pre>
+
+Like the no-parameter version, this returns an <a href='SkImage_Reference#Image'>image</a> of the current <a href='SkSurface_Reference#Surface'>surface</a> contents.
+This variant takes a rectangle specifying the subset of the <a href='SkSurface_Reference#Surface'>surface</a> that is of interest.
+These bounds will be sanitized before being used.
+- If bounds extends beyond the <a href='SkSurface_Reference#Surface'>surface</a>, it will be trimmed to just the intersection of
+it and the <a href='SkSurface_Reference#Surface'>surface</a>.
+- If bounds does not intersect the <a href='SkSurface_Reference#Surface'>surface</a>, then this returns nullptr.
+- If bounds == the <a href='SkSurface_Reference#Surface'>surface</a>, then this is the same as calling the no-parameter variant.
+
+### Example
+
+<div><fiddle-embed name="@Surface_makeImageSnapshot_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_draw'>draw</a> <a href='#SkSurface_getCanvas'>getCanvas</a>
+
+<a name='Pixels'></a>
+
+<a name='SkSurface_draw'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void draw(<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>* <a href='SkCanvas_Reference#Canvas'>canvas</a>, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y, const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a>)
+</pre>
+
+Draws <a href='SkSurface_Reference#SkSurface'>SkSurface</a> contents to <a href='#SkSurface_draw_canvas'>canvas</a>, with its top-left corner at (<a href='#SkSurface_draw_x'>x</a>, <a href='#SkSurface_draw_y'>y</a>).
+
+If <a href='SkPaint_Reference#SkPaint'>SkPaint</a> <a href='#SkSurface_draw_paint'>paint</a> is not nullptr, apply <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='SkColor_Reference#Alpha'>alpha</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,
+<a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, and <a href='undocumented#SkDrawLooper'>SkDrawLooper</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_draw_canvas'><code><strong>canvas</strong></code></a></td>
+    <td><a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a> drawn into</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_draw_x'><code><strong>x</strong></code></a></td>
+    <td>horizontal offset in <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_draw_y'><code><strong>y</strong></code></a></td>
+    <td>vertical offset in <a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_draw_paint'><code><strong>paint</strong></code></a></td>
+    <td><a href='SkPaint_Reference#SkPaint'>SkPaint</a> containing <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a>, <a href='undocumented#SkColorFilter'>SkColorFilter</a>, <a href='undocumented#SkImageFilter'>SkImageFilter</a>,</td>
+  </tr>
+</table>
+
+and so on; or nullptr
+
+### Example
+
+<div><fiddle-embed name="@Surface_draw"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_makeImageSnapshot'>makeImageSnapshot</a> <a href='#SkSurface_getCanvas'>getCanvas</a>
+
+<a name='SkSurface_peekPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkSurface_peekPixels'>peekPixels</a>(<a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>* <a href='SkPixmap_Reference#Pixmap'>pixmap</a>)
+</pre>
+
+Copies <a href='SkSurface_Reference#SkSurface'>SkSurface</a> <a href='undocumented#Pixel'>pixel</a> address, row bytes, and <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a> to <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>, if address
+is available, and returns true. If <a href='undocumented#Pixel'>pixel</a> address is not available, return
+false and leave <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a> unchanged.
+
+<a href='#SkSurface_peekPixels_pixmap'>pixmap</a> contents become invalid on any future change to <a href='SkSurface_Reference#SkSurface'>SkSurface</a>.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_peekPixels_pixmap'><code><strong>pixmap</strong></code></a></td>
+    <td>storage for <a href='undocumented#Pixel'>pixel</a> state if pixels are readable; otherwise, ignored</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if <a href='SkSurface_Reference#SkSurface'>SkSurface</a> has direct access to pixels
+
+### Example
+
+<div><fiddle-embed name="8c6184f22cfe068f021704cf92a147a1"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_readPixels'>readPixels</a> <a href='#SkSurface_writePixels'>writePixels</a>
+
+<a name='SkSurface_readPixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkSurface_readPixels'>readPixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& dst, int srcX, int srcY)
+</pre>
+
+Copies <a href='SkRect_Reference#Rect'>Rect</a> of pixels to <a href='#SkSurface_readPixels_dst'>dst</a>.
+
+Source <a href='SkRect_Reference#Rect'>Rect</a> corners are (<a href='#SkSurface_readPixels_srcX'>srcX</a>, <a href='#SkSurface_readPixels_srcY'>srcY</a>) and <a href='SkSurface_Reference#Surface'>Surface</a> (<a href='#SkSurface_width'>width()</a>, <a href='#SkSurface_height'>height()</a>).
+Destination <a href='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<a href='#SkSurface_readPixels_dst'>dst</a>.<a href='#SkPixmap_width'>width()</a>, <a href='#SkSurface_readPixels_dst'>dst</a>.<a href='#SkPixmap_height'>height()</a>).
+Copies each readable <a href='undocumented#Pixel'>pixel</a> intersecting both rectangles, without scaling,
+converting to <a href='#SkSurface_readPixels_dst'>dst</a>.<a href='#SkPixmap_colorType'>colorType</a>() and <a href='#SkSurface_readPixels_dst'>dst</a>.<a href='#SkPixmap_alphaType'>alphaType</a>() if required.
+
+Pixels are readable when <a href='SkSurface_Reference#Surface'>Surface</a> is raster, or backed by a GPU.
+
+The destination  <a href='undocumented#Pixel_Storage'>pixel storage</a> must be allocated by the caller.
+
+<a href='undocumented#Pixel'>Pixel</a> values are converted only if <a href='#Image_Info_Color_Type'>Color_Type</a> and <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>
+do not match. Only pixels within both source and destination rectangles
+are copied. <a href='#SkSurface_readPixels_dst'>dst</a> contents outside <a href='SkRect_Reference#Rect'>Rect</a> intersection are unchanged.
+
+Pass negative values for <a href='#SkSurface_readPixels_srcX'>srcX</a> or <a href='#SkSurface_readPixels_srcY'>srcY</a> to offset pixels across or down destination.
+
+Does not copy, and returns false if:
+
+<table>  <tr>
+    <td>Source and destination rectangles do not intersect.</td>
+  </tr>  <tr>
+    <td><a href='SkPixmap_Reference#Pixmap'>Pixmap</a> pixels could not be allocated.</td>
+  </tr>  <tr>
+    <td><a href='#SkSurface_readPixels_dst'>dst</a>.<a href='#SkPixmap_rowBytes'>rowBytes</a>() is too small to contain one row of pixels.</td>
+  </tr>
+</table>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_readPixels_dst'><code><strong>dst</strong></code></a></td>
+    <td>storage for pixels copied from <a href='SkSurface_Reference#Surface'>Surface</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_readPixels_srcX'><code><strong>srcX</strong></code></a></td>
+    <td>offset into readable pixels on x-axis; may be negative</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_readPixels_srcY'><code><strong>srcY</strong></code></a></td>
+    <td>offset into readable pixels on y-axis; may be negative</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels were copied
+
+### Example
+
+<div><fiddle-embed name="9f454fb93bca6482598d198b4121f0a6"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_peekPixels'>peekPixels</a> <a href='#SkSurface_writePixels'>writePixels</a>
+
+<a name='SkSurface_readPixels_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkSurface_readPixels'>readPixels</a>(const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>& dstInfo, void* dstPixels, size_t dstRowBytes, int srcX, int srcY)
+</pre>
+
+Copies <a href='SkRect_Reference#Rect'>Rect</a> of pixels from <a href='SkCanvas_Reference#Canvas'>Canvas</a> into <a href='#SkSurface_readPixels_2_dstPixels'>dstPixels</a>.
+
+Source <a href='SkRect_Reference#Rect'>Rect</a> corners are (<a href='#SkSurface_readPixels_2_srcX'>srcX</a>, <a href='#SkSurface_readPixels_2_srcY'>srcY</a>) and <a href='SkSurface_Reference#Surface'>Surface</a> (<a href='#SkSurface_width'>width()</a>, <a href='#SkSurface_height'>height()</a>).
+Destination <a href='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<a href='#SkSurface_readPixels_2_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_width'>width()</a>, <a href='#SkSurface_readPixels_2_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_height'>height()</a>).
+Copies each readable <a href='undocumented#Pixel'>pixel</a> intersecting both rectangles, without scaling,
+converting to <a href='#SkSurface_readPixels_2_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorType'>colorType</a>() and <a href='#SkSurface_readPixels_2_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>() if required.
+
+Pixels are readable when <a href='SkSurface_Reference#Surface'>Surface</a> is raster, or backed by a GPU.
+
+The destination  <a href='undocumented#Pixel_Storage'>pixel storage</a> must be allocated by the caller.
+
+<a href='undocumented#Pixel'>Pixel</a> values are converted only if <a href='#Image_Info_Color_Type'>Color_Type</a> and <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>
+do not match. Only pixels within both source and destination rectangles
+are copied. <a href='#SkSurface_readPixels_2_dstPixels'>dstPixels</a> contents outside <a href='SkRect_Reference#Rect'>Rect</a> intersection are unchanged.
+
+Pass negative values for <a href='#SkSurface_readPixels_2_srcX'>srcX</a> or <a href='#SkSurface_readPixels_2_srcY'>srcY</a> to offset pixels across or down destination.
+
+Does not copy, and returns false if:
+
+<table>  <tr>
+    <td>Source and destination rectangles do not intersect.</td>
+  </tr>  <tr>
+    <td><a href='SkSurface_Reference#Surface'>Surface</a> pixels could not be converted to <a href='#SkSurface_readPixels_2_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_colorType'>colorType</a>() or <a href='#SkSurface_readPixels_2_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_alphaType'>alphaType</a>().</td>
+  </tr>  <tr>
+    <td><a href='#SkSurface_readPixels_2_dstRowBytes'>dstRowBytes</a> is too small to contain one row of pixels.</td>
+  </tr>
+</table>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_readPixels_2_dstInfo'><code><strong>dstInfo</strong></code></a></td>
+    <td>width, height, <a href='#Image_Info_Color_Type'>Color_Type</a>, and <a href='#Image_Info_Alpha_Type'>Alpha_Type</a> of <a href='#SkSurface_readPixels_2_dstPixels'>dstPixels</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_readPixels_2_dstPixels'><code><strong>dstPixels</strong></code></a></td>
+    <td>storage for pixels; <a href='#SkSurface_readPixels_2_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_height'>height()</a> times <a href='#SkSurface_readPixels_2_dstRowBytes'>dstRowBytes</a>, or larger</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_readPixels_2_dstRowBytes'><code><strong>dstRowBytes</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of one destination row; <a href='#SkSurface_readPixels_2_dstInfo'>dstInfo</a>.<a href='#SkImageInfo_width'>width()</a> times <a href='undocumented#Pixel'>pixel</a> <a href='undocumented#Size'>size</a>, or larger</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_readPixels_2_srcX'><code><strong>srcX</strong></code></a></td>
+    <td>offset into readable pixels on x-axis; may be negative</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_readPixels_2_srcY'><code><strong>srcY</strong></code></a></td>
+    <td>offset into readable pixels on y-axis; may be negative</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels were copied
+
+### Example
+
+<div><fiddle-embed name="@Surface_readPixels_2"><div>A black <a href='undocumented#Oval'>oval</a> drawn on a red background provides an <a href='SkImage_Reference#Image'>image</a> to copy.
+<a href='#SkSurface_readPixels'>readPixels</a> copies one quarter of the <a href='SkSurface_Reference#Surface'>Surface</a> into each of the four corners.
+The copied quarter <a href='undocumented#Oval'>ovals</a> overdraw the original <a href='undocumented#Oval'>oval</a>.
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_peekPixels'>peekPixels</a> <a href='#SkSurface_writePixels'>writePixels</a>
+
+<a name='SkSurface_readPixels_3'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkSurface_readPixels'>readPixels</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& dst, int srcX, int srcY)
+</pre>
+
+Copies <a href='SkRect_Reference#Rect'>Rect</a> of pixels from <a href='SkSurface_Reference#Surface'>Surface</a> into <a href='SkBitmap_Reference#Bitmap'>bitmap</a>.
+
+Source <a href='SkRect_Reference#Rect'>Rect</a> corners are (<a href='#SkSurface_readPixels_3_srcX'>srcX</a>, <a href='#SkSurface_readPixels_3_srcY'>srcY</a>) and <a href='SkSurface_Reference#Surface'>Surface</a> (<a href='#SkSurface_width'>width()</a>, <a href='#SkSurface_height'>height()</a>).
+Destination <a href='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<a href='SkBitmap_Reference#Bitmap'>bitmap</a>.<a href='#SkSurface_width'>width()</a>, <a href='SkBitmap_Reference#Bitmap'>bitmap</a>.<a href='#SkSurface_height'>height()</a>).
+Copies each readable <a href='undocumented#Pixel'>pixel</a> intersecting both rectangles, without scaling,
+converting to <a href='#SkSurface_readPixels_3_dst'>dst</a>.<a href='#SkBitmap_colorType'>colorType</a>() and <a href='#SkSurface_readPixels_3_dst'>dst</a>.<a href='#SkBitmap_alphaType'>alphaType</a>() if required.
+
+Pixels are readable when <a href='SkSurface_Reference#Surface'>Surface</a> is raster, or backed by a GPU.
+
+The destination  <a href='undocumented#Pixel_Storage'>pixel storage</a> must be allocated by the caller.
+
+<a href='undocumented#Pixel'>Pixel</a> values are converted only if <a href='#Image_Info_Color_Type'>Color_Type</a> and <a href='#Image_Info_Alpha_Type'>Alpha_Type</a>
+do not match. Only pixels within both source and destination rectangles
+are copied. <a href='#SkSurface_readPixels_3_dst'>dst</a> contents outside <a href='SkRect_Reference#Rect'>Rect</a> intersection are unchanged.
+
+Pass negative values for <a href='#SkSurface_readPixels_3_srcX'>srcX</a> or <a href='#SkSurface_readPixels_3_srcY'>srcY</a> to offset pixels across or down destination.
+
+Does not copy, and returns false if:
+
+<table>  <tr>
+    <td>Source and destination rectangles do not intersect.</td>
+  </tr>  <tr>
+    <td><a href='SkSurface_Reference#Surface'>Surface</a> pixels could not be converted to <a href='#SkSurface_readPixels_3_dst'>dst</a>.<a href='#SkBitmap_colorType'>colorType</a>() or <a href='#SkSurface_readPixels_3_dst'>dst</a>.<a href='#SkBitmap_alphaType'>alphaType</a>().</td>
+  </tr>  <tr>
+    <td><a href='#SkSurface_readPixels_3_dst'>dst</a> pixels could not be allocated.</td>
+  </tr>  <tr>
+    <td><a href='#SkSurface_readPixels_3_dst'>dst</a>.<a href='#SkBitmap_rowBytes'>rowBytes</a>() is too small to contain one row of pixels.</td>
+  </tr>
+</table>
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_readPixels_3_dst'><code><strong>dst</strong></code></a></td>
+    <td>storage for pixels copied from <a href='SkSurface_Reference#Surface'>Surface</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_readPixels_3_srcX'><code><strong>srcX</strong></code></a></td>
+    <td>offset into readable pixels on x-axis; may be negative</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_readPixels_3_srcY'><code><strong>srcY</strong></code></a></td>
+    <td>offset into readable pixels on y-axis; may be negative</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if pixels were copied
+
+### Example
+
+<div><fiddle-embed name="@Surface_readPixels_3"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_peekPixels'>peekPixels</a> <a href='#SkSurface_writePixels'>writePixels</a>
+
+<a name='SkSurface_writePixels'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkSurface_writePixels'>writePixels</a>(const <a href='SkPixmap_Reference#SkPixmap'>SkPixmap</a>& src, int dstX, int dstY)
+</pre>
+
+Copies <a href='SkRect_Reference#Rect'>Rect</a> of pixels from the <a href='#SkSurface_writePixels_src'>src</a> <a href='SkPixmap_Reference#Pixmap'>Pixmap</a> to the <a href='SkSurface_Reference#Surface'>Surface</a>.
+
+Source <a href='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<a href='#SkSurface_writePixels_src'>src</a>.<a href='#SkPixmap_width'>width()</a>, <a href='#SkSurface_writePixels_src'>src</a>.<a href='#SkPixmap_height'>height()</a>).
+Destination <a href='SkRect_Reference#Rect'>Rect</a> corners are (<a href='#SkSurface_writePixels_dstX'>dstX</a>, <a href='#SkSurface_writePixels_dstY'>dstY</a>) and
+<code>(<a href='#SkSurface_writePixels_dstX'>dstX</a> + <a href='SkSurface_Reference#Surface'>Surface</a> <a href='#SkSurface_width'>width()</a>, <a href='#SkSurface_writePixels_dstY'>dstY</a> + <a href='SkSurface_Reference#Surface'>Surface</a> <a href='#SkSurface_height'>height()</a>)</code>.
+
+Copies each readable <a href='undocumented#Pixel'>pixel</a> intersecting both rectangles, without scaling,
+converting to <a href='SkSurface_Reference#Surface'>Surface</a> <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> if required.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_writePixels_src'><code><strong>src</strong></code></a></td>
+    <td>storage for pixels to copy to <a href='SkSurface_Reference#Surface'>Surface</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_writePixels_dstX'><code><strong>dstX</strong></code></a></td>
+    <td>x-axis position relative to <a href='SkSurface_Reference#Surface'>Surface</a> to begin copy; may be negative</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_writePixels_dstY'><code><strong>dstY</strong></code></a></td>
+    <td>y-axis position relative to <a href='SkSurface_Reference#Surface'>Surface</a> to begin copy; may be negative</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="760793bcf0ef193fa61ea03e6e8fc825"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_readPixels'>readPixels</a> <a href='#SkSurface_peekPixels'>peekPixels</a>
+
+<a name='SkSurface_writePixels_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkSurface_writePixels'>writePixels</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& src, int dstX, int dstY)
+</pre>
+
+Copies <a href='SkRect_Reference#Rect'>Rect</a> of pixels from the <a href='#SkSurface_writePixels_2_src'>src</a> <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> to the <a href='SkSurface_Reference#Surface'>Surface</a>.
+
+Source <a href='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<a href='#SkSurface_writePixels_2_src'>src</a>.<a href='#SkBitmap_width'>width()</a>, <a href='#SkSurface_writePixels_2_src'>src</a>.<a href='#SkBitmap_height'>height()</a>).
+Destination <a href='SkRect_Reference#Rect'>Rect</a> corners are (<a href='#SkSurface_writePixels_2_dstX'>dstX</a>, <a href='#SkSurface_writePixels_2_dstY'>dstY</a>) and
+<code>(<a href='#SkSurface_writePixels_2_dstX'>dstX</a> + <a href='SkSurface_Reference#Surface'>Surface</a> <a href='#SkSurface_width'>width()</a>, <a href='#SkSurface_writePixels_2_dstY'>dstY</a> + <a href='SkSurface_Reference#Surface'>Surface</a> <a href='#SkSurface_height'>height()</a>)</code>.
+
+Copies each readable <a href='undocumented#Pixel'>pixel</a> intersecting both rectangles, without scaling,
+converting to <a href='SkSurface_Reference#Surface'>Surface</a> <a href='SkImageInfo_Reference#SkColorType'>SkColorType</a> and <a href='SkImageInfo_Reference#SkAlphaType'>SkAlphaType</a> if required.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_writePixels_2_src'><code><strong>src</strong></code></a></td>
+    <td>storage for pixels to copy to <a href='SkSurface_Reference#Surface'>Surface</a></td>
+  </tr>
+  <tr>    <td><a name='SkSurface_writePixels_2_dstX'><code><strong>dstX</strong></code></a></td>
+    <td>x-axis position relative to <a href='SkSurface_Reference#Surface'>Surface</a> to begin copy; may be negative</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_writePixels_2_dstY'><code><strong>dstY</strong></code></a></td>
+    <td>y-axis position relative to <a href='SkSurface_Reference#Surface'>Surface</a> to begin copy; may be negative</td>
+  </tr>
+</table>
+
+### Example
+
+<div><fiddle-embed name="@Surface_writePixels_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_readPixels'>readPixels</a> <a href='#SkSurface_peekPixels'>peekPixels</a>
+
+<a name='SkSurface_props'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>& <a href='#SkSurface_props'>props()</a>const
+</pre>
+
+Returns <a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a> for <a href='SkSurface_Reference#Surface'>surface</a>.
+
+### Return Value
+
+LCD striping orientation and setting for <a href='undocumented#Device'>device</a> independent fonts
+
+### Example
+
+<div><fiddle-embed name="@Surface_props">
+
+#### Example Output
+
+~~~~
+surf.props(): kRGB_H_SkPixelGeometry
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#SkSurfaceProps'>SkSurfaceProps</a>
+
+<a name='Utility'></a>
+
+<a name='SkSurface_flush'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkSurface_flush'>flush()</a>
+</pre>
+
+Issues pending <a href='SkSurface_Reference#SkSurface'>SkSurface</a> commands to the GPU-backed API and resolves any <a href='SkSurface_Reference#SkSurface'>SkSurface</a> MSAA.
+
+Skia flushes as needed, so it is not necessary to call this if Skia manages
+drawing and object lifetime. Call when interleaving Skia calls with native
+GPU calls.
+
+### See Also
+
+<a href='undocumented#GrBackendSemaphore'>GrBackendSemaphore</a>
+
+<a name='SkSurface_flushAndSignalSemaphores'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#GrSemaphoresSubmitted'>GrSemaphoresSubmitted</a> <a href='#SkSurface_flushAndSignalSemaphores'>flushAndSignalSemaphores</a>(int numSemaphores,
+                                               <a href='undocumented#GrBackendSemaphore'>GrBackendSemaphore</a> signalSemaphores[])
+</pre>
+
+Issues pending <a href='SkSurface_Reference#SkSurface'>SkSurface</a> commands to the GPU-backed API and resolves any <a href='SkSurface_Reference#SkSurface'>SkSurface</a> MSAA.
+After issuing all commands, <a href='#SkSurface_flushAndSignalSemaphores_signalSemaphores'>signalSemaphores</a> of count <a href='#SkSurface_flushAndSignalSemaphores_numSemaphores'>numSemaphores</a> semaphores
+are signaled by the GPU.
+
+For each <a href='undocumented#GrBackendSemaphore'>GrBackendSemaphore</a> in <a href='#SkSurface_flushAndSignalSemaphores_signalSemaphores'>signalSemaphores</a>:
+if <a href='undocumented#GrBackendSemaphore'>GrBackendSemaphore</a> is initialized, the GPU back-end uses the semaphore as is;
+otherwise, a new semaphore is created and initializes <a href='undocumented#GrBackendSemaphore'>GrBackendSemaphore</a>.
+
+The caller must delete the semaphores created and returned in <a href='#SkSurface_flushAndSignalSemaphores_signalSemaphores'>signalSemaphores</a>.
+<a href='undocumented#GrBackendSemaphore'>GrBackendSemaphore</a> can be deleted as soon as this function returns.
+
+If the back-end API is OpenGL only uninitialized  <a href='undocumented#Backend_Semaphore'>backend semaphores</a> are supported.
+
+If the back-end API is Vulkan semaphores may be initialized or uninitialized.
+If uninitialized, created semaphores are valid only with the VkDevice
+with which they were created.
+
+If <a href='undocumented#GrSemaphoresSubmitted'>GrSemaphoresSubmitted</a>::<a href='#GrSemaphoresSubmitted_kNo'>kNo</a> is returned, the GPU back-end did not create or
+add any semaphores to signal on the GPU; the caller should not instruct the GPU
+to wait on any of the semaphores.
+
+Pending <a href='SkSurface_Reference#Surface'>surface</a> commands are flushed regardless of the return result.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_flushAndSignalSemaphores_numSemaphores'><code><strong>numSemaphores</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of <a href='#SkSurface_flushAndSignalSemaphores_signalSemaphores'>signalSemaphores</a> array</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_flushAndSignalSemaphores_signalSemaphores'><code><strong>signalSemaphores</strong></code></a></td>
+    <td>array of semaphore containers</td>
+  </tr>
+</table>
+
+### Return Value
+
+one of: <a href='undocumented#GrSemaphoresSubmitted'>GrSemaphoresSubmitted</a>::<a href='#GrSemaphoresSubmitted_kYes'>kYes</a>, <a href='undocumented#GrSemaphoresSubmitted'>GrSemaphoresSubmitted</a>::<a href='#GrSemaphoresSubmitted_kNo'>kNo</a>
+
+### See Also
+
+<a href='#SkSurface_wait'>wait</a> <a href='undocumented#GrBackendSemaphore'>GrBackendSemaphore</a>
+
+<a name='SkSurface_wait'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool wait(int numSemaphores, const <a href='undocumented#GrBackendSemaphore'>GrBackendSemaphore</a>* waitSemaphores)
+</pre>
+
+Inserts a list of GPU semaphores that the current GPU-backed API must wait on before
+executing any more commands on the GPU for this <a href='SkSurface_Reference#Surface'>surface</a>. Skia will take ownership of the
+underlying semaphores and delete them once they have been signaled and waited on.
+If this call returns false, then the GPU back-end will not wait on any passed in semaphores,
+and the client will still own the semaphores.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_wait_numSemaphores'><code><strong>numSemaphores</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of <a href='#SkSurface_wait_waitSemaphores'>waitSemaphores</a> array</td>
+  </tr>
+  <tr>    <td><a name='SkSurface_wait_waitSemaphores'><code><strong>waitSemaphores</strong></code></a></td>
+    <td>array of semaphore containers</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if GPU is waiting on semaphores
+
+### See Also
+
+<a href='#SkSurface_flushAndSignalSemaphores'>flushAndSignalSemaphores</a> <a href='undocumented#GrBackendSemaphore'>GrBackendSemaphore</a>
+
+<a name='SkSurface_characterize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkSurface_characterize'>characterize</a>(<a href='undocumented#SkSurfaceCharacterization'>SkSurfaceCharacterization</a>* characterization)const
+</pre>
+
+Initializes <a href='undocumented#SkSurfaceCharacterization'>SkSurfaceCharacterization</a> that can be used to perform GPU back-end
+processing in a separate thread. Typically this is used to divide drawing
+into multiple tiles. <a href='undocumented#SkDeferredDisplayListRecorder'>SkDeferredDisplayListRecorder</a> records the drawing commands
+for each tile.
+
+Return true if <a href='SkSurface_Reference#SkSurface'>SkSurface</a> supports <a href='#SkSurface_characterize_characterization'>characterization</a>.  <a href='undocumented#Raster_Surface'>raster surface</a> returns false.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_characterize_characterization'><code><strong>characterization</strong></code></a></td>
+    <td>properties for parallel drawing</td>
+  </tr>
+</table>
+
+### Return Value
+
+true if supported
+
+### Example
+
+<div><fiddle-embed name="6de6f3ef699a72ff26da1b26b23a3316" gpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_draw'>draw()</a> <a href='undocumented#SkSurfaceCharacterization'>SkSurfaceCharacterization</a> <a href='undocumented#SkDeferredDisplayList'>SkDeferredDisplayList</a>
+
+<a name='SkSurface_draw_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool draw(<a href='undocumented#SkDeferredDisplayList'>SkDeferredDisplayList</a>* deferredDisplayList)
+</pre>
+
+Draws   deferred display list created using <a href='undocumented#SkDeferredDisplayListRecorder'>SkDeferredDisplayListRecorder</a>.
+Has no effect and returns false if <a href='undocumented#SkSurfaceCharacterization'>SkSurfaceCharacterization</a> stored in
+<a href='#SkSurface_draw_2_deferredDisplayList'>deferredDisplayList</a> is not compatible with <a href='SkSurface_Reference#SkSurface'>SkSurface</a>.
+
+<a href='undocumented#Raster_Surface'>raster surface</a> returns false.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkSurface_draw_2_deferredDisplayList'><code><strong>deferredDisplayList</strong></code></a></td>
+    <td>drawing commands</td>
+  </tr>
+</table>
+
+### Return Value
+
+false if <a href='#SkSurface_draw_2_deferredDisplayList'>deferredDisplayList</a> is not compatible
+
+### Example
+
+<div><fiddle-embed name="46d9bacf593deaaeabd74ff42f2571a0" gpu="true" cpu="true"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkSurface_characterize'>characterize()</a> <a href='undocumented#SkSurfaceCharacterization'>SkSurfaceCharacterization</a> <a href='undocumented#SkDeferredDisplayList'>SkDeferredDisplayList</a>
+
diff --git a/src/third_party/skia/site/user/api/SkTextBlobBuilder_Reference.md b/src/third_party/skia/site/user/api/SkTextBlobBuilder_Reference.md
new file mode 100644
index 0000000..5f8600b
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkTextBlobBuilder_Reference.md
@@ -0,0 +1,323 @@
+SkTextBlobBuilder Reference
+===
+
+
+<a name='SkTextBlobBuilder'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkTextBlobBuilder_Reference#SkTextBlobBuilder'>SkTextBlobBuilder</a> {
+
+    <a href='#SkTextBlobBuilder_empty_constructor'>SkTextBlobBuilder()</a>;
+    <a href='#SkTextBlobBuilder_destructor'>~SkTextBlobBuilder()</a>;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>> <a href='#SkTextBlobBuilder_make'>make()</a>;
+    const <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>& <a href='#SkTextBlobBuilder_allocRun'>allocRun</a>(const <a href='SkFont_Reference#SkFont'>SkFont</a>& <a href='SkFont_Reference#Font'>font</a>, int count, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y,
+                              const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds = nullptr);
+    const <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>& <a href='#SkTextBlobBuilder_allocRunPosH'>allocRunPosH</a>(const <a href='SkFont_Reference#SkFont'>SkFont</a>& <a href='SkFont_Reference#Font'>font</a>, int count, <a href='undocumented#SkScalar'>SkScalar</a> y,
+                                  const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds = nullptr);
+    const <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>& <a href='#SkTextBlobBuilder_allocRunPos'>allocRunPos</a>(const <a href='SkFont_Reference#SkFont'>SkFont</a>& <a href='SkFont_Reference#Font'>font</a>, int count,
+                                 const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds = nullptr);
+};
+
+</pre>
+
+Helper class for constructing <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>.
+
+<a name='SkTextBlobBuilder_RunBuffer'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+    struct <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a> {
+        <a href='undocumented#SkGlyphID'>SkGlyphID</a>* <a href='#SkTextBlobBuilder_RunBuffer_glyphs'>glyphs</a>;
+        <a href='undocumented#SkScalar'>SkScalar</a>* <a href='#SkTextBlobBuilder_RunBuffer_pos'>pos</a>;
+        char* <a href='#SkTextBlobBuilder_RunBuffer_utf8text'>utf8text</a>;
+        uint32_t* <a href='#SkTextBlobBuilder_RunBuffer_clusters'>clusters</a>;
+    };
+</pre>
+
+<a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a> supplies storage for <a href='undocumented#Glyph'>Glyphs</a> and positions within a run.
+
+A run is a sequence of <a href='undocumented#Glyph'>Glyphs</a> sharing <a href='#Font_Metrics'>Font_Metrics</a> and positioning.
+Each run may position its <a href='undocumented#Glyph'>Glyphs</a> in one of three ways:
+by specifying where the first <a href='undocumented#Glyph'>Glyph</a> is drawn, and allowing <a href='#Font_Metrics'>Font_Metrics</a> to
+determine the advance to subsequent <a href='undocumented#Glyph'>Glyphs</a>; by specifying a baseline, and
+the position on that baseline for each <a href='undocumented#Glyph'>Glyph</a> in run; or by providing <a href='SkPoint_Reference#Point'>Point</a>
+array, one per <a href='undocumented#Glyph'>Glyph</a>.<table style='border-collapse: collapse; width: 62.5em'>
+
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Type</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Member</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkGlyphID*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkTextBlobBuilder_RunBuffer_glyphs'><code>glyphs</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#SkTextBlobBuilder_RunBuffer_glyphs'>glyphs</a> <a href='SkPoint_Reference#Point'>points</a> to memory for one or more <a href='undocumented#Glyph'>Glyphs</a>. <a href='#SkTextBlobBuilder_RunBuffer_glyphs'>glyphs</a> memory must be
+written to by the caller.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkTextBlobBuilder_RunBuffer_pos'><code>pos</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+<a href='#SkTextBlobBuilder_RunBuffer_pos'>pos</a> <a href='SkPoint_Reference#Point'>points</a> to memory for <a href='undocumented#Glyph'>Glyph</a> positions. Depending on how <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>
+is allocated, <a href='#SkTextBlobBuilder_RunBuffer_pos'>pos</a> may <a href='SkPoint_Reference#Point'>point</a> to zero bytes per <a href='undocumented#Glyph'>Glyph</a>, one <a href='undocumented#Scalar'>Scalar</a> per <a href='undocumented#Glyph'>Glyph</a>,
+or one <a href='SkPoint_Reference#Point'>Point</a> per <a href='undocumented#Glyph'>Glyph</a>.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>char*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkTextBlobBuilder_RunBuffer_utf8text'><code>utf8text</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Reserved for future use. <a href='#SkTextBlobBuilder_RunBuffer_utf8text'>utf8text</a> should not be read or written.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>uint32_t*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkTextBlobBuilder_RunBuffer_clusters'><code>clusters</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Reserved for future use. <a href='#SkTextBlobBuilder_RunBuffer_clusters'>clusters</a> should not be read or written.
+</td>
+  </tr>
+</table>
+
+### See Also
+
+<a href='#SkTextBlobBuilder_allocRun'>allocRun</a> <a href='#SkTextBlobBuilder_allocRunPos'>allocRunPos</a> <a href='#SkTextBlobBuilder_allocRunPosH'>allocRunPosH</a>
+
+<a name='SkTextBlobBuilder_empty_constructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkTextBlobBuilder_empty_constructor'>SkTextBlobBuilder()</a>
+</pre>
+
+Constructs empty <a href='SkTextBlobBuilder_Reference#SkTextBlobBuilder'>SkTextBlobBuilder</a>. By default, <a href='SkTextBlobBuilder_Reference#SkTextBlobBuilder'>SkTextBlobBuilder</a> has no runs.
+
+### Return Value
+
+empty <a href='SkTextBlobBuilder_Reference#SkTextBlobBuilder'>SkTextBlobBuilder</a>
+
+### Example
+
+<div><fiddle-embed name="@TextBlobBuilder_empty_constructor">
+
+#### Example Output
+
+~~~~
+blob equals nullptr
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='#SkTextBlobBuilder_make'>make</a> <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>::<a href='#SkTextBlob_MakeFromText'>MakeFromText</a>
+
+<a name='SkTextBlobBuilder_destructor'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkTextBlobBuilder_destructor'>~SkTextBlobBuilder()</a>
+</pre>
+
+Deletes <a href='undocumented#Data'>data</a> allocated internally by <a href='SkTextBlobBuilder_Reference#SkTextBlobBuilder'>SkTextBlobBuilder</a>.
+
+### See Also
+
+<a href='#SkTextBlobBuilder_empty_constructor'>SkTextBlobBuilder()</a>
+
+<a name='SkTextBlobBuilder_make'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>&gt; <a href='#SkTextBlobBuilder_make'>make()</a>
+</pre>
+
+Returns <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a> built from runs of <a href='undocumented#Glyph'>glyphs</a> added by builder. Returned
+<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a> is immutable; it may be copied, but its contents may not be altered.
+Returns nullptr if no runs of <a href='undocumented#Glyph'>glyphs</a> were added by builder.
+
+Resets <a href='SkTextBlobBuilder_Reference#SkTextBlobBuilder'>SkTextBlobBuilder</a> to its initial empty state, allowing it to be
+reused to build a new set of runs.
+
+### Return Value
+
+<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a> or nullptr
+
+### Example
+
+<div><fiddle-embed name="34c37c0212cc0aef670d96945d08fe24">
+
+#### Example Output
+
+~~~~
+blob equals nullptr
+blob does not equal nullptr
+blob equals nullptr
+~~~~
+
+</fiddle-embed></div>
+
+### See Also
+
+<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>::<a href='#SkTextBlob_MakeFromText'>MakeFromText</a>
+
+<a name='SkTextBlobBuilder_allocRun'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>& <a href='#SkTextBlobBuilder_allocRun'>allocRun</a>(const <a href='SkFont_Reference#SkFont'>SkFont</a>& <a href='SkFont_Reference#Font'>font</a>, int count, <a href='undocumented#SkScalar'>SkScalar</a> x, <a href='undocumented#SkScalar'>SkScalar</a> y,
+                          const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds = nullptr)
+</pre>
+
+Returns run with storage for <a href='undocumented#Glyph'>glyphs</a>. Caller must write <a href='#SkTextBlobBuilder_allocRun_count'>count</a> <a href='undocumented#Glyph'>glyphs</a> to
+<a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_glyphs'>glyphs</a> before next call to <a href='SkTextBlobBuilder_Reference#SkTextBlobBuilder'>SkTextBlobBuilder</a>.
+
+<a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_utf8text'>utf8text</a>, and <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_clusters'>clusters</a> should be ignored.
+
+<a href='undocumented#Glyph'>Glyphs</a> share metrics in <a href='#SkTextBlobBuilder_allocRun_font'>font</a>.
+
+<a href='undocumented#Glyph'>Glyphs</a> are positioned on a baseline at (<a href='#SkTextBlobBuilder_allocRun_x'>x</a>, <a href='#SkTextBlobBuilder_allocRun_y'>y</a>), using  <a href='undocumented#Font_Metrics'>font metrics</a> to
+determine their relative placement.
+
+<a href='#SkTextBlobBuilder_allocRun_bounds'>bounds</a> defines an optional bounding box, used to suppress drawing when <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>
+<a href='#SkTextBlobBuilder_allocRun_bounds'>bounds</a> does not intersect <a href='SkSurface_Reference#SkSurface'>SkSurface</a> <a href='#SkTextBlobBuilder_allocRun_bounds'>bounds</a>. If <a href='#SkTextBlobBuilder_allocRun_bounds'>bounds</a> is nullptr, <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a> <a href='#SkTextBlobBuilder_allocRun_bounds'>bounds</a>
+is computed from (<a href='#SkTextBlobBuilder_allocRun_x'>x</a>, <a href='#SkTextBlobBuilder_allocRun_y'>y</a>) and <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_glyphs'>glyphs</a> metrics.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkTextBlobBuilder_allocRun_font'><code><strong>font</strong></code></a></td>
+    <td><a href='SkFont_Reference#SkFont'>SkFont</a> used for this run</td>
+  </tr>
+  <tr>    <td><a name='SkTextBlobBuilder_allocRun_count'><code><strong>count</strong></code></a></td>
+    <td>number of <a href='undocumented#Glyph'>glyphs</a></td>
+  </tr>
+  <tr>    <td><a name='SkTextBlobBuilder_allocRun_x'><code><strong>x</strong></code></a></td>
+    <td>horizontal offset within the blob</td>
+  </tr>
+  <tr>    <td><a name='SkTextBlobBuilder_allocRun_y'><code><strong>y</strong></code></a></td>
+    <td>vertical offset within the blob</td>
+  </tr>
+  <tr>    <td><a name='SkTextBlobBuilder_allocRun_bounds'><code><strong>bounds</strong></code></a></td>
+    <td>optional run bounding box</td>
+  </tr>
+</table>
+
+### Return Value
+
+writable <a href='undocumented#Glyph'>glyph</a> buffer
+
+### Example
+
+<div><fiddle-embed name="f0e584aec20eaee7a5bfed62aa885eee"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkTextBlobBuilder_allocRunPosH'>allocRunPosH</a> <a href='#SkTextBlobBuilder_allocRunPos'>allocRunPos</a>
+
+<a name='SkTextBlobBuilder_allocRunPosH'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>& <a href='#SkTextBlobBuilder_allocRunPosH'>allocRunPosH</a>(const <a href='SkFont_Reference#SkFont'>SkFont</a>& <a href='SkFont_Reference#Font'>font</a>, int count, <a href='undocumented#SkScalar'>SkScalar</a> y,
+                              const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds = nullptr)
+</pre>
+
+Returns run with storage for <a href='undocumented#Glyph'>glyphs</a> and positions along baseline. Caller must
+write <a href='#SkTextBlobBuilder_allocRunPosH_count'>count</a> <a href='undocumented#Glyph'>glyphs</a> to <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_glyphs'>glyphs</a>, and <a href='#SkTextBlobBuilder_allocRunPosH_count'>count</a> <a href='undocumented#Scalar'>scalars</a> to <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_pos'>pos</a>;
+before next call to <a href='SkTextBlobBuilder_Reference#SkTextBlobBuilder'>SkTextBlobBuilder</a>.
+
+<a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_utf8text'>utf8text</a>, and <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_clusters'>clusters</a> should be ignored.
+
+<a href='undocumented#Glyph'>Glyphs</a> share metrics in <a href='#SkTextBlobBuilder_allocRunPosH_font'>font</a>.
+
+<a href='undocumented#Glyph'>Glyphs</a> are positioned on a baseline at <a href='#SkTextBlobBuilder_allocRunPosH_y'>y</a>, using x-axis positions written by
+caller to <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_pos'>pos</a>.
+
+<a href='#SkTextBlobBuilder_allocRunPosH_bounds'>bounds</a> defines an optional bounding box, used to suppress drawing when <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>
+<a href='#SkTextBlobBuilder_allocRunPosH_bounds'>bounds</a> does not intersect <a href='SkSurface_Reference#SkSurface'>SkSurface</a> <a href='#SkTextBlobBuilder_allocRunPosH_bounds'>bounds</a>. If <a href='#SkTextBlobBuilder_allocRunPosH_bounds'>bounds</a> is nullptr, <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a> <a href='#SkTextBlobBuilder_allocRunPosH_bounds'>bounds</a>
+is computed from <a href='#SkTextBlobBuilder_allocRunPosH_y'>y</a>, <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_pos'>pos</a>, and <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_glyphs'>glyphs</a> metrics.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkTextBlobBuilder_allocRunPosH_font'><code><strong>font</strong></code></a></td>
+    <td><a href='SkFont_Reference#SkFont'>SkFont</a> used for this run</td>
+  </tr>
+  <tr>    <td><a name='SkTextBlobBuilder_allocRunPosH_count'><code><strong>count</strong></code></a></td>
+    <td>number of <a href='undocumented#Glyph'>glyphs</a></td>
+  </tr>
+  <tr>    <td><a name='SkTextBlobBuilder_allocRunPosH_y'><code><strong>y</strong></code></a></td>
+    <td>vertical offset within the blob</td>
+  </tr>
+  <tr>    <td><a name='SkTextBlobBuilder_allocRunPosH_bounds'><code><strong>bounds</strong></code></a></td>
+    <td>optional run bounding box</td>
+  </tr>
+</table>
+
+### Return Value
+
+writable <a href='undocumented#Glyph'>glyph</a> buffer and x-axis position buffer
+
+### Example
+
+<div><fiddle-embed name="c77ac50f506106fdfef94d20bc1a6934"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkTextBlobBuilder_allocRunPos'>allocRunPos</a> <a href='#SkTextBlobBuilder_allocRun'>allocRun</a>
+
+<a name='SkTextBlobBuilder_allocRunPos'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>& <a href='#SkTextBlobBuilder_allocRunPos'>allocRunPos</a>(const <a href='SkFont_Reference#SkFont'>SkFont</a>& <a href='SkFont_Reference#Font'>font</a>, int count, const <a href='SkRect_Reference#SkRect'>SkRect</a>* bounds = nullptr)
+</pre>
+
+Returns run with storage for <a href='undocumented#Glyph'>glyphs</a> and <a href='SkPoint_Reference#SkPoint'>SkPoint</a> positions. Caller must
+write <a href='#SkTextBlobBuilder_allocRunPos_count'>count</a> <a href='undocumented#Glyph'>glyphs</a> to <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_glyphs'>glyphs</a>, and <a href='#SkTextBlobBuilder_allocRunPos_count'>count</a> <a href='SkPoint_Reference#SkPoint'>SkPoint</a> to <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_pos'>pos</a>;
+before next call to <a href='SkTextBlobBuilder_Reference#SkTextBlobBuilder'>SkTextBlobBuilder</a>.
+
+<a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_utf8text'>utf8text</a>, and <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_clusters'>clusters</a> should be ignored.
+
+<a href='undocumented#Glyph'>Glyphs</a> share metrics in <a href='#SkTextBlobBuilder_allocRunPos_font'>font</a>.
+
+<a href='undocumented#Glyph'>Glyphs</a> are positioned using <a href='SkPoint_Reference#SkPoint'>SkPoint</a> written by caller to <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_pos'>pos</a>, using
+two <a href='undocumented#Scalar'>scalar</a> values for each <a href='SkPoint_Reference#SkPoint'>SkPoint</a>.
+
+<a href='#SkTextBlobBuilder_allocRunPos_bounds'>bounds</a> defines an optional bounding box, used to suppress drawing when <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>
+<a href='#SkTextBlobBuilder_allocRunPos_bounds'>bounds</a> does not intersect <a href='SkSurface_Reference#SkSurface'>SkSurface</a> <a href='#SkTextBlobBuilder_allocRunPos_bounds'>bounds</a>. If <a href='#SkTextBlobBuilder_allocRunPos_bounds'>bounds</a> is nullptr, <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a> <a href='#SkTextBlobBuilder_allocRunPos_bounds'>bounds</a>
+is computed from <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_pos'>pos</a>, and <a href='#SkTextBlobBuilder_RunBuffer'>RunBuffer</a>::<a href='#SkTextBlobBuilder_RunBuffer_glyphs'>glyphs</a> metrics.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkTextBlobBuilder_allocRunPos_font'><code><strong>font</strong></code></a></td>
+    <td><a href='SkFont_Reference#SkFont'>SkFont</a> used for this run</td>
+  </tr>
+  <tr>    <td><a name='SkTextBlobBuilder_allocRunPos_count'><code><strong>count</strong></code></a></td>
+    <td>number of <a href='undocumented#Glyph'>glyphs</a></td>
+  </tr>
+  <tr>    <td><a name='SkTextBlobBuilder_allocRunPos_bounds'><code><strong>bounds</strong></code></a></td>
+    <td>optional run bounding box</td>
+  </tr>
+</table>
+
+### Return Value
+
+writable <a href='undocumented#Glyph'>glyph</a> buffer and <a href='SkPoint_Reference#SkPoint'>SkPoint</a> buffer
+
+### Example
+
+<div><fiddle-embed name="da4fcb4a972b500996be9aff6c6c40e1"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkTextBlobBuilder_allocRunPosH'>allocRunPosH</a> <a href='#SkTextBlobBuilder_allocRun'>allocRun</a>
+
diff --git a/src/third_party/skia/site/user/api/SkTextBlob_Reference.md b/src/third_party/skia/site/user/api/SkTextBlob_Reference.md
new file mode 100644
index 0000000..15a1502
--- /dev/null
+++ b/src/third_party/skia/site/user/api/SkTextBlob_Reference.md
@@ -0,0 +1,336 @@
+SkTextBlob Reference
+===
+
+
+<a name='SkTextBlob'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
+class <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a> final : public <a href='undocumented#SkNVRefCnt'>SkNVRefCnt</a><<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>> {
+
+    const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='#SkTextBlob_bounds'>bounds()</a> const;
+    uint32_t <a href='#SkTextBlob_uniqueID'>uniqueID</a>() const;
+    int <a href='#SkTextBlob_getIntercepts'>getIntercepts</a>(const <a href='undocumented#SkScalar'>SkScalar</a> bounds[2], <a href='undocumented#SkScalar'>SkScalar</a> intervals[],
+                      const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr) const;
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>> <a href='#SkTextBlob_MakeFromText'>MakeFromText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, const <a href='SkFont_Reference#SkFont'>SkFont</a>& <a href='SkFont_Reference#Font'>font</a>,
+                                      <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding = <a href='undocumented#SkTextEncoding::kUTF8'>SkTextEncoding::kUTF8</a>);
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>> <a href='#SkTextBlob_MakeFromString'>MakeFromString</a>(const char* <a href='undocumented#String'>string</a>, const <a href='SkFont_Reference#SkFont'>SkFont</a>& <a href='SkFont_Reference#Font'>font</a>,
+                                    <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding = <a href='undocumented#SkTextEncoding::kUTF8'>SkTextEncoding::kUTF8</a>);
+    size_t <a href='#SkTextBlob_serialize'>serialize</a>(const <a href='undocumented#SkSerialProcs'>SkSerialProcs</a>& procs, void* memory, size_t memory_size) const;
+    <a href='undocumented#sk_sp'>sk_sp</a><<a href='undocumented#SkData'>SkData</a>> <a href='#SkTextBlob_serialize'>serialize</a>(const <a href='undocumented#SkSerialProcs'>SkSerialProcs</a>& procs) const;
+    static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>> <a href='#SkTextBlob_Deserialize'>Deserialize</a>(const void* <a href='undocumented#Data'>data</a>, size_t <a href='undocumented#Size'>size</a>,
+                                         const <a href='undocumented#SkDeserialProcs'>SkDeserialProcs</a>& procs);
+};
+
+</pre>
+
+<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a> combines multiple <a href='undocumented#Text'>text</a> runs into an immutable container. Each <a href='undocumented#Text'>text</a>
+run consists of <a href='undocumented#Glyph'>Glyphs</a>, <a href='SkPaint_Reference#Paint'>Paint</a>, and position. Only parts of <a href='SkPaint_Reference#Paint'>Paint</a> related to
+fonts and <a href='undocumented#Text'>text</a> rendering are used by run.
+
+<a name='SkTextBlob_bounds'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+const <a href='SkRect_Reference#SkRect'>SkRect</a>& <a href='#SkTextBlob_bounds'>bounds()</a>const
+</pre>
+
+Returns conservative bounding box. Uses <a href='SkPaint_Reference#SkPaint'>SkPaint</a> associated with each <a href='undocumented#Glyph'>glyph</a> to
+determine <a href='undocumented#Glyph'>glyph</a> bounds, and unions all bounds. Returned bounds may be
+larger than the bounds of all <a href='undocumented#Glyph'>glyphs</a> in runs.
+
+### Return Value
+
+conservative bounding box
+
+### Example
+
+<div><fiddle-embed name="fb8b2502bbe52d2029aecdf569dd9fdb"></fiddle-embed></div>
+
+### See Also
+
+<a href='SkPath_Reference#SkPath'>SkPath</a>::<a href='#SkPath_getBounds'>getBounds</a>
+
+<a name='SkTextBlob_uniqueID'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+uint32_t <a href='#SkTextBlob_uniqueID'>uniqueID</a>()const
+</pre>
+
+Returns a non-zero value unique among all <a href='undocumented#Text'>text</a> blobs.
+
+### Return Value
+
+identifier for <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>
+
+### Example
+
+<div><fiddle-embed name="6e12cceca981ddabc0fc18c380543f34"></fiddle-embed></div>
+
+### See Also
+
+<a href='undocumented#SkRefCnt'>SkRefCnt</a>
+
+<a name='Text_Intercepts'></a>
+
+<a href='#Text_Blob_Text_Intercepts'>Text_Intercepts</a> describe the intersection of drawn <a href='undocumented#Text'>text</a> <a href='undocumented#Glyph'>Glyphs</a> with a pair
+of <a href='undocumented#Line'>lines</a> parallel to the <a href='undocumented#Text'>text</a> advance. <a href='#Text_Blob_Text_Intercepts'>Text_Intercepts</a> permits creating a
+underline that skips Descenders.
+
+<a name='SkTextBlob_getIntercepts'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkTextBlob_getIntercepts'>getIntercepts</a>(const <a href='undocumented#SkScalar'>SkScalar</a> bounds[2], <a href='undocumented#SkScalar'>SkScalar</a> intervals[], const <a href='SkPaint_Reference#SkPaint'>SkPaint</a>* <a href='SkPaint_Reference#Paint'>paint</a> = nullptr) const;
+</pre>
+
+Returns the number of <a href='#SkTextBlob_getIntercepts_intervals'>intervals</a> that intersect <a href='#SkTextBlob_getIntercepts_bounds'>bounds</a>.
+<a href='#SkTextBlob_getIntercepts_bounds'>bounds</a> describes a pair of <a href='undocumented#Line'>lines</a> parallel to the <a href='undocumented#Text'>text</a> advance.
+The return count is zero or a multiple of two, and is at most twice the number of <a href='undocumented#Glyph'>glyphs</a> in
+the the blob.
+
+Pass nullptr for <a href='#SkTextBlob_getIntercepts_intervals'>intervals</a> to determine the <a href='undocumented#Size'>size</a> of the interval array.
+
+Runs within the blob that contain <a href='undocumented#SkRSXform'>SkRSXform</a> are ignored when computing intercepts.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkTextBlob_getIntercepts_bounds'><code><strong>bounds</strong></code></a></td>
+    <td>lower and upper <a href='undocumented#Line'>line</a> parallel to the advance</td>
+  </tr>
+  <tr>    <td><a name='SkTextBlob_getIntercepts_intervals'><code><strong>intervals</strong></code></a></td>
+    <td>returned intersections; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkTextBlob_getIntercepts_paint'><code><strong>paint</strong></code></a></td>
+    <td>specifies stroking, <a href='undocumented#SkPathEffect'>SkPathEffect</a> that affects the result; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+number of intersections; may be zero
+
+### Example
+
+<div><fiddle-embed name="e9d4eb8ece521b1329e7433d4b243fdf"></fiddle-embed></div>
+
+<a name='SkTextBlob_MakeFromText'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>&gt; <a href='#SkTextBlob_MakeFromText'>MakeFromText</a>(const void* <a href='undocumented#Text'>text</a>, size_t byteLength, const <a href='SkFont_Reference#SkFont'>SkFont</a>& <a href='SkFont_Reference#Font'>font</a>,
+                                      <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding = <a href='undocumented#SkTextEncoding::kUTF8'>SkTextEncoding::kUTF8</a>)
+</pre>
+
+Creates <a href='#Text_Blob'>Text_Blob</a> with a single run. <a href='#SkTextBlob_MakeFromText_text'>text</a> meaning depends on <a href='#Text_Encoding'>Text_Encoding</a>;
+by default, <a href='#SkTextBlob_MakeFromText_text'>text</a> is encoded as UTF-8.
+
+<a href='#SkTextBlob_MakeFromText_font'>font</a> contains attributes used to define the run <a href='#SkTextBlob_MakeFromText_text'>text</a>: <a href='undocumented#Typeface'>Typeface</a>, <a href='#Font_Size'>Font_Size</a>, <a href='#Font_Scale_X'>Font_Scale_X</a>,
+<a href='#Font_Skew_X'>Font_Skew_X</a>, <a href='#Font_Hinting'>Font_Hinting</a>, <a href='#Paint_Anti_Alias'>Paint_Anti_Alias</a>, <a href='#Font_Embolden'>Font_Embolden</a>, <a href='#Font_Force_Hinting'>Font_Force_Hinting</a>,
+<a href='#Font_Embedded_Bitmaps'>Font_Embedded_Bitmaps</a>, <a href='#Font_Hinting_Spacing'>Font_Hinting_Spacing</a>, <a href='#Font_Anti_Alias'>Font_Anti_Alias</a>, <a href='#Font_Linear'>Font_Linear</a>,
+and <a href='#Font_Subpixel'>Font_Subpixel</a>
+.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkTextBlob_MakeFromText_text'><code><strong>text</strong></code></a></td>
+    <td>character code <a href='SkPoint_Reference#Point'>points</a> or <a href='undocumented#Glyph'>Glyphs</a> drawn</td>
+  </tr>
+  <tr>    <td><a name='SkTextBlob_MakeFromText_byteLength'><code><strong>byteLength</strong></code></a></td>
+    <td>byte length of <a href='#SkTextBlob_MakeFromText_text'>text</a> array</td>
+  </tr>
+  <tr>    <td><a name='SkTextBlob_MakeFromText_font'><code><strong>font</strong></code></a></td>
+    <td><a href='#SkTextBlob_MakeFromText_text'>text</a> <a href='undocumented#Size'>size</a>, <a href='undocumented#Typeface'>typeface</a>,  <a href='#SkTextBlob_MakeFromText_text'>text scale</a>, and so on, used to draw</td>
+  </tr>
+  <tr>    <td><a name='SkTextBlob_MakeFromText_encoding'><code><strong>encoding</strong></code></a></td>
+    <td>one of: <a href='undocumented#SkTextEncoding::kUTF8'>SkTextEncoding::kUTF8</a>, <a href='undocumented#SkTextEncoding::kUTF16'>SkTextEncoding::kUTF16</a>,
+<a href='undocumented#SkTextEncoding::kUTF32'>SkTextEncoding::kUTF32</a>, <a href='undocumented#SkTextEncoding::kGlyphID'>SkTextEncoding::kGlyphID</a>
+</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='#Text_Blob'>Text_Blob</a> constructed from one run
+
+### Example
+
+<div><fiddle-embed name="bec2252bc36dc8fd023015629d60c405"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkTextBlob_MakeFromString'>MakeFromString</a> <a href='SkTextBlobBuilder_Reference#SkTextBlobBuilder'>SkTextBlobBuilder</a>
+
+<a name='SkTextBlob_MakeFromString'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>&gt; <a href='#SkTextBlob_MakeFromString'>MakeFromString</a>(const char* <a href='undocumented#String'>string</a>, const <a href='SkFont_Reference#SkFont'>SkFont</a>& <a href='SkFont_Reference#Font'>font</a>,
+                                        <a href='undocumented#SkTextEncoding'>SkTextEncoding</a> encoding = <a href='undocumented#SkTextEncoding::kUTF8'>SkTextEncoding::kUTF8</a>)
+</pre>
+
+Creates <a href='#Text_Blob'>Text_Blob</a> with a single run. <a href='#SkTextBlob_MakeFromString_string'>string</a> meaning depends on <a href='#Text_Encoding'>Text_Encoding</a>;
+by default, <a href='#SkTextBlob_MakeFromString_string'>string</a> is encoded as UTF-8.
+
+<a href='#SkTextBlob_MakeFromString_font'>font</a> contains <a href='#Font_Metrics'>Font_Metrics</a> used to define the run <a href='undocumented#Text'>text</a>: <a href='undocumented#Typeface'>Typeface</a>, <a href='#Font_Size'>Font_Size</a>, <a href='#Font_Scale_X'>Font_Scale_X</a>,
+<a href='#Font_Skew_X'>Font_Skew_X</a>, <a href='#Font_Hinting'>Font_Hinting</a>, <a href='#Paint_Anti_Alias'>Paint_Anti_Alias</a>, <a href='#Font_Embolden'>Font_Embolden</a>, <a href='#Font_Force_Hinting'>Font_Force_Hinting</a>,
+<a href='#Font_Embedded_Bitmaps'>Font_Embedded_Bitmaps</a>, <a href='#Font_Hinting_Spacing'>Font_Hinting_Spacing</a>, <a href='#Font_Anti_Alias'>Font_Anti_Alias</a>, <a href='#Font_Linear'>Font_Linear</a>,
+and <a href='#Font_Subpixel'>Font_Subpixel</a>
+.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkTextBlob_MakeFromString_string'><code><strong>string</strong></code></a></td>
+    <td>character code <a href='SkPoint_Reference#Point'>points</a> or <a href='undocumented#Glyph'>Glyphs</a> drawn</td>
+  </tr>
+  <tr>    <td><a name='SkTextBlob_MakeFromString_font'><code><strong>font</strong></code></a></td>
+    <td><a href='undocumented#Text'>text</a> <a href='undocumented#Size'>size</a>, <a href='undocumented#Typeface'>typeface</a>,  <a href='undocumented#Text'>text scale</a>, and so on, used to draw</td>
+  </tr>
+  <tr>    <td><a name='SkTextBlob_MakeFromString_encoding'><code><strong>encoding</strong></code></a></td>
+    <td>one of: <a href='undocumented#SkTextEncoding::kUTF8'>SkTextEncoding::kUTF8</a>, <a href='undocumented#SkTextEncoding::kUTF16'>SkTextEncoding::kUTF16</a>,
+<a href='undocumented#SkTextEncoding::kUTF32'>SkTextEncoding::kUTF32</a>, <a href='undocumented#SkTextEncoding::kGlyphID'>SkTextEncoding::kGlyphID</a>
+</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='#Text_Blob'>Text_Blob</a> constructed from one run
+
+### Example
+
+<div><fiddle-embed name="a5af182e793eed3f2bb3b0efc2cf4852"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkTextBlob_MakeFromText'>MakeFromText</a> <a href='SkTextBlobBuilder_Reference#SkTextBlobBuilder'>SkTextBlobBuilder</a>
+
+<a name='SkTextBlob_serialize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+size_t <a href='#SkTextBlob_serialize'>serialize</a>(const <a href='undocumented#SkSerialProcs'>SkSerialProcs</a>& procs, void* memory, size_t memory_size)const
+</pre>
+
+Writes <a href='undocumented#Data'>data</a> to allow later reconstruction of <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>. <a href='#SkTextBlob_serialize_memory'>memory</a> <a href='SkPoint_Reference#Point'>points</a> to storage
+to receive the encoded <a href='undocumented#Data'>data</a>, and <a href='#SkTextBlob_serialize_memory_size'>memory_size</a> describes the <a href='undocumented#Size'>size</a> of storage.
+Returns bytes used if provided storage is large enough to hold all <a href='undocumented#Data'>data</a>;
+otherwise, returns zero.
+
+<a href='#SkTextBlob_serialize_procs'>procs</a>.<a href='#SkSerialProcs_fTypefaceProc'>fTypefaceProc</a> permits supplying a custom function to encode <a href='undocumented#SkTypeface'>SkTypeface</a>.
+If <a href='#SkTextBlob_serialize_procs'>procs</a>.<a href='#SkSerialProcs_fTypefaceProc'>fTypefaceProc</a> is nullptr, default encoding is used. <a href='#SkTextBlob_serialize_procs'>procs</a>.<a href='#SkSerialProcs_fTypefaceCtx'>fTypefaceCtx</a>
+may be used to provide user context to <a href='#SkTextBlob_serialize_procs'>procs</a>.<a href='#SkSerialProcs_fTypefaceProc'>fTypefaceProc</a>; <a href='#SkTextBlob_serialize_procs'>procs</a>.<a href='#SkSerialProcs_fTypefaceProc'>fTypefaceProc</a>
+is called with a pointer to <a href='undocumented#SkTypeface'>SkTypeface</a> and user context.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkTextBlob_serialize_procs'><code><strong>procs</strong></code></a></td>
+    <td>custom serial <a href='undocumented#Data'>data</a> encoders; may be nullptr</td>
+  </tr>
+  <tr>    <td><a name='SkTextBlob_serialize_memory'><code><strong>memory</strong></code></a></td>
+    <td>storage for <a href='undocumented#Data'>data</a></td>
+  </tr>
+  <tr>    <td><a name='SkTextBlob_serialize_memory_size'><code><strong>memory_size</strong></code></a></td>
+    <td><a href='undocumented#Size'>size</a> of storage</td>
+  </tr>
+</table>
+
+### Return Value
+
+bytes written, or zero if required storage is larger than <a href='#SkTextBlob_serialize_memory_size'>memory_size</a>
+
+### Example
+
+<div><fiddle-embed name="90ce8c327d407b1faac73baa2ebd0378"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkTextBlob_Deserialize'>Deserialize</a> <a href='undocumented#SkSerialProcs'>SkSerialProcs</a>
+
+<a name='SkTextBlob_serialize_2'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='undocumented#SkData'>SkData</a>&gt; <a href='#SkTextBlob_serialize'>serialize</a>(const <a href='undocumented#SkSerialProcs'>SkSerialProcs</a>& procs)const
+</pre>
+
+Returns storage containing <a href='undocumented#SkData'>SkData</a> describing <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>, using optional custom
+encoders.
+
+<a href='#SkTextBlob_serialize_2_procs'>procs</a>.<a href='#SkSerialProcs_fTypefaceProc'>fTypefaceProc</a> permits supplying a custom function to encode <a href='undocumented#SkTypeface'>SkTypeface</a>.
+If <a href='#SkTextBlob_serialize_2_procs'>procs</a>.<a href='#SkSerialProcs_fTypefaceProc'>fTypefaceProc</a> is nullptr, default encoding is used. <a href='#SkTextBlob_serialize_2_procs'>procs</a>.<a href='#SkSerialProcs_fTypefaceCtx'>fTypefaceCtx</a>
+may be used to provide user context to <a href='#SkTextBlob_serialize_2_procs'>procs</a>.<a href='#SkSerialProcs_fTypefaceProc'>fTypefaceProc</a>; <a href='#SkTextBlob_serialize_2_procs'>procs</a>.<a href='#SkSerialProcs_fTypefaceProc'>fTypefaceProc</a>
+is called with a pointer to <a href='undocumented#SkTypeface'>SkTypeface</a> and user context.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkTextBlob_serialize_2_procs'><code><strong>procs</strong></code></a></td>
+    <td>custom serial <a href='undocumented#Data'>data</a> encoders; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+storage containing serialized <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>
+
+### Example
+
+<div><fiddle-embed name="@TextBlob_serialize_2"></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkTextBlob_Deserialize'>Deserialize</a> <a href='undocumented#SkData'>SkData</a> <a href='undocumented#SkSerialProcs'>SkSerialProcs</a>
+
+<a name='SkTextBlob_Deserialize'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='undocumented#sk_sp'>sk_sp</a>&lt;<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>&gt; <a href='#SkTextBlob_Deserialize'>Deserialize</a>(const void* <a href='undocumented#Data'>data</a>, size_t <a href='undocumented#Size'>size</a>, const <a href='undocumented#SkDeserialProcs'>SkDeserialProcs</a>& procs)
+</pre>
+
+Recreates <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a> that was serialized into <a href='#SkTextBlob_Deserialize_data'>data</a>. Returns constructed <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>
+if successful; otherwise, returns nullptr. Fails if <a href='#SkTextBlob_Deserialize_size'>size</a> is smaller than
+required <a href='#SkTextBlob_Deserialize_data'>data</a> length, or if <a href='#SkTextBlob_Deserialize_data'>data</a> does not permit constructing valid <a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a>.
+
+<a href='#SkTextBlob_Deserialize_procs'>procs</a>.<a href='#SkDeserialProcs_fTypefaceProc'>fTypefaceProc</a> permits supplying a custom function to decode <a href='undocumented#SkTypeface'>SkTypeface</a>.
+If <a href='#SkTextBlob_Deserialize_procs'>procs</a>.<a href='#SkDeserialProcs_fTypefaceProc'>fTypefaceProc</a> is nullptr, default decoding is used. <a href='#SkTextBlob_Deserialize_procs'>procs</a>.<a href='#SkDeserialProcs_fTypefaceCtx'>fTypefaceCtx</a>
+may be used to provide user context to <a href='#SkTextBlob_Deserialize_procs'>procs</a>.<a href='#SkDeserialProcs_fTypefaceProc'>fTypefaceProc</a>; <a href='#SkTextBlob_Deserialize_procs'>procs</a>.<a href='#SkDeserialProcs_fTypefaceProc'>fTypefaceProc</a>
+is called with a pointer to <a href='undocumented#SkTypeface'>SkTypeface</a> <a href='#SkTextBlob_Deserialize_data'>data</a>, <a href='#SkTextBlob_Deserialize_data'>data</a> byte length, and user context.
+
+### Parameters
+
+<table>  <tr>    <td><a name='SkTextBlob_Deserialize_data'><code><strong>data</strong></code></a></td>
+    <td>pointer for serial <a href='#SkTextBlob_Deserialize_data'>data</a></td>
+  </tr>
+  <tr>    <td><a name='SkTextBlob_Deserialize_size'><code><strong>size</strong></code></a></td>
+    <td><a href='#SkTextBlob_Deserialize_size'>size</a> of <a href='#SkTextBlob_Deserialize_data'>data</a></td>
+  </tr>
+  <tr>    <td><a name='SkTextBlob_Deserialize_procs'><code><strong>procs</strong></code></a></td>
+    <td>custom serial <a href='#SkTextBlob_Deserialize_data'>data</a> decoders; may be nullptr</td>
+  </tr>
+</table>
+
+### Return Value
+
+<a href='SkTextBlob_Reference#SkTextBlob'>SkTextBlob</a> constructed from <a href='#SkTextBlob_Deserialize_data'>data</a> in memory
+
+### Example
+
+<div><fiddle-embed name="68b6d0208eb0b4de67fc152381af7a58"><div><a href='undocumented#Text'>Text</a> "Hacker" replaces "World!", but does not update its metrics.
+When drawn, "Hacker" uses the spacing computed for "World!".
+</div></fiddle-embed></div>
+
+### See Also
+
+<a href='#SkTextBlob_serialize'>serialize</a> <a href='undocumented#SkDeserialProcs'>SkDeserialProcs</a>
+
diff --git a/src/third_party/skia/site/user/api/catalog.htm b/src/third_party/skia/site/user/api/catalog.htm
new file mode 100644
index 0000000..2f001a8
--- /dev/null
+++ b/src/third_party/skia/site/user/api/catalog.htm
@@ -0,0 +1,9736 @@
+<!DOCTYPE html>
+
+<html lang="en" xmlns="https://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8" />
+    <title></title>
+
+<script type="text/javascript">
+    var text = {
+        "Path_Conic_Weight": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* verbNames[] = { \"move\", \"line\", \"quad\", \"conic\", \"cubic\", \"close\", \"done\" };\n    const int pointCount[]  = {     1 ,     2 ,     3 ,      3 ,      4 ,      1 ,     0  };\n    SkPath path;\n    path.conicTo(20, 30, 50, 60, 1);\n    SkPath::Iter iter(path, false);\n    SkPath::Verb verb;\n    do {\n       SkPoint points[4];\n       verb = iter.next(points);\n       SkDebugf(\"%s \", verbNames[(int) verb]);\n       for (int i = 0; i < pointCount[(int) verb]; ++i) {\n            SkDebugf(\"{%g, %g}, \", points[i].fX, points[i].fY);\n       }\n       if (SkPath::kConic_Verb == verb) {\n           SkDebugf(\"weight = %g\", iter.conicWeight());\n       }\n       SkDebugf(\"\\n\");\n    } while (SkPath::kDone_Verb != verb);\n}\n",
+    "hash": "2aadded3d20dfef34d1c8abe28c7bc8d",
+    "file": "SkPath_Reference",
+    "name": "Conic_Weight",
+        "stdout": "move {0, 0}, \\nquad {0, 0}, {20, 30}, {50, 60}, \\ndone \\n"
+    },
+        "Path_Conic_Weight_a": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* verbNames[] = { \"move\", \"line\", \"quad\", \"conic\", \"cubic\", \"close\", \"done\" };\n    const int pointCount[]  = {     1 ,     2 ,     3 ,      3 ,      4 ,      1 ,     0  };\n    SkPath path;\n    path.arcTo(20, 0, 20, 20, 20);\n    SkPath::Iter iter(path, false);\n    SkPath::Verb verb;\n    do {\n       SkPoint points[4];\n       verb = iter.next(points);\n       SkDebugf(\"%s \", verbNames[(int) verb]);\n       for (int i = 0; i < pointCount[(int) verb]; ++i) {\n            SkDebugf(\"{%g, %g}, \", points[i].fX, points[i].fY);\n       }\n       if (SkPath::kConic_Verb == verb) {\n           SkDebugf(\"weight = %g\", iter.conicWeight());\n       }\n       SkDebugf(\"\\n\");\n    } while (SkPath::kDone_Verb != verb);\n}\n",
+    "hash": "e88f554efacfa9f75f270fb1c0add5b4",
+    "file": "SkPath_Reference",
+    "name": "Conic_Weight_2",
+        "stdout": "move {0, 0}, \\nconic {0, 0}, {20, 0}, {20, 20}, weight = 0.707107\\ndone \\n"
+    },
+        "Path_Conic_Weight_b": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* verbNames[] = { \"move\", \"line\", \"quad\", \"conic\", \"cubic\", \"close\", \"done\" };\n    const int pointCount[]  = {     1 ,     2 ,     3 ,      3 ,      4 ,      1 ,     0  };\n    SkPath path;\n    path.conicTo(20, 0, 20, 20, SK_ScalarInfinity);\n    SkPath::Iter iter(path, false);\n    SkPath::Verb verb;\n    do {\n       SkPoint points[4];\n       verb = iter.next(points);\n       SkDebugf(\"%s \", verbNames[(int) verb]);\n       for (int i = 0; i < pointCount[(int) verb]; ++i) {\n            SkDebugf(\"{%g, %g}, \", points[i].fX, points[i].fY);\n       }\n       if (SkPath::kConic_Verb == verb) {\n           SkDebugf(\"weight = %g\", iter.conicWeight());\n       }\n       SkDebugf(\"\\n\");\n    } while (SkPath::kDone_Verb != verb);\n}\n",
+    "hash": "6fb11419e99297fe2fe666c296117fb9",
+    "file": "SkPath_Reference",
+    "name": "Conic_Weight_3",
+        "stdout": "move {0, 0}, \\nline {0, 0}, {20, 0}, \\nline {20, 0}, {20, 20}, \\ndone \\n"
+    },
+        "SkAutoCanvasRestore_restore": {
+    "code": "void draw(SkCanvas* canvas) {\n    for (bool callRestore : { false, true } ) {\n        for (bool saveCanvas : {false, true} ) {\n            SkAutoCanvasRestore autoRestore(canvas, saveCanvas);\n            if (!saveCanvas) {\n                canvas->save();\n            }\n            SkDebugf(\"saveCanvas: %s  before restore: %d\\n\",\n                   saveCanvas ? \"true\" : \"false\", canvas->getSaveCount());\n            if (callRestore) autoRestore.restore();\n            SkDebugf(\"saveCanvas: %s  after restore: %d\\n\",\n                   saveCanvas ? \"true\" : \"false\", canvas->getSaveCount());\n        }\n    }\n    SkDebugf(\"final count: %d\\n\", canvas->getSaveCount());\n}",
+    "hash": "9f459b218ec079c1ada23f4412968f9a",
+    "file": "SkAutoCanvasRestore_Reference",
+    "name": "SkAutoCanvasRestore::restore()",
+        "stdout": "saveCanvas: false  before restore: 2\\nsaveCanvas: false  after restore: 2\\nsaveCanvas: true  before restore: 2\\nsaveCanvas: true  after restore: 2\\nsaveCanvas: false  before restore: 2\\nsaveCanvas: false  after restore: 1\\nsaveCanvas: true  before restore: 2\\nsaveCanvas: true  after restore: 1\\nfinal count: 1\\n"
+    },
+        "SkBitmap_ComputeIsOpaque": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.setInfo(SkImageInfo::Make(2, 2, kN32_SkColorType, kPremul_SkAlphaType));\n    for (int index = 0; index < 2; ++index) {\n        bitmap.allocPixels();\n        bitmap.eraseColor(0x00000000);\n        SkDebugf(\"computeIsOpaque: %s\\n\", SkBitmap::ComputeIsOpaque(bitmap) ? \"true\" : \"false\");\n        bitmap.eraseColor(0xFFFFFFFF);\n        SkDebugf(\"computeIsOpaque: %s\\n\", SkBitmap::ComputeIsOpaque(bitmap) ? \"true\" : \"false\");\n        bitmap.setInfo(bitmap.info().makeAlphaType(kOpaque_SkAlphaType));\n    }\n}",
+    "hash": "9df1baa17658fbd0c419780f26fd854f",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::ComputeIsOpaque",
+        "stdout": "computeIsOpaque: false\\ncomputeIsOpaque: true\\ncomputeIsOpaque: false\\ncomputeIsOpaque: true\\n"
+    },
+        "SkBitmap_HeapAllocator_allocPixelRef": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.setInfo(SkImageInfo::MakeN32(16, 16, kPremul_SkAlphaType));\n    SkDebugf(\"pixel address = %p\\n\", bitmap.getPixels());\n    SkBitmap::HeapAllocator stdalloc;\n    if (!stdalloc.allocPixelRef(&bitmap)) {\n        SkDebugf(\"pixel allocation failed\\n\");\n    } else {\n        SkDebugf(\"pixel address = %p\\n\", bitmap.getPixels());\n    }\n}",
+    "hash": "fe79a9c1ec350264eb9c7b2509dd3638",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::HeapAllocator::allocPixelRef",
+        "stdout": "pixel address = (nil)\\npixel address = 0x560ddd0ac670\\n\\n"
+    },
+        "SkBitmap_alphaType": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* alphas[] = {\"Unknown\", \"Opaque\", \"Premul\", \"Unpremul\"};\n    SkPixmap pixmap(SkImageInfo::MakeA8(16, 32), nullptr, 64);\n    SkDebugf(\"alpha type: k\" \"%s\" \"_SkAlphaType\\n\", alphas[pixmap.alphaType()]);\n}",
+    "hash": "070b1a60232be499eb10c6ea62371804",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::alphaType",
+        "stdout": "alpha type: kPremul_SkAlphaType\\n"
+    },
+        "SkBitmap_bytesPerPixel": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* colors[] = {\"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                            \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\"};\n    SkImageInfo info = SkImageInfo::MakeA8(1, 1);\n    SkBitmap bitmap;\n    for (SkColorType colorType : {\n    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,\n    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,\n    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,\n    kGray_8_SkColorType, kRGBA_F16_SkColorType\n                                 } ) {\n        bitmap.setInfo(info.makeColorType(colorType));\n        SkDebugf(\"color: k\" \"%s\" \"_SkColorType\" \"%*s\" \"bytesPerPixel: %d\\n\",\n                colors[colorType], 13 - strlen(colors[colorType]), \" \",\n                bitmap.bytesPerPixel());\n    }\n}",
+    "hash": "2a688e6f0a516c0d44a826381e9d637f",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::bytesPerPixel",
+        "stdout": "color: kUnknown_SkColorType      bytesPerPixel: 0\\ncolor: kAlpha_8_SkColorType      bytesPerPixel: 1\\ncolor: kRGB_565_SkColorType      bytesPerPixel: 2\\ncolor: kARGB_4444_SkColorType    bytesPerPixel: 2\\ncolor: kRGBA_8888_SkColorType    bytesPerPixel: 4\\ncolor: kRGB_888x_SkColorType     bytesPerPixel: 4\\ncolor: kBGRA_8888_SkColorType    bytesPerPixel: 4\\ncolor: kRGBA_1010102_SkColorType bytesPerPixel: 4\\ncolor: kRGB_101010x_SkColorType  bytesPerPixel: 4\\ncolor: kGray_8_SkColorType       bytesPerPixel: 1\\ncolor: kRGBA_F16_SkColorType     bytesPerPixel: 8\\n"
+    },
+        "SkBitmap_colorSpace": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.setInfo(SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,\n            SkColorSpace::MakeSRGBLinear()));\n    SkColorSpace* colorSpace = bitmap.colorSpace();\n    SkDebugf(\"gammaCloseToSRGB: %s  gammaIsLinear: %s  isSRGB: %s\\n\",\n            colorSpace->gammaCloseToSRGB() ? \"true\" : \"false\",\n            colorSpace->gammaIsLinear() ? \"true\" : \"false\",\n            colorSpace->isSRGB() ? \"true\" : \"false\");\n}",
+    "hash": "817f95879fadba44baf87ea60e9b595a",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::colorSpace",
+        "stdout": "gammaCloseToSRGB: false  gammaIsLinear: true  isSRGB: false\\n"
+    },
+        "SkBitmap_colorType": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* colors[] = {\"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                            \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\"};\n    SkBitmap bitmap;\n    bitmap.setInfo(SkImageInfo::MakeA8(16, 32));\n    SkDebugf(\"color type: k\" \"%s\" \"_SkColorType\\n\", colors[bitmap.colorType()]);\n}",
+    "hash": "ceb77fab7326b57822a147b04aa0960e",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::colorType",
+        "stdout": "color type: kAlpha_8_SkColorType\\n"
+    },
+        "SkBitmap_computeByteSize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    for (int width : { 1, 1000, 1000000 } ) {\n        for (int height: { 1, 1000, 1000000 } ) {\n            SkImageInfo imageInfo = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType);\n            bitmap.setInfo(imageInfo, width * 5);\n            SkDebugf(\"width: %7d height: %7d computeByteSize: %13lld\\n\", width, height,\n                     bitmap.computeByteSize());\n        }\n    }\n}",
+    "hash": "165c8f208829fc0908e8a50da60c0076",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::computeByteSize",
+        "stdout": "width:       1 height:       1 computeByteSize:             4\\nwidth:       1 height:    1000 computeByteSize:          4999\\nwidth:       1 height: 1000000 computeByteSize:       4999999\\nwidth:    1000 height:       1 computeByteSize:          4000\\nwidth:    1000 height:    1000 computeByteSize:       4999000\\nwidth:    1000 height: 1000000 computeByteSize:    4999999000\\nwidth: 1000000 height:       1 computeByteSize:       4000000\\nwidth: 1000000 height:    1000 computeByteSize:    4999000000\\nwidth: 1000000 height: 1000000 computeByteSize: 4999999000000\\n"
+    },
+        "SkBitmap_copy_const_SkBitmap": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap original;\n    if (original.tryAllocPixels(\n            SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) {\n        SkDebugf(\"original has pixels before copy: %s\\n\", original.getPixels() ? \"true\" : \"false\");\n        SkBitmap copy(original);\n        SkDebugf(\"original has pixels after copy: %s\\n\", original.getPixels() ? \"true\" : \"false\");\n        SkDebugf(\"copy has pixels: %s\\n\", copy.getPixels() ? \"true\" : \"false\");\n    }\n}\n",
+    "hash": "bbbae7a181bfd128a4484e8e9f454db1",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::SkBitmap(const SkBitmap& src)",
+        "stdout": "original has pixels before copy: true\\noriginal has pixels after copy: true\\ncopy has pixels: true\\n"
+    },
+        "SkBitmap_copy_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap original;\n    if (original.tryAllocPixels(\n            SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) {\n        SkDebugf(\"original has pixels before copy: %s\\n\", original.getPixels() ? \"true\" : \"false\");\n        SkBitmap copy = original;\n        SkDebugf(\"original has pixels after copy: %s\\n\", original.getPixels() ? \"true\" : \"false\");\n        SkDebugf(\"copy has pixels: %s\\n\", copy.getPixels() ? \"true\" : \"false\");\n    }\n}\n",
+    "hash": "45279c519ae808f78bd30e9d84bdfdde",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::operator=(const SkBitmap& src)",
+        "stdout": "original has pixels before copy: true\\noriginal has pixels after copy: true\\ncopy has pixels: true\\n"
+    },
+        "SkBitmap_dimensions": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.setInfo(SkImageInfo::MakeN32(33, 55, kOpaque_SkAlphaType));\n    SkISize dimensions = bitmap.dimensions();\n    SkRect bounds;\n    bitmap.getBounds(&bounds);\n    SkRect dimensionsAsBounds = SkRect::Make(dimensions);\n    SkDebugf(\"dimensionsAsBounds %c= bounds\\n\", dimensionsAsBounds == bounds ? '=' : '!');\n}",
+    "hash": "647056bcc12c27fb4413f212f33a2898",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::dimensions()",
+        "stdout": "dimensionsAsBounds == bounds\\n"
+    },
+        "SkBitmap_drawsNothing": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    for (int w : { 0, 8 } ) {\n        for (bool allocate : { false, true} ) {\n            bitmap.setInfo(SkImageInfo::MakeA8(w, 8));\n            allocate ? bitmap.allocPixels() : (void) 0 ;\n            SkDebugf(\"empty:%s isNull:%s drawsNothing:%s\\n\", bitmap.empty() ? \"true \" : \"false\",\n                     bitmap.isNull() ? \"true \" : \"false\", bitmap.drawsNothing() ? \"true\" : \"false\");\n        }\n    }\n}",
+    "hash": "daacf43394ce4045a362a48b5774deed",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::drawsNothing",
+        "stdout": "empty:true  isNull:true  drawsNothing:true\\nempty:true  isNull:false drawsNothing:true\\nempty:false isNull:true  drawsNothing:true\\nempty:false isNull:false drawsNothing:false\\n"
+    },
+        "SkBitmap_empty": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    for (int width : { 0, 2 } ) {\n        for (int height : { 0, 2 } ) {\n             bitmap.setInfo(SkImageInfo::MakeA8(width, height));\n             SkDebugf(\"width: %d height: %d empty: %s\\n\", width, height,\n                      bitmap.empty() ? \"true\" : \"false\");\n        }\n    }\n}",
+    "hash": "a3762c2722b56ba55e42689c527f146c",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::empty()",
+        "stdout": "width: 0 height: 0 empty: true\\nwidth: 0 height: 2 empty: true\\nwidth: 2 height: 0 empty: true\\nwidth: 2 height: 2 empty: false\\n"
+    },
+        "SkBitmap_empty_constructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* alphas[] = {\"Unknown\", \"Opaque\", \"Premul\", \"Unpremul\"};\n    const char* colors[] = {\"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                            \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\"};\n    SkBitmap bitmap;\n    for (int i = 0; i < 2; ++i) {\n       SkDebugf(\"width: %2d  height: %2d\", bitmap.width(), bitmap.height());\n       SkDebugf(\"  color: k%s_SkColorType\", colors[bitmap.colorType()]);\n       SkDebugf(\"  alpha: k%s_SkAlphaType\\n\", alphas[bitmap.alphaType()]);\n       bitmap.setInfo(SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType),\n                      0);\n    }\n}\n",
+    "hash": "6739d14ec0d6a373f2fcadc6b3077fd4",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::SkBitmap()",
+        "stdout": "width:  0  height:  0  color: kUnknown_SkColorType  alpha: kUnknown_SkAlphaType\\nwidth: 25  height: 35  color: kRGBA_8888_SkColorType  alpha: kOpaque_SkAlphaType\\n"
+    },
+        "SkBitmap_extractSubset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect bounds, s;\n    source.getBounds(&bounds);\n    SkDebugf(\"bounds: %d, %d, %d, %d\\n\", bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);\n    SkBitmap subset;\n    for (int left: { -100, 0, 100, 1000 } ) {\n         for (int right: { 0, 100, 1000 } ) {\n             SkIRect b = SkIRect::MakeLTRB(left, 100, right, 200);\n             bool success = source.extractSubset(&subset, b);\n             SkDebugf(\"subset: %4d, %4d, %4d, %4d  \", b.fLeft, b.fTop, b.fRight, b.fBottom);\n             SkDebugf(\"success; %s\", success ? \"true\" : \"false\");\n             if (success) {\n                 subset.getBounds(&s);\n                 SkDebugf(\"  subset: %d, %d, %d, %d\", s.fLeft, s.fTop, s.fRight, s.fBottom);\n             }\n             SkDebugf(\"\\n\");\n         }\n    }\n}",
+    "hash": "304148c50c91490bfd58e9222342419c",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::extractSubset",
+        "stdout": "bounds: 0, 0, 512, 512\\nsubset: -100,  100,    0,  200  success; false\\nsubset: -100,  100,  100,  200  success; true  subset: 0, 0, 100, 100\\nsubset: -100,  100, 1000,  200  success; true  subset: 0, 0, 512, 100\\nsubset:    0,  100,    0,  200  success; false\\nsubset:    0,  100,  100,  200  success; true  subset: 0, 0, 100, 100\\nsubset:    0,  100, 1000,  200  success; true  subset: 0, 0, 512, 100\\nsubset:  100,  100,    0,  200  success; false\\nsubset:  100,  100,  100,  200  success; false\\nsubset:  100,  100, 1000,  200  success; true  subset: 0, 0, 412, 100\\nsubset: 1000,  100,    0,  200  success; false\\nsubset: 1000,  100,  100,  200  success; false\\nsubset: 1000,  100, 1000,  200  success; false\\n"
+    },
+        "SkBitmap_getAddr": {
+    "code": "void draw(SkCanvas* canvas) {\n    char* row0 = (char* ) source.getAddr(0, 0);\n    char* row1 = (char* ) source.getAddr(0, 1);\n    SkDebugf(\"addr interval %c= rowBytes\\n\",\n             (size_t) (row1 - row0) == source.rowBytes() ? '=' : '!');\n}",
+    "hash": "ffcefb2344cd38c3b99f69cfe6d64a17",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::getAddr",
+        "stdout": "addr interval == rowBytes\\n"
+    },
+        "SkBitmap_getAddr16": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap16;\n    SkImageInfo dstInfo = SkImageInfo::Make(source.width(), source.height(), kARGB_4444_SkColorType,\n                     kPremul_SkAlphaType);\n    bitmap16.allocPixels(dstInfo);\n    if (source.readPixels(dstInfo, bitmap16.getPixels(), bitmap16.rowBytes(), 0, 0)) {\n        uint16_t* row0 = bitmap16.getAddr16(0, 0);\n        uint16_t* row1 = bitmap16.getAddr16(0, 1);\n        size_t interval = (row1 - row0) * bitmap16.bytesPerPixel();\n        SkDebugf(\"addr interval %c= rowBytes\\n\", interval == bitmap16.rowBytes() ? '=' : '!');\n    }\n}",
+    "hash": "53e00899ef2e00e2096daf7a07d9b059",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::getAddr16",
+        "stdout": "addr interval == rowBytes\\n"
+    },
+        "SkBitmap_getAddr32": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint32_t* row0 = source.getAddr32(0, 0);\n    uint32_t* row1 = source.getAddr32(0, 1);\n    size_t interval = (row1 - row0) * source.bytesPerPixel();\n    SkDebugf(\"addr interval %c= rowBytes\\n\", interval == source.rowBytes() ? '=' : '!');\n}",
+    "hash": "837a2bcc9fb9ce617a3420956cefc64a",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::getAddr32",
+        "stdout": "addr interval == rowBytes\\n"
+    },
+        "SkBitmap_getAddr8": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    const int width = 8;\n    const int height = 8;\n    uint8_t pixels[height][width];\n    SkImageInfo info = SkImageInfo::Make(width, height, kGray_8_SkColorType, kOpaque_SkAlphaType);\n    if (bitmap.installPixels(info, pixels, info.minRowBytes())) {\n        SkDebugf(\"&pixels[4][2] %c= bitmap.getAddr8(2, 4)\\n\",\n                  &pixels[4][2]  == bitmap.getAddr8(2, 4) ? '=' : '!');\n    }\n}",
+    "hash": "cb9a08e8ff779b6a1cf8bb54f3883aaf",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::getAddr8",
+        "stdout": "&pixels[4][2] == bitmap.getAddr8(2, 4)\\n"
+    },
+        "SkBitmap_getColor": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    SkColor colors[][w] = {\n        { 0x00000000, 0x2a0e002a, 0x55380055, 0x7f7f007f },\n        { 0x2a000e2a, 0x551c1c55, 0x7f542a7f, 0xaaaa38aa },\n        { 0x55003855, 0x7f2a547f, 0xaa7171aa, 0xd4d48dd4 },\n        { 0x7f007f7f, 0xaa38aaaa, 0xd48dd4d4, 0xffffffff }\n    };\n    SkDebugf(\"Premultiplied:\\n\");\n    for (int y = 0; y < h; ++y) {\n        SkDebugf(\"(0, %d) \", y);\n        for (int x = 0; x < w; ++x) {\n            SkDebugf(\"0x%08x%c\", colors[y][x], x == w - 1 ? '\\n' : ' ');\n        }\n    }\n    SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), colors, w * 4);\n    SkBitmap bitmap;\n    bitmap.installPixels(pixmap);\n    SkDebugf(\"Unpremultiplied:\\n\");\n    for (int y = 0; y < h; ++y) {\n        SkDebugf(\"(0, %d) \", y);\n        for (int x = 0; x < w; ++x) {\n            SkDebugf(\"0x%08x%c\", bitmap.getColor(x, y), x == w - 1 ? '\\n' : ' ');\n        }\n    }\n}",
+    "hash": "193d1f6d8a43b7a8e9f27ba21de38617",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::getColor",
+        "stdout": "Premultiplied:\\n(0, 0) 0x00000000 0x2a0e002a 0x55380055 0x7f7f007f\\n(0, 1) 0x2a000e2a 0x551c1c55 0x7f542a7f 0xaaaa38aa\\n(0, 2) 0x55003855 0x7f2a547f 0xaa7171aa 0xd4d48dd4\\n(0, 3) 0x7f007f7f 0xaa38aaaa 0xd48dd4d4 0xffffffff\\nUnpremultiplied:\\n(0, 0) 0x00000000 0x2a5500ff 0x55a800ff 0x7fff00ff\\n(0, 1) 0x2a0055ff 0x555454ff 0x7fa954ff 0xaaff54ff\\n(0, 2) 0x5500a8ff 0x7f54a9ff 0xaaaaaaff 0xd4ffaaff\\n(0, 3) 0x7f00ffff 0xaa54ffff 0xd4aaffff 0xffffffff\\n"
+    },
+        "SkBitmap_getGenerationID": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    SkDebugf(\"empty id %u\\n\", bitmap.getGenerationID());\n    bitmap.allocPixels(SkImageInfo::MakeN32(64, 64, kOpaque_SkAlphaType));\n    SkDebugf(\"alloc id %u\\n\", bitmap.getGenerationID());\n    bitmap.eraseColor(SK_ColorRED);\n    SkDebugf(\"erase id %u\\n\", bitmap.getGenerationID());\n}",
+    "hash": "db9dd91e0207c3941c09538555817b4b",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::getGenerationID",
+        "stdout": "empty id 0\\nalloc id 4\\nerase id 6\\n\\n"
+    },
+        "SkBitmap_getPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.setInfo(SkImageInfo::MakeN32(4, 4, kPremul_SkAlphaType));\n    bitmap.allocPixels();\n    bitmap.eraseColor(0x00000000);\n    void* baseAddr = bitmap.getPixels();\n    *(SkPMColor*)baseAddr = 0xFFFFFFFF;\n    SkDebugf(\"bitmap.getColor(0, 1) %c= 0x00000000\\n\",\n              bitmap.getColor(0, 1)  == 0x00000000 ? '=' : '!');\n    SkDebugf(\"bitmap.getColor(0, 0) %c= 0xFFFFFFFF\\n\",\n              bitmap.getColor(0, 0)  == 0xFFFFFFFF ? '=' : '!');\n}",
+    "hash": "e006bb05cf74ec8d2b3d6adeb5dba11b",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::getPixels",
+        "stdout": "bitmap.getColor(0, 1) == 0x00000000\\nbitmap.getColor(0, 0) == 0xFFFFFFFF\\n"
+    },
+        "SkBitmap_getSubset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect bounds;\n    source.getBounds(&bounds);\n    bounds.inset(100, 100);\n    SkBitmap subset;\n    source.extractSubset(&subset, bounds);\n    SkIRect r = source.getSubset();\n    SkDebugf(\"source: %d, %d, %d, %d\\n\", r.fLeft, r.fTop, r.fRight, r.fBottom);\n    r = subset.getSubset();\n    SkDebugf(\"subset: %d, %d, %d, %d\\n\", r.fLeft, r.fTop, r.fRight, r.fBottom);\n}",
+    "hash": "d6dd0b425aa550f21b938a18c2e1a981",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::getSubset",
+        "stdout": "source: 0, 0, 512, 512\\nsubset: 100, 100, 412, 412\\n"
+    },
+        "SkBitmap_height": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::MakeA8(16, 32);\n    SkBitmap bitmap;\n    bitmap.setInfo(info);\n    SkDebugf(\"bitmap height: %d  info height: %d\\n\", bitmap.height(), info.height());\n}",
+    "hash": "c79a196278c58b34cd5f551b0124ecc9",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::height()",
+        "stdout": "bitmap height: 32  info height: 32\\n"
+    },
+        "SkBitmap_info": {
+    "code": "void draw(SkCanvas* canvas) {\n    // SkBitmap source;  // pre-populated with soccer ball by fiddle.skia.org\n    const SkImageInfo& info = source.info();\n    const char* alphas[] = {\"Unknown\", \"Opaque\", \"Premul\", \"Unpremul\"};\n    const char* colors[] = {\"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                            \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\"};\n    SkDebugf(\"width: %d height: %d color: %s alpha: %s\\n\", info.width(), info.height(),\n                colors[info.colorType()], alphas[info.alphaType()]);\n}\n",
+    "hash": "ec47c4dc23e2925ad565eaba55a91553",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::info()",
+        "stdout": "width: 56 height: 56 color: BGRA_8888 alpha: Opaque\\n"
+    },
+        "SkBitmap_installPixels": {
+    "code": "static void releaseProc(void* addr, void* ) {\n    SkDebugf(\"releaseProc called\\n\");\n    delete[] (uint32_t*) addr;\n}\n\nvoid draw(SkCanvas* canvas) {\n   SkBitmap bitmap;\n   void* pixels = new uint32_t[8 * 8];\n   SkImageInfo info = SkImageInfo::MakeN32(8, 8, kOpaque_SkAlphaType);\n   SkDebugf(\"before installPixels\\n\");\n   bool installed = bitmap.installPixels(info, pixels, 16, releaseProc, nullptr);\n   SkDebugf(\"install \" \"%s\" \"successful\\n\", installed ? \"\" : \"not \");\n}\n",
+    "hash": "8c4f7bf73fffa1a812ee8e88e44e639c",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::installPixels",
+        "stdout": "before installPixels\\nreleaseProc called\\ninstall not successful\\n"
+    },
+        "SkBitmap_isImmutable": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap original;\n    SkImageInfo info = SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);\n    if (original.tryAllocPixels(info)) {\n        original.setImmutable();\n        SkBitmap copy;\n        original.extractSubset(&copy, {5, 10, 15, 20});\n        SkDebugf(\"original is \" \"%s\" \"immutable\\n\", original.isImmutable() ? \"\" : \"not \");\n        SkDebugf(\"copy is \" \"%s\" \"immutable\\n\", copy.isImmutable() ? \"\" : \"not \");\n    }\n}",
+    "hash": "db61fdcd382342ee88ea1b4f27c27b95",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::isImmutable",
+        "stdout": "original is immutable\\ncopy is immutable\\n"
+    },
+        "SkBitmap_isNull": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    SkDebugf(\"empty bitmap does %shave pixels\\n\", bitmap.isNull() ? \"not \" : \"\");\n    bitmap.setInfo(SkImageInfo::MakeA8(8, 8));\n    SkDebugf(\"bitmap with dimensions does %shave pixels\\n\", bitmap.isNull() ? \"not \" : \"\");\n    bitmap.allocPixels();\n    SkDebugf(\"allocated bitmap does %shave pixels\\n\", bitmap.isNull() ? \"not \" : \"\");\n}",
+    "hash": "211ec89418011aa6e54aa2cc9567e003",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::isNull",
+        "stdout": "empty bitmap does not have pixels\\nbitmap with dimensions does not have pixels\\nallocated bitmap does have pixels\\n"
+    },
+        "SkBitmap_isOpaque": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int height = 2;\n    const int width = 2;\n    SkBitmap bitmap;\n    bitmap.setInfo(SkImageInfo::Make(width, height, kN32_SkColorType, kPremul_SkAlphaType));\n    for (int index = 0; index < 2; ++index) {\n        bitmap.allocPixels();\n        bitmap.eraseColor(0x00000000);\n        SkDebugf(\"isOpaque: %s\\n\", bitmap.isOpaque() ? \"true\" : \"false\");\n        bitmap.eraseColor(0xFFFFFFFF);\n        SkDebugf(\"isOpaque: %s\\n\", bitmap.isOpaque() ? \"true\" : \"false\");\n        bitmap.setInfo(bitmap.info().makeAlphaType(kOpaque_SkAlphaType));\n    }\n}",
+    "hash": "5e76b68bb46d54315eb0c12d83bd6949",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::isOpaque",
+        "stdout": "isOpaque: false\\nisOpaque: false\\nisOpaque: true\\nisOpaque: true\\n"
+    },
+        "SkBitmap_isVolatile": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap original;\n    SkImageInfo info = SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);\n    if (original.tryAllocPixels(info)) {\n        original.setIsVolatile(true);\n        SkBitmap copy;\n        original.extractSubset(&copy, {5, 10, 15, 20});\n        SkDebugf(\"original is \" \"%s\" \"volatile\\n\", original.isVolatile() ? \"\" : \"not \");\n        SkDebugf(\"copy is \" \"%s\" \"volatile\\n\", copy.isImmutable() ? \"\" : \"not \");\n    }\n}",
+    "hash": "23c4543ac6cdd0e8fe762816a0dc2e03",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::isVolatile",
+        "stdout": "original is volatile\\ncopy is not volatile\\n"
+    },
+        "SkBitmap_move_SkBitmap": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap original;\n    if (original.tryAllocPixels(\n            SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) {\n        SkDebugf(\"original has pixels before move: %s\\n\", original.getPixels() ? \"true\" : \"false\");\n        SkBitmap copy(std::move(original));\n        SkDebugf(\"original has pixels after move: %s\\n\", original.getPixels() ? \"true\" : \"false\");\n        SkDebugf(\"copy has pixels: %s\\n\", copy.getPixels() ? \"true\" : \"false\");\n    }\n}\n",
+    "hash": "40afd4f1fa69e02d69d92b38252088ef",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::SkBitmap(SkBitmap&& src)",
+        "stdout": "original has pixels before move: true\\noriginal has pixels after move: false\\ncopy has pixels: true\\n"
+    },
+        "SkBitmap_move_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap original;\n    if (original.tryAllocPixels(\n            SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) {\n        SkDebugf(\"original has pixels before move: %s\\n\", original.getPixels() ? \"true\" : \"false\");\n        SkBitmap copy = std::move(original);\n        SkDebugf(\"original has pixels after move: %s\\n\", original.getPixels() ? \"true\" : \"false\");\n        SkDebugf(\"copy has pixels: %s\\n\", copy.getPixels() ? \"true\" : \"false\");\n    }\n}\n",
+    "hash": "35ea3fed27d8db22dc00f48670de64de",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::operator=(SkBitmap&& src)",
+        "stdout": "original has pixels before move: true\\noriginal has pixels after move: false\\ncopy has pixels: true\\n"
+    },
+        "SkBitmap_peekPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(6, 11));\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorWHITE);\n    SkPaint paint;\n    offscreen.drawString(\"?\", 0, 10, paint);\n    SkPixmap pixmap;\n    if (bitmap.peekPixels(&pixmap)) {\n        const SkPMColor* pixels = pixmap.addr32();\n        SkPMColor pmWhite = pixels[0];\n        for (int y = 0; y < bitmap.height(); ++y) {\n            for (int x = 0; x < bitmap.width(); ++x) {\n                SkDebugf(\"%c\", *pixels++ == pmWhite ? '-' : 'x');\n            }\n            SkDebugf(\"\\n\");\n        }\n    }\n}",
+    "hash": "0cc2c6a0dffa61a88711534bd3d43b40",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::peekPixels",
+        "stdout": "------\\n-xxx--\\nx---x-\\n----x-\\n---x--\\n--x---\\n--x---\\n------\\n--x---\\n--x---\\n------\\n"
+    },
+        "SkBitmap_pixelRef": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap subset;\n    source.extractSubset(&subset, SkIRect::MakeXYWH(32, 64, 128, 256));\n    SkDebugf(\"src ref %c= sub ref\\n\", source.pixelRef() == subset.pixelRef() ? '=' : '!');\n    SkDebugf(\"src pixels %c= sub pixels\\n\", source.getPixels() == subset.getPixels() ? '=' : '!');\n    SkDebugf(\"src addr %c= sub addr\\n\", source.getAddr(32, 64) == subset.getAddr(0, 0) ? '=' : '!');\n}",
+    "hash": "5db2d30870a7cc45f28e22578d1880c3",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::pixelRef",
+        "stdout": "src ref == sub ref\\nsrc pixels != sub pixels\\nsrc addr == sub addr\\n"
+    },
+        "SkBitmap_pixelRefOrigin": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap subset;\n    source.extractSubset(&subset, SkIRect::MakeXYWH(32, 64, 128, 256));\n    SkIPoint sourceOrigin = source.pixelRefOrigin();\n    SkIPoint subsetOrigin = subset.pixelRefOrigin();\n    SkDebugf(\"source origin: %d, %d\\n\", sourceOrigin.fX, sourceOrigin.fY);\n    SkDebugf(\"subset origin: %d, %d\\n\", subsetOrigin.fX, subsetOrigin.fY);\n}",
+    "hash": "6d31686c6c0829c70f284ae716526d6a",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::pixelRefOrigin",
+        "stdout": "source origin: 0, 0\\nsubset origin: 32, 64\\n"
+    },
+        "SkBitmap_pixmap": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(10, 11));\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorWHITE);\n    SkPaint paint;\n    offscreen.drawString(\"&\", 0, 10, paint);\n    const SkPixmap& pixmap = bitmap.pixmap();\n    if (pixmap.addr()) {\n        SkPMColor pmWhite = *pixmap.addr32(0, 0);\n        for (int y = 0; y < pixmap.height(); ++y) {\n            for (int x = 0; x < pixmap.width(); ++x) {\n                SkDebugf(\"%c\", *pixmap.addr32(x, y) == pmWhite ? '-' : 'x');\n            }\n            SkDebugf(\"\\n\");\n        }\n    }\n}",
+    "hash": "7f972d742dd78d2500034d8867e9ef2f",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::pixmap()",
+        "stdout": "----------\\n---xx-----\\n--x--x----\\n--x-------\\n--xx------\\n--x-x---x-\\n-x---x--x-\\n-x----xx--\\n-xx---x---\\n--xxxx-xx-\\n----------\\n"
+    },
+        "SkBitmap_refColorSpace": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap1, bitmap2;\n    bitmap1.setInfo(SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,\n            SkColorSpace::MakeSRGBLinear()));\n    bitmap2.setInfo(SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,\n            bitmap1.refColorSpace()));\n    SkColorSpace* colorSpace = bitmap2.colorSpace();\n    SkDebugf(\"gammaCloseToSRGB: %s  gammaIsLinear: %s  isSRGB: %s\\n\",\n            colorSpace->gammaCloseToSRGB() ? \"true\" : \"false\",\n            colorSpace->gammaIsLinear() ? \"true\" : \"false\",\n            colorSpace->isSRGB() ? \"true\" : \"false\");\n}",
+    "hash": "cb028b7931da85b949ad0953b9711f9f",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::refColorSpace",
+        "stdout": "gammaCloseToSRGB: false  gammaIsLinear: true  isSRGB: false\\n"
+    },
+        "SkBitmap_reset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.setInfo(SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType));\n    bitmap.allocPixels();\n    SkDebugf(\"width:%d height:%d isNull:%s\\n\", bitmap.width(), bitmap.height(),\n             bitmap.isNull() ? \"true\" : \"false\");\n    bitmap.reset();\n    SkDebugf(\"width:%d height:%d isNull:%s\\n\", bitmap.width(), bitmap.height(),\n             bitmap.isNull() ? \"true\" : \"false\");\n}",
+    "hash": "52ccaeda67924373c5b55a2b89fe314d",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::reset()",
+        "stdout": "width:1 height:1 isNull:false\\nwidth:0 height:0 isNull:true\\n"
+    },
+        "SkBitmap_rowBytes": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    for (int rowBytes : { 2, 8 } ) {\n        bool result = bitmap.setInfo(SkImageInfo::MakeA8(4, 4), rowBytes);\n        SkDebugf(\"setInfo returned:%s rowBytes:%d\\n\", result ? \"true \" : \"false\", bitmap.rowBytes());\n     }\n}",
+    "hash": "a654fd0b73f424859ae6c95e03f55099",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::rowBytes",
+        "stdout": "setInfo returned:false rowBytes:0\\nsetInfo returned:true  rowBytes:8\\n"
+    },
+        "SkBitmap_rowBytesAsPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    for (int rowBytes : { 4, 5, 6, 7, 8} ) {\n        bitmap.setInfo(SkImageInfo::MakeN32(1, 1, kPremul_SkAlphaType), rowBytes);\n        SkDebugf(\"rowBytes: %d rowBytesAsPixels: %d\\n\", rowBytes, bitmap.rowBytesAsPixels());\n    }\n}",
+    "hash": "03a9e08082a23a98de17c3e24871d61a",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::rowBytesAsPixels",
+        "stdout": "rowBytes: 4 rowBytesAsPixels: 1\\nrowBytes: 5 rowBytesAsPixels: 1\\nrowBytes: 6 rowBytesAsPixels: 1\\nrowBytes: 7 rowBytesAsPixels: 1\\nrowBytes: 8 rowBytesAsPixels: 2\\n"
+    },
+        "SkBitmap_setAlphaType": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* colors[] = { \"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                             \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\" };\n    const char* alphas[] = {\"Unknown \", \"Opaque  \", \"Premul  \", \"Unpremul\"};\n    SkBitmap bitmap;\n    SkAlphaType alphaTypes[] = { kUnknown_SkAlphaType, kOpaque_SkAlphaType, kPremul_SkAlphaType,\n    kUnpremul_SkAlphaType\n                               };\n    SkDebugf(\"%18s%15s%17s%18s%19s\\n\", \"Canonical\", \"Unknown\", \"Opaque\", \"Premul\", \"Unpremul\");\n    for (SkColorType colorType : {\n    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,\n    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,\n    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,\n    kGray_8_SkColorType, kRGBA_F16_SkColorType\n                                 } ) {\n        for (SkAlphaType canonicalAlphaType : alphaTypes) {\n            SkColorTypeValidateAlphaType(colorType, kUnknown_SkAlphaType, &canonicalAlphaType );\n            SkDebugf(\"%12s %9s  \", colors[(int) colorType], alphas[(int) canonicalAlphaType ]);\n            for (SkAlphaType alphaType : alphaTypes) {\n                bitmap.setInfo(SkImageInfo::Make(4, 4, colorType, canonicalAlphaType));\n                bool result = bitmap.setAlphaType(alphaType);\n                SkDebugf(\"%s %s    \", result ? \"true \" : \"false\", alphas[(int) bitmap.alphaType()]);\n            }\n            SkDebugf(\"\\n\");\n        }\n    }\n}\n",
+    "hash": "af3adcbea7b58bf90298ca5e0ea93030",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::setAlphaType",
+        "stdout": "Canonical        Unknown           Opaque            Premul           Unpremul\\n     Unknown  Unknown   true  Unknown     true  Unknown     true  Unknown     true  Unknown     \\n     Unknown  Unknown   true  Unknown     true  Unknown     true  Unknown     true  Unknown     \\n     Unknown  Unknown   true  Unknown     true  Unknown     true  Unknown     true  Unknown     \\n     Unknown  Unknown   true  Unknown     true  Unknown     true  Unknown     true  Unknown     \\n     Alpha_8  Unknown   true  Unknown     true  Unknown     true  Unknown     true  Unknown     \\n     Alpha_8  Opaque    false Opaque      true  Opaque      true  Premul      true  Premul      \\n     Alpha_8  Premul    false Premul      true  Opaque      true  Premul      true  Premul      \\n     Alpha_8  Unpremul  false Premul      true  Opaque      true  Premul      true  Premul      \\n     RGB_565  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n     RGB_565  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n     RGB_565  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n     RGB_565  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n   ARGB_4444  Unknown   true  Unknown     true  Unknown     true  Unknown     true  Unknown     \\n   ARGB_4444  Opaque    false Opaque      true  Opaque      true  Premul      true  Unpremul    \\n   ARGB_4444  Premul    false Premul      true  Opaque      true  Premul      true  Unpremul    \\n   ARGB_4444  Unpremul  false Unpremul    true  Opaque      true  Premul      true  Unpremul    \\n   RGBA_8888  Unknown   true  Unknown     true  Unknown     true  Unknown     true  Unknown     \\n   RGBA_8888  Opaque    false Opaque      true  Opaque      true  Premul      true  Unpremul    \\n   RGBA_8888  Premul    false Premul      true  Opaque      true  Premul      true  Unpremul    \\n   RGBA_8888  Unpremul  false Unpremul    true  Opaque      true  Premul      true  Unpremul    \\n    RGB_888x  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n    RGB_888x  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n    RGB_888x  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n    RGB_888x  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n   BGRA_8888  Unknown   true  Unknown     true  Unknown     true  Unknown     true  Unknown     \\n   BGRA_8888  Opaque    false Opaque      true  Opaque      true  Premul      true  Unpremul    \\n   BGRA_8888  Premul    false Premul      true  Opaque      true  Premul      true  Unpremul    \\n   BGRA_8888  Unpremul  false Unpremul    true  Opaque      true  Premul      true  Unpremul    \\nRGBA_1010102  Unknown   true  Unknown     true  Unknown     true  Unknown     true  Unknown     \\nRGBA_1010102  Opaque    false Opaque      true  Opaque      true  Premul      true  Unpremul    \\nRGBA_1010102  Premul    false Premul      true  Opaque      true  Premul      true  Unpremul    \\nRGBA_1010102  Unpremul  false Unpremul    true  Opaque      true  Premul      true  Unpremul    \\n RGB_101010x  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n RGB_101010x  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n RGB_101010x  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n RGB_101010x  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n      Gray_8  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n      Gray_8  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n      Gray_8  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n      Gray_8  Opaque    true  Opaque      true  Opaque      true  Opaque      true  Opaque      \\n    RGBA_F16  Unknown   true  Unknown     true  Unknown     true  Unknown     true  Unknown     \\n    RGBA_F16  Opaque    false Opaque      true  Opaque      true  Premul      true  Unpremul    \\n    RGBA_F16  Premul    false Premul      true  Opaque      true  Premul      true  Unpremul    \\n    RGBA_F16  Unpremul  false Unpremul    true  Opaque      true  Premul      true  Unpremul    \\n"
+    },
+        "SkBitmap_setImmutable": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.setInfo(SkImageInfo::MakeN32(4, 4, kPremul_SkAlphaType));\n    bitmap.allocPixels();\n    SkCanvas offscreen(bitmap);\n    SkDebugf(\"draw white\\n\");\n    offscreen.clear(SK_ColorWHITE);\n    bitmap.setImmutable();\n    SkDebugf(\"draw black\\n\");\n    offscreen.clear(SK_ColorBLACK);\n}",
+    "hash": "9210060d1f4ca46e1375496237902ef3",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::setImmutable",
+        "stdout": "draw white\\ndraw black\\n"
+    },
+        "SkBitmap_shiftPerPixel": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* colors[] = {\"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                            \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\"};\n    SkImageInfo info = SkImageInfo::MakeA8(1, 1);\n    SkBitmap bitmap;\n    for (SkColorType colorType : {\n    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,\n    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,\n    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,\n    kGray_8_SkColorType, kRGBA_F16_SkColorType\n                                 } ) {\n        bitmap.setInfo(info.makeColorType(colorType));\n        SkDebugf(\"color: k\" \"%s\" \"_SkColorType\" \"%*s\" \"shiftPerPixel: %d\\n\",\n                colors[colorType], 14 - strlen(colors[colorType]), \" \",\n                bitmap.shiftPerPixel());\n    }\n}",
+    "hash": "56ede4b7d45c15d5936f81ac3d74f070",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::shiftPerPixel",
+        "stdout": "color: kUnknown_SkColorType       shiftPerPixel: 0\\ncolor: kAlpha_8_SkColorType       shiftPerPixel: 0\\ncolor: kRGB_565_SkColorType       shiftPerPixel: 1\\ncolor: kARGB_4444_SkColorType     shiftPerPixel: 1\\ncolor: kRGBA_8888_SkColorType     shiftPerPixel: 2\\ncolor: kRGB_888x_SkColorType      shiftPerPixel: 2\\ncolor: kBGRA_8888_SkColorType     shiftPerPixel: 2\\ncolor: kRGBA_1010102_SkColorType  shiftPerPixel: 2\\ncolor: kRGB_101010x_SkColorType   shiftPerPixel: 2\\ncolor: kGray_8_SkColorType        shiftPerPixel: 0\\ncolor: kRGBA_F16_SkColorType      shiftPerPixel: 3\\n"
+    },
+        "SkBitmap_swap": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkBitmap& b) -> void {\n        const char* alphas[] = {\"Unknown\", \"Opaque\", \"Premul\", \"Unpremul\"};\n        const char* colors[] = {\"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                                \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\"};\n        SkDebugf(\"%s width:%d height:%d colorType:k%s_SkColorType alphaType:k%s_SkAlphaType\\n\",\n                 prefix, b.width(), b.height(), colors[b.colorType()], alphas[b.alphaType()]);\n    };\n    SkBitmap one, two;\n    if (!one.tryAllocPixels(\n            SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) {\n        return;\n    }\n    if (!two.tryAllocPixels(\n            SkImageInfo::Make(2, 2, kBGRA_8888_SkColorType, kPremul_SkAlphaType))) {\n        return;\n    }\n    for (int index = 0; index < 2; ++index) {\n       debugster(\"one\", one);\n       debugster(\"two\", two);\n       one.swap(two);\n    }\n}\n",
+    "hash": "de9be45255e48fae445c916a41063abc",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::swap()",
+        "stdout": "one width:1 height:1 colorType:kRGBA_8888_SkColorType alphaType:kOpaque_SkAlphaType\\ntwo width:2 height:2 colorType:kBGRA_8888_SkColorType alphaType:kPremul_SkAlphaType\\none width:2 height:2 colorType:kBGRA_8888_SkColorType alphaType:kPremul_SkAlphaType\\ntwo width:1 height:1 colorType:kRGBA_8888_SkColorType alphaType:kOpaque_SkAlphaType\\n"
+    },
+        "SkBitmap_tryAllocPixelsFlags": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    if (!bitmap.tryAllocPixelsFlags(SkImageInfo::MakeN32(10000, 10000, kOpaque_SkAlphaType),\n                                    SkBitmap::kZeroPixels_AllocFlag)) {\n        SkDebugf(\"bitmap allocation failed!\\n\");\n    } else {\n        SkDebugf(\"bitmap allocation succeeded!\\n\");\n    }\n}",
+    "hash": "f1d1880d38e0aea4cefd3e11745e8a09",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::tryAllocPixelsFlags",
+        "stdout": "bitmap allocation succeeded!\\n"
+    },
+        "SkBitmap_width": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::MakeA8(16, 32);\n    SkBitmap bitmap;\n    bitmap.setInfo(info);\n    SkDebugf(\"bitmap width: %d  info width: %d\\n\", bitmap.width(), info.width());\n}",
+    "hash": "d06880c42f8bb3b4c3b67bd988046049",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::width()",
+        "stdout": "bitmap width: 16  info width: 16\\n"
+    },
+        "SkBlendMode_Name": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkDebugf(\"default blend: SkBlendMode::k%s\\n\", SkBlendMode_Name(SkPaint().getBlendMode()));\n}",
+    "hash": "3996f4994bf4e90b4cd86524c1f9f1a6",
+    "file": "SkBlendMode_Reference",
+    "name": "SkBlendMode_Name",
+        "stdout": "default blend: SkBlendMode::kSrcOver\\n"
+    },
+        "SkCanvas_MakeRasterDirect": {
+    "code": "void draw(SkCanvas* ) {\n    SkImageInfo info = SkImageInfo::MakeN32Premul(3, 3);  // device aligned, 32 bpp, Premultiplied\n    const size_t minRowBytes = info.minRowBytes();  // bytes used by one bitmap row\n    const size_t size = info.computeMinByteSize();  // bytes used by all rows\n    SkAutoTMalloc<SkPMColor> storage(size);  // allocate storage for pixels\n    SkPMColor* pixels = storage.get();  // get pointer to allocated storage\n    // create a SkCanvas backed by a raster device, and delete it when the\n    // function goes out of scope.\n    std::unique_ptr<SkCanvas> canvas = SkCanvas::MakeRasterDirect(info, pixels, minRowBytes);\n    canvas->clear(SK_ColorWHITE);  // white is Unpremultiplied, in ARGB order\n    canvas->flush();  // ensure that pixels are cleared\n    SkPMColor pmWhite = pixels[0];  // the Premultiplied format may vary\n    SkPaint paint;  // by default, draws black\n    canvas->drawPoint(1, 1, paint);  // draw in the center\n    canvas->flush();  // ensure that point was drawn\n    for (int y = 0; y < info.height(); ++y) {\n        for (int x = 0; x < info.width(); ++x) {\n            SkDebugf(\"%c\", *pixels++ == pmWhite ? '-' : 'x');\n        }\n        SkDebugf(\"\\n\");\n    }\n}\n",
+    "hash": "525285073aae7e53eb8f454a398f880c",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::MakeRasterDirect",
+        "stdout": "---\\n-x-\\n---\\n"
+    },
+        "SkCanvas_MakeRasterDirectN32": {
+    "code": "void draw(SkCanvas* ) {\n    const int width = 3;\n    const int height = 3;\n    SkPMColor pixels[height][width];  // allocate a 3 by 3 Premultiplied bitmap on the stack\n    // create a SkCanvas backed by a raster device, and delete it when the\n    // function goes out of scope.\n    std::unique_ptr<SkCanvas> canvas = SkCanvas::MakeRasterDirectN32(\n            width,\n            height,\n            pixels[0],  // top-left of the bitmap\n            sizeof(pixels[0]));  // byte width of the each row\n    // write a Premultiplied value for white into all pixels in the bitmap\n    canvas->clear(SK_ColorWHITE);\n    SkPMColor pmWhite = pixels[0][0];  // the Premultiplied format may vary\n    SkPaint paint;  // by default, draws black\n    canvas->drawPoint(1, 1, paint);  // draw in the center\n    canvas->flush();  // ensure that pixels is ready to be read\n    for (int y = 0; y < height; ++y) {\n        for (int x = 0; x < width; ++x) {\n            SkDebugf(\"%c\", pixels[y][x] == pmWhite ? '-' : 'x');\n        }\n        SkDebugf(\"\\n\");\n    }\n}\n",
+    "hash": "87f55e62ec4c3535e1a5d0f1415b20c6",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::MakeRasterDirectN32",
+        "stdout": "---\\n-x-\\n---\\n"
+    },
+        "SkCanvas_SaveLayerRec_SaveLayerRec": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkCanvas::SaveLayerRec rec1;\n    rec1.fSaveLayerFlags = SkCanvas::kPreserveLCDText_SaveLayerFlag;\n    SkCanvas::SaveLayerRec rec2(nullptr, nullptr, SkCanvas::kPreserveLCDText_SaveLayerFlag);\n    SkDebugf(\"rec1 %c= rec2\\n\", rec1.fBounds == rec2.fBounds\n            && rec1.fPaint == rec2.fPaint\n            && rec1.fBackdrop == rec2.fBackdrop\n            && rec1.fSaveLayerFlags == rec2.fSaveLayerFlags ? '=' : '!');\n}",
+    "hash": "b5cea1eed80a0eb04ddbab3f36dff73f",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::SaveLayerRec::SaveLayerRec()",
+        "stdout": "rec1 == rec2\\n"
+    },
+        "SkCanvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkCanvas::SaveLayerRec rec1;\n    SkCanvas::SaveLayerRec rec2(nullptr, nullptr);\n    SkDebugf(\"rec1 %c= rec2\\n\", rec1.fBounds == rec2.fBounds\n            && rec1.fPaint == rec2.fPaint\n            && rec1.fBackdrop == rec2.fBackdrop\n            && rec1.fSaveLayerFlags == rec2.fSaveLayerFlags ? '=' : '!');\n}",
+    "hash": "027f920259888fc19591ea9a90d92873",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::SaveLayerRec::SaveLayerRec(const SkRect* bounds, const SkPaint* paint, SaveLayerFlags saveLayerFlags = 0)",
+        "stdout": "rec1 == rec2\\n"
+    },
+        "SkCanvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_const_SkImageFilter_star": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkCanvas::SaveLayerRec rec1;\n    SkCanvas::SaveLayerRec rec2(nullptr, nullptr, nullptr, 0);\n    SkDebugf(\"rec1 %c= rec2\\n\", rec1.fBounds == rec2.fBounds\n            && rec1.fPaint == rec2.fPaint\n            && rec1.fBackdrop == rec2.fBackdrop\n            && rec1.fSaveLayerFlags == rec2.fSaveLayerFlags ? '=' : '!');\n}",
+    "hash": "9b7fa2fe855642ffff6538829db15328",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::SaveLayerRec::SaveLayerRec(const SkRect* bounds, const SkPaint* paint, const SkImageFilter* backdrop,                     SaveLayerFlags saveLayerFlags)",
+        "stdout": "rec1 == rec2\\n"
+    },
+        "SkCanvas_accessTopRasterHandle": {
+    "code": "static void DeleteCallback(void*, void* context) {\n    delete (char*) context;\n}\nclass CustomAllocator : public SkRasterHandleAllocator {\npublic:\n    bool allocHandle(const SkImageInfo& info, Rec* rec) override {\n        char* context = new char[4]{'s', 'k', 'i', 'a'};\n        rec->fReleaseProc = DeleteCallback;\n        rec->fReleaseCtx = context;\n        rec->fHandle = context;\n        rec->fPixels = context;\n        rec->fRowBytes = 4;\n        return true;\n    }\n    void updateHandle(Handle handle, const SkMatrix& ctm, const SkIRect& clip_bounds) override {\n        // apply canvas matrix and clip to custom environment\n    }\n};\n\nvoid draw(SkCanvas* canvas) {\n    const SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1);\n    std::unique_ptr<SkCanvas> c2 =\n            SkRasterHandleAllocator::MakeCanvas(std::unique_ptr<CustomAllocator>(\n            new CustomAllocator()), info);\n    char* context = (char*) c2->accessTopRasterHandle();\n    SkDebugf(\"context = %.4s\\n\", context);\n}\n",
+    "hash": "4486d0c0b22ad2931db130f42da4c80c",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::accessTopRasterHandle",
+        "stdout": "context = skia\\n"
+    },
+        "SkCanvas_const_SkBitmap_const_SkSurfaceProps": {
+    "code": "void draw(SkCanvas* ) {\n    SkBitmap bitmap;\n    // create a bitmap 5 wide and 11 high\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(5, 11));\n    SkCanvas canvas(bitmap, SkSurfaceProps(0, kUnknown_SkPixelGeometry));\n    canvas.clear(SK_ColorWHITE);  // white is Unpremultiplied, in ARGB order\n    SkPixmap pixmap;  // provides guaranteed access to the drawn pixels\n    if (!canvas.peekPixels(&pixmap)) {\n        SkDebugf(\"peekPixels should never fail.\\n\");\n    }\n    const SkPMColor* pixels = pixmap.addr32();  // points to top-left of bitmap\n    SkPMColor pmWhite = pixels[0];  // the Premultiplied format may vary\n    SkPaint paint;  // by default, draws black, 12 point text\n    canvas.drawString(\"!\", 1, 10, paint);  // 1 char at baseline (1, 10)\n    for (int y = 0; y < bitmap.height(); ++y) {\n        for (int x = 0; x < bitmap.width(); ++x) {\n            SkDebugf(\"%c\", *pixels++ == pmWhite ? '-' : 'x');\n        }\n        SkDebugf(\"\\n\");\n    }\n}",
+    "hash": "c26cfae4c42cb445240335cc12a50235",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::SkCanvas(const SkBitmap& bitmap, const SkSurfaceProps& props)",
+        "stdout": "-----\\n---x-\\n---x-\\n---x-\\n---x-\\n---x-\\n---x-\\n-----\\n---x-\\n---x-\\n-----\\n"
+    },
+        "SkCanvas_copy_const_SkBitmap": {
+    "code": "void draw(SkCanvas* ) {\n    SkBitmap bitmap;\n    // create a bitmap 5 wide and 11 high\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(5, 11));\n    SkCanvas canvas(bitmap);\n    canvas.clear(SK_ColorWHITE);  // white is Unpremultiplied, in ARGB order\n    SkPixmap pixmap;  // provides guaranteed access to the drawn pixels\n    if (!canvas.peekPixels(&pixmap)) {\n        SkDebugf(\"peekPixels should never fail.\\n\");\n    }\n    const SkPMColor* pixels = pixmap.addr32();  // points to top-left of bitmap\n    SkPMColor pmWhite = pixels[0];  // the Premultiplied format may vary\n    SkPaint paint;  // by default, draws black, 12 point text\n    canvas.drawString(\"!\", 1, 10, paint);  // 1 char at baseline (1, 10)\n    for (int y = 0; y < bitmap.height(); ++y) {\n        for (int x = 0; x < bitmap.width(); ++x) {\n            SkDebugf(\"%c\", *pixels++ == pmWhite ? '-' : 'x');\n        }\n        SkDebugf(\"\\n\");\n    }\n}",
+    "hash": "dd92db963af190e849894038f39b598a",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::SkCanvas(const SkBitmap& bitmap)",
+        "stdout": "-----\\n---x-\\n---x-\\n---x-\\n---x-\\n---x-\\n---x-\\n-----\\n---x-\\n---x-\\n-----\\n"
+    },
+        "SkCanvas_empty_constructor": {
+    "code": "static void check_for_rotated_ctm(const SkCanvas* canvas) {\n    const SkMatrix& matrix = canvas->getTotalMatrix();\n    SkDebugf(\"rect stays rect is %s\\n\", matrix.rectStaysRect() ? \"true\" : \"false\");\n}\n\nvoid draw(SkCanvas* canvas) {\n    check_for_rotated_ctm(canvas);\n    canvas->rotate(30);\n    check_for_rotated_ctm(canvas);\n    SkCanvas defaultCanvas;\n    check_for_rotated_ctm(&defaultCanvas);\n}\n",
+    "hash": "4a00e6589e862fde5be532f4b6e316ce",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::SkCanvas()",
+        "stdout": "rect stays rect is true\\nrect stays rect is false\\nrect stays rect is true\\n"
+    },
+        "SkCanvas_getBaseLayerSize": {
+    "code": "void draw(SkCanvas* ) {\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(20, 30));\n    SkCanvas canvas(bitmap, SkSurfaceProps(0, kUnknown_SkPixelGeometry));\n    canvas.clipRect(SkRect::MakeWH(10, 40));\n    SkIRect clipDeviceBounds = canvas.getDeviceClipBounds();\n    if (clipDeviceBounds.isEmpty()) {\n        SkDebugf(\"Empty clip bounds is unexpected!\\n\");\n    }\n    SkDebugf(\"clip=%d,%d\\n\", clipDeviceBounds.width(), clipDeviceBounds.height());\n    SkISize baseLayerSize = canvas.getBaseLayerSize();\n    SkDebugf(\"size=%d,%d\\n\", baseLayerSize.width(), baseLayerSize.height());\n}",
+    "hash": "374e245d91cd729eca48fd20e631fdf3",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::getBaseLayerSize",
+        "stdout": "clip=10,30\\nsize=20,30\\n"
+    },
+        "SkCanvas_getDeviceClipBounds": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkCanvas device(256, 256);\n    canvas = &device;\n    SkIRect bounds = canvas->getDeviceClipBounds();\n    SkDebugf(\"left:%d  top:%d  right:%d  bottom:%d\\n\",\n            bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);\n    SkPoint clipPoints[]  = {{30, 130}, {120, 130}, {120, 230} };\n    SkPath clipPath;\n    clipPath.addPoly(clipPoints, SK_ARRAY_COUNT(clipPoints), true);\n    canvas->save();\n    canvas->clipPath(clipPath);\n    bounds = canvas->getDeviceClipBounds();\n    SkDebugf(\"left:%d  top:%d  right:%d  bottom:%d\\n\",\n            bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);\n    canvas->restore();\n    canvas->scale(1.f/2, 1.f/2);\n    canvas->clipPath(clipPath);\n    bounds = canvas->getDeviceClipBounds();\n    SkDebugf(\"left:%d  top:%d  right:%d  bottom:%d\\n\",\n            bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);\n}\n",
+    "hash": "556832ac5711af662a98c21c547185e9",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::getDeviceClipBounds",
+        "stdout": "left:0  top:0  right:256  bottom:256\\nleft:30  top:130  right:120  bottom:230\\nleft:15  top:65  right:60  bottom:115\\n"
+    },
+        "SkCanvas_getDeviceClipBounds_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect bounds;\n    SkDebugf(\"device bounds empty = %s\\n\", canvas->getDeviceClipBounds(&bounds)\n             ? \"false\" : \"true\");\n    SkPath path;\n    canvas->clipPath(path);\n    SkDebugf(\"device bounds empty = %s\\n\", canvas->getDeviceClipBounds(&bounds)\n             ? \"false\" : \"true\");\n}\n",
+    "hash": "6abb99f849a1f0e33e1dedc00d1c4f7a",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::getDeviceClipBounds_2",
+        "stdout": "device bounds empty = false\\ndevice bounds empty = true\\n"
+    },
+        "SkCanvas_getLocalClipBounds": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkCanvas local(256, 256);\n    canvas = &local;\n    SkRect bounds = canvas->getLocalClipBounds();\n    SkDebugf(\"left:%g  top:%g  right:%g  bottom:%g\\n\",\n            bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);\n    SkPoint clipPoints[]  = {{30, 130}, {120, 130}, {120, 230} };\n    SkPath clipPath;\n    clipPath.addPoly(clipPoints, SK_ARRAY_COUNT(clipPoints), true);\n    canvas->clipPath(clipPath);\n    bounds = canvas->getLocalClipBounds();\n    SkDebugf(\"left:%g  top:%g  right:%g  bottom:%g\\n\",\n            bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);\n    canvas->scale(2, 2);\n    bounds = canvas->getLocalClipBounds();\n    SkDebugf(\"left:%g  top:%g  right:%g  bottom:%g\\n\",\n            bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);\n}",
+    "hash": "7f60cb030d3f9b2473adbe3e34b19d91",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::getLocalClipBounds",
+        "stdout": "left:-1  top:-1  right:257  bottom:257\\nleft:29  top:129  right:121  bottom:231\\nleft:14.5  top:64.5  right:60.5  bottom:115.5\\n"
+    },
+        "SkCanvas_getLocalClipBounds_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkCanvas local(256, 256);\n    canvas = &local;\n    SkRect bounds;\n    SkDebugf(\"local bounds empty = %s\\n\", canvas->getLocalClipBounds(&bounds)\n             ? \"false\" : \"true\");\n    SkPath path;\n    canvas->clipPath(path);\n    SkDebugf(\"local bounds empty = %s\\n\", canvas->getLocalClipBounds(&bounds)\n             ? \"false\" : \"true\");\n}\n",
+    "hash": "85496614e90c66b020f8a70db8d06f4a",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::getLocalClipBounds_2",
+        "stdout": "local bounds empty = false\\nlocal bounds empty = true\\n"
+    },
+        "SkCanvas_getMetaData": {
+    "code": "void draw(SkCanvas* ) {\n    const char* kHelloMetaData = \"HelloMetaData\";\n    SkCanvas canvas;\n    SkMetaData& metaData = canvas.getMetaData();\n    SkDebugf(\"before: %s\\n\", metaData.findString(kHelloMetaData));\n    metaData.setString(kHelloMetaData, \"Hello!\");\n    SkDebugf(\"during: %s\\n\", metaData.findString(kHelloMetaData));\n    metaData.removeString(kHelloMetaData);\n    SkDebugf(\"after: %s\\n\", metaData.findString(kHelloMetaData));\n}",
+    "hash": "1598396056045e8d0c583b748293d652",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::getMetaData",
+        "stdout": "before: (null)\\nduring: Hello!\\nafter: (null)\\n"
+    },
+        "SkCanvas_getProps": {
+    "code": "void draw(SkCanvas* ) {\n    SkBitmap bitmap;\n    SkCanvas canvas(bitmap, SkSurfaceProps(0, kRGB_V_SkPixelGeometry));\n    SkSurfaceProps surfaceProps(0, kUnknown_SkPixelGeometry);\n    SkDebugf(\"isRGB:%d\\n\", SkPixelGeometryIsRGB(surfaceProps.pixelGeometry()));\n    if (!canvas.getProps(&surfaceProps)) {\n        SkDebugf(\"getProps failed unexpectedly.\\n\");\n    }\n    SkDebugf(\"isRGB:%d\\n\", SkPixelGeometryIsRGB(surfaceProps.pixelGeometry()));\n}",
+    "hash": "0fbf2dedc2619bbfbf173c9e3bc1a508",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::getProps",
+        "stdout": "isRGB:0\\nisRGB:1\\n"
+    },
+        "SkCanvas_getSaveCount": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkCanvas simple;\n    SkDebugf(\"depth = %d\\n\", simple.getSaveCount());\n    simple.save();\n    SkDebugf(\"depth = %d\\n\", simple.getSaveCount());\n    simple.restore();\n    SkDebugf(\"depth = %d\\n\", simple.getSaveCount());\n}\n",
+    "hash": "005f2b207e078baac596681924fe591e",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::getSaveCount",
+        "stdout": "depth = 1\\ndepth = 2\\ndepth = 1\\n"
+    },
+        "SkCanvas_getTotalMatrix": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkDebugf(\"isIdentity %s\\n\", canvas->getTotalMatrix().isIdentity() ? \"true\" : \"false\");\n}",
+    "hash": "c0d5fa544759704768f47cac91ae3832",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::getTotalMatrix",
+        "stdout": "isIdentity true\\n"
+    },
+        "SkCanvas_imageInfo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkCanvas emptyCanvas;\n    SkImageInfo canvasInfo = emptyCanvas.imageInfo();\n    SkImageInfo emptyInfo;\n    SkDebugf(\"emptyInfo %c= canvasInfo\\n\", emptyInfo == canvasInfo ? '=' : '!');\n}",
+    "hash": "d93389d971f8084c4ccc7a66e4e157ee",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::imageInfo",
+        "stdout": "emptyInfo == canvasInfo\\n"
+    },
+        "SkCanvas_int_int_const_SkSurfaceProps_star": {
+    "code": "void draw(SkCanvas* ) {\n    SkCanvas canvas(10, 20);  // 10 units wide, 20 units high\n    canvas.clipRect(SkRect::MakeXYWH(30, 40, 5, 10));  // clip is outside canvas' device\n    SkDebugf(\"canvas %s empty\\n\", canvas.getDeviceClipBounds().isEmpty() ? \"is\" : \"is not\");\n}",
+    "hash": "ce6a5ef2df447970b4453489d9d67930",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::SkCanvas(int width, int height, const SkSurfaceProps* props = nullptr)",
+        "stdout": "canvas is empty\\n"
+    },
+        "SkCanvas_isClipEmpty": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkDebugf(\"clip is%s empty\\n\", canvas->isClipEmpty() ? \"\" : \" not\");\n    SkPath path;\n    canvas->clipPath(path);\n    SkDebugf(\"clip is%s empty\\n\", canvas->isClipEmpty() ? \"\" : \" not\");\n}\n",
+    "hash": "f106f146a58c8604308d4d8d7086d2f5",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::isClipEmpty",
+        "stdout": "clip is not empty\\nclip is empty\\n"
+    },
+        "SkCanvas_isClipRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkDebugf(\"clip is%s rect\\n\", canvas->isClipRect() ? \"\" : \" not\");\n    canvas->clipRect({0, 0, 0, 0});\n    SkDebugf(\"clip is%s rect\\n\", canvas->isClipRect() ? \"\" : \" not\");\n}\n",
+    "hash": "9894bfb476c78a8f6c8f49fbbca3d50d",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::isClipRect",
+        "stdout": "clip is rect\\nclip is not rect\\n"
+    },
+        "SkCanvas_makeSurface": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(5, 6);\n    SkCanvas* smallCanvas = surface->getCanvas();\n    SkImageInfo imageInfo = SkImageInfo::MakeN32Premul(3, 4);\n    sk_sp<SkSurface> compatible = smallCanvas->makeSurface(imageInfo);\n    SkDebugf(\"compatible %c= nullptr\\n\", compatible == nullptr ? '=' : '!');\n    SkDebugf(\"size = %d, %d\\n\", compatible->width(), compatible->height());\n}",
+    "hash": "1ce28351444b41ab2b8e3128a4b9b9c2",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::makeSurface",
+        "stdout": "compatible != nullptr\\nsize = 3, 4\\n"
+    },
+        "SkCanvas_peekPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPixmap pixmap;\n    if (canvas->peekPixels(&pixmap)) {\n        SkDebugf(\"width=%d height=%d\\n\", pixmap.bounds().width(), pixmap.bounds().height());\n    }\n}",
+    "hash": "e9411d676d1fa13b46331abe9e14ad3e",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::peekPixels",
+        "stdout": "width=256 height=256\\n"
+    },
+        "SkCanvas_quickReject": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect testRect = {30, 30, 120, 129 };\n    SkRect clipRect = {30, 130, 120, 230 };\n    canvas->save();\n    canvas->clipRect(clipRect);\n    SkDebugf(\"quickReject %s\\n\", canvas->quickReject(testRect) ? \"true\" : \"false\");\n    canvas->restore();\n    canvas->rotate(10);\n    canvas->clipRect(clipRect);\n    SkDebugf(\"quickReject %s\\n\", canvas->quickReject(testRect) ? \"true\" : \"false\");\n}\n",
+    "hash": "cfe4016241074477809dd45435be9cf4",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::quickReject",
+        "stdout": "quickReject true\\nquickReject false\\n"
+    },
+        "SkCanvas_quickReject_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint testPoints[] = {{30,  30}, {120,  30}, {120, 129} };\n    SkPoint clipPoints[] = {{30, 130}, {120, 130}, {120, 230} };\n    SkPath testPath, clipPath;\n    testPath.addPoly(testPoints, SK_ARRAY_COUNT(testPoints), true);\n    clipPath.addPoly(clipPoints, SK_ARRAY_COUNT(clipPoints), true);\n    canvas->save();\n    canvas->clipPath(clipPath);\n    SkDebugf(\"quickReject %s\\n\", canvas->quickReject(testPath) ? \"true\" : \"false\");\n    canvas->restore();\n    canvas->rotate(10);\n    canvas->clipPath(clipPath);\n    SkDebugf(\"quickReject %s\\n\", canvas->quickReject(testPath) ? \"true\" : \"false\");\n}\n",
+    "hash": "56dcd14f943aea6f7d7aafe0de7e6c25",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::quickReject_2",
+        "stdout": "quickReject true\\nquickReject false\\n"
+    },
+        "SkCanvas_readPixels_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->clear(0x8055aaff);\n    uint32_t pixels[1] = { 0 };\n    SkPixmap pixmap(SkImageInfo::MakeN32Premul(1, 1), pixels, 4);\n    canvas->readPixels(pixmap, 0, 0);\n    SkDebugf(\"pixel = %08x\\n\", pixels[0]);\n}\n",
+    "hash": "85f199032943b6483722c34a91c4e20f",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::readPixels_2",
+        "stdout": "pixel = 802b5580\\n"
+    },
+        "SkCanvas_readPixels_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->clear(0x8055aaff);\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(1, 1));\n    canvas->readPixels(bitmap, 0, 0);\n    SkDebugf(\"pixel = %08x\\n\", bitmap.getAddr32(0, 0)[0]);\n}\n",
+    "hash": "af6dec8ef974aa67bf102f29915bcd6a",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::readPixels_3",
+        "stdout": "pixel = 802b5580\\n"
+    },
+        "SkCanvas_readPixels_a": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->clear(0x8055aaff);\n    for (SkAlphaType alphaType : { kPremul_SkAlphaType, kUnpremul_SkAlphaType } ) {\n        uint32_t pixel = 0;\n        SkImageInfo info = SkImageInfo::Make(1, 1, kBGRA_8888_SkColorType, alphaType);\n        if (canvas->readPixels(info, &pixel, 4, 0, 0)) {\n            SkDebugf(\"pixel = %08x\\n\", pixel);\n        }\n    }\n}",
+    "hash": "481e990e923a0ed34654f4361b94f096",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::readPixels_2",
+        "stdout": "pixel = 802b5580\\npixel = 8056a9ff\\n"
+    },
+        "SkCanvas_restore": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkCanvas simple;\n    SkDebugf(\"depth = %d\\n\", simple.getSaveCount());\n    simple.restore();\n    SkDebugf(\"depth = %d\\n\", simple.getSaveCount());\n}\n",
+    "hash": "e78471212a67f2f4fd39496e17a30d17",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::restore()",
+        "stdout": "depth = 1\\ndepth = 1\\n"
+    },
+        "SkCanvas_restoreToCount": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkDebugf(\"depth = %d\\n\", canvas->getSaveCount());\n    canvas->save();\n    canvas->save();\n    SkDebugf(\"depth = %d\\n\", canvas->getSaveCount());\n    canvas->restoreToCount(0);\n    SkDebugf(\"depth = %d\\n\", canvas->getSaveCount());\n}\n",
+    "hash": "9ed0d56436e114c7097fd49eed1aea47",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::restoreToCount",
+        "stdout": "depth = 1\\ndepth = 3\\ndepth = 1\\n"
+    },
+        "SkIPoint_Make": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIPoint pt1 = {45, 66};\n    SkIPoint pt2 = SkIPoint::Make(45, 66);\n    SkDebugf(\"pt1 %c= pt2\\n\", pt1 == pt2 ? '=' : '!');\n}",
+    "hash": "e5cf5159525bd3140f288a95fe641fae",
+    "file": "SkIPoint_Reference",
+    "name": "SkIPoint::Make",
+        "stdout": "pt1 == pt2\\n"
+    },
+        "SkIPoint_equal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIPoint test[] = { {0, -0}, {-1, -2}, {SK_MaxS32, -1}, {SK_NaN32, -1} };\n    for (const SkIPoint& pt : test) {\n        SkDebugf(\"pt: %d, %d  %c= pt\\n\", pt.fX, pt.fY, pt == pt ? '=' : '!');\n    }\n}",
+    "hash": "37ffe2817d720f99e6c252332ce70460",
+    "file": "SkIPoint_Reference",
+    "name": "SkIPoint::operator==(const SkIPoint& a, const SkIPoint& b)",
+        "stdout": "pt: 0, 0  == pt\\npt: -1, -2  == pt\\npt: 2147483647, -1  == pt\\npt: -2147483648, -1  == pt\\n"
+    },
+        "SkIPoint_equals": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIPoint test[] = { {0, -0}, {-1, -2}, {SK_MaxS32, -1}, {SK_NaN32, -1} };\n    for (const SkIPoint& pt : test) {\n        SkDebugf(\"pt: %d, %d  %c= pt\\n\", pt.fX, pt.fY, pt.equals(pt.fX, pt.fY) ? '=' : '!');\n    }\n}",
+    "hash": "64f575d36439d5b69aaed14ffeff1cc4",
+    "file": "SkIPoint_Reference",
+    "name": "SkIPoint::equals()",
+        "stdout": "pt: 0, 0  == pt\\npt: -1, -2  == pt\\npt: 2147483647, -1  == pt\\npt: -2147483648, -1  == pt\\n"
+    },
+        "SkIPoint_isZero": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIPoint pt = { 0, -0};\n    SkDebugf(\"pt.isZero() == %s\\n\", pt.isZero() ? \"true\" : \"false\");\n}",
+    "hash": "658c1df611b4577cc7e0bb384e95737e",
+    "file": "SkIPoint_Reference",
+    "name": "SkIPoint::isZero",
+        "stdout": "pt.isZero() == true\\n"
+    },
+        "SkIPoint_minus_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIPoint test[] = { {0, -0}, {-1, -2},\n                       { SK_MaxS32, SK_MinS32 },\n                       { SK_NaN32, SK_NaN32 } };\n    for (const SkIPoint& pt : test) {\n        SkIPoint negPt = -pt;\n        SkDebugf(\"pt: %d, %d  negate: %d, %d\\n\", pt.fX, pt.fY, negPt.fX, negPt.fY);\n    }\n}",
+    "hash": "b30d4780475d113a7fed3637af7f0db1",
+    "file": "SkIPoint_Reference",
+    "name": "SkIPoint::operator-() const",
+        "stdout": "pt: 0, 0  negate: 0, 0\\npt: -1, -2  negate: 1, 2\\npt: 2147483647, -2147483647  negate: -2147483647, 2147483647\\npt: -2147483648, -2147483648  negate: -2147483648, -2147483648\\n"
+    },
+        "SkIPoint_notequal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIPoint test[] = { {0, -0}, {-1, -2}, {SK_MaxS32, -1}, {SK_NaN32, -1} };\n    for (const SkIPoint& pt : test) {\n        SkDebugf(\"pt: %d, %d  %c= pt\\n\", pt.fX, pt.fY, pt != pt ? '!' : '=');\n    }\n}",
+    "hash": "dd89dc48dff69b53d99530b120f204bc",
+    "file": "SkIPoint_Reference",
+    "name": "SkIPoint::operator!=(const SkIPoint& a, const SkIPoint& b)",
+        "stdout": "pt: 0, 0  == pt\\npt: -1, -2  == pt\\npt: 2147483647, -1  == pt\\npt: -2147483648, -1  == pt\\n"
+    },
+        "SkIPoint_set": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIPoint pt1, pt2 = { SK_MinS32, SK_MaxS32 };\n    pt1.set(SK_MinS32, SK_MaxS32);\n    SkDebugf(\"pt1 %c= pt2\\n\", pt1 == pt2 ? '=' : '!');\n}",
+    "hash": "165418b5718d79d8f1682a8a0ee32ba0",
+    "file": "SkIPoint_Reference",
+    "name": "SkIPoint::set()",
+        "stdout": "pt1 == pt2\\n"
+    },
+        "SkIPoint_x": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIPoint pt1 = {45, 66};\n    SkDebugf(\"pt1.fX %c= pt1.x()\\n\", pt1.fX == pt1.x() ? '=' : '!');\n}",
+    "hash": "eed4185294f8a8216fc354e6ee6b2e3a",
+    "file": "SkIPoint_Reference",
+    "name": "SkIPoint::x()",
+        "stdout": "pt1.fX == pt1.x()\\n"
+    },
+        "SkIPoint_y": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIPoint pt1 = {45, 66};\n    SkDebugf(\"pt1.fY %c= pt1.y()\\n\", pt1.fY == pt1.y() ? '=' : '!');\n}",
+    "hash": "35c41b8ba7cebf8c9a7a8494e610e14d",
+    "file": "SkIPoint_Reference",
+    "name": "SkIPoint::y()",
+        "stdout": "pt1.fY == pt1.y()\\n"
+    },
+        "SkIRect_EmptyIRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    const SkIRect& rect = SkIRect::EmptyIRect();\n    SkDebugf(\"rect: %d, %d, %d, %d\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "65e0b9b52e907902630577941fb3ed6d",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::EmptyIRect",
+        "stdout": "rect: 0, 0, 0, 0\\n"
+    },
+        "SkIRect_Intersects": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkDebugf(\"%s intersection\", SkIRect::Intersects({10, 40, 50, 80}, {30, 60, 70, 90}) ? \"\" : \"no \");\n}",
+    "hash": "0c67cf8981389efc7108369fb9b7976b",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::Intersects",
+        "stdout": "intersection"
+    },
+        "SkIRect_IntersectsNoEmptyCheck": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkDebugf(\"%s intersection\", SkIRect::IntersectsNoEmptyCheck(\n            {10, 40, 50, 80}, {30, 60, 70, 90}) ? \"\" : \"no \");\n}",
+    "hash": "dba234d15162fb5b26e1a96529ca6a2a",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::IntersectsNoEmptyCheck",
+        "stdout": "intersection"
+    },
+        "SkIRect_MakeEmpty": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = SkIRect::MakeEmpty();\n    SkDebugf(\"MakeEmpty isEmpty: %s\\n\", rect.isEmpty() ? \"true\" : \"false\");\n    rect.offset(10, 10);\n    SkDebugf(\"offset rect isEmpty: %s\\n\", rect.isEmpty() ? \"true\" : \"false\");\n    rect.inset(10, 10);\n    SkDebugf(\"inset rect isEmpty: %s\\n\", rect.isEmpty() ? \"true\" : \"false\");\n    rect.outset(20, 20);\n    SkDebugf(\"outset rect isEmpty: %s\\n\", rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "0ade3971c1d2616564992e286966ec8a",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::MakeEmpty",
+        "stdout": "MakeEmpty isEmpty: true\\noffset rect isEmpty: true\\ninset rect isEmpty: true\\noutset rect isEmpty: false\\n"
+    },
+        "SkIRect_MakeLTRB": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = SkIRect::MakeLTRB(5, 35, 15, 25);\n    SkDebugf(\"rect: %d, %d, %d, %d  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n    rect.sort();\n    SkDebugf(\"rect: %d, %d, %d, %d  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "ec1473b700c594f2df9749a12a06b89b",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::MakeLTRB",
+        "stdout": "rect: 5, 35, 15, 25  isEmpty: true\\nrect: 5, 25, 15, 35  isEmpty: false\\n"
+    },
+        "SkIRect_MakeSize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkSize size = {25.5f, 35.5f};\n    SkIRect rect = SkIRect::MakeSize(size.toRound());\n    SkDebugf(\"round width: %d  height: %d\\n\", rect.width(), rect.height());\n    rect = SkIRect::MakeSize(size.toFloor());\n    SkDebugf(\"floor width: %d  height: %d\\n\", rect.width(), rect.height());\n}",
+    "hash": "c6586ff8d24869c780169b0d19c75df6",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::MakeSize",
+        "stdout": "round width: 26  height: 36\\nfloor width: 25  height: 35\\n"
+    },
+        "SkIRect_MakeWH": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect1 = SkIRect::MakeWH(25, 35);\n    SkIRect rect2 = SkIRect::MakeSize({25, 35});\n    SkIRect rect3 = SkIRect::MakeXYWH(0, 0, 25, 35);\n    SkIRect rect4 = SkIRect::MakeLTRB(0, 0, 25, 35);\n    SkDebugf(\"all %s\" \"equal\\n\", rect1 == rect2 && rect2 == rect3 && rect3 == rect4 ?\n             \"\" : \"not \");\n}",
+    "hash": "e36827a1a6ae2b1c26e7a8a08f325a07",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::MakeWH",
+        "stdout": "all equal\\n"
+    },
+        "SkIRect_MakeXYWH": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = SkIRect::MakeXYWH(5, 35, -15, 25);\n    SkDebugf(\"rect: %d, %d, %d, %d  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n    rect.sort();\n    SkDebugf(\"rect: %d, %d, %d, %d  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "598ee14350bd1d961cae6b36fa3df17e",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::MakeXYWH",
+        "stdout": "rect: 5, 35, -10, 60  isEmpty: true\\nrect: -10, 35, 5, 60  isEmpty: false\\n"
+    },
+        "SkIRect_adjust": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 8, 11, 19, 22 };\n    rect.adjust(2, -1, 1, -2);\n    SkDebugf(\"rect: %d, %d, %d, %d\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "8dc91284493dd012cca3d0ce4c66bda4",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::adjust()",
+        "stdout": "rect: 10, 10, 20, 20\\n"
+    },
+        "SkIRect_bottom": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect unsorted = { 15, 25, 10, 5 };\n    SkDebugf(\"unsorted.fBottom: %d unsorted.bottom(): %d\\n\", unsorted.fBottom, unsorted.bottom());\n    SkIRect sorted = unsorted.makeSorted();\n    SkDebugf(\"sorted.fBottom: %d sorted.bottom(): %d\\n\", sorted.fBottom, sorted.bottom());\n}",
+    "hash": "c32afebc296054a181621648a184b8e3",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::bottom()",
+        "stdout": "unsorted.fBottom: 5 unsorted.bottom(): 5\\nsorted.fBottom: 25 sorted.bottom(): 25\\n"
+    },
+        "SkIRect_contains": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 30, 50, 40, 60 };\n    SkIPoint pts[] = { { 30, 50}, { 40, 50}, { 30, 60} };\n    for (auto pt : pts) {\n        SkDebugf(\"rect: (%d, %d, %d, %d) %s (%d, %d)\\n\",\n                 rect.left(), rect.top(), rect.right(), rect.bottom(),\n                 rect.contains(pt.x(), pt.y()) ? \"contains\" : \"does not contain\", pt.x(), pt.y());\n    }\n}",
+    "hash": "a7958a4e0668f5cf805a8e78eb57f51d",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::contains()",
+        "stdout": "rect: (30, 50, 40, 60) contains (30, 50)\\nrect: (30, 50, 40, 60) does not contain (40, 50)\\nrect: (30, 50, 40, 60) does not contain (30, 60)\\n"
+    },
+        "SkIRect_containsNoEmptyCheck": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 30, 50, 40, 60 };\n    SkIRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };\n    for (auto contained : tests) {\n        bool success = rect.containsNoEmptyCheck(\n                 contained.left(), contained.top(), contained.right(), contained.bottom());\n        SkDebugf(\"rect: (%d, %d, %d, %d) %s (%d, %d, %d, %d)\\n\",\n                 rect.left(), rect.top(), rect.right(), rect.bottom(),\n                 success ? \"contains\" : \"does not contain\",\n                 contained.left(), contained.top(), contained.right(), contained.bottom());\n    }\n}",
+    "hash": "fef2a36bee224e92500199fa9d3cbb8b",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::containsNoEmptyCheck",
+        "stdout": "rect: (30, 50, 40, 60) contains (30, 50, 31, 51)\\nrect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)\\nrect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)\\n"
+    },
+        "SkIRect_containsNoEmptyCheck_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 30, 50, 40, 60 };\n    SkIRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };\n    for (auto contained : tests) {\n        SkDebugf(\"rect: (%d, %d, %d, %d) %s (%d, %d, %d, %d)\\n\",\n                 rect.left(), rect.top(), rect.right(), rect.bottom(),\n                 rect.containsNoEmptyCheck(contained) ? \"contains\" : \"does not contain\",\n                 contained.left(), contained.top(), contained.right(), contained.bottom());\n    }\n}",
+    "hash": "8f91f58001d9c10420eb146fbc169af4",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::containsNoEmptyCheck_2",
+        "stdout": "rect: (30, 50, 40, 60) contains (30, 50, 31, 51)\\nrect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)\\nrect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)\\n"
+    },
+        "SkIRect_contains_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 30, 50, 40, 60 };\n    SkIRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };\n    for (auto contained : tests) {\n        bool success = rect.contains(\n                       contained.left(), contained.top(), contained.right(), contained.bottom());\n        SkDebugf(\"rect: (%d, %d, %d, %d) %s (%d, %d, %d, %d)\\n\",\n                 rect.left(), rect.top(), rect.right(), rect.bottom(),\n                 success ? \"contains\" : \"does not contain\",\n                 contained.left(), contained.top(), contained.right(), contained.bottom());\n    }\n}",
+    "hash": "eae55f284818d9965ec5834747d14a48",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::contains_2",
+        "stdout": "rect: (30, 50, 40, 60) contains (30, 50, 31, 51)\\nrect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)\\nrect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)\\n"
+    },
+        "SkIRect_contains_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 30, 50, 40, 60 };\n    SkIRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };\n    for (auto contained : tests) {\n        SkDebugf(\"rect: (%d, %d, %d, %d) %s (%d, %d, %d, %d)\\n\",\n                 rect.left(), rect.top(), rect.right(), rect.bottom(),\n                 rect.contains(contained) ? \"contains\" : \"does not contain\",\n                 contained.left(), contained.top(), contained.right(), contained.bottom());\n    }\n}",
+    "hash": "ee0185db622602b4eb19583c2f42c734",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::contains_3",
+        "stdout": "rect: (30, 50, 40, 60) contains (30, 50, 31, 51)\\nrect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)\\nrect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)\\n"
+    },
+        "SkIRect_contains_4": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 30, 50, 40, 60 };\n    SkRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };\n    for (auto contained : tests) {\n        SkDebugf(\"rect: (%d, %d, %d, %d) %s (%g, %g, %g, %g)\\n\",\n                 rect.left(), rect.top(), rect.right(), rect.bottom(),\n                 rect.contains(contained) ? \"contains\" : \"does not contain\",\n                 contained.left(), contained.top(), contained.right(), contained.bottom());\n    }\n}",
+    "hash": "acbd79ffb304f332e4b38ef18e19663e",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::contains_4",
+        "stdout": "rect: (30, 50, 40, 60) contains (30, 50, 31, 51)\\nrect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)\\nrect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)\\n"
+    },
+        "SkIRect_equal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect test = {0, 0, 2, 2};\n    SkIRect sorted = test.makeSorted();\n    SkDebugf(\"test %c= sorted\\n\", test == sorted ? '=' : '!');\n}",
+    "hash": "bd8f028d9051062816c9116fea4237b2",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::operator==(const SkIRect& a, const SkIRect& b)",
+        "stdout": "test == sorted\\n"
+    },
+        "SkIRect_height": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect unsorted = { 15, 25, 10, 20 };\n    SkDebugf(\"unsorted height: %d\\n\", unsorted.height());\n    SkIRect large = { 1, -2147483647, 2, 2147483644 };\n    SkDebugf(\"large height: %d\\n\", large.height());\n}",
+    "hash": "0175bae87fafcd9433ae661574695586",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::height()",
+        "stdout": "unsorted height: -5\\nlarge height: -5\\n"
+    },
+        "SkIRect_height64": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect large = { 1, -2147483647, 2, 2147483644 };\n    SkDebugf(\"height: %d height64: %lld\\n\", large.height(), large.height64());\n}",
+    "hash": "02dd98716e54bbd8c2f0ff23b7ef98cf",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::height64",
+        "stdout": "height: -5 height64: 4294967291\\n"
+    },
+        "SkIRect_inset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 10, 14, 50, 73 };\n    rect.inset(5, 13);\n    SkDebugf(\"rect: %d, %d, %d, %d\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "9debaded1aa8bdf5077a4de0b3015b8f",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::inset()",
+        "stdout": "rect: 15, 27, 45, 60\\n"
+    },
+        "SkIRect_intersect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect leftRect =  { 10, 40, 50, 80 };\n    SkIRect rightRect = { 30, 60, 70, 90 };\n    SkDebugf(\"%s intersection: \", leftRect.intersect(rightRect) ? \"\" : \"no \");\n    SkDebugf(\"%d, %d, %d, %d\\n\", leftRect.left(), leftRect.top(),\n                                 leftRect.right(), leftRect.bottom());\n}",
+    "hash": "ea233f5d5d1ae0e76fc6f2eb371c927a",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::intersect()",
+        "stdout": "intersection: 30, 60, 50, 80\\n"
+    },
+        "SkIRect_intersectNoEmptyCheck": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect result;\n    if (result.intersectNoEmptyCheck({ 10, 40, 50, 80 }, { 30, 60, 70, 90 })) {\n        SkDebugf(\"intersection: %d, %d, %d, %d\\n\",\n                 result.left(), result.top(), result.right(), result.bottom());\n    }\n}",
+    "hash": "d35fbc9fdea71df8b8a12fd3da50d11c",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::intersectNoEmptyCheck",
+        "stdout": "intersection: 30, 60, 50, 80\\n"
+    },
+        "SkIRect_intersect_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect result;\n    bool intersected = result.intersect({ 10, 40, 50, 80 }, { 30, 60, 70, 90 });\n    SkDebugf(\"%s intersection: %d, %d, %d, %d\\n\", intersected ? \"\" : \"no \",\n             result.left(), result.top(), result.right(), result.bottom());\n}",
+    "hash": "b2db0573aacf99ca52776c5522459d02",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::intersect_2",
+        "stdout": "intersection: 30, 60, 50, 80\\n"
+    },
+        "SkIRect_intersect_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect leftRect =  { 10, 40, 50, 80 };\n    SkDebugf(\"%s intersection: \", leftRect.intersect(30, 60, 70, 90) ? \"\" : \"no \");\n    SkDebugf(\"%d, %d, %d, %d\\n\", leftRect.left(), leftRect.top(),\n                                 leftRect.right(), leftRect.bottom());\n}",
+    "hash": "200422990eded2f754ab9893118f2645",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::intersect_3",
+        "stdout": "intersection: 30, 60, 50, 80\\n"
+    },
+        "SkIRect_isEmpty": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect tests[] = {{20, 40, 10, 50}, {20, 40, 20, 50}};\n    for (auto rect : tests) {\n        SkDebugf(\"rect: {%d, %d, %d, %d} is\" \"%s empty\\n\", rect.left(), rect.top(), rect.right(),\n                 rect.bottom(), rect.isEmpty() ? \"\" : \" not\");\n        rect.sort();\n        SkDebugf(\"sorted: {%d, %d, %d, %d} is\" \"%s empty\\n\", rect.left(), rect.top(), rect.right(),\n                 rect.bottom(), rect.isEmpty() ? \"\" : \" not\");\n    }\n}",
+    "hash": "edaad064b6de249b7a7c768dfa000adc",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::isEmpty",
+        "stdout": "rect: {20, 40, 10, 50} is empty\\nsorted: {10, 40, 20, 50} is not empty\\nrect: {20, 40, 20, 50} is empty\\nsorted: {20, 40, 20, 50} is empty\\n"
+    },
+        "SkIRect_isEmpty64": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect tests[] = {{20, 40, 10, 50}, {20, 40, 20, 50}};\n    for (auto rect : tests) {\n        SkDebugf(\"rect: {%d, %d, %d, %d} is\" \"%s empty\\n\", rect.left(), rect.top(), rect.right(),\n                rect.bottom(), rect.isEmpty64() ? \"\" : \" not\");\n        rect.sort();\n        SkDebugf(\"sorted: {%d, %d, %d, %d} is\" \"%s empty\\n\", rect.left(), rect.top(), rect.right(),\n                rect.bottom(), rect.isEmpty64() ? \"\" : \" not\");\n    }\n}",
+    "hash": "eb905faa1084ccab3ad0605df4c27ea4",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::isEmpty64",
+        "stdout": "rect: {20, 40, 10, 50} is empty\\nsorted: {10, 40, 20, 50} is not empty\\nrect: {20, 40, 20, 50} is empty\\nsorted: {20, 40, 20, 50} is empty\\n"
+    },
+        "SkIRect_join": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 10, 20, 15, 25};\n    rect.join(50, 60, 55, 65);\n    SkDebugf(\"join: %d, %d, %d, %d\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "c00ef06289d21db70340e465690e0e08",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::join()",
+        "stdout": "join: 10, 20, 55, 65\\n"
+    },
+        "SkIRect_join_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 10, 20, 15, 25};\n    rect.join({50, 60, 55, 65});\n    SkDebugf(\"join: %d, %d, %d, %d\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "75fd81c1d3512e63890d085593018876",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::join_2",
+        "stdout": "join: 10, 20, 55, 65\\n"
+    },
+        "SkIRect_left": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect unsorted = { 15, 5, 10, 25 };\n    SkDebugf(\"unsorted.fLeft: %d unsorted.left(): %d\\n\", unsorted.fLeft, unsorted.left());\n    SkIRect sorted = unsorted.makeSorted();\n    SkDebugf(\"sorted.fLeft: %d sorted.left(): %d\\n\", sorted.fLeft, sorted.left());\n}",
+    "hash": "caf38ea4431bc246ba198f6a8c2b0f01",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::left()",
+        "stdout": "unsorted.fLeft: 15 unsorted.left(): 15\\nsorted.fLeft: 10 sorted.left(): 10\\n"
+    },
+        "SkIRect_makeInset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 10, 50, 20, 60 };\n    SkDebugf(\"rect: %d, %d, %d, %d  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n    rect = rect.makeInset(15, 32);\n    SkDebugf(\"rect: %d, %d, %d, %d  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "1db94b2c76e0a7a71856532335fa56b6",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::makeInset",
+        "stdout": "rect: 10, 50, 20, 60  isEmpty: false\\nrect: 25, 82, 5, 28  isEmpty: true\\n"
+    },
+        "SkIRect_makeOffset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 10, 50, 20, 60 };\n    SkDebugf(\"rect: %d, %d, %d, %d  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n    rect = rect.makeOffset(15, 32);\n    SkDebugf(\"rect: %d, %d, %d, %d  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "737c747df07ddf392c05970440de0927",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::makeOffset",
+        "stdout": "rect: 10, 50, 20, 60  isEmpty: false\\nrect: 25, 82, 35, 92  isEmpty: false\\n"
+    },
+        "SkIRect_makeOutset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 10, 50, 20, 60 };\n    SkDebugf(\"rect: %d, %d, %d, %d  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n    rect = rect.makeOutset(15, 32);\n    SkDebugf(\"rect: %d, %d, %d, %d  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "240e2953e3455c08f6d89255feff8416",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::makeOutset",
+        "stdout": "rect: 10, 50, 20, 60  isEmpty: false\\nrect: -5, 18, 35, 92  isEmpty: false\\n"
+    },
+        "SkIRect_makeSorted": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 30, 50, 20, 10 };\n    SkDebugf(\"rect: %d, %d, %d, %d\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n    SkIRect sort = rect.makeSorted();\n    SkDebugf(\"sorted: %d, %d, %d, %d\\n\", sort.fLeft, sort.fTop, sort.fRight, sort.fBottom);\n}",
+    "hash": "de89926c374aa16427916900b89a3441",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::makeSorted",
+        "stdout": "rect: 30, 50, 20, 10\\nsorted: 20, 10, 30, 50\\n"
+    },
+        "SkIRect_notequal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect test = {2, 2, 0, 0};\n    SkIRect sorted = test.makeSorted();\n    SkDebugf(\"test %c= sorted\\n\", test != sorted ? '!' : '=');\n}",
+    "hash": "6c4acd8aa203f632b7d85cae672abf4d",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::operator!=(const SkIRect& a, const SkIRect& b)",
+        "stdout": "test != sorted\\n"
+    },
+        "SkIRect_offset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 10, 14, 50, 73 };\n    rect.offset(5, 13);\n    SkDebugf(\"rect: %d, %d, %d, %d\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "77e633b2174ffae923c038b303418b50",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::offset()",
+        "stdout": "rect: 15, 27, 55, 86\\n"
+    },
+        "SkIRect_offsetTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 10, 14, 50, 73 };\n    rect.offsetTo(15, 27);\n    SkDebugf(\"rect: %d, %d, %d, %d\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "a2734ff23b35653956a3002e5c29ff91",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::offsetTo",
+        "stdout": "rect: 15, 27, 55, 86\\n"
+    },
+        "SkIRect_offset_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 10, 14, 50, 73 };\n    rect.offset({5, 13});\n    SkDebugf(\"rect: %d, %d, %d, %d\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "31a4c575499e76def651eb65994876f0",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::offset_2",
+        "stdout": "rect: 15, 27, 55, 86\\n"
+    },
+        "SkIRect_outset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 10, 14, 50, 73 };\n    rect.outset(5, 13);\n    SkDebugf(\"rect: %d, %d, %d, %d\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "3fc62ca29428195f33a3a02b3eb74e4f",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::outset()",
+        "stdout": "rect: 5, 1, 55, 86\\n"
+    },
+        "SkIRect_right": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect unsorted = { 15, 25, 10, 5 };\n    SkDebugf(\"unsorted.fRight: %d unsorted.right(): %d\\n\", unsorted.fRight, unsorted.right());\n    SkIRect sorted = unsorted.makeSorted();\n    SkDebugf(\"sorted.fRight: %d sorted.right(): %d\\n\", sorted.fRight, sorted.right());\n}",
+    "hash": "97e210976f1ee0387b30c70635cf114f",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::right()",
+        "stdout": "unsorted.fRight: 10 unsorted.right(): 10\\nsorted.fRight: 15 sorted.right(): 15\\n"
+    },
+        "SkIRect_set": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect1 = {3, 4, 1, 2};\n    SkDebugf(\"rect1: {%d, %d, %d, %d}\\n\", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);\n    SkIRect rect2;\n    rect2.set(3, 4, 1, 2);\n    SkDebugf(\"rect2: {%d, %d, %d, %d}\\n\", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);\n}",
+    "hash": "1912c37076b7f3bf6aebfa167e971bec",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::set()",
+        "stdout": "rect1: {3, 4, 1, 2}\\nrect2: {3, 4, 1, 2}\\n"
+    },
+        "SkIRect_setEmpty": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = {3, 4, 1, 2};\n    for (int i = 0; i < 2; ++i) {\n    SkDebugf(\"rect: {%d, %d, %d, %d} is %s\" \"empty\\n\", rect.fLeft, rect.fTop,\n             rect.fRight, rect.fBottom, rect.isEmpty() ? \"\" : \"not \");\n    rect.setEmpty();\n    }\n}",
+    "hash": "94039c3cc9e911c8ab2993d56fd06210",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::setEmpty",
+        "stdout": "rect: {3, 4, 1, 2} is empty\\nrect: {0, 0, 0, 0} is empty\\n"
+    },
+        "SkIRect_setLTRB": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect1 = {3, 4, 1, 2};\n    SkDebugf(\"rect1: {%d, %d, %d, %d}\\n\", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);\n    SkIRect rect2;\n    rect2.setLTRB(3, 4, 1, 2);\n    SkDebugf(\"rect2: {%d, %d, %d, %d}\\n\", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);\n}",
+    "hash": "ead6bdcf2ae77ec19a1c5a96f5b31af8",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::setLTRB",
+        "stdout": "rect1: {3, 4, 1, 2}\\nrect2: {3, 4, 1, 2}\\n"
+    },
+        "SkIRect_setXYWH": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect;\n    rect.setXYWH(5, 35, -15, 25);\n    SkDebugf(\"rect: %d, %d, %d, %d  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n    rect.sort();\n    SkDebugf(\"rect: %d, %d, %d, %d  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "0e1db8c86678c004e504f47641b44b17",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::setXYWH",
+        "stdout": "rect: 5, 35, -10, 60  isEmpty: true\\nrect: -10, 35, 5, 60  isEmpty: false\\n"
+    },
+        "SkIRect_size": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkIRect& rect) -> void {\n        SkISize size = rect.size();\n        SkDebugf(\"%s \", prefix);\n        SkDebugf(\"rect: %d, %d, %d, %d  \", rect.left(), rect.top(), rect.right(), rect.bottom());\n        SkDebugf(\"size: %d, %d\\n\", size.width(), size.height());\n    };\n    SkIRect rect = {20, 30, 40, 50};\n    debugster(\"original\", rect);\n    rect.offset(20, 20);\n    debugster(\"  offset\", rect);\n    rect.outset(20, 20);\n    debugster(\"  outset\", rect);\n}",
+    "hash": "8b3224641cb3053a7b8a5798b6cd1cf6",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::size()",
+        "stdout": "original rect: 20, 30, 40, 50  size: 20, 20\\n  offset rect: 40, 50, 60, 70  size: 20, 20\\n  outset rect: 20, 30, 80, 90  size: 60, 60\\n"
+    },
+        "SkIRect_sort": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 30, 50, 20, 10 };\n    SkDebugf(\"rect: %d, %d, %d, %d\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n    rect.sort();\n    SkDebugf(\"sorted: %d, %d, %d, %d\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "fa12547fcfd4c1aef3db1a1f6aae0fe4",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::sort()",
+        "stdout": "rect: 30, 50, 20, 10\\nsorted: 20, 10, 30, 50\\n"
+    },
+        "SkIRect_top": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect unsorted = { 15, 25, 10, 5 };\n    SkDebugf(\"unsorted.fTop: %d unsorted.top(): %d\\n\", unsorted.fTop, unsorted.top());\n    SkIRect sorted = unsorted.makeSorted();\n    SkDebugf(\"sorted.fTop: %d sorted.top(): %d\\n\", sorted.fTop, sorted.top());\n}",
+    "hash": "cbec1ae6530e95943775450b1d11f19e",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::top()",
+        "stdout": "unsorted.fTop: 25 unsorted.top(): 25\\nsorted.fTop: 5 sorted.top(): 5\\n"
+    },
+        "SkIRect_width": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect unsorted = { 15, 25, 10, 5 };\n    SkDebugf(\"unsorted width: %d\\n\", unsorted.width());\n    SkIRect large = { -2147483647, 1, 2147483644, 2 };\n    SkDebugf(\"large width: %d\\n\", large.width());\n}",
+    "hash": "4acfbe051805940210c8916a94794142",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::width()",
+        "stdout": "unsorted width: -5\\nlarge width: -5\\n"
+    },
+        "SkIRect_width64": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect large = { -2147483647, 1, 2147483644, 2 };\n    SkDebugf(\"width: %d width64: %lld\\n\", large.width(), large.width64());\n}",
+    "hash": "63977f97999bbd6eecfdcc7575d75492",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::width64",
+        "stdout": "width: -5 width64: 4294967291\\n"
+    },
+        "SkIRect_x": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect unsorted = { 15, 5, 10, 25 };\n    SkDebugf(\"unsorted.fLeft: %d unsorted.x(): %d\\n\", unsorted.fLeft, unsorted.x());\n    SkIRect sorted = unsorted.makeSorted();\n    SkDebugf(\"sorted.fLeft: %d sorted.x(): %d\\n\", sorted.fLeft, sorted.x());\n}",
+    "hash": "2a59cbfd1330a0db520d6ebb2b7c68c7",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::x()",
+        "stdout": "unsorted.fLeft: 15 unsorted.x(): 15\\nsorted.fLeft: 10 sorted.x(): 10\\n"
+    },
+        "SkIRect_y": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect unsorted = { 15, 25, 10, 5 };\n    SkDebugf(\"unsorted.fTop: %d unsorted.y(): %d\\n\", unsorted.fTop, unsorted.y());\n    SkIRect sorted = unsorted.makeSorted();\n    SkDebugf(\"sorted.fTop: %d sorted.y(): %d\\n\", sorted.fTop, sorted.y());\n}",
+    "hash": "6ea461e71f7fc80605818fbf493caa63",
+    "file": "SkIRect_Reference",
+    "name": "SkIRect::y()",
+        "stdout": "unsorted.fTop: 25 unsorted.y(): 25\\nsorted.fTop: 5 sorted.y(): 5\\n"
+    },
+        "SkImageInfo_ByteSizeOverflowed": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::MakeN32Premul(2, 1000000000);\n    for (size_t rowBytes = 100000000; rowBytes < 10000000000000LL; rowBytes *= 10) {\n        const size_t size = info.computeByteSize(rowBytes);\n        SkDebugf(\"rowBytes:%llu size:%llu overflowed:%s\\n\", rowBytes, size,\n                 SkImageInfo::ByteSizeOverflowed(size) ? \"true\" : \"false\");\n    }\n}",
+    "hash": "6a63dfdd62ab77ff57783af8c33d7b78",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::ByteSizeOverflowed",
+        "stdout": "rowBytes:100000000 size:99999999900000008 overflowed:false\\nrowBytes:1000000000 size:999999999000000008 overflowed:false\\nrowBytes:10000000000 size:9999999990000000008 overflowed:false\\nrowBytes:100000000000 size:18446744073709551615 overflowed:true\\nrowBytes:1000000000000 size:18446744073709551615 overflowed:true\\n"
+    },
+        "SkImageInfo_alphaType": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* alphas[] = {\"Unknown\", \"Opaque\", \"Premul\", \"Unpremul\"};\n    SkImageInfo info = SkImageInfo::MakeA8(16, 32);\n    SkDebugf(\"alpha type: k\" \"%s\" \"_SkAlphaType\\n\", alphas[info.alphaType()]);\n}",
+    "hash": "5c1d2499a4056b6cff38c1cf924158a1",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::alphaType",
+        "stdout": "alpha type: kPremul_SkAlphaType\\n"
+    },
+        "SkImageInfo_bytesPerPixel": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* colors[] = {\"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                            \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\"};\n    for (SkColorType colorType : {\n    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,\n    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,\n    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,\n    kGray_8_SkColorType, kRGBA_F16_SkColorType\n                                 } ) {\n        SkImageInfo info = SkImageInfo::Make(1, 1, colorType, kOpaque_SkAlphaType);\n        SkDebugf(\"color: k\" \"%s\" \"_SkColorType\" \"%*s\" \"bytesPerPixel: %d\\n\",\n                colors[colorType], 13 - strlen(colors[colorType]), \" \",\n                info.bytesPerPixel());\n    }\n}",
+    "hash": "9b6de4a07b2316228e9340e5a3b82134",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::bytesPerPixel",
+        "stdout": "color: kUnknown_SkColorType      bytesPerPixel: 0\\ncolor: kAlpha_8_SkColorType      bytesPerPixel: 1\\ncolor: kRGB_565_SkColorType      bytesPerPixel: 2\\ncolor: kARGB_4444_SkColorType    bytesPerPixel: 2\\ncolor: kRGBA_8888_SkColorType    bytesPerPixel: 4\\ncolor: kRGB_888x_SkColorType     bytesPerPixel: 4\\ncolor: kBGRA_8888_SkColorType    bytesPerPixel: 4\\ncolor: kRGBA_1010102_SkColorType bytesPerPixel: 4\\ncolor: kRGB_101010x_SkColorType  bytesPerPixel: 4\\ncolor: kGray_8_SkColorType       bytesPerPixel: 1\\ncolor: kRGBA_F16_SkColorType     bytesPerPixel: 8\\n"
+    },
+        "SkImageInfo_colorSpace": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,\n            SkColorSpace::MakeSRGBLinear());\n    SkColorSpace* colorSpace = info.colorSpace();\n    SkDebugf(\"gammaCloseToSRGB: %s  gammaIsLinear: %s  isSRGB: %s\\n\",\n            colorSpace->gammaCloseToSRGB() ? \"true\" : \"false\",\n            colorSpace->gammaIsLinear() ? \"true\" : \"false\",\n            colorSpace->isSRGB() ? \"true\" : \"false\");\n}",
+    "hash": "5602b816d7cf75e3851274ef36a4c10f",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::colorSpace",
+        "stdout": "gammaCloseToSRGB: false  gammaIsLinear: true  isSRGB: false\\n"
+    },
+        "SkImageInfo_colorType": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* colors[] = {\"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                            \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\"};\n    SkImageInfo info = SkImageInfo::MakeA8(16, 32);\n    SkDebugf(\"color type: k\" \"%s\" \"_SkColorType\\n\", colors[info.colorType()]);\n}",
+    "hash": "06ecc3ce7f35cc7f930cbc2a662e3105",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::colorType",
+        "stdout": "color type: kAlpha_8_SkColorType\\n"
+    },
+        "SkImageInfo_dimensions": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int height = 2;\n    const int width = 2;\n    SkImageInfo imageInfo = SkImageInfo::Make(width, height, kN32_SkColorType, kPremul_SkAlphaType);\n    SkISize dimensions = imageInfo.dimensions();\n    SkIRect bounds = imageInfo.bounds();\n    SkIRect dimensionsAsBounds = SkIRect::MakeSize(dimensions);\n    SkDebugf(\"dimensionsAsBounds %c= bounds\\n\", dimensionsAsBounds == bounds ? '=' : '!');\n}",
+    "hash": "d5547cd2b302822aa85b7b0ae3f48458",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::dimensions()",
+        "stdout": "dimensionsAsBounds == bounds\\n"
+    },
+        "SkImageInfo_equal1_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info1 = SkImageInfo::Make(10, 20, kGray_8_SkColorType, kPremul_SkAlphaType);\n    SkImageInfo info2 = SkImageInfo::Make(20, 10, kAlpha_8_SkColorType, kUnpremul_SkAlphaType);\n    SkDebugf(\"info1 %c= info2\\n\", info1 == info2 ? '=' : '!');\n    info2 = info2.makeWH(10, 20);\n    SkDebugf(\"info1 %c= info2\\n\", info1 == info2 ? '=' : '!');\n    info2 = info2.makeColorType(kGray_8_SkColorType);\n    SkDebugf(\"info1 %c= info2\\n\", info1 == info2 ? '=' : '!');\n    info2 = info2.makeAlphaType(kPremul_SkAlphaType);\n    SkDebugf(\"info1 %c= info2\\n\", info1 == info2 ? '=' : '!');\n}",
+    "hash": "53c212c4f2449df0b0eedbc6227b6ab7",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::operator==(const SkImageInfo& other) const",
+        "stdout": "info1 != info2\\ninfo1 != info2\\ninfo1 != info2\\ninfo1 == info2\\n"
+    },
+        "SkImageInfo_isEmpty": {
+    "code": "void draw(SkCanvas* canvas) {\n    for (int width : { 0, 2 } ) {\n        for (int height : { 0, 2 } ) {\n             SkImageInfo imageInfo= SkImageInfo::MakeA8(width, height);\n             SkDebugf(\"width: %d height: %d empty: %s\\n\", width, height,\n                      imageInfo.isEmpty() ? \"true\" : \"false\");\n        }\n    }\n}",
+    "hash": "b8757200da5be0b43763cf79feb681a7",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::isEmpty",
+        "stdout": "width: 0 height: 0 empty: true\\nwidth: 0 height: 2 empty: true\\nwidth: 2 height: 0 empty: true\\nwidth: 2 height: 2 empty: false\\n"
+    },
+        "SkImageInfo_isOpaque": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int height = 2;\n    const int width = 2;\n    SkBitmap bitmap;\n    SkImageInfo imageInfo = SkImageInfo::Make(width, height, kN32_SkColorType, kPremul_SkAlphaType);\n    bitmap.setInfo(imageInfo);\n    for (int index = 0; index < 2; ++index) {\n        bitmap.allocPixels();\n        bitmap.eraseColor(0x00000000);\n        SkDebugf(\"isOpaque: %s\\n\", imageInfo.isOpaque() ? \"true\" : \"false\");\n        bitmap.eraseColor(0xFFFFFFFF);\n        SkDebugf(\"isOpaque: %s\\n\", imageInfo.isOpaque() ? \"true\" : \"false\");\n        imageInfo = imageInfo.makeAlphaType(kOpaque_SkAlphaType);\n        bitmap.setInfo(imageInfo);\n    }\n}",
+    "hash": "e9bd4f02b6cfb3ac864cb7fee7d7299c",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::isOpaque",
+        "stdout": "isOpaque: false\\nisOpaque: false\\nisOpaque: true\\nisOpaque: true\\n"
+    },
+        "SkImageInfo_minRowBytes": {
+    "code": "void draw(SkCanvas* canvas) {\n    for (int shift = 24; shift < 32; ++shift) {\n        int width = 1 << shift;\n        SkImageInfo imageInfo =\n                SkImageInfo::Make(width, 1, kRGBA_F16_SkColorType, kPremul_SkAlphaType);\n        size_t minRowBytes = imageInfo.minRowBytes();\n        bool widthTooLarge = !minRowBytes;\n        SkDebugf(\"RGBA_F16 width %d (0x%08x) %s\\n\",\n                width, width, widthTooLarge ? \"too large\" : \"OK\");\n    }\n}",
+    "hash": "897230ecfb36095486beca324fd369f9",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::minRowBytes",
+        "stdout": "RGBA_F16 width 16777216 (0x01000000) OK\\nRGBA_F16 width 33554432 (0x02000000) OK\\nRGBA_F16 width 67108864 (0x04000000) OK\\nRGBA_F16 width 134217728 (0x08000000) OK\\nRGBA_F16 width 268435456 (0x10000000) too large\\nRGBA_F16 width 536870912 (0x20000000) too large\\nRGBA_F16 width 1073741824 (0x40000000) too large\\nRGBA_F16 width -2147483648 (0x80000000) too large\\n"
+    },
+        "SkImageInfo_minRowBytes64": {
+    "code": "void draw(SkCanvas* canvas) {\n    for (int shift = 24; shift < 32; ++shift) {\n        int width = 1 << shift;\n        SkImageInfo imageInfo =\n                SkImageInfo::Make(width, 1, kRGBA_F16_SkColorType, kPremul_SkAlphaType);\n        uint64_t minRowBytes = imageInfo.minRowBytes64();\n        bool widthTooLarge = (uint64_t) (int32_t) minRowBytes != minRowBytes;\n        SkDebugf(\"RGBA_F16 width %d (0x%08x) %s\\n\",\n                width, width, widthTooLarge ? \"too large\" : \"OK\");\n    }\n}",
+    "hash": "4b5d3904476726a39f1c3e276d6b6ba7",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::minRowBytes64",
+        "stdout": "RGBA_F16 width 16777216 (0x01000000) OK\\nRGBA_F16 width 33554432 (0x02000000) OK\\nRGBA_F16 width 67108864 (0x04000000) OK\\nRGBA_F16 width 134217728 (0x08000000) OK\\nRGBA_F16 width 268435456 (0x10000000) too large\\nRGBA_F16 width 536870912 (0x20000000) too large\\nRGBA_F16 width 1073741824 (0x40000000) too large\\nRGBA_F16 width -2147483648 (0x80000000) too large\\n"
+    },
+        "SkImageInfo_notequal1_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info1 = SkImageInfo::Make(10, 20, kGray_8_SkColorType, kPremul_SkAlphaType);\n    SkImageInfo info2 = SkImageInfo::Make(20, 10, kAlpha_8_SkColorType, kUnpremul_SkAlphaType);\n    SkDebugf(\"info1 %c= info2\\n\", info1 != info2 ? '!' : '=');\n    info2 = info2.makeWH(10, 20);\n    SkDebugf(\"info1 %c= info2\\n\", info1 != info2 ? '!' : '=');\n    info2 = info2.makeColorType(kGray_8_SkColorType);\n    SkDebugf(\"info1 %c= info2\\n\", info1 != info2 ? '!' : '=');\n    info2 = info2.makeAlphaType(kPremul_SkAlphaType);\n    SkDebugf(\"info1 %c= info2\\n\", info1 != info2 ? '!' : '=');\n}",
+    "hash": "8c039fde0a476ac1aa62bf9de5d61c77",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::operator!=(const SkImageInfo& other) const",
+        "stdout": "info1 != info2\\ninfo1 != info2\\ninfo1 != info2\\ninfo1 == info2\\n"
+    },
+        "SkImageInfo_refColorSpace": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info1 = SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,\n            SkColorSpace::MakeSRGBLinear());\n    SkImageInfo info2 = SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,\n            info1.refColorSpace());\n    SkColorSpace* colorSpace = info2.colorSpace();\n    SkDebugf(\"gammaCloseToSRGB: %s  gammaIsLinear: %s  isSRGB: %s\\n\",\n            colorSpace->gammaCloseToSRGB() ? \"true\" : \"false\",\n            colorSpace->gammaIsLinear() ? \"true\" : \"false\",\n            colorSpace->isSRGB() ? \"true\" : \"false\");\n}",
+    "hash": "33f65524736736fd91802b4198ba6fa8",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::refColorSpace",
+        "stdout": "gammaCloseToSRGB: false  gammaIsLinear: true  isSRGB: false\\n"
+    },
+        "SkImageInfo_reset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::MakeN32Premul(16, 8);\n    SkImageInfo copy = info;\n    SkDebugf(\"info %c= copy\\n\", info == copy ? '=' : '!');\n    copy.reset();\n    SkDebugf(\"info %c= reset copy\\n\", info == copy ? '=' : '!');\n    SkDebugf(\"SkImageInfo() %c= reset copy\\n\", SkImageInfo() == copy ? '=' : '!');\n}",
+    "hash": "ab7e73786805c936de386b6c1ebe1f13",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::reset()",
+        "stdout": "info == copy\\ninfo != reset copy\\nSkImageInfo() == reset copy\\n"
+    },
+        "SkImageInfo_shiftPerPixel": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* colors[] = {\"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                            \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\"};\n    for (SkColorType colorType : {\n    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,\n    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,\n    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,\n    kGray_8_SkColorType, kRGBA_F16_SkColorType\n                                 } ) {\n        SkImageInfo info = SkImageInfo::Make(1, 1, colorType, kOpaque_SkAlphaType);\n        SkDebugf(\"color: k\" \"%s\" \"_SkColorType\" \"%*s\" \"shiftPerPixel: %d\\n\",\n                colors[colorType], 14 - strlen(colors[colorType]), \" \",\n                info.shiftPerPixel());\n    }\n}",
+    "hash": "e47b911f94fc629f756a829e523a2a89",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::shiftPerPixel",
+        "stdout": "color: kUnknown_SkColorType       shiftPerPixel: 0\\ncolor: kAlpha_8_SkColorType       shiftPerPixel: 0\\ncolor: kRGB_565_SkColorType       shiftPerPixel: 1\\ncolor: kARGB_4444_SkColorType     shiftPerPixel: 1\\ncolor: kRGBA_8888_SkColorType     shiftPerPixel: 2\\ncolor: kRGB_888x_SkColorType      shiftPerPixel: 2\\ncolor: kBGRA_8888_SkColorType     shiftPerPixel: 2\\ncolor: kRGBA_1010102_SkColorType  shiftPerPixel: 2\\ncolor: kRGB_101010x_SkColorType   shiftPerPixel: 2\\ncolor: kGray_8_SkColorType        shiftPerPixel: 0\\ncolor: kRGBA_F16_SkColorType      shiftPerPixel: 3\\n"
+    },
+        "SkImageInfo_validRowBytes": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::MakeN32Premul(16, 8);\n    for (size_t rowBytes = 60; rowBytes < 72; rowBytes += sizeof(SkPMColor)) {\n        SkDebugf(\"validRowBytes(%llu): %s\\n\", rowBytes, info.validRowBytes(rowBytes) ?\n                 \"true\" : \"false\");\n    }\n}",
+    "hash": "c6b0f6a3f493cb08d9abcdefe12de245",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::validRowBytes",
+        "stdout": "validRowBytes(60): false\\nvalidRowBytes(64): true\\nvalidRowBytes(68): true\\n"
+    },
+        "SkImage_MakeFromRaster": {
+    "code": "static void releaseProc(const void* pixels, SkImage::ReleaseContext context) {\n     int* countPtr = static_cast<int*>(context);\n     *countPtr += 1;\n}\n\nvoid draw(SkCanvas* canvas) {\n    SkColor color = 0;\n    SkPixmap pixmap(SkImageInfo::MakeN32(1, 1, kPremul_SkAlphaType), &color, 4);\n    int releaseCount = 0;\n    sk_sp<SkImage> image(SkImage::MakeFromRaster(pixmap, releaseProc, &releaseCount));\n    SkDebugf(\"before reset: %d\\n\", releaseCount);\n    image.reset();\n    SkDebugf(\"after reset: %d\\n\", releaseCount);\n}\n",
+    "hash": "275356b65d18c8868f4434137350cddc",
+    "file": "SkImage_Reference",
+    "name": "SkImage::MakeFromRaster",
+        "stdout": "before reset: 0\\nafter reset: 1\\n"
+    },
+        "SkImage_dimensions": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkISize dimensions = image->dimensions();\n    SkIRect bounds = image->bounds();\n    SkIRect dimensionsAsBounds = SkIRect::MakeSize(dimensions);\n    SkDebugf(\"dimensionsAsBounds %c= bounds\\n\", dimensionsAsBounds == bounds ? '=' : '!');\n}",
+    "hash": "96b4bc43b3667df9ba9e2dafb770d33c",
+    "file": "SkImage_Reference",
+    "name": "SkImage::dimensions()",
+        "stdout": "dimensionsAsBounds == bounds\\n"
+    },
+        "SkImage_isAlphaOnly": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t pmColors = 0;\n    sk_sp<SkImage> image = SkImage::MakeRasterCopy({SkImageInfo::MakeA8(1, 1), &pmColors, 1});\n    SkDebugf(\"alphaOnly = %s\\n\", image->isAlphaOnly() ? \"true\" : \"false\");\n}",
+    "hash": "50762c73b8ea91959c5a7b68fbf1062d",
+    "file": "SkImage_Reference",
+    "name": "SkImage::isAlphaOnly",
+        "stdout": "alphaOnly = true\\n"
+    },
+        "SkImage_isOpaque": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto check_isopaque = [](const SkImageInfo& imageInfo) -> void {\n        auto surface(SkSurface::MakeRaster(imageInfo));\n        auto image(surface->makeImageSnapshot());\n        SkDebugf(\"isOpaque = %s\\n\", image->isOpaque() ? \"true\" : \"false\");\n    };\n    check_isopaque(SkImageInfo::MakeN32Premul(5, 5));\n    check_isopaque(SkImageInfo::MakeN32(5, 5, kOpaque_SkAlphaType));\n}",
+    "hash": "e3340460003b74ee286d625e68589d65",
+    "file": "SkImage_Reference",
+    "name": "SkImage::isOpaque",
+        "stdout": "isOpaque = false\\nisOpaque = true\\n"
+    },
+        "SkImage_peekPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(12, 11));\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorWHITE);\n    SkPaint paint;\n    offscreen.drawString(\"%\", 1, 10, paint);\n    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);\n    SkPixmap pixmap;\n    if (image->peekPixels(&pixmap)) {\n        const SkPMColor* pixels = pixmap.addr32();\n        SkPMColor pmWhite = pixels[0];\n        for (int y = 0; y < image->height(); ++y) {\n            for (int x = 0; x < image->width(); ++x) {\n                SkDebugf(\"%c\", *pixels++ == pmWhite ? '-' : 'x');\n            }\n            SkDebugf(\"\\n\");\n        }\n    }\n}",
+    "hash": "900c0eab8dfdecd8301ed5be95887f8e",
+    "file": "SkImage_Reference",
+    "name": "SkImage::peekPixels",
+        "stdout": "------------\\n--xx----x---\\n-x--x--x----\\n-x--x--x----\\n-x--x-x-----\\n--xx-xx-xx--\\n-----x-x--x-\\n----x--x--x-\\n----x--x--x-\\n---x----xx--\\n------------\\n"
+    },
+        "SkMatrix_I": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix m1, m2, m3;\n    m1.reset();\n    m2.setIdentity();\n    m3 = SkMatrix::I();\n    SkDebugf(\"m1 %c= m2\\n\", m1 == m2 ? '=' : '!');\n    SkDebugf(\"m2 %c= m3\\n\", m1 == m2 ? '=' : '!');\n}",
+    "hash": "d961d91020f19037204a8c3fd8cb1060",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::I",
+        "stdout": "m1 == m2\\nm2 == m3\\n"
+    },
+        "SkMatrix_InvalidMatrix": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkDebugf(\"scaleX %g\\n\", SkMatrix::InvalidMatrix().getScaleX());\n}",
+    "hash": "af0b72360c1c7a25b4754bfa47011dd5",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::InvalidMatrix",
+        "stdout": "scaleX 3.40282e+38\\n"
+    },
+        "SkMatrix_MakeRectToRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    const SkRect srcs[] = { {0, 0, 0, 0}, {1, 2, 3, 4} };\n    const SkRect dsts[] = { {0, 0, 0, 0}, {5, 6, 8, 9} };\n    for (auto src : srcs) {\n        for (auto dst : dsts) {\n             SkMatrix matrix = SkMatrix::MakeRectToRect(src, dst, SkMatrix::kFill_ScaleToFit);\n             SkDebugf(\"src: %g, %g, %g, %g  dst: %g, %g, %g, %g\\n\",\n                      src.fLeft, src.fTop, src.fRight, src.fBottom,\n                      dst.fLeft, dst.fTop, dst.fRight, dst.fBottom);\n             matrix.dump();\n        }\n    }\n}",
+    "hash": "a1d6a6721b39350f81021f71a1b93208",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::MakeRectToRect",
+        "stdout": "src: 0, 0, 0, 0  dst: 0, 0, 0, 0\\n[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]\\nsrc: 0, 0, 0, 0  dst: 5, 6, 8, 9\\n[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]\\nsrc: 1, 2, 3, 4  dst: 0, 0, 0, 0\\n[  0.0000   0.0000   0.0000][  0.0000   0.0000   0.0000][  0.0000   0.0000   1.0000]\\nsrc: 1, 2, 3, 4  dst: 5, 6, 8, 9\\n[  1.5000   0.0000   3.5000][  0.0000   1.5000   3.0000][  0.0000   0.0000   1.0000]\\n"
+    },
+        "SkMatrix_SetAffineIdentity": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkScalar affine[6];\n    SkMatrix::SetAffineIdentity(affine);\n    const char* names[] = { \"ScaleX\", \"SkewY\", \"SkewX\", \"ScaleY\", \"TransX\", \"TransY\" };\n    for (int i = 0; i < 6; ++i) {\n        SkDebugf(\"%s: %g \", names[i], affine[i]);\n    }\n    SkDebugf(\"\\n\");\n}",
+    "hash": "e10adbd0bcc940c5d4d872db0e78e892",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::SetAffineIdentity",
+        "stdout": "ScaleX: 1 SkewY: 0 SkewX: 0 ScaleY: 1 TransX: 0 TransY: 0 \\n"
+    },
+        "SkMatrix_TypeMask": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkMatrix& matrix) -> void {\n        SkString typeMask;\n        typeMask += SkMatrix::kIdentity_Mask == matrix.getType() ? \"kIdentity_Mask \" : \"\";\n        typeMask += SkMatrix::kTranslate_Mask & matrix.getType() ? \"kTranslate_Mask \" : \"\";\n        typeMask += SkMatrix::kScale_Mask & matrix.getType() ? \"kScale_Mask \" : \"\";\n        typeMask += SkMatrix::kAffine_Mask & matrix.getType() ? \"kAffine_Mask \" : \"\";\n        typeMask += SkMatrix::kPerspective_Mask & matrix.getType() ? \"kPerspective_Mask\" : \"\";\n        SkDebugf(\"after %s: %s\\n\", prefix, typeMask.c_str());\n    };\nSkMatrix matrix;\nmatrix.reset();\ndebugster(\"reset\", matrix);\nmatrix.postTranslate(1, 0);\ndebugster(\"postTranslate\", matrix);\nmatrix.postScale(2, 1);\ndebugster(\"postScale\", matrix);\nmatrix.postRotate(45);\ndebugster(\"postScale\", matrix);\nSkPoint polys[][4] = {{{0, 0}, {0, 1}, {1, 1}, {1, 0}}, {{0, 0}, {0, 1}, {2, 1}, {1, 0}}};\nmatrix.setPolyToPoly(polys[0], polys[1], 4);\ndebugster(\"setPolyToPoly\", matrix);\n}",
+    "hash": "ba19b36df8cd78586f3dff54e2d4c093",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::TypeMask",
+        "stdout": "after reset: kIdentity_Mask \\nafter postTranslate: kTranslate_Mask \\nafter postScale: kTranslate_Mask kScale_Mask \\nafter postScale: kTranslate_Mask kScale_Mask kAffine_Mask \\nafter setPolyToPoly: kTranslate_Mask kScale_Mask kAffine_Mask kPerspective_Mask\\n"
+    },
+        "SkMatrix_array1_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setIdentity();\n    SkDebugf(\"with identity matrix: x = %g\\n\", matrix.mapXY(24, 42).fX);\n    SkScalar& skewRef = matrix[SkMatrix::kMSkewX];\n    skewRef = 0;\n    SkDebugf(\"after skew x mod:     x = %g\\n\", matrix.mapXY(24, 42).fX);\n    skewRef = 1;\n    SkDebugf(\"after 2nd skew x mod: x = %g\\n\", matrix.mapXY(24, 42).fX);\n    matrix.dirtyMatrixTypeCache();\n    SkDebugf(\"after dirty cache:    x = %g\\n\", matrix.mapXY(24, 42).fX);\n}",
+    "hash": "f4365ef332f51f7fd25040e0771ba9a2",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::operator[](int index)",
+        "stdout": "with identity matrix: x = 24\\nafter skew x mod:     x = 24\\nafter 2nd skew x mod: x = 24\\nafter dirty cache:    x = 66\\n"
+    },
+        "SkMatrix_array_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setScale(42, 24);\n    SkDebugf(\"matrix[SkMatrix::kMScaleX] %c= 42\\n\", matrix[SkMatrix::kMScaleX] == 42 ? '=' : '!');\n    SkDebugf(\"matrix[SkMatrix::kMScaleY] %c= 24\\n\", matrix[SkMatrix::kMScaleY] == 24 ? '=' : '!');\n}",
+    "hash": "e8740493abdf0c6341762db9cee56b89",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::operator[](int index) const",
+        "stdout": "matrix[SkMatrix::kMScaleX] == 42\\nmatrix[SkMatrix::kMScaleY] == 24\\n"
+    },
+        "SkMatrix_asAffine": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setAll(2, 3, 4, 5, 6, 7, 0, 0, 1);\n    SkScalar affine[6];\n    if (matrix.asAffine(affine)) {\n        const char* names[] = { \"ScaleX\", \"SkewY\", \"SkewX\", \"ScaleY\", \"TransX\", \"TransY\" };\n        for (int i = 0; i < 6; ++i) {\n            SkDebugf(\"%s: %g \", names[i], affine[i]);\n        }\n        SkDebugf(\"\\n\");\n    }\n}",
+    "hash": "3325bdf82bd86d9fbc4199f248afa82c",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::asAffine",
+        "stdout": "ScaleX: 2 SkewY: 5 SkewX: 3 ScaleY: 6 TransX: 4 TransY: 7 \\n"
+    },
+        "SkMatrix_cheapEqualTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkMatrix& a, const SkMatrix& b) -> void {\n        SkDebugf(\"%s: a %c= b a.cheapEqualTo(b): %s\\n\", prefix,\n                 a == b ? '=' : '!', a.cheapEqualTo(b) ? \"true\" : \"false\");\n    };\n    SkMatrix a, b;\n    a.setAll(1, 0, 0,   0, 1, 0,  0, 0, 1);\n    b.setIdentity();\n    debugster(\"identity\", a, b);\n    a.setAll(1, -0.0f, 0,   0, 1, 0,  0, 0, 1);\n    debugster(\"neg zero\", a, b);\n    a.setAll(1, SK_ScalarNaN, 0,   0, 1, 0,  0, 0, 1);\n    debugster(\" one NaN\", a, b);\n    b.setAll(1, SK_ScalarNaN, 0,   0, 1, 0,  0, 0, 1);\n    debugster(\"both NaN\", a, b);\n}",
+    "hash": "39016b3cfc6bbabb09348a53822ce508",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::cheapEqualTo",
+        "stdout": "identity: a == b a.cheapEqualTo(b): true\\nneg zero: a == b a.cheapEqualTo(b): false\\n one NaN: a != b a.cheapEqualTo(b): false\\nboth NaN: a != b a.cheapEqualTo(b): true\\n"
+    },
+        "SkMatrix_decomposeScale": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setRotate(90 * SK_Scalar1);\n    matrix.postScale(1.f / 4, 1.f / 2);\n    matrix.dump();\n    SkSize scale = {SK_ScalarNaN, SK_ScalarNaN};\n    SkMatrix remaining;\n    remaining.reset();\n    bool success = matrix.decomposeScale(&scale, &remaining);\n    SkDebugf(\"success: %s  \", success ? \"true\" : \"false\");\n    SkDebugf(\"scale: %g, %g\\n\", scale.width(), scale.height());\n    remaining.dump();\n    SkMatrix scaleMatrix = SkMatrix::MakeScale(scale.width(), scale.height());\n    SkMatrix combined = SkMatrix::Concat(scaleMatrix, remaining);\n    combined.dump();\n}",
+    "hash": "139b874da0a3ede1f3df88119085c0aa",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::decomposeScale",
+        "stdout": "[  0.0000  -0.2500   0.0000][  0.5000   0.0000   0.0000][  0.0000   0.0000   1.0000]\\nsuccess: true  scale: 0.5, 0.25\\n[  0.0000  -0.5000   0.0000][  2.0000   0.0000   0.0000][  0.0000   0.0000   1.0000]\\n[  0.0000  -0.2500   0.0000][  0.5000   0.0000   0.0000][  0.0000   0.0000   1.0000]\\n"
+    },
+        "SkMatrix_dirtyMatrixTypeCache": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setIdentity();\n    SkDebugf(\"with identity matrix: x = %g\\n\", matrix.mapXY(24, 42).fX);\n    SkScalar& skewRef = matrix[SkMatrix::kMSkewX];\n    skewRef = 0;\n    SkDebugf(\"after skew x mod:     x = %g\\n\", matrix.mapXY(24, 42).fX);\n    skewRef = 1;\n    SkDebugf(\"after 2nd skew x mod: x = %g\\n\", matrix.mapXY(24, 42).fX);\n    matrix.dirtyMatrixTypeCache();\n    SkDebugf(\"after dirty cache:    x = %g\\n\", matrix.mapXY(24, 42).fX);\n}",
+    "hash": "f4365ef332f51f7fd25040e0771ba9a2",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::dirtyMatrixTypeCache",
+        "stdout": "with identity matrix: x = 24\\nafter skew x mod:     x = 24\\nafter 2nd skew x mod: x = 24\\nafter dirty cache:    x = 66\\n"
+    },
+        "SkMatrix_dump": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setRotate(45);\n    matrix.dump();\n    SkMatrix nearlyEqual;\n    nearlyEqual.setAll(0.7071f, -0.7071f, 0,   0.7071f, 0.7071f, 0,   0, 0, 1);\n    nearlyEqual.dump();\n    SkDebugf(\"matrix %c= nearlyEqual\\n\", matrix == nearlyEqual ? '=' : '!');\n}",
+    "hash": "8d72a4818e5a9188348f6c08ab5d8a40",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::dump()",
+        "stdout": "[  0.7071  -0.7071   0.0000][  0.7071   0.7071   0.0000][  0.0000   0.0000   1.0000]\\n[  0.7071  -0.7071   0.0000][  0.7071   0.7071   0.0000][  0.0000   0.0000   1.0000]\\nmatrix != nearlyEqual\\n"
+    },
+        "SkMatrix_equal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkMatrix& a, const SkMatrix& b) -> void {\n        SkDebugf(\"%s: a %c= b a.cheapEqualTo(b): %s\\n\", prefix,\n                 a == b ? '=' : '!', a.cheapEqualTo(b) ? \"true\" : \"false\");\n    };\n    SkMatrix a, b;\n    a.setAll(1, 0, 0,   0, 1, 0,  0, 0, 1);\n    b.setScale(2, 4);\n    b.postScale(0.5f, 0.25f);\n    debugster(\"identity\", a, b);\n}",
+    "hash": "3902859150b0f0c4aeb1f25d00434baa",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::operator==(const SkMatrix& a, const SkMatrix& b)",
+        "stdout": "identity: a == b a.cheapEqualTo(b): true\\n"
+    },
+        "SkMatrix_get": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setSkew(42, 24);\n    SkDebugf(\"matrix.get(SkMatrix::kMSkewX) %c= 42\\n\",\n             matrix.get(SkMatrix::kMSkewX) == 42 ? '=' : '!');\n    SkDebugf(\"matrix.get(SkMatrix::kMSkewY) %c= 24\\n\",\n             matrix.get(SkMatrix::kMSkewY) == 24 ? '=' : '!');\n}",
+    "hash": "f5ed382bd04fa7d50b2398cce2fca23a",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::get()",
+        "stdout": "matrix.get(SkMatrix::kMSkewX) == 42\\nmatrix.get(SkMatrix::kMSkewY) == 24\\n"
+    },
+        "SkMatrix_get9": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix = SkMatrix::MakeRectToRect({0, 0, 1, 1}, {3, 4, 7, 9},\n                                               SkMatrix::kFill_ScaleToFit);\n    SkScalar b[9];\n    matrix.get9(b);\n    SkDebugf(\"{%g, %g, %g},\\n{%g, %g, %g},\\n{%g, %g, %g}\\n\", b[0], b[1], b[2],\n             b[3], b[4], b[5], b[6], b[7], b[8]);\n}",
+    "hash": "379fc375e011050b54ed9df83c0996a7",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::get9",
+        "stdout": "{4, 0, 3},\\n{0, 5, 4},\\n{0, 0, 1}\\n"
+    },
+        "SkMatrix_getMaxScale": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setScale(42, 24);\n    SkDebugf(\"matrix.getMaxScale() %g\\n\", matrix.getMaxScale());\n}",
+    "hash": "3fee4364929899649cf9efc37897e964",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::getMaxScale",
+        "stdout": "matrix.getMaxScale() 42\\n"
+    },
+        "SkMatrix_getMinScale": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setScale(42, 24);\n    SkDebugf(\"matrix.getMinScale() %g\\n\", matrix.getMinScale());\n}",
+    "hash": "1d6f67904c88a806c3731879e9af4ae5",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::getMinScale",
+        "stdout": "matrix.getMinScale() 24\\n"
+    },
+        "SkMatrix_getScaleX": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setScale(42, 24);\n    SkDebugf(\"matrix.getScaleX() %c= 42\\n\", matrix.getScaleX() == 42 ? '=' : '!');\n}",
+    "hash": "ab746d9be63975041ae8e50cba84dc3d",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::getScaleX",
+        "stdout": "matrix.getScaleX() == 42\\n"
+    },
+        "SkMatrix_getScaleY": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setScale(42, 24);\n    SkDebugf(\"matrix.getScaleY() %c= 24\\n\", matrix.getScaleY() == 24 ? '=' : '!');\n}",
+    "hash": "708b1a548a2f8661b2ab570782fbc751",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::getScaleY",
+        "stdout": "matrix.getScaleY() == 24\\n"
+    },
+        "SkMatrix_getSkewX": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setSkew(42, 24);\n    SkDebugf(\"matrix.getSkewX() %c= 42\\n\", matrix.getSkewX() == 42 ? '=' : '!');\n}",
+    "hash": "df3a5d3c688e7597eae1e4e07bf91ae6",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::getSkewX",
+        "stdout": "matrix.getSkewX() == 42\\n"
+    },
+        "SkMatrix_getSkewY": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setSkew(42, 24);\n    SkDebugf(\"matrix.getSkewY() %c= 24\\n\", matrix.getSkewY() == 24 ? '=' : '!');\n}",
+    "hash": "6be5704506d029ffc91ba03b1d3e674b",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::getSkewY",
+        "stdout": "matrix.getSkewY() == 24\\n"
+    },
+        "SkMatrix_getTranslateX": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setTranslate(42, 24);\n    SkDebugf(\"matrix.getTranslateX() %c= 42\\n\", matrix.getTranslateX() == 42 ? '=' : '!');\n}",
+    "hash": "6236f7f2b91aff977a66ba2ee2558ca4",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::getTranslateX",
+        "stdout": "matrix.getTranslateX() == 42\\n"
+    },
+        "SkMatrix_getTranslateY": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setTranslate(42, 24);\n    SkDebugf(\"matrix.getTranslateY() %c= 24\\n\", matrix.getTranslateY() == 24 ? '=' : '!');\n}",
+    "hash": "08464e32d22421d2b254c71a84545ef5",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::getTranslateY",
+        "stdout": "matrix.getTranslateY() == 24\\n"
+    },
+        "SkMatrix_getType": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setAll(1, 0, 0,   0, 1, 0,    0, 0, 1);\n    SkDebugf(\"identity flags hex: %0x decimal: %d\\n\", matrix.getType(), matrix.getType());\n    matrix.setAll(1, 0, 0,   0, 1, 0,    0, 0, .5f);\n    SkDebugf(\"set all  flags hex: %0x decimal: %d\\n\", matrix.getType(), matrix.getType());\n}",
+    "hash": "8e45fe2dd52731bb2d4318686257e1d7",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::getType",
+        "stdout": "identity flags hex: 0 decimal: 0\\nset all  flags hex: f decimal: 15\\n"
+    },
+        "SkMatrix_isFinite": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix = SkMatrix::MakeTrans(SK_ScalarNaN, 0);\n    matrix.dump();\n    SkDebugf(\"matrix is finite: %s\\n\", matrix.isFinite() ? \"true\" : \"false\");\n    SkDebugf(\"matrix %c= matrix\\n\", matrix == matrix ? '=' : '!');\n}",
+    "hash": "bc6c6f6a5df770287120d87f81b922eb",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::isFinite",
+        "stdout": "[  1.0000   0.0000      nan][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]\\nmatrix is finite: false\\nmatrix != matrix\\n"
+    },
+        "SkMatrix_isFixedStepInX": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    for (SkScalar px : { 0.0f, 0.1f } ) {\n        for (SkScalar py : { 0.0f, 0.1f } ) {\n            for (SkScalar sy : { 1, 2 } ) {\n                matrix.setAll(1, 0, 0,   0, sy, 0,   px, py, 1);\n                matrix.dump();\n                SkDebugf(\"isFixedStepInX: %s\\n\", matrix.isFixedStepInX() ? \"true\" : \"false\");\n            }\n        }\n    }\n}",
+    "hash": "ab57b232acef69f26de9cb23d23c8a1a",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::isFixedStepInX",
+        "stdout": "[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]\\nisFixedStepInX: true\\n[  1.0000   0.0000   0.0000][  0.0000   2.0000   0.0000][  0.0000   0.0000   1.0000]\\nisFixedStepInX: true\\n[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.1000   1.0000]\\nisFixedStepInX: true\\n[  1.0000   0.0000   0.0000][  0.0000   2.0000   0.0000][  0.0000   0.1000   1.0000]\\nisFixedStepInX: true\\n[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.1000   0.0000   1.0000]\\nisFixedStepInX: false\\n[  1.0000   0.0000   0.0000][  0.0000   2.0000   0.0000][  0.1000   0.0000   1.0000]\\nisFixedStepInX: false\\n[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.1000   0.1000   1.0000]\\nisFixedStepInX: false\\n[  1.0000   0.0000   0.0000][  0.0000   2.0000   0.0000][  0.1000   0.1000   1.0000]\\nisFixedStepInX: false\\n"
+    },
+        "SkMatrix_isIdentity": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setAll(1, 0, 0,   0, 1, 0,    0, 0, 1);\n    SkDebugf(\"is identity: %s\\n\", matrix.isIdentity() ? \"true\" : \"false\");\n    matrix.setAll(1, 0, 0,   0, 1, 0,    0, 0, 2);\n    SkDebugf(\"is identity: %s\\n\", matrix.isIdentity() ? \"true\" : \"false\");\n}",
+    "hash": "780ab376325b3cfa889ea26c0769ec11",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::isIdentity",
+        "stdout": "is identity: true\\nis identity: false\\n"
+    },
+        "SkMatrix_isScaleTranslate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    for (SkScalar scaleX : { 1, 2 } ) {\n        for (SkScalar translateX : { 0, 20 } ) {\n            matrix.setAll(scaleX, 0, translateX,   0, 1, 0,    0, 0, 1);\n            SkDebugf(\"is scale-translate: %s\\n\", matrix.isScaleTranslate() ? \"true\" : \"false\");\n        }\n    }\n}",
+    "hash": "6287e29674a487eb94174992d45b9a34",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::isScaleTranslate",
+        "stdout": "is scale-translate: true\\nis scale-translate: true\\nis scale-translate: true\\nis scale-translate: true\\n"
+    },
+        "SkMatrix_isTranslate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    for (SkScalar scaleX : { 1, 2 } ) {\n        for (SkScalar translateX : { 0, 20 } ) {\n            matrix.setAll(scaleX, 0, translateX,   0, 1, 0,    0, 0, 1);\n            SkDebugf(\"is translate: %s\\n\", matrix.isTranslate() ? \"true\" : \"false\");\n        }\n    }\n}",
+    "hash": "73ac71a8a30841873577c11c6c9b38ee",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::isTranslate",
+        "stdout": "is translate: true\\nis translate: true\\nis translate: false\\nis translate: false\\n"
+    },
+        "SkMatrix_notequal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkMatrix& a, const SkMatrix& b) -> void {\n        SkDebugf(\"%s: a %c= b a.cheapEqualTo(b): %s\\n\", prefix,\n                 a != b ? '!' : '=', a.cheapEqualTo(b) ? \"true\" : \"false\");\n    };\n    SkMatrix a, b;\n    a.setAll(1, 0, 0,   0, 1, 0,  1, 0, 1);\n    if (a.invert(&b)) {\n        debugster(\"identity\", a, b);\n    }\n}",
+    "hash": "088ab41f877599f980a99523749b0afd",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::operator!=(const SkMatrix& a, const SkMatrix& b)",
+        "stdout": "identity: a != b a.cheapEqualTo(b): false\\n"
+    },
+        "SkMatrix_preservesAxisAlignment": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    for (SkScalar angle: { 0, 90, 180, 270 } ) {\n        matrix.setRotate(angle);\n        SkDebugf(\"preservesAxisAlignment: %s\\n\", matrix.preservesAxisAlignment() ? \"true\" : \"false\");\n    }\n}",
+    "hash": "7a234c96608fb7cb8135b9940b0b15f7",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::preservesAxisAlignment",
+        "stdout": "preservesAxisAlignment: true\\npreservesAxisAlignment: true\\npreservesAxisAlignment: true\\npreservesAxisAlignment: true\\n"
+    },
+        "SkMatrix_rectStaysRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    for (SkScalar angle: { 0, 90, 180, 270 } ) {\n        matrix.setRotate(angle);\n        SkDebugf(\"rectStaysRect: %s\\n\", matrix.rectStaysRect() ? \"true\" : \"false\");\n    }\n}",
+    "hash": "ce5319c036c9b5086da8a0009fe409f8",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::rectStaysRect",
+        "stdout": "rectStaysRect: true\\nrectStaysRect: true\\nrectStaysRect: true\\nrectStaysRect: true\\n"
+    },
+        "SkMatrix_reset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix m;\n    m.reset();\n    SkDebugf(\"m.isIdentity(): %s\\n\", m.isIdentity() ? \"true\" : \"false\");\n}",
+    "hash": "ca94f7922bc37ef03bbc51ad70536fcf",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::reset()",
+        "stdout": "m.isIdentity(): true\\n"
+    },
+        "SkMatrix_set": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setIdentity();\n    SkDebugf(\"with identity matrix: x = %g\\n\", matrix.mapXY(24, 42).fX);\n    matrix.set(SkMatrix::kMSkewX, 0);\n    SkDebugf(\"after skew x mod:     x = %g\\n\", matrix.mapXY(24, 42).fX);\n    matrix.set(SkMatrix::kMSkewX, 1);\n    SkDebugf(\"after 2nd skew x mod: x = %g\\n\", matrix.mapXY(24, 42).fX);\n}",
+    "hash": "1d400a92ca826cc89bcb88ea051f28c8",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::set()",
+        "stdout": "with identity matrix: x = 24\\nafter skew x mod:     x = 24\\nafter 2nd skew x mod: x = 66\\n"
+    },
+        "SkMatrix_setAffine": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setAll(2, 3, 4, 5, 6, 7, 0, 0, 1);\n    SkScalar affine[6];\n    if (matrix.asAffine(affine)) {\n        const char* names[] = { \"ScaleX\", \"SkewY\", \"SkewX\", \"ScaleY\", \"TransX\", \"TransY\" };\n        for (int i = 0; i < 6; ++i) {\n            SkDebugf(\"%s: %g \", names[i], affine[i]);\n        }\n        SkDebugf(\"\\n\");\n        matrix.reset();\n        matrix.setAffine(affine);\n        matrix.dump();\n    }\n}",
+    "hash": "f5b6d371c4d65e5b5ac6eebdd4b237d8",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setAffine",
+        "stdout": "ScaleX: 2 SkewY: 5 SkewX: 3 ScaleY: 6 TransX: 4 TransY: 7 \\n[  2.0000   3.0000   4.0000][  5.0000   6.0000   7.0000][  0.0000   0.0000   1.0000]\\n"
+    },
+        "SkMatrix_setIdentity": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix m;\n    m.setIdentity();\n    SkDebugf(\"m.isIdentity(): %s\\n\", m.isIdentity() ? \"true\" : \"false\");\n}",
+    "hash": "3979c865bb482e6ef1fafc71e56bbb91",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setIdentity",
+        "stdout": "m.isIdentity(): true\\n"
+    },
+        "SkMatrix_setRectToRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    const SkRect srcs[] = { {0, 0, 0, 0}, {1, 2, 3, 4} };\n    const SkRect dsts[] = { {0, 0, 0, 0}, {5, 6, 8, 9} };\n    for (auto src : srcs) {\n        for (auto dst : dsts) {\n             SkMatrix matrix;\n             matrix.setAll(-1, -1, -1, -1, -1, -1, -1, -1, -1);\n             bool success = matrix.setRectToRect(src, dst, SkMatrix::kFill_ScaleToFit);\n             SkDebugf(\"src: %g, %g, %g, %g  dst: %g, %g, %g, %g  success: %s\\n\",\n                      src.fLeft, src.fTop, src.fRight, src.fBottom,\n                      dst.fLeft, dst.fTop, dst.fRight, dst.fBottom, success ? \"true\" : \"false\");\n             matrix.dump();\n        }\n    }\n}",
+    "hash": "69cdea599dcaaec35efcb24403f4287b",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setRectToRect",
+        "stdout": "src: 0, 0, 0, 0  dst: 0, 0, 0, 0  success: false\\n[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]\\nsrc: 0, 0, 0, 0  dst: 5, 6, 8, 9  success: false\\n[  1.0000   0.0000   0.0000][  0.0000   1.0000   0.0000][  0.0000   0.0000   1.0000]\\nsrc: 1, 2, 3, 4  dst: 0, 0, 0, 0  success: true\\n[  0.0000   0.0000   0.0000][  0.0000   0.0000   0.0000][  0.0000   0.0000   1.0000]\\nsrc: 1, 2, 3, 4  dst: 5, 6, 8, 9  success: true\\n[  1.5000   0.0000   3.5000][  0.0000   1.5000   3.0000][  0.0000   0.0000   1.0000]\\n"
+    },
+        "SkMatrix_setScaleTranslate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setScaleTranslate(1, 2, 3, 4);\n    matrix.dump();\n}",
+    "hash": "fed43797f13796529cb6731385d6f8f3",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setScaleTranslate",
+        "stdout": "[  1.0000   0.0000   3.0000][  0.0000   2.0000   4.0000][  0.0000   0.0000   1.0000]\\n"
+    },
+        "SkPaint_containsText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    const uint16_t goodGlyph = 511;\n    const uint16_t zeroGlyph = 0;\n    const uint16_t badGlyph = 65535; // larger than glyph count in font\n    paint.setTextEncoding(SkTextEncoding::kGlyphID);\n    SkDebugf(\"0x%04x %c= has glyph\\n\", goodGlyph,\n            paint.containsText(&goodGlyph, 2) ? '=' : '!');\n    SkDebugf(\"0x%04x %c= has glyph\\n\", zeroGlyph,\n            paint.containsText(&zeroGlyph, 2) ? '=' : '!');\n    SkDebugf(\"0x%04x %c= has glyph\\n\", badGlyph,\n            paint.containsText(&badGlyph, 2) ? '=' : '!');\n}",
+    "hash": "6a68cb3c8b81a5976c81ee004f559247",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::containsText",
+        "stdout": "0x01ff == has glyph\\n0x0000 != has glyph\\n0xffff == has glyph\\n"
+    },
+        "SkPaint_copy_const_SkPaint": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1;\n    paint1.setColor(SK_ColorRED);\n    SkPaint paint2(paint1);\n    paint2.setColor(SK_ColorBLUE);\n    SkDebugf(\"SK_ColorRED %c= paint1.getColor()\\n\", SK_ColorRED == paint1.getColor() ? '=' : '!');\n    SkDebugf(\"SK_ColorBLUE %c= paint2.getColor()\\n\", SK_ColorBLUE == paint2.getColor() ? '=' : '!');\n}",
+    "hash": "b99971ad0ef243d617925289d963b62d",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::SkPaint(const SkPaint& paint)",
+        "stdout": "SK_ColorRED == paint1.getColor()\\nSK_ColorBLUE == paint2.getColor()\\n"
+    },
+        "SkPaint_copy_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setColor(SK_ColorRED);\n    paint2 = paint1;\n    SkDebugf(\"SK_ColorRED %c= paint1.getColor()\\n\", SK_ColorRED == paint1.getColor() ? '=' : '!');\n    SkDebugf(\"SK_ColorRED %c= paint2.getColor()\\n\", SK_ColorRED == paint2.getColor() ? '=' : '!');\n}",
+    "hash": "b476a9088f80dece176ed577807d3992",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::operator=(const SkPaint& paint)",
+        "stdout": "SK_ColorRED == paint1.getColor()\\nSK_ColorRED == paint2.getColor()\\n"
+    },
+        "SkPaint_countText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    const uint8_t utf8[] = { 0x24, 0xC2, 0xA2, 0xE2, 0x82, 0xAC, 0xC2, 0xA5, 0xC2, 0xA3 };\n    SkDebugf(\"count = %d\\n\", paint.countText(utf8, sizeof(utf8)));\n}",
+    "hash": "85436c71aab5410767fc688ab0573e09",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::countText",
+        "stdout": "count = 5\\n"
+    },
+        "SkPaint_equal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setColor(SK_ColorRED);\n    paint2.setColor(0xFFFF0000);\n    SkDebugf(\"paint1 %c= paint2\\n\", paint1 == paint2 ? '=' : '!');\n    float intervals[] = { 5, 5 };\n    paint1.setPathEffect(SkDashPathEffect::Make(intervals, 2, 2.5f));\n    paint2.setPathEffect(SkDashPathEffect::Make(intervals, 2, 2.5f));\n    SkDebugf(\"paint1 %c= paint2\\n\", paint1 == paint2 ? '=' : '!');\n}",
+    "hash": "7481a948e34672720337a631830586dd",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::operator==(const SkPaint& a, const SkPaint& b)",
+        "stdout": "paint1 == paint2\\npaint1 != paint2\\n"
+    },
+        "SkPaint_getAlpha": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"255 %c= paint.getAlpha()\\n\", 255 == paint.getAlpha() ? '=' : '!');\n}",
+    "hash": "9a85bb62fe3d877b18fb7f952c4fa7f7",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getAlpha",
+        "stdout": "255 == paint.getAlpha()\\n"
+    },
+        "SkPaint_getBlendMode": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPaint paint;\n   SkDebugf(\"kSrcOver %c= getBlendMode\\n\",\n            SkBlendMode::kSrcOver == paint.getBlendMode() ? '=' : '!');\n   paint.setBlendMode(SkBlendMode::kSrc);\n   SkDebugf(\"kSrcOver %c= getBlendMode\\n\",\n            SkBlendMode::kSrcOver == paint.getBlendMode() ? '=' : '!');\n}\n",
+    "hash": "a1e059c8f6740fa2044cc64152b39dda",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getBlendMode",
+        "stdout": "kSrcOver == getBlendMode\\nkSrcOver != getBlendMode\\n"
+    },
+        "SkPaint_getColor": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColor(SK_ColorYELLOW);\n    SkColor y = paint.getColor();\n    SkDebugf(\"Yellow is %d%% red, %d%% green, and %d%% blue.\\n\", (int) (SkColorGetR(y) / 2.55f),\n            (int) (SkColorGetG(y) / 2.55f), (int) (SkColorGetB(y) / 2.55f));\n}",
+    "hash": "72d41f890203109a41f589a7403acae9",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getColor",
+        "stdout": "Yellow is 100% red, 100% green, and 0% blue.\\n"
+    },
+        "SkPaint_getColor4f": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColor(SK_ColorYELLOW);\n    SkColor4f y = paint.getColor4f();\n    SkDebugf(\"Yellow is %d%% red, %d%% green, and %d%% blue.\\n\", (int) (y.fR * 100),\n            (int) (y.fG * 100), (int) (y.fB * 100));\n}",
+    "hash": "8512ea2176f36e8f1aeef311ff228790",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getColor4f",
+        "stdout": "Yellow is 100% red, 100% green, and 0% blue.\\n"
+    },
+        "SkPaint_getColorFilter": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPaint paint;\n   SkDebugf(\"nullptr %c= color filter\\n\", paint.getColorFilter() ? '!' : '=');\n   paint.setColorFilter(SkColorFilter::MakeModeFilter(SK_ColorLTGRAY, SkBlendMode::kSrcIn));\n   SkDebugf(\"nullptr %c= color filter\\n\", paint.getColorFilter() ? '!' : '=');\n}\n",
+    "hash": "093bdc627d6b59002670fd290931f6c9",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getColorFilter",
+        "stdout": "nullptr == color filter\\nnullptr != color filter\\n"
+    },
+        "SkPaint_getDrawLooper": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPaint paint;\n   SkDebugf(\"nullptr %c= draw looper\\n\", paint.getDrawLooper() ? '!' : '=');\n   SkLayerDrawLooper::Builder looperBuilder;\n   paint.setDrawLooper(looperBuilder.detach());\n   SkDebugf(\"nullptr %c= draw looper\\n\", paint.getDrawLooper() ? '!' : '=');\n}\n",
+    "hash": "af4c5acc7a91e7f23c2af48018903ad4",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getDrawLooper",
+        "stdout": "nullptr == draw looper\\nnullptr != draw looper\\n"
+    },
+        "SkPaint_getFilterQuality": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"kNone_SkFilterQuality %c= paint.getFilterQuality()\\n\",\n            kNone_SkFilterQuality == paint.getFilterQuality() ? '=' : '!');\n}",
+    "hash": "d4ca1f23809b6835c4ba46ea98a86900",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getFilterQuality",
+        "stdout": "kNone_SkFilterQuality == paint.getFilterQuality()\\n"
+    },
+        "SkPaint_getFlags": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkDebugf(\"(SkPaint::kAntiAlias_Flag & paint.getFlags()) %c= 0\\n\",\n        SkPaint::kAntiAlias_Flag & paint.getFlags() ? '!' : '=');\n}",
+    "hash": "8a3f8c309533388b01aa66e1267f322d",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getFlags",
+        "stdout": "(SkPaint::kAntiAlias_Flag & paint.getFlags()) != 0\\n"
+    },
+        "SkPaint_getFontSpacing": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    for (SkScalar textSize : { 12, 18, 24, 32 } ) {\n        paint.setTextSize(textSize);\n        SkDebugf(\"textSize: %g fontSpacing: %g\\n\", textSize, paint.getFontSpacing());\n    }\n}",
+    "hash": "424741e26e1b174e43087d67422ce14f",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getFontSpacing",
+        "stdout": "textSize: 12 fontSpacing: 13.9688\\ntextSize: 18 fontSpacing: 20.9531\\ntextSize: 24 fontSpacing: 27.9375\\ntextSize: 32 fontSpacing: 37.25\\n"
+    },
+        "SkPaint_getHash": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setColor(SK_ColorRED);\n    paint2.setColor(0xFFFF0000);\n    SkDebugf(\"paint1 %c= paint2\\n\", paint1 == paint2 ? '=' : '!');\n    SkDebugf(\"paint1.getHash() %c= paint2.getHash()\\n\",\n             paint1.getHash() == paint2.getHash() ? '=' : '!');\n}",
+    "hash": "7f7e1b701361912b344f90ae6b530393",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getHash",
+        "stdout": "paint1 == paint2\\npaint1.getHash() == paint2.getHash()\\n"
+    },
+        "SkPaint_getHinting": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"SkFontHinting::kNormal %c= paint.getHinting()\\n\",\n            SkFontHinting::kNormal == paint.getHinting() ? '=' : ':');\n}",
+    "hash": "b56b70c7ea2453c41bfa58b626953bed",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getHinting",
+        "stdout": "SkFontHinting::kNormal == paint.getHinting()\\n"
+    },
+        "SkPaint_getImageFilter": {
+    "code": "#include \"SkBlurImageFilter.h\"\n\nvoid draw(SkCanvas* canvas) {\n   SkPaint paint;\n   SkDebugf(\"nullptr %c= image filter\\n\", paint.getImageFilter() ? '!' : '=');\n   paint.setImageFilter(SkBlurImageFilter::Make(kOuter_SkBlurStyle, 3, nullptr, nullptr));\n   SkDebugf(\"nullptr %c= image filter\\n\", paint.getImageFilter() ? '!' : '=');\n}\n",
+    "hash": "c11f8eaa1dd149bc18db21e23ce26904",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getImageFilter",
+        "stdout": "nullptr == image filter\\nnullptr != image filter\\n"
+    },
+        "SkPaint_getMaskFilter": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPaint paint;\n   SkDebugf(\"nullptr %c= mask filter\\n\", paint.getMaskFilter() ? '!' : '=');\n   paint.setMaskFilter(SkMaskFilter::MakeBlur(kOuter_SkBlurStyle, 3));\n   SkDebugf(\"nullptr %c= mask filter\\n\", paint.getMaskFilter() ? '!' : '=');\n}\n",
+    "hash": "5ac4b31371726da87bb7390b385e9fee",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getMaskFilter",
+        "stdout": "nullptr == mask filter\\nnullptr != mask filter\\n"
+    },
+        "SkPaint_getPathEffect": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPaint paint;\n   SkDebugf(\"nullptr %c= path effect\\n\", paint.getPathEffect() ? '!' : '=');\n   paint.setPathEffect(SkCornerPathEffect::Make(10));\n   SkDebugf(\"nullptr %c= path effect\\n\", paint.getPathEffect() ? '!' : '=');\n}\n",
+    "hash": "211a1b14bfa6c4332082c8eab4fbc5fd",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getPathEffect",
+        "stdout": "nullptr == path effect\\nnullptr != path effect\\n"
+    },
+        "SkPaint_getShader": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPaint paint;\n   SkDebugf(\"nullptr %c= shader\\n\", paint.getShader() ? '!' : '=');\n   paint.setShader(SkShader::MakeEmptyShader());\n   SkDebugf(\"nullptr %c= shader\\n\", paint.getShader() ? '!' : '=');\n}\n",
+    "hash": "09f15b9fd88882850da2d235eb86292f",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getShader",
+        "stdout": "nullptr == shader\\nnullptr != shader\\n"
+    },
+        "SkPaint_getStrokeCap": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"kButt_Cap %c= default stroke cap\\n\",\n            SkPaint::kButt_Cap == paint.getStrokeCap() ? '=' : '!');\n}",
+    "hash": "aabf9baee8e026fae36fca30e955512b",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getStrokeCap",
+        "stdout": "kButt_Cap == default stroke cap\\n"
+    },
+        "SkPaint_getStrokeJoin": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"kMiter_Join %c= default stroke join\\n\",\n            SkPaint::kMiter_Join == paint.getStrokeJoin() ? '=' : '!');\n}",
+    "hash": "31bf751d0a8ddf176b871810820d8199",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getStrokeJoin",
+        "stdout": "kMiter_Join == default stroke join\\n"
+    },
+        "SkPaint_getStrokeMiter": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"default miter limit == %g\\n\", paint.getStrokeMiter());\n}",
+    "hash": "50da74a43b725f07a914df588c867d36",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getStrokeMiter",
+        "stdout": "default miter limit == 4\\n"
+    },
+        "SkPaint_getStrokeWidth": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"0 %c= paint.getStrokeWidth()\\n\", 0 == paint.getStrokeWidth() ? '=' : '!');\n}",
+    "hash": "99aa73f64df8bbf06e656cd891a81b9e",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getStrokeWidth",
+        "stdout": "0 == paint.getStrokeWidth()\\n"
+    },
+        "SkPaint_getStyle": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"SkPaint::kFill_Style %c= paint.getStyle()\\n\",\n            SkPaint::kFill_Style == paint.getStyle() ? '=' : '!');\n}",
+    "hash": "1c5e18c3c0102d2dac86a78ba8c8ce01",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getStyle",
+        "stdout": "SkPaint::kFill_Style == paint.getStyle()\\n"
+    },
+        "SkPaint_getTextEncoding": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"SkTextEncoding::kUTF8 %c= text encoding\\n\",\n            SkTextEncoding::kUTF8 == paint.getTextEncoding() ? '=' : '!');\n    paint.setTextEncoding(SkTextEncoding::kGlyphID);\n    SkDebugf(\"SkTextEncoding::kGlyphID %c= text encoding\\n\",\n            SkTextEncoding::kGlyphID == paint.getTextEncoding() ? '=' : '!');\n}",
+    "hash": "0d21e968e9a4c78c902ae3ef494941a0",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getTextEncoding",
+        "stdout": "SkTextEncoding::kUTF8 == text encoding\\nSkTextEncoding::kGlyphID == text encoding\\n"
+    },
+        "SkPaint_getTextScaleX": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"1 %c= default text scale x\\n\", 1 == paint.getTextScaleX() ? '=' : '!');\n}",
+    "hash": "5dc8e58f6910cb8e4de9ed60f888188b",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getTextScaleX",
+        "stdout": "1 == default text scale x\\n"
+    },
+        "SkPaint_getTextSize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"12 %c= default text size\\n\", 12 == paint.getTextSize() ? '=' : '!');\n}",
+    "hash": "983e2a71ba72d4ba8c945420040b8f1c",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getTextSize",
+        "stdout": "12 == default text size\\n"
+    },
+        "SkPaint_getTextSkewX": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"0 %c= default text skew x\\n\", 0 == paint.getTextSkewX() ? '=' : '!');\n}",
+    "hash": "11c10f466dae0d1639dbb9f6a0040218",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getTextSkewX",
+        "stdout": "0 == default text skew x\\n"
+    },
+        "SkPaint_getTypeface": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPaint paint;\n   SkDebugf(\"nullptr %c= typeface\\n\", paint.getTypeface() ? '!' : '=');\n   paint.setTypeface(SkTypeface::MakeFromName(\"monospace\", SkFontStyle()));\n   SkDebugf(\"nullptr %c= typeface\\n\", paint.getTypeface() ? '!' : '=');\n}\n",
+    "hash": "5ce718e5a184baaac80e7098d7dad67b",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getTypeface",
+        "stdout": "nullptr == typeface\\nnullptr != typeface\\n"
+    },
+        "SkPaint_isAntiAlias": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"paint.isAntiAlias() %c= !!(paint.getFlags() & SkPaint::kAntiAlias_Flag)\\n\",\n            paint.isAntiAlias() == !!(paint.getFlags() & SkPaint::kAntiAlias_Flag) ? '=' : '!');\n    paint.setAntiAlias(true);\n    SkDebugf(\"paint.isAntiAlias() %c= !!(paint.getFlags() & SkPaint::kAntiAlias_Flag)\\n\",\n            paint.isAntiAlias() == !!(paint.getFlags() & SkPaint::kAntiAlias_Flag) ? '=' : '!');\n}",
+    "hash": "d7d5f4f7da7acd5104a652f490c6f7b8",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::isAntiAlias",
+        "stdout": "paint.isAntiAlias() == !!(paint.getFlags() & SkPaint::kAntiAlias_Flag)\\npaint.isAntiAlias() == !!(paint.getFlags() & SkPaint::kAntiAlias_Flag)\\n"
+    },
+        "SkPaint_isAutohinted": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    for (auto forceAutoHinting : { false, true} ) {\n    paint.setAutohinted(forceAutoHinting);\n    SkDebugf(\"paint.isAutohinted() %c=\"\n            \" !!(paint.getFlags() & SkPaint::kAutoHinting_Flag)\\n\",\n            paint.isAutohinted() ==\n            !!(paint.getFlags() & SkPaint::kAutoHinting_Flag) ? '=' : '!');\n    }\n}",
+    "hash": "aa4781afbe3b90e7ef56a287e5b9ce1e",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::isAutohinted",
+        "stdout": "paint.isAutohinted() == !!(paint.getFlags() & SkPaint::kAutoHinting_Flag)\\npaint.isAutohinted() == !!(paint.getFlags() & SkPaint::kAutoHinting_Flag)\\n"
+    },
+        "SkPaint_isDither": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"paint.isDither() %c= !!(paint.getFlags() & SkPaint::kDither_Flag)\\n\",\n            paint.isDither() == !!(paint.getFlags() & SkPaint::kDither_Flag) ? '=' : '!');\n    paint.setDither(true);\n    SkDebugf(\"paint.isDither() %c= !!(paint.getFlags() & SkPaint::kDither_Flag)\\n\",\n            paint.isDither() == !!(paint.getFlags() & SkPaint::kDither_Flag) ? '=' : '!');\n}",
+    "hash": "f4ce93f6c5e7335436a985377fd980c0",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::isDither",
+        "stdout": "paint.isDither() == !!(paint.getFlags() & SkPaint::kDither_Flag)\\npaint.isDither() == !!(paint.getFlags() & SkPaint::kDither_Flag)\\n"
+    },
+        "SkPaint_isEmbeddedBitmapText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"paint.isEmbeddedBitmapText() %c=\"\n            \" !!(paint.getFlags() & SkPaint::kEmbeddedBitmapText_Flag)\\n\",\n            paint.isEmbeddedBitmapText() ==\n            !!(paint.getFlags() & SkPaint::kEmbeddedBitmapText_Flag) ? '=' : '!');\n    paint.setEmbeddedBitmapText(true);\n    SkDebugf(\"paint.isEmbeddedBitmapText() %c=\"\n            \" !!(paint.getFlags() & SkPaint::kEmbeddedBitmapText_Flag)\\n\",\n            paint.isEmbeddedBitmapText() ==\n            !!(paint.getFlags() & SkPaint::kEmbeddedBitmapText_Flag) ? '=' : '!');\n}",
+    "hash": "eba10b27b790e87183ae451b3fc5c4b1",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::isEmbeddedBitmapText",
+        "stdout": "paint.isEmbeddedBitmapText() == !!(paint.getFlags() & SkPaint::kEmbeddedBitmapText_Flag)\\npaint.isEmbeddedBitmapText() == !!(paint.getFlags() & SkPaint::kEmbeddedBitmapText_Flag)\\n"
+    },
+        "SkPaint_isFakeBoldText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"paint.isFakeBoldText() %c= !!(paint.getFlags() & SkPaint::kFakeBoldText_Flag)\\n\",\n        paint.isFakeBoldText() == !!(paint.getFlags() & SkPaint::kFakeBoldText_Flag) ? '=' : '!');\n    paint.setFakeBoldText(true);\n    SkDebugf(\"paint.isFakeBoldText() %c= !!(paint.getFlags() & SkPaint::kFakeBoldText_Flag)\\n\",\n        paint.isFakeBoldText() == !!(paint.getFlags() & SkPaint::kFakeBoldText_Flag) ? '=' : '!');\n}",
+    "hash": "f54d1f85b16073b80b9eef2e1a1d151d",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::isFakeBoldText",
+        "stdout": "paint.isFakeBoldText() == !!(paint.getFlags() & SkPaint::kFakeBoldText_Flag)\\npaint.isFakeBoldText() == !!(paint.getFlags() & SkPaint::kFakeBoldText_Flag)\\n"
+    },
+        "SkPaint_isLCDRenderText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"paint.isLCDRenderText() %c= !!(paint.getFlags() & SkPaint::kLCDRenderText_Flag)\\n\",\n        paint.isLCDRenderText() == !!(paint.getFlags() & SkPaint::kLCDRenderText_Flag) ? '=' : '!');\n    paint.setLCDRenderText(true);\n    SkDebugf(\"paint.isLCDRenderText() %c= !!(paint.getFlags() & SkPaint::kLCDRenderText_Flag)\\n\",\n        paint.isLCDRenderText() == !!(paint.getFlags() & SkPaint::kLCDRenderText_Flag) ? '=' : '!');\n}",
+    "hash": "68e1fd95dd2fd06a333899d2bd2396b9",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::isLCDRenderText",
+        "stdout": "paint.isLCDRenderText() == !!(paint.getFlags() & SkPaint::kLCDRenderText_Flag)\\npaint.isLCDRenderText() == !!(paint.getFlags() & SkPaint::kLCDRenderText_Flag)\\n"
+    },
+        "SkPaint_isSrcOver": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPaint paint;\n   SkDebugf(\"isSrcOver %c= true\\n\", paint.isSrcOver() ? '=' : '!');\n   paint.setBlendMode(SkBlendMode::kSrc);\n   SkDebugf(\"isSrcOver %c= true\\n\", paint.isSrcOver() ? '=' : '!');\n}\n",
+    "hash": "257c9473db7a2b3a0fb2b9e2431e59a6",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::isSrcOver",
+        "stdout": "isSrcOver == true\\nisSrcOver != true\\n"
+    },
+        "SkPaint_isSubpixelText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"paint.isSubpixelText() %c= !!(paint.getFlags() & SkPaint::kSubpixelText_Flag)\\n\",\n        paint.isSubpixelText() == !!(paint.getFlags() & SkPaint::kSubpixelText_Flag) ? '=' : '!');\n    paint.setSubpixelText(true);\n    SkDebugf(\"paint.isSubpixelText() %c= !!(paint.getFlags() & SkPaint::kSubpixelText_Flag)\\n\",\n        paint.isSubpixelText() == !!(paint.getFlags() & SkPaint::kSubpixelText_Flag) ? '=' : '!');\n}",
+    "hash": "abe9afc0932e2199324ae6cbb396e67c",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::isSubpixelText",
+        "stdout": "paint.isSubpixelText() == !!(paint.getFlags() & SkPaint::kSubpixelText_Flag)\\npaint.isSubpixelText() == !!(paint.getFlags() & SkPaint::kSubpixelText_Flag)\\n"
+    },
+        "SkPaint_measureText_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"default width = %g\\n\", paint.measureText(\"!\", 1));\n    paint.setTextSize(paint.getTextSize() * 2);\n    SkDebugf(\"double width = %g\\n\", paint.measureText(\"!\", 1));\n}",
+    "hash": "f1139a5ddd17fd47c2f45f6e642cac76",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::measureText_2",
+        "stdout": "default width = 5\\ndouble width = 10\\n"
+    },
+        "SkPaint_move_SkPaint": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    float intervals[] = { 5, 5 };\n    paint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 2.5f));\n    SkPaint dashed(std::move(paint));\n    SkDebugf(\"path effect unique: %s\\n\", dashed.getPathEffect()->unique() ? \"true\" : \"false\");\n}",
+    "hash": "8ed1488a503cd5282b86a51614aa90b1",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::SkPaint(SkPaint&& paint)",
+        "stdout": "path effect unique: true\\n"
+    },
+        "SkPaint_move_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setColor(SK_ColorRED);\n    paint2 = std::move(paint1);\n    SkDebugf(\"SK_ColorRED == paint2.getColor()\\n\", SK_ColorRED == paint2.getColor() ? '=' : '!');\n}",
+    "hash": "9fb7459b097d713f5f1fe5675afe14f5",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::operator=(SkPaint&& paint)",
+        "stdout": "SK_ColorRED == paint2.getColor()\\n"
+    },
+        "SkPaint_notequal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setColor(SK_ColorRED);\n    paint2.setColor(0xFFFF0000);\n    SkDebugf(\"paint1 %c= paint2\\n\", paint1 == paint2 ? '=' : '!');\n    SkDebugf(\"paint1 %c= paint2\\n\", paint1 != paint2 ? '!' : '=');\n}",
+    "hash": "b6c8484b1187f555b435ad5369833be4",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::operator!=(const SkPaint& a, const SkPaint& b)",
+        "stdout": "paint1 == paint2\\npaint1 == paint2\\n"
+    },
+        "SkPaint_nothingToDraw": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPaint& p) -> void {\n        SkDebugf(\"%s nothing to draw: %s\\n\", prefix,\n                 p.nothingToDraw() ? \"true\" : \"false\");\n    };\n    SkPaint paint;\n    debugster(\"initial\", paint);\n    paint.setBlendMode(SkBlendMode::kDst);\n    debugster(\"blend dst\", paint);\n    paint.setBlendMode(SkBlendMode::kSrcOver);\n    debugster(\"blend src over\", paint);\n    paint.setAlpha(0);\n    debugster(\"alpha 0\", paint);\n}\n",
+    "hash": "2973b05bfbb6b4c29332c8ac4fcf3995",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::nothingToDraw",
+        "stdout": "initial nothing to draw: false\\nblend dst nothing to draw: true\\nblend src over nothing to draw: false\\nalpha 0 nothing to draw: true\\n"
+    },
+        "SkPaint_refColorFilter": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setColorFilter(SkColorFilter::MakeModeFilter(0xFFFF0000, SkBlendMode::kSrcATop));\n    SkDebugf(\"color filter unique: %s\\n\", paint1.getColorFilter()->unique() ? \"true\" : \"false\");\n    paint2.setColorFilter(paint1.refColorFilter());\n    SkDebugf(\"color filter unique: %s\\n\", paint1.getColorFilter()->unique() ? \"true\" : \"false\");\n}\n",
+    "hash": "b588c95fa4c86ddbc4b0546762f08297",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::refColorFilter",
+        "stdout": "color filter unique: true\\ncolor filter unique: false\\n"
+    },
+        "SkPaint_refDrawLooper": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    SkLayerDrawLooper::Builder looperBuilder;\n    paint1.setDrawLooper(looperBuilder.detach());\n    SkDebugf(\"draw looper unique: %s\\n\", paint1.getDrawLooper()->unique() ? \"true\" : \"false\");\n    paint2.setDrawLooper(paint1.refDrawLooper());\n    SkDebugf(\"draw looper unique: %s\\n\", paint1.getDrawLooper()->unique() ? \"true\" : \"false\");\n}\n",
+    "hash": "2a3782c33f04ed17a725d0e449c6f7c3",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::refDrawLooper",
+        "stdout": "draw looper unique: true\\ndraw looper unique: false\\n"
+    },
+        "SkPaint_refImageFilter": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setImageFilter(SkOffsetImageFilter::Make(25, 25, nullptr));\n    SkDebugf(\"image filter unique: %s\\n\", paint1.getImageFilter()->unique() ? \"true\" : \"false\");\n    paint2.setImageFilter(paint1.refImageFilter());\n    SkDebugf(\"image filter unique: %s\\n\", paint1.getImageFilter()->unique() ? \"true\" : \"false\");\n}\n",
+    "hash": "13f09088b569251547107d14ae989dc1",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::refImageFilter",
+        "stdout": "image filter unique: true\\nimage filter unique: false\\n"
+    },
+        "SkPaint_refMaskFilter": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 1));\n    SkDebugf(\"mask filter unique: %s\\n\", paint1.getMaskFilter()->unique() ? \"true\" : \"false\");\n    paint2.setMaskFilter(paint1.refMaskFilter());\n    SkDebugf(\"mask filter unique: %s\\n\", paint1.getMaskFilter()->unique() ? \"true\" : \"false\");\n}\n",
+    "hash": "084b0dc3cebd78718c651d58f257f799",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::refMaskFilter",
+        "stdout": "mask filter unique: true\\nmask filter unique: false\\n"
+    },
+        "SkPaint_refPathEffect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    SkScalar intervals[] = {1, 2};\n    paint1.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 10));\n    SkDebugf(\"path effect unique: %s\\n\", paint1.getPathEffect()->unique() ? \"true\" : \"false\");\n    paint2.setPathEffect(paint1.refPathEffect());\n    SkDebugf(\"path effect unique: %s\\n\", paint1.getPathEffect()->unique() ? \"true\" : \"false\");\n}\n",
+    "hash": "f56039b94c702c2704c8c5100e623aca",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::refPathEffect",
+        "stdout": "path effect unique: true\\npath effect unique: false\\n"
+    },
+        "SkPaint_refShader": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPaint paint1, paint2;\n   paint1.setShader(SkShader::MakeEmptyShader());\n   SkDebugf(\"shader unique: %s\\n\", paint1.getShader()->unique() ? \"true\" : \"false\");\n   paint2.setShader(paint1.refShader());\n   SkDebugf(\"shader unique: %s\\n\", paint1.getShader()->unique() ? \"true\" : \"false\");\n}\n",
+    "hash": "53da0295972a418cbc9607bbb17feaa8",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::refShader",
+        "stdout": "shader unique: true\\nshader unique: false\\n"
+    },
+        "SkPaint_refTypeface": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPaint paint1, paint2;\n   paint1.setTypeface(SkTypeface::MakeFromName(\"monospace\",\n            SkFontStyle(SkFontStyle::kNormal_Weight, SkFontStyle::kNormal_Width,\n            SkFontStyle::kItalic_Slant)));\n   SkDebugf(\"typeface1 %c= typeface2\\n\",\n            paint1.getTypeface() == paint2.getTypeface() ? '=' : '!');\n   paint2.setTypeface(paint1.refTypeface());\n   SkDebugf(\"typeface1 %c= typeface2\\n\",\n            paint1.getTypeface() == paint2.getTypeface() ? '=' : '!');\n}\n",
+    "hash": "8b5aa7e555a0dc31be69db7cadf471a1",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::refTypeface",
+        "stdout": "typeface1 != typeface2\\ntypeface1 == typeface2\\n"
+    },
+        "SkPaint_reset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setColor(SK_ColorRED);\n    paint1.reset();\n    SkDebugf(\"paint1 %c= paint2\", paint1 == paint2 ? '=' : '!');\n}",
+    "hash": "ef269937ade7e7353635121d9a64f9f7",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::reset()",
+        "stdout": "paint1 == paint2"
+    },
+        "SkPaint_setARGB": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint transRed1, transRed2;\n    transRed1.setARGB(255 / 2, 255, 0, 0);\n    transRed2.setColor(SkColorSetARGB(255 / 2, 255, 0, 0));\n    SkDebugf(\"transRed1 %c= transRed2\", transRed1 == transRed2 ? '=' : '!');\n}",
+    "hash": "cb62e4755789ed32f7120dc55984959d",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setARGB",
+        "stdout": "transRed1 == transRed2"
+    },
+        "SkPaint_setAlpha": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColor(0x00112233);\n    paint.setAlpha(0x44);\n    SkDebugf(\"0x44112233 %c= paint.getColor()\\n\", 0x44112233 == paint.getColor() ? '=' : '!');\n}",
+    "hash": "6ddc0360512dfb9947e75c17e6a8103d",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setAlpha",
+        "stdout": "0x44112233 == paint.getColor()\\n"
+    },
+        "SkPaint_setAntiAlias": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setAntiAlias(true);\n    paint2.setFlags(paint2.getFlags() | SkPaint::kAntiAlias_Flag);\n    SkDebugf(\"paint1 %c= paint2\\n\", paint1 == paint2 ? '=' : '!');\n}",
+    "hash": "c2ff148374d01cbef845b223e725905c",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setAntiAlias",
+        "stdout": "paint1 == paint2\\n"
+    },
+        "SkPaint_setBlendMode": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPaint paint;\n   SkDebugf(\"isSrcOver %c= true\\n\", paint.isSrcOver() ? '=' : '!');\n   paint.setBlendMode(SkBlendMode::kSrc);\n   SkDebugf(\"isSrcOver %c= true\\n\", paint.isSrcOver() ? '=' : '!');\n}\n",
+    "hash": "257c9473db7a2b3a0fb2b9e2431e59a6",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setBlendMode",
+        "stdout": "isSrcOver == true\\nisSrcOver != true\\n"
+    },
+        "SkPaint_setColor": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint green1, green2;\n    unsigned a = 255;\n    unsigned r = 0;\n    unsigned g = 255;\n    unsigned b = 0;\n    green1.setColor((a << 24) + (r << 16) + (g << 8) + (b << 0));\n    green2.setColor(0xFF00FF00);\n    SkDebugf(\"green1 %c= green2\\n\", green1 == green2 ? '=' : '!');\n}",
+    "hash": "6e70f18300bd676a3c056ceb6b62f8df",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setColor",
+        "stdout": "green1 == green2\\n"
+    },
+        "SkPaint_setColor4f": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint green1, green2;\n    green1.setColor4f({0, 1, 0, 1}, nullptr);  // R=0 G=1 B=0 A=1\n    green2.setColor(0xFF00FF00); // A=255 R=0 G=255 B=0\n    SkDebugf(\"green1 %c= green2\\n\", green1 == green2 ? '=' : '!');\n}",
+    "hash": "fa60859e3d03bdc117a05b32e093a8f1",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setColor4f",
+        "stdout": "green1 == green2\\n"
+    },
+        "SkPaint_setDither": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setDither(true);\n    paint2.setFlags(paint2.getFlags() | SkPaint::kDither_Flag);\n    SkDebugf(\"paint1 %c= paint2\\n\", paint1 == paint2 ? '=' : '!');\n}",
+    "hash": "69b7162e8324d9239dd02dd9ada2bdff",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setDither",
+        "stdout": "paint1 == paint2\\n"
+    },
+        "SkPaint_setEmbeddedBitmapText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setEmbeddedBitmapText(true);\n    paint2.setFlags(paint2.getFlags() | SkPaint::kEmbeddedBitmapText_Flag);\n    SkDebugf(\"paint1 %c= paint2\\n\", paint1 == paint2 ? '=' : '!');\n}",
+    "hash": "246dffdd93a484ba4ad7ecf71198a5d4",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setEmbeddedBitmapText",
+        "stdout": "paint1 == paint2\\n"
+    },
+        "SkPaint_setFakeBoldText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setFakeBoldText(true);\n    paint2.setFlags(paint2.getFlags() | SkPaint::kFakeBoldText_Flag);\n    SkDebugf(\"paint1 %c= paint2\\n\", paint1 == paint2 ? '=' : '!');\n}",
+    "hash": "594d47858eb11028cb626515a520910a",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setFakeBoldText",
+        "stdout": "paint1 == paint2\\n"
+    },
+        "SkPaint_setFilterQuality": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setFilterQuality(kHigh_SkFilterQuality);\n    SkDebugf(\"kHigh_SkFilterQuality %c= paint.getFilterQuality()\\n\",\n            kHigh_SkFilterQuality == paint.getFilterQuality() ? '=' : '!');\n}",
+    "hash": "e4288fabf24ee60b645e8bb6ea0afadf",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setFilterQuality",
+        "stdout": "kHigh_SkFilterQuality == paint.getFilterQuality()\\n"
+    },
+        "SkPaint_setFlags": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setFlags((uint32_t) (SkPaint::kAntiAlias_Flag | SkPaint::kDither_Flag));\n    SkDebugf(\"paint.isAntiAlias()\\n\", paint.isAntiAlias() ? '!' : '=');\n    SkDebugf(\"paint.isDither()\\n\", paint.isDither() ? '!' : '=');\n}",
+    "hash": "54baed3f6bc4b9c31ba664e27767fdc7",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setFlags",
+        "stdout": "paint.isAntiAlias()\\npaint.isDither()\\n"
+    },
+        "SkPaint_setHinting": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint2.setHinting(SkFontHinting::kNormal);\n    SkDebugf(\"paint1 %c= paint2\\n\", paint1 == paint2 ? '=' : ':');\n}",
+    "hash": "bb179ec5698ec1398ff18f3657ab73f7",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setHinting",
+        "stdout": "paint1 == paint2\\n"
+    },
+        "SkPaint_setLCDRenderText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setLCDRenderText(true);\n    paint2.setFlags(paint2.getFlags() | SkPaint::kLCDRenderText_Flag);\n    SkDebugf(\"paint1 %c= paint2\\n\", paint1 == paint2 ? '=' : '!');\n}",
+    "hash": "50dedf8450159571a3edaf4f0050defe",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setLCDRenderText",
+        "stdout": "paint1 == paint2\\n"
+    },
+        "SkPaint_setStrokeCap": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStrokeCap(SkPaint::kRound_Cap);\n    paint.setStrokeCap((SkPaint::Cap) SkPaint::kCapCount);\n    SkDebugf(\"kRound_Cap %c= paint.getStrokeCap()\\n\",\n            SkPaint::kRound_Cap == paint.getStrokeCap() ? '=' : '!');\n}",
+    "hash": "de83fbd848a4625345b4b87a6e55d98a",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setStrokeCap",
+        "stdout": "kRound_Cap == paint.getStrokeCap()\\n"
+    },
+        "SkPaint_setStrokeJoin": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStrokeJoin(SkPaint::kMiter_Join);\n    paint.setStrokeJoin((SkPaint::Join) SkPaint::kJoinCount);\n    SkDebugf(\"kMiter_Join %c= paint.getStrokeJoin()\\n\",\n            SkPaint::kMiter_Join == paint.getStrokeJoin() ? '=' : '!');\n}",
+    "hash": "48d963ad4286eddf680f9c511eb6da91",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setStrokeJoin",
+        "stdout": "kMiter_Join == paint.getStrokeJoin()\\n"
+    },
+        "SkPaint_setStrokeMiter": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStrokeMiter(8);\n    paint.setStrokeMiter(-1);\n    SkDebugf(\"default miter limit == %g\\n\", paint.getStrokeMiter());\n}",
+    "hash": "700b284dbc97785c6a9c9636088713ad",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setStrokeMiter",
+        "stdout": "default miter limit == 8\\n"
+    },
+        "SkPaint_setStrokeWidth": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStrokeWidth(5);\n    paint.setStrokeWidth(-1);\n    SkDebugf(\"5 %c= paint.getStrokeWidth()\\n\", 5 == paint.getStrokeWidth() ? '=' : '!');\n}",
+    "hash": "0c4446c0870b5c7b5a2efe77ff92afb8",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setStrokeWidth",
+        "stdout": "5 == paint.getStrokeWidth()\\n"
+    },
+        "SkPaint_setSubpixelText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint1, paint2;\n    paint1.setSubpixelText(true);\n    paint2.setFlags(paint2.getFlags() | SkPaint::kSubpixelText_Flag);\n    SkDebugf(\"paint1 %c= paint2\\n\", paint1 == paint2 ? '=' : '!');\n}",
+    "hash": "a77bbc1a4e3be9a8ab0f842f877c5ee4",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setSubpixelText",
+        "stdout": "paint1 == paint2\\n"
+    },
+        "SkPaint_setTextEncoding": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextEncoding((SkTextEncoding) 4);\n    SkDebugf(\"4 %c= text encoding\\n\", (SkTextEncoding) 4 == paint.getTextEncoding() ? '=' : '!');\n}",
+    "hash": "a5d1ba0dbf42afb797ffdb07647b5cb9",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setTextEncoding",
+        "stdout": "4 != text encoding\\n"
+    },
+        "SkPaint_setTextScaleX": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextScaleX(0.f / 0.f);\n    SkDebugf(\"text scale %s-a-number\\n\", SkScalarIsNaN(paint.getTextScaleX()) ? \"not\" : \"is\");\n}",
+    "hash": "a75bbdb8bb866b125c4c1dd5e967d470",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setTextScaleX",
+        "stdout": "text scale not-a-number\\n"
+    },
+        "SkPaint_setTextSize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkDebugf(\"12 %c= text size\\n\", 12 == paint.getTextSize() ? '=' : '!');\n    paint.setTextSize(-20);\n    SkDebugf(\"12 %c= text size\\n\", 12 == paint.getTextSize() ? '=' : '!');\n}",
+    "hash": "6510c9e2f57b83c47e67829e7a68d493",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setTextSize",
+        "stdout": "12 == text size\\n12 == text size\\n"
+    },
+        "SkPaint_setTextSkewX": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextScaleX(1.f / 0.f);\n    SkDebugf(\"text scale %s-finite\\n\", SkScalarIsFinite(paint.getTextScaleX()) ? \"is\" : \"not\");\n}",
+    "hash": "6bd705a6e0c5f8ee24f302fe531bfabc",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setTextSkewX",
+        "stdout": "text scale not-finite\\n"
+    },
+        "SkPath_ConvertToNonInverseFillType": {
+    "code": "#define nameValue(fill) { SkPath::fill, #fill }\n\nvoid draw(SkCanvas* canvas) {\n    struct {\n        SkPath::FillType fill;\n        const char* name;\n    } fills[] = {\n        nameValue(kWinding_FillType),\n        nameValue(kEvenOdd_FillType),\n        nameValue(kInverseWinding_FillType),\n        nameValue(kInverseEvenOdd_FillType),\n    };\n    for (unsigned i = 0; i < SK_ARRAY_COUNT(fills); ++i) {\n        if (fills[i].fill != (SkPath::FillType) i) {\n            SkDebugf(\"fills array order does not match FillType enum order\");\n            break;\n        }\n        SkDebugf(\"ConvertToNonInverseFillType(%s) == %s\\n\", fills[i].name,\n                fills[(int) SkPath::ConvertToNonInverseFillType(fills[i].fill)].name);\n    }\n}\n",
+    "hash": "319f6b124458dcc0f9ce4d7bbde65810",
+    "file": "SkPath_Reference",
+    "name": "SkPath::ConvertToNonInverseFillType",
+        "stdout": "ConvertToNonInverseFillType(kWinding_FillType) == kWinding_FillType\\nConvertToNonInverseFillType(kEvenOdd_FillType) == kEvenOdd_FillType\\nConvertToNonInverseFillType(kInverseWinding_FillType) == kWinding_FillType\\nConvertToNonInverseFillType(kInverseEvenOdd_FillType) == kEvenOdd_FillType\\n"
+    },
+        "SkPath_IsCubicDegenerate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint points[] = {{1, 0}, {0, 0}, {0, 0}, {0, 0}};\n    SkScalar step = 1;\n    SkScalar prior, length = 0, degenerate = 0;\n    do {\n        prior = points[0].fX;\n        step /= 2;\n        if (SkPath::IsCubicDegenerate(points[0], points[1], points[2], points[3], false)) {\n            degenerate = prior;\n            points[0].fX += step;\n        } else {\n            length = prior;\n            points[0].fX -= step;\n        }\n    } while (prior != points[0].fX);\n    SkDebugf(\"%1.8g is degenerate\\n\", degenerate);\n    SkDebugf(\"%1.8g is length\\n\", length);\n}\n",
+    "hash": "6b97099acdae80b16df0c4241f593991",
+    "file": "SkPath_Reference",
+    "name": "SkPath::IsCubicDegenerate",
+        "stdout": "0.00024414062 is degenerate\\n0.00024414065 is length\\n"
+    },
+        "SkPath_IsInverseFillType": {
+    "code": "#define nameValue(fill) { SkPath::fill, #fill }\n\nvoid draw(SkCanvas* canvas) {\n    struct {\n        SkPath::FillType fill;\n        const char* name;\n    } fills[] = {\n        nameValue(kWinding_FillType),\n        nameValue(kEvenOdd_FillType),\n        nameValue(kInverseWinding_FillType),\n        nameValue(kInverseEvenOdd_FillType),\n    };\n    for (auto fill: fills ) {\n        SkDebugf(\"IsInverseFillType(%s) == %s\\n\", fill.name, SkPath::IsInverseFillType(fill.fill) ?\n                 \"true\" : \"false\");\n    }\n}\n",
+    "hash": "1453856a9d0c73e8192bf298c4143563",
+    "file": "SkPath_Reference",
+    "name": "SkPath::IsInverseFillType",
+        "stdout": "IsInverseFillType(kWinding_FillType) == false\\nIsInverseFillType(kEvenOdd_FillType) == false\\nIsInverseFillType(kInverseWinding_FillType) == true\\nIsInverseFillType(kInverseEvenOdd_FillType) == true\\n"
+    },
+        "SkPath_IsLineDegenerate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint points[] = { {100, 100}, {100.000001f, 100.000001f}, {100.0001f, 100.0001f} };\n    for (size_t i = 0; i < SK_ARRAY_COUNT(points) - 1; ++i) {\n        for (bool exact : { false, true } ) {\n            SkDebugf(\"line from (%1.8g,%1.8g) to (%1.8g,%1.8g) is %s\" \"degenerate, %s\\n\",\n                    points[i].fX, points[i].fY, points[i + 1].fX, points[i + 1].fY,\n                    SkPath::IsLineDegenerate(points[i], points[i + 1], exact)\n                    ? \"\" : \"not \", exact ? \"exactly\" : \"nearly\");\n        }\n    }\n}\n",
+    "hash": "97a031f9186ade586928563840ce9116",
+    "file": "SkPath_Reference",
+    "name": "SkPath::IsLineDegenerate",
+        "stdout": "line from (100,100) to (100,100) is degenerate, nearly\\nline from (100,100) to (100,100) is degenerate, exactly\\nline from (100,100) to (100.0001,100.0001) is degenerate, nearly\\nline from (100,100) to (100.0001,100.0001) is not degenerate, exactly\\n"
+    },
+        "SkPath_IsQuadDegenerate": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const SkPath& path, bool exact) -> void {\n        SkDebugf(\"quad (%1.8g,%1.8g), (%1.8g,%1.8g), (%1.8g,%1.8g) is %s\" \"degenerate, %s\\n\",\n            path.getPoint(0).fX, path.getPoint(0).fY, path.getPoint(1).fX,\n            path.getPoint(1).fY, path.getPoint(2).fX, path.getPoint(2).fY,\n            SkPath::IsQuadDegenerate(path.getPoint(0), path.getPoint(1), path.getPoint(2), exact) ?\n            \"\" : \"not \", exact ? \"exactly\" : \"nearly\");\n    };\n    SkPath path, offset;\n    path.moveTo({100, 100});\n    path.quadTo({100.00001f, 100.00001f}, {100.00002f, 100.00002f});\n    offset.addPath(path, 1000, 1000);\n    for (bool exact : { false, true } ) {\n        debugster(path, exact);\n        debugster(offset, exact);\n    }\n}\n",
+    "hash": "a2b255a7dac1926cc3a247d318d63c62",
+    "file": "SkPath_Reference",
+    "name": "SkPath::IsQuadDegenerate",
+        "stdout": "quad (100,100), (100.00001,100.00001), (100.00002,100.00002) is degenerate, nearly\\nquad (1100,1100), (1100,1100), (1100,1100) is degenerate, nearly\\nquad (100,100), (100.00001,100.00001), (100.00002,100.00002) is not degenerate, exactly\\nquad (1100,1100), (1100,1100), (1100,1100) is degenerate, exactly\\n"
+    },
+        "SkPath_Iter_Iter": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath::Iter iter;\n    SkPoint points[4];\n    SkDebugf(\"iter is \" \"%s\" \"done\\n\", SkPath::kDone_Verb == iter.next(points) ? \"\" : \"not \");\n    SkPath path;\n    iter.setPath(path, false);\n    SkDebugf(\"iter is \" \"%s\" \"done\\n\", SkPath::kDone_Verb == iter.next(points) ? \"\" : \"not \");\n}\n",
+    "hash": "01648775cb9b354b2f1836dad82a25ab",
+    "file": "SkPath_Reference",
+    "name": "SkPath::Iter::Iter()",
+        "stdout": "iter is done\\niter is done\\n"
+    },
+        "SkPath_Iter_conicWeight": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPath path;\n   path.conicTo(1, 2, 3, 4, .5f);\n   SkPath::Iter iter(path, false);\n   SkPoint p[4];\n   SkDebugf(\"first verb is \" \"%s\" \"move\\n\", SkPath::kMove_Verb == iter.next(p) ? \"\" : \"not \");\n   SkDebugf(\"next verb is \" \"%s\" \"conic\\n\", SkPath::kConic_Verb == iter.next(p) ? \"\" : \"not \");\n   SkDebugf(\"conic points: {%g,%g}, {%g,%g}, {%g,%g}\\n\", p[0].fX, p[0].fY, p[1].fX, p[1].fY,\n                p[2].fX, p[2].fY);\n   SkDebugf(\"conic weight: %g\\n\", iter.conicWeight());\n}\n",
+    "hash": "7cdea37741d50f0594c6244eb07fd175",
+    "file": "SkPath_Reference",
+    "name": "SkPath::Iter::conicWeight",
+        "stdout": "first verb is move\\nnext verb is conic\\nconic points: {0,0}, {1,2}, {3,4}\\nconic weight: 0.5\\n"
+    },
+        "SkPath_Iter_const_SkPath": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, SkPath::Iter& iter) -> void {\n        SkDebugf(\"%s:\\n\", prefix);\n        const char* verbStr[] =  { \"Move\", \"Line\", \"Quad\", \"Conic\", \"Cubic\", \"Close\", \"Done\" };\n        const int pointCount[] = {     1 ,     2 ,     3 ,      3 ,      4 ,      1 ,     0  };\n        SkPath::Verb verb;\n        do {\n           SkPoint points[4];\n           verb = iter.next(points);\n           SkDebugf(\"k%s_Verb \", verbStr[(int) verb]);\n           for (int i = 0; i < pointCount[(int) verb]; ++i) {\n                SkDebugf(\"{%g, %g}, \", points[i].fX, points[i].fY);\n           }\n           if (SkPath::kConic_Verb == verb) {\n               SkDebugf(\"weight = %g\", iter.conicWeight());\n           }\n           SkDebugf(\"\\n\");\n        } while (SkPath::kDone_Verb != verb);\n        SkDebugf(\"\\n\");\n    };\n    SkPath path;\n    path.quadTo(10, 20, 30, 40);\n    SkPath::Iter openIter(path, false);\n    debugster(\"open\", openIter);\n    SkPath::Iter closedIter(path, true);\n    debugster(\"closed\", closedIter);\n}\n",
+    "hash": "13044dbf68885c0f15322c0633b633a3",
+    "file": "SkPath_Reference",
+    "name": "SkPath::Iter::Iter(const SkPath& path, bool forceClose)",
+        "stdout": "open:\\nkMove_Verb {0, 0}, \\nkQuad_Verb {0, 0}, {10, 20}, {30, 40}, \\nkDone_Verb \\n\\nclosed:\\nkMove_Verb {0, 0}, \\nkQuad_Verb {0, 0}, {10, 20}, {30, 40}, \\nkLine_Verb {30, 40}, {0, 0}, \\nkClose_Verb {0, 0}, \\nkDone_Verb \\n\\n"
+    },
+        "SkPath_Iter_isCloseLine": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPath path;\n   path.moveTo(6, 7);\n   path.conicTo(1, 2, 3, 4, .5f);\n   path.close();\n   SkPath::Iter iter(path, false);\n   SkPoint p[4];\n   SkDebugf(\"1st verb is \" \"%s\" \"move\\n\", SkPath::kMove_Verb == iter.next(p) ? \"\" : \"not \");\n   SkDebugf(\"moveTo point: {%g,%g}\\n\", p[0].fX, p[0].fY);\n   SkDebugf(\"2nd verb is \" \"%s\" \"conic\\n\", SkPath::kConic_Verb == iter.next(p) ? \"\" : \"not \");\n   SkDebugf(\"3rd verb is \" \"%s\" \"line\\n\", SkPath::kLine_Verb == iter.next(p) ? \"\" : \"not \");\n   SkDebugf(\"line points: {%g,%g}, {%g,%g}\\n\", p[0].fX, p[0].fY, p[1].fX, p[1].fY);\n   SkDebugf(\"line \" \"%s\" \"generated by close\\n\", iter.isCloseLine() ? \"\" : \"not \");\n   SkDebugf(\"4th verb is \" \"%s\" \"close\\n\", SkPath::kClose_Verb == iter.next(p) ? \"\" : \"not \");\n}\n",
+    "hash": "7000b501f49341629bfdd9f80e686103",
+    "file": "SkPath_Reference",
+    "name": "SkPath::Iter::isCloseLine",
+        "stdout": "1st verb is move\\nmoveTo point: {6,7}\\n2nd verb is conic\\n3rd verb is line\\nline points: {3,4}, {6,7}\\nline generated by close\\n4th verb is close\\n"
+    },
+        "SkPath_Iter_isClosedContour": {
+    "code": "void draw(SkCanvas* canvas) {\n   for (bool forceClose : { false, true } ) {\n       SkPath path;\n       path.conicTo(1, 2, 3, 4, .5f);\n       SkPath::Iter iter(path, forceClose);\n       SkDebugf(\"without close(), forceClose is %s: isClosedContour returns %s\\n\",\n           forceClose ? \"true \" : \"false\", iter.isClosedContour() ? \"true\" : \"false\");\n       path.close();\n       iter.setPath(path, forceClose);\n       SkDebugf(\"with close(),    forceClose is %s: isClosedContour returns %s\\n\",\n           forceClose ? \"true \" : \"false\", iter.isClosedContour() ? \"true\" : \"false\");\n    }\n}\n",
+    "hash": "b0d48a6e949db1cb545216ae9c3c3c70",
+    "file": "SkPath_Reference",
+    "name": "SkPath::Iter::isClosedContour",
+        "stdout": "without close(), forceClose is false: isClosedContour returns false\\nwith close(),    forceClose is false: isClosedContour returns true\\nwithout close(), forceClose is true : isClosedContour returns true\\nwith close(),    forceClose is true : isClosedContour returns true\\n"
+    },
+        "SkPath_Iter_next": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& path, bool degen, bool exact) -> void {\n        SkPath::Iter iter(path, false);\n        SkDebugf(\"%s:\\n\", prefix);\n        const char* verbStr[] =  { \"Move\", \"Line\", \"Quad\", \"Conic\", \"Cubic\", \"Close\", \"Done\" };\n        const int pointCount[] = {     1 ,     2 ,     3 ,      3 ,      4 ,      1 ,     0  };\n        SkPath::Verb verb;\n        do {\n           SkPoint points[4];\n           verb = iter.next(points, degen, exact);\n           SkDebugf(\"k%s_Verb \", verbStr[(int) verb]);\n           for (int i = 0; i < pointCount[(int) verb]; ++i) {\n                SkDebugf(\"{%1.8g, %1.8g}, \", points[i].fX, points[i].fY);\n           }\n           SkDebugf(\"\\n\");\n        } while (SkPath::kDone_Verb != verb);\n        SkDebugf(\"\\n\");\n    };\n    SkPath path;\n    path.moveTo(10, 10);\n    path.moveTo(20, 20);\n    path.quadTo(10, 20, 30, 40);\n    path.moveTo(1, 1);\n    path.close();\n    path.moveTo(30, 30);\n    path.lineTo(30, 30);\n    path.moveTo(30, 30);\n    path.lineTo(30.00001f, 30);\n    debugster(\"skip degenerate\", path, true, false);\n    debugster(\"skip degenerate if exact\", path, true, true);\n    debugster(\"skip none\", path, false, false);\n}\n",
+    "hash": "00ae8984856486bdb626d0ed6587855a",
+    "file": "SkPath_Reference",
+    "name": "SkPath::Iter::next()",
+        "stdout": "skip degenerate:\\nkMove_Verb {20, 20}, \\nkQuad_Verb {20, 20}, {10, 20}, {30, 40}, \\nkDone_Verb \\n\\nskip degenerate if exact:\\nkMove_Verb {20, 20}, \\nkQuad_Verb {20, 20}, {10, 20}, {30, 40}, \\nkMove_Verb {30, 30}, \\nkLine_Verb {30, 30}, {30.00001, 30}, \\nkDone_Verb \\n\\nskip none:\\nkMove_Verb {10, 10}, \\nkMove_Verb {20, 20}, \\nkQuad_Verb {20, 20}, {10, 20}, {30, 40}, \\nkMove_Verb {1, 1}, \\nkClose_Verb {1, 1}, \\nkMove_Verb {30, 30}, \\nkLine_Verb {30, 30}, {30, 30}, \\nkMove_Verb {30, 30}, \\nkLine_Verb {30, 30}, {30.00001, 30}, \\nkDone_Verb \\n\\n"
+    },
+        "SkPath_Iter_setPath": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, SkPath::Iter& iter) -> void {\n        SkDebugf(\"%s:\\n\", prefix);\n        const char* verbStr[] =  { \"Move\", \"Line\", \"Quad\", \"Conic\", \"Cubic\", \"Close\", \"Done\" };\n        const int pointCount[] = {     1 ,     2 ,     3 ,      3 ,      4 ,      1 ,     0  };\n        SkPath::Verb verb;\n        do {\n           SkPoint points[4];\n           verb = iter.next(points);\n           SkDebugf(\"k%s_Verb \", verbStr[(int) verb]);\n           for (int i = 0; i < pointCount[(int) verb]; ++i) {\n                SkDebugf(\"{%g, %g}, \", points[i].fX, points[i].fY);\n           }\n           if (SkPath::kConic_Verb == verb) {\n               SkDebugf(\"weight = %g\", iter.conicWeight());\n           }\n           SkDebugf(\"\\n\");\n        } while (SkPath::kDone_Verb != verb);\n        SkDebugf(\"\\n\");\n    };\n    SkPath path;\n    path.quadTo(10, 20, 30, 40);\n    SkPath::Iter iter(path, false);\n    debugster(\"quad open\", iter);\n    SkPath path2;\n    path2.conicTo(1, 2, 3, 4, .5f);\n    iter.setPath(path2, true);\n    debugster(\"conic closed\", iter);\n}\n",
+    "hash": "6c9688008cea8937ad5cc188b38ecf16",
+    "file": "SkPath_Reference",
+    "name": "SkPath::Iter::setPath",
+        "stdout": "quad open:\\nkMove_Verb {0, 0}, \\nkQuad_Verb {0, 0}, {10, 20}, {30, 40}, \\nkDone_Verb \\n\\nconic closed:\\nkMove_Verb {0, 0}, \\nkConic_Verb {0, 0}, {1, 2}, {3, 4}, weight = 0.5\\nkLine_Verb {3, 4}, {0, 0}, \\nkClose_Verb {0, 0}, \\nkDone_Verb \\n\\n"
+    },
+        "SkPath_RawIter_conicWeight": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPath path;\n   path.conicTo(1, 2, 3, 4, .5f);\n   SkPath::RawIter iter(path);\n   SkPoint p[4];\n   SkDebugf(\"first verb is \" \"%s\" \"move\\n\", SkPath::kMove_Verb == iter.next(p) ? \"\" : \"not \");\n   SkDebugf(\"next verb is \" \"%s\" \"conic\\n\", SkPath::kConic_Verb == iter.next(p) ? \"\" : \"not \");\n   SkDebugf(\"conic points: {%g,%g}, {%g,%g}, {%g,%g}\\n\", p[0].fX, p[0].fY, p[1].fX, p[1].fY,\n                p[2].fX, p[2].fY);\n   SkDebugf(\"conic weight: %g\\n\", iter.conicWeight());\n}\n",
+    "hash": "69f360a0ba8f40c51ef4cd9f972c5893",
+    "file": "SkPath_Reference",
+    "name": "SkPath::RawIter::conicWeight",
+        "stdout": "first verb is move\\nnext verb is conic\\nconic points: {0,0}, {1,2}, {3,4}\\nconic weight: 0.5\\n"
+    },
+        "SkPath_RawIter_next": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.moveTo(50, 60);\n    path.quadTo(10, 20, 30, 40);\n    path.close();\n    path.lineTo(30, 30);\n    path.conicTo(1, 2, 3, 4, .5f);\n    path.cubicTo(-1, -2, -3, -4, -5, -6);\n    SkPath::RawIter iter(path);\n    const char* verbStr[] =  { \"Move\", \"Line\", \"Quad\", \"Conic\", \"Cubic\", \"Close\", \"Done\" };\n    const int pointCount[] = {     1 ,     2 ,     3 ,      3 ,      4 ,      1 ,     0  };\n    SkPath::Verb verb;\n    do {\n        SkPoint points[4];\n        verb = iter.next(points);\n        SkDebugf(\"k%s_Verb \", verbStr[(int) verb]);\n        for (int i = 0; i < pointCount[(int) verb]; ++i) {\n            SkDebugf(\"{%1.8g, %1.8g}, \", points[i].fX, points[i].fY);\n        }\n        if (SkPath::kConic_Verb == verb) {\n            SkDebugf(\"weight = %g\", iter.conicWeight());\n        }\n        SkDebugf(\"\\n\");\n    } while (SkPath::kDone_Verb != verb);\n}\n",
+    "hash": "944a80c7ff8c04e1fecc4aec4a47ea60",
+    "file": "SkPath_Reference",
+    "name": "SkPath::RawIter::next()",
+        "stdout": "kMove_Verb {50, 60}, \\nkQuad_Verb {50, 60}, {10, 20}, {30, 40}, \\nkClose_Verb {50, 60}, \\nkMove_Verb {50, 60}, \\nkLine_Verb {50, 60}, {30, 30}, \\nkConic_Verb {30, 30}, {1, 2}, {3, 4}, weight = 0.5\\nkCubic_Verb {3, 4}, {-1, -2}, {-3, -4}, {-5, -6}, \\nkDone_Verb \\n"
+    },
+        "SkPath_RawIter_peek": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.quadTo(10, 20, 30, 40);\n    path.conicTo(1, 2, 3, 4, .5f);\n    path.cubicTo(1, 2, 3, 4, .5, 6);\n    SkPath::RawIter iter(path);\n    SkPath::Verb verb, peek = iter.peek();\n    const char* verbStr[] =  { \"Move\", \"Line\", \"Quad\", \"Conic\", \"Cubic\", \"Close\", \"Done\" };\n    do {\n        SkPoint points[4];\n        verb = iter.next(points);\n        SkDebugf(\"peek %s %c= verb %s\\n\", verbStr[peek], peek == verb ? '=' : '!', verbStr[verb]);\n        peek = iter.peek();\n    } while (SkPath::kDone_Verb != verb);\n    SkDebugf(\"peek %s %c= verb %s\\n\", verbStr[peek], peek == verb ? '=' : '!', verbStr[verb]);\n}",
+    "hash": "eb5fa5bea23059ce538e883502f828f5",
+    "file": "SkPath_Reference",
+    "name": "SkPath::RawIter::peek()",
+        "stdout": "peek Move == verb Move\\npeek Quad == verb Quad\\npeek Conic == verb Conic\\npeek Cubic == verb Cubic\\npeek Done == verb Done\\npeek Done == verb Done\\n\\n"
+    },
+        "SkPath_SegmentMask": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.conicTo(10, 10, 20, 30, 1);\n    SkDebugf(\"Path kConic_SegmentMask is %s\\n\", path.getSegmentMasks() &\n          SkPath::kConic_SegmentMask ? \"set\" : \"clear\");\n    SkDebugf(\"Path kQuad_SegmentMask is %s\\n\", path.getSegmentMasks() &\n          SkPath::kQuad_SegmentMask ? \"set\" : \"clear\");\n}",
+    "hash": "a61e5758574e28190ec4ed8c4ae7e7fa",
+    "file": "SkPath_Reference",
+    "name": "SkPath::SegmentMask",
+        "stdout": "Path kConic_SegmentMask is clear\\nPath kQuad_SegmentMask is set\\n"
+    },
+        "SkPath_Verb": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.lineTo(20, 20);\n    path.quadTo(-10, -10, 30, 30);\n    path.close();\n    path.cubicTo(1, 2, 3, 4, 5, 6);\n    path.conicTo(0, 0, 0, 0, 2);\n    uint8_t verbs[7];\n    int count = path.getVerbs(verbs, (int) SK_ARRAY_COUNT(verbs));\n    const char* verbStr[] = { \"Move\", \"Line\", \"Quad\", \"Conic\", \"Cubic\", \"Close\" };\n    SkDebugf(\"verb count: %d\\nverbs: \", count);\n    for (int i = 0; i < count; ++i) {\n        SkDebugf(\"k%s_Verb \", verbStr[verbs[i]]);\n    }\n    SkDebugf(\"\\n\");\n}\n",
+    "hash": "799096fdc1298aa815934a74e76570ca",
+    "file": "SkPath_Reference",
+    "name": "SkPath::Verb",
+        "stdout": "verb count: 7\\nverbs: kMove_Verb kLine_Verb kQuad_Verb kClose_Verb kMove_Verb kCubic_Verb kConic_Verb \\n"
+    },
+        "SkPath_arcTo_2_b": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.moveTo({156, 20});\n    path.arcTo(200, 20, 170, 50, 50);\n    SkPath::Iter iter(path, false);\n    SkPoint p[4];\n    SkPath::Verb verb;\n    while (SkPath::kDone_Verb != (verb = iter.next(p))) {\n        switch (verb) {\n            case SkPath::kMove_Verb:\n                SkDebugf(\"move to (%g,%g)\\n\", p[0].fX, p[0].fY);\n                break;\n            case SkPath::kLine_Verb:\n                SkDebugf(\"line (%g,%g),(%g,%g)\\n\", p[0].fX, p[0].fY, p[1].fX, p[1].fY);\n                break;\n            case SkPath::kConic_Verb:\n                SkDebugf(\"conic (%g,%g),(%g,%g),(%g,%g) weight %g\\n\",\n                         p[0].fX, p[0].fY, p[1].fX, p[1].fY, p[2].fX, p[2].fY, iter.conicWeight());\n                break;\n            default:\n                SkDebugf(\"unexpected verb\\n\");\n        }\n    }\n}\n",
+    "hash": "498360fa0a201cc5db04b1c27256358f",
+    "file": "SkPath_Reference",
+    "name": "SkPath::arcTo_2_3",
+        "stdout": "move to (156,20)\\nline (156,20),(79.2893,20)\\nconic (79.2893,20),(200,20),(114.645,105.355) weight 0.382683\\n"
+    },
+        "SkPath_arcTo_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.moveTo({156, 20});\n    path.arcTo({200, 20}, {170, 20}, 50);\n    SkPath::Iter iter(path, false);\n    SkPoint p[4];\n    SkPath::Verb verb;\n    while (SkPath::kDone_Verb != (verb = iter.next(p))) {\n        switch (verb) {\n            case SkPath::kMove_Verb:\n                SkDebugf(\"move to (%g,%g)\\n\", p[0].fX, p[0].fY);\n                break;\n            case SkPath::kLine_Verb:\n                SkDebugf(\"line (%g,%g),(%g,%g)\\n\", p[0].fX, p[0].fY, p[1].fX, p[1].fY);\n                break;\n            case SkPath::kConic_Verb:\n                SkDebugf(\"conic (%g,%g),(%g,%g),(%g,%g) weight %g\\n\",\n                          p[0].fX, p[0].fY, p[1].fX, p[1].fY, p[2].fX, p[2].fY, iter.conicWeight());\n                break;\n            default:\n                SkDebugf(\"unexpected verb\\n\");\n        }\n    }\n}\n",
+    "hash": "0c056264a361579c18e5d02d3172d4d4",
+    "file": "SkPath_Reference",
+    "name": "SkPath::arcTo_3",
+        "stdout": "move to (156,20)\\nline (156,20),(200,20)\\n"
+    },
+        "SkPath_computeTightBounds": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& path) -> void {\n            const SkRect& bounds = path.computeTightBounds();\n            SkDebugf(\"%s bounds = %g, %g, %g, %g\\n\", prefix,\n                     bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);\n    };\n    SkPath path;\n    debugster(\"empty\", path);\n    path.addCircle(50, 45, 25);\n    debugster(\"circle\", path);\n    SkMatrix matrix;\n    matrix.setRotate(45, 50, 45);\n    path.transform(matrix);\n    debugster(\"rotated circle\", path);\n}",
+    "hash": "9a39c56e95b19a657133b7ad1fe0cf03",
+    "file": "SkPath_Reference",
+    "name": "SkPath::computeTightBounds",
+        "stdout": "empty bounds = 0, 0, 0, 0\\ncircle bounds = 25, 20, 75, 70\\nrotated circle bounds = 25, 20, 75, 70\\n"
+    },
+        "SkPath_copy_const_SkPath": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.lineTo(20, 20);\n    SkPath path2(path);\n    path2.close();\n    SkDebugf(\"path verbs: %d\\n\", path.countVerbs());\n    SkDebugf(\"path2 verbs: %d\\n\", path2.countVerbs());\n    path.reset();\n    SkDebugf(\"after reset\\n\" \"path verbs: %d\\n\", path.countVerbs());\n    SkDebugf(\"path2 verbs: %d\\n\", path2.countVerbs());\n}",
+    "hash": "647312aacd946c8a6eabaca797140432",
+    "file": "SkPath_Reference",
+    "name": "SkPath::SkPath(const SkPath& path)",
+        "stdout": "path verbs: 2\\npath2 verbs: 3\\nafter reset\\npath verbs: 0\\npath2 verbs: 3\\n"
+    },
+        "SkPath_copy_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path1;\n    path1.addRect({10, 20, 30, 40});\n    SkPath path2 = path1;\n    const SkRect& b1 = path1.getBounds();\n    SkDebugf(\"path1 bounds = %g, %g, %g, %g\\n\", b1.fLeft, b1.fTop, b1.fRight, b1.fBottom);\n    const SkRect& b2 = path2.getBounds();\n    SkDebugf(\"path2 bounds = %g, %g, %g, %g\\n\", b2.fLeft, b2.fTop, b2.fRight, b2.fBottom);\n}",
+    "hash": "bba288f5f77fc8e37e89d2ec08e0ac60",
+    "file": "SkPath_Reference",
+    "name": "SkPath::operator=(const SkPath& path)",
+        "stdout": "path1 bounds = 10, 20, 30, 40\\npath2 bounds = 10, 20, 30, 40\\n"
+    },
+        "SkPath_countPoints": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& path) -> void {\n         SkDebugf(\"%s point count: %d\\n\", prefix, path.countPoints());\n    };\n    SkPath path;\n    debugster(\"empty\", path);\n    path.lineTo(0, 0);\n    debugster(\"zero line\", path);\n    path.rewind();\n    path.moveTo(10, 10);\n    path.lineTo(20, 20);\n    debugster(\"line\", path);\n    path.moveTo(20, 20);\n    debugster(\"second move\", path);\n}\n",
+    "hash": "bca6379ccef62cb081b10db7381deb27",
+    "file": "SkPath_Reference",
+    "name": "SkPath::countPoints",
+        "stdout": "empty point count: 0\\nzero line point count: 2\\nline point count: 2\\nsecond move point count: 3\\n"
+    },
+        "SkPath_countVerbs": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    SkDebugf(\"empty verb count: %d\\n\", path.countVerbs());\n    path.addRoundRect({10, 20, 30, 40}, 5, 5);\n    SkDebugf(\"round rect verb count: %d\\n\", path.countVerbs());\n}",
+    "hash": "af0c66aea3ef81b709664c7007f48aae",
+    "file": "SkPath_Reference",
+    "name": "SkPath::countVerbs",
+        "stdout": "empty verb count: 0\\nround rect verb count: 10\\n"
+    },
+        "SkPath_destructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath* path = new SkPath();\n    path->lineTo(20, 20);\n    SkPath path2(*path);\n    delete path;\n    SkDebugf(\"path2 is \" \"%s\" \"empty\", path2.isEmpty() ? \"\" : \"not \");\n}\n",
+    "hash": "01ad6be9b7d15a2217daea273eb3d466",
+    "file": "SkPath_Reference",
+    "name": "SkPath::~SkPath()",
+        "stdout": "path2 is not empty"
+    },
+        "SkPath_dump": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.quadTo(20, 30, 40, 50);\n    for (bool forceClose : { false, true } ) {\n        for (bool dumpAsHex : { false, true } ) {\n            path.dump(nullptr, forceClose, dumpAsHex);\n            SkDebugf(\"\\n\");\n        }\n    }\n}",
+    "hash": "8036d764452a62f9953af50846f0f3c0",
+    "file": "SkPath_Reference",
+    "name": "SkPath::dump()",
+        "stdout": "path.setFillType(SkPath::kWinding_FillType);\\npath.moveTo(0, 0);\\npath.quadTo(20, 30, 40, 50);\\n\\npath.setFillType(SkPath::kWinding_FillType);\\npath.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0\\npath.quadTo(SkBits2Float(0x41a00000), SkBits2Float(0x41f00000), SkBits2Float(0x42200000), SkBits2Float(0x42480000));  // 20, 30, 40, 50\\n\\npath.setFillType(SkPath::kWinding_FillType);\\npath.moveTo(0, 0);\\npath.quadTo(20, 30, 40, 50);\\npath.lineTo(0, 0);\\npath.close();\\n\\npath.setFillType(SkPath::kWinding_FillType);\\npath.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0\\npath.quadTo(SkBits2Float(0x41a00000), SkBits2Float(0x41f00000), SkBits2Float(0x42200000), SkBits2Float(0x42480000));  // 20, 30, 40, 50\\npath.lineTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0\\npath.close();\\n\\n"
+    },
+        "SkPath_dumpHex": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path, copy;\n    path.lineTo(6.f / 7, 2.f / 3);\n    path.dumpHex();\n    copy.setFillType(SkPath::kWinding_FillType);\n    copy.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0\n    copy.lineTo(SkBits2Float(0x3f5b6db7), SkBits2Float(0x3f2aaaab));  // 0.857143f, 0.666667f\n    SkDebugf(\"path is \" \"%s\" \"equal to copy\\n\", path == copy ? \"\" : \"not \");\n}",
+    "hash": "72a92fe058e8b3be6c8a30fad7fd1266",
+    "file": "SkPath_Reference",
+    "name": "SkPath::dumpHex",
+        "stdout": "path.setFillType(SkPath::kWinding_FillType);\\npath.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0\\npath.lineTo(SkBits2Float(0x3f5b6db7), SkBits2Float(0x3f2aaaab));  // 0.857143f, 0.666667f\\npath is equal to copy\\n"
+    },
+        "SkPath_dump_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path, copy;\n    path.lineTo(6.f / 7, 2.f / 3);\n    path.dump();\n    copy.setFillType(SkPath::kWinding_FillType);\n    copy.moveTo(0, 0);\n    copy.lineTo(0.857143f, 0.666667f);\n    SkDebugf(\"path is \" \"%s\" \"equal to copy\\n\", path == copy ? \"\" : \"not \");\n}",
+    "hash": "92e0032f85181795d1f8b5a2c8e4e4b7",
+    "file": "SkPath_Reference",
+    "name": "SkPath::dump_2",
+        "stdout": "path.setFillType(SkPath::kWinding_FillType);\\npath.moveTo(0, 0);\\npath.lineTo(0.857143f, 0.666667f);\\npath is not equal to copy\\n"
+    },
+        "SkPath_empty_constructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    SkDebugf(\"path is \" \"%s\" \"empty\", path.isEmpty() ? \"\" : \"not \");\n}",
+    "hash": "0a0026fca638d1cd75c0ab884e3ee1c6",
+    "file": "SkPath_Reference",
+    "name": "SkPath::SkPath()",
+        "stdout": "path is empty"
+    },
+        "SkPath_equal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& a, const SkPath& b) -> void {\n                SkDebugf(\"%s one %c= two\\n\", prefix, a == b ? '=' : '!');\n    };\n    SkPath one;\n    SkPath two;\n    debugster(\"empty\", one, two);\n    one.moveTo(0, 0);\n    debugster(\"moveTo\", one, two);\n    one.rewind();\n    debugster(\"rewind\", one, two);\n    one.moveTo(0, 0);\n    one.reset();\n    debugster(\"reset\", one, two);\n}\n",
+    "hash": "31883f51bb357f2ac5990d88f8b82e02",
+    "file": "SkPath_Reference",
+    "name": "SkPath::operator==(const SkPath& a, const SkPath& b)",
+        "stdout": "empty one == two\\nmoveTo one != two\\nrewind one == two\\nreset one == two\\n"
+    },
+        "SkPath_getBounds": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& path) -> void {\n            const SkRect& bounds = path.getBounds();\n            SkDebugf(\"%s bounds = %g, %g, %g, %g\\n\", prefix,\n                     bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);\n    };\n    SkPath path;\n    debugster(\"empty\", path);\n    path.addCircle(50, 45, 25);\n    debugster(\"circle\", path);\n    SkMatrix matrix;\n    matrix.setRotate(45, 50, 45);\n    path.transform(matrix);\n    debugster(\"rotated circle\", path);\n}",
+    "hash": "45c0fc3acb74fab99d544b80eadd10ad",
+    "file": "SkPath_Reference",
+    "name": "SkPath::getBounds",
+        "stdout": "empty bounds = 0, 0, 0, 0\\ncircle bounds = 25, 20, 75, 70\\nrotated circle bounds = 14.6447, 9.64466, 85.3553, 80.3553\\n"
+    },
+        "SkPath_getConvexity": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& path) -> void {\n        SkDebugf(\"%s path convexity is %s\\n\", prefix,\n                SkPath::kUnknown_Convexity == path.getConvexity() ? \"unknown\" :\n                SkPath::kConvex_Convexity == path.getConvexity() ? \"convex\" : \"concave\"); };\n    SkPath path;\n    debugster(\"initial\", path);\n    path.lineTo(50, 0);\n    debugster(\"first line\", path);\n    path.lineTo(50, 50);\n    debugster(\"second line\", path);\n    path.lineTo(100, 50);\n    debugster(\"third line\", path);\n}\n",
+    "hash": "a8f36f2fa90003e3691fd0da0bb0c243",
+    "file": "SkPath_Reference",
+    "name": "SkPath::getConvexity",
+        "stdout": "initial path convexity is convex\\nfirst line path convexity is convex\\nsecond line path convexity is convex\\nthird line path convexity is concave\\n"
+    },
+        "SkPath_getConvexityOrUnknown": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& path) -> void {\n        SkDebugf(\"%s path convexity is %s\\n\", prefix,\n            SkPath::kUnknown_Convexity == path.getConvexityOrUnknown() ? \"unknown\" :\n            SkPath::kConvex_Convexity == path.getConvexityOrUnknown() ? \"convex\" : \"concave\"); };\n    SkPath path;\n    debugster(\"initial\", path);\n    path.lineTo(50, 0);\n    debugster(\"first line\", path);\n    path.getConvexity();\n    path.lineTo(50, 50);\n    debugster(\"second line\", path);\n    path.lineTo(100, 50);\n    path.getConvexity();\n    debugster(\"third line\", path);\n}\n",
+    "hash": "111c59e9afadb940ab8f41bdc25378a4",
+    "file": "SkPath_Reference",
+    "name": "SkPath::getConvexityOrUnknown",
+        "stdout": "initial path convexity is unknown\\nfirst line path convexity is unknown\\nsecond line path convexity is unknown\\nthird line path convexity is concave\\n"
+    },
+        "SkPath_getFillType": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    SkDebugf(\"default path fill type is %s\\n\",\n            path.getFillType() == SkPath::kWinding_FillType ? \"kWinding_FillType\" :\n            path.getFillType() == SkPath::kEvenOdd_FillType ? \"kEvenOdd_FillType\" :\n            path.getFillType() == SkPath::kInverseWinding_FillType ? \"kInverseWinding_FillType\" :\n                                                                     \"kInverseEvenOdd_FillType\");\n}",
+    "hash": "019af90e778914e8a109d6305ede4fc4",
+    "file": "SkPath_Reference",
+    "name": "SkPath::getFillType",
+        "stdout": "default path fill type is kWinding_FillType\\n"
+    },
+        "SkPath_getGenerationID": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    SkDebugf(\"empty genID = %u\\n\", path.getGenerationID());\n    path.lineTo(1, 2);\n    SkDebugf(\"1st lineTo genID = %u\\n\", path.getGenerationID());\n    path.rewind();\n    SkDebugf(\"empty genID = %u\\n\", path.getGenerationID());\n    path.lineTo(1, 2);\n    SkDebugf(\"2nd lineTo genID = %u\\n\", path.getGenerationID());\n}",
+    "hash": "a0f166715d6479f91258d854e63e586d",
+    "file": "SkPath_Reference",
+    "name": "SkPath::getGenerationID",
+        "stdout": "empty genID = 1\\n1st lineTo genID = 2\\nempty genID = 1\\n2nd lineTo genID = 3\\n"
+    },
+        "SkPath_getLastPt": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.moveTo(100, 100);\n    path.quadTo(100, 20, 20, 100);\n    SkMatrix matrix;\n    matrix.setRotate(36, 100, 100);\n    path.transform(matrix);\n    SkPoint last;\n    path.getLastPt(&last);\n    SkDebugf(\"last point: %g, %g\\n\", last.fX, last.fY);\n}",
+    "hash": "df8160dd7ac8aa4b40fce7286fe49952",
+    "file": "SkPath_Reference",
+    "name": "SkPath::getLastPt",
+        "stdout": "last point: 35.2786, 52.9772\\n"
+    },
+        "SkPath_getPoint": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.lineTo(20, 20);\n    path.offset(-10, -10);\n    for (int i= 0; i < path.countPoints(); ++i) {\n         SkDebugf(\"point %d: (%1.8g,%1.8g)\\n\", i, path.getPoint(i).fX, path.getPoint(i).fY);\n    }\n}\n",
+    "hash": "42885f1df13de109adccc5d531f62111",
+    "file": "SkPath_Reference",
+    "name": "SkPath::getPoint",
+        "stdout": "point 0: (-10,-10)\\npoint 1: (10,10)\\n"
+    },
+        "SkPath_getPoints": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& path, SkPoint* points, int max) -> void {\n         int count = path.getPoints(points, max);\n         SkDebugf(\"%s point count: %d  \", prefix, count);\n         for (int i = 0; i < SkTMin(count, max) && points; ++i) {\n             SkDebugf(\"(%1.8g,%1.8g) \", points[i].fX, points[i].fY);\n         }\n         SkDebugf(\"\\n\");\n    };\n    SkPath path;\n    path.lineTo(20, 20);\n    path.lineTo(-10, -10);\n    SkPoint points[3];\n    debugster(\"no points\",  path, nullptr, 0);\n    debugster(\"zero max\",  path, points, 0);\n    debugster(\"too small\",  path, points, 2);\n    debugster(\"just right\",  path, points, path.countPoints());\n}\n",
+    "hash": "9bc86efda08cbcd9c6f7c5f220294a24",
+    "file": "SkPath_Reference",
+    "name": "SkPath::getPoints",
+        "stdout": "no points point count: 3  \\nzero max point count: 3  \\ntoo small point count: 3  (0,0) (20,20) \\njust right point count: 3  (0,0) (20,20) (-10,-10) \\n"
+    },
+        "SkPath_getSegmentMasks": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.quadTo(20, 30, 40, 50);\n    path.close();\n    const char* masks[] = { \"line\", \"quad\", \"conic\", \"cubic\" };\n    int index = 0;\n    for (auto mask : { SkPath::kLine_SegmentMask, SkPath::kQuad_SegmentMask,\n            SkPath::kConic_SegmentMask, SkPath::kCubic_SegmentMask } ) {\n        if (mask & path.getSegmentMasks()) {\n           SkDebugf(\"mask %s set\\n\", masks[index]);\n        }\n        ++index;\n    }\n}",
+    "hash": "657a3f3e11acafea92b84d6bb0c13633",
+    "file": "SkPath_Reference",
+    "name": "SkPath::getSegmentMasks",
+        "stdout": "mask quad set\\n"
+    },
+        "SkPath_getVerbs": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& path, uint8_t* verbs, int max) -> void {\n         int count = path.getVerbs(verbs, max);\n         SkDebugf(\"%s verb count: %d  \", prefix, count);\n         const char* verbStr[] = { \"move\", \"line\", \"quad\", \"conic\", \"cubic\", \"close\" };\n         for (int i = 0; i < SkTMin(count, max) && verbs; ++i) {\n             SkDebugf(\"%s \", verbStr[verbs[i]]);\n         }\n         SkDebugf(\"\\n\");\n    };\n    SkPath path;\n    path.lineTo(20, 20);\n    path.lineTo(-10, -10);\n    uint8_t verbs[3];\n    debugster(\"no verbs\",  path, nullptr, 0);\n    debugster(\"zero max\",  path, verbs, 0);\n    debugster(\"too small\",  path, verbs, 2);\n    debugster(\"just right\",  path, verbs, path.countVerbs());\n}\n",
+    "hash": "2ec66880966a6133ddd9331ce7323438",
+    "file": "SkPath_Reference",
+    "name": "SkPath::getVerbs",
+        "stdout": "no verbs verb count: 3  \\nzero max verb count: 3  \\ntoo small verb count: 3  move line \\njust right verb count: 3  move line line \\n"
+    },
+        "SkPath_isEmpty": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& path) -> void {\n        SkDebugf(\"%s path is %s\" \"empty\\n\", prefix, path.isEmpty() ? \"\" : \"not \");\n    };\n    SkPath path;\n    debugster(\"initial\", path);\n    path.moveTo(0, 0);\n    debugster(\"after moveTo\", path);\n    path.rewind();\n    debugster(\"after rewind\", path);\n    path.lineTo(0, 0);\n    debugster(\"after lineTo\", path);\n    path.reset();\n    debugster(\"after reset\", path);\n}\n",
+    "hash": "0b34e6d55d11586744adeb889d2a12f4",
+    "file": "SkPath_Reference",
+    "name": "SkPath::isEmpty",
+        "stdout": "initial path is empty\\nafter moveTo path is not empty\\nafter rewind path is empty\\nafter lineTo path is not empty\\nafter reset path is empty\\n"
+    },
+        "SkPath_isFinite": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& path) -> void {\n        SkDebugf(\"%s path is %s\" \"finite\\n\", prefix, path.isFinite() ? \"\" : \"not \");\n    };\n    SkPath path;\n    debugster(\"initial\", path);\n    path.lineTo(SK_ScalarMax, SK_ScalarMax);\n    debugster(\"after line\", path);\n    SkMatrix matrix;\n    matrix.setScale(2, 2);\n    path.transform(matrix);\n    debugster(\"after scale\", path);\n}\n",
+    "hash": "dd4e4dd2aaa8039b2430729c6b3af817",
+    "file": "SkPath_Reference",
+    "name": "SkPath::isFinite",
+        "stdout": "initial path is finite\\nafter line path is finite\\nafter scale path is not finite\\n"
+    },
+        "SkPath_isInterpolatable": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path, path2;\n    path.moveTo(20, 20);\n    path.lineTo(40, 40);\n    path.lineTo(20, 20);\n    path.lineTo(40, 40);\n    path.close();\n    path2.addRect({20, 20, 40, 40});\n    SkDebugf(\"paths are \" \"%s\" \"interpolatable\", path.isInterpolatable(path2) ? \"\" : \"not \");\n}",
+    "hash": "c81fc7dfaf785c3fb77209c7f2ebe5b8",
+    "file": "SkPath_Reference",
+    "name": "SkPath::isInterpolatable",
+        "stdout": "paths are interpolatable"
+    },
+        "SkPath_isInverseFillType": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    SkDebugf(\"default path fill type is inverse: %s\\n\",\n            path.isInverseFillType() ? \"true\" : \"false\");\n}",
+    "hash": "2a2d39f5da611545caa18bbcea873ab2",
+    "file": "SkPath_Reference",
+    "name": "SkPath::isInverseFillType",
+        "stdout": "default path fill type is inverse: false\\n"
+    },
+        "SkPath_isLastContourClosed": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& path) -> void {\n        SkDebugf(\"%s last contour is %s\" \"closed\\n\", prefix,\n                 path.isLastContourClosed() ? \"\" : \"not \");\n    };\n    SkPath path;\n    debugster(\"initial\", path);\n    path.close();\n    debugster(\"after close\", path);\n    path.lineTo(0, 0);\n    debugster(\"after lineTo\", path);\n    path.close();\n    debugster(\"after close\", path);\n}\n",
+    "hash": "03b740ab94b9017800a52e30b5e7fee7",
+    "file": "SkPath_Reference",
+    "name": "SkPath::isLastContourClosed",
+        "stdout": "initial last contour is not closed\\nafter close last contour is not closed\\nafter lineTo last contour is not closed\\nafter close last contour is closed\\n"
+    },
+        "SkPath_isLine": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& path) -> void {\n        SkPoint line[2];\n        if (path.isLine(line)) {\n            SkDebugf(\"%s is line (%1.8g,%1.8g) (%1.8g,%1.8g)\\n\", prefix,\n                 line[0].fX, line[0].fY, line[1].fX, line[1].fY);\n        } else {\n            SkDebugf(\"%s is not line\\n\", prefix);\n        }\n    };\n    SkPath path;\n    debugster(\"empty\", path);\n    path.lineTo(0, 0);\n    debugster(\"zero line\", path);\n    path.rewind();\n    path.moveTo(10, 10);\n    path.lineTo(20, 20);\n    debugster(\"line\", path);\n    path.moveTo(20, 20);\n    debugster(\"second move\", path);\n}\n",
+    "hash": "1ad07d56e4258e041606d50cad969392",
+    "file": "SkPath_Reference",
+    "name": "SkPath::isLine",
+        "stdout": "empty is not line\\nzero line is line (0,0) (0,0)\\nline is line (10,10) (20,20)\\nsecond move is not line\\n"
+    },
+        "SkPath_isNestedFillRects": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(5);\n    SkPath path;\n    path.addRect({10, 20, 30, 40});\n    paint.getFillPath(path, &path);\n    SkRect rects[2];\n    SkPath::Direction directions[2];\n    if (path.isNestedFillRects(rects, directions)) {\n        for (int i = 0; i < 2; ++i) {\n            SkDebugf(\"%s (%g, %g, %g, %g); direction %s\\n\", i ? \"inner\" : \"outer\",\n                     rects[i].fLeft, rects[i].fTop, rects[i].fRight, rects[i].fBottom,\n                     SkPath::kCW_Direction == directions[i] ? \"CW\" : \"CCW\");\n        }\n    } else {\n        SkDebugf(\"is not nested rectangles\\n\");\n    }\n}\n",
+    "hash": "77e4394caf9fa083c19c21c2462efe14",
+    "file": "SkPath_Reference",
+    "name": "SkPath::isNestedFillRects",
+        "stdout": "outer (7.5, 17.5, 32.5, 42.5); direction CW\\ninner (12.5, 22.5, 27.5, 37.5); direction CCW\\n"
+    },
+        "SkPath_isRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& path) -> void {\n        SkRect rect;\n        SkPath::Direction direction;\n        bool isClosed;\n        path.isRect(&rect, &isClosed, &direction) ?\n                SkDebugf(\"%s is rect (%g, %g, %g, %g); is %s\" \"closed; direction %s\\n\", prefix,\n                         rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, isClosed ? \"\" : \"not \",\n                         SkPath::kCW_Direction == direction ? \"CW\" : \"CCW\") :\n                SkDebugf(\"%s is not rect\\n\", prefix);\n    };\n    SkPath path;\n    debugster(\"empty\", path);\n    path.addRect({10, 20, 30, 40});\n    debugster(\"addRect\", path);\n    path.moveTo(60, 70);\n    debugster(\"moveTo\", path);\n    path.lineTo(60, 70);\n    debugster(\"lineTo\", path);\n    path.reset();\n    const SkPoint pts[] = { {0, 0}, {0, 80}, {80, 80}, {80, 0}, {40, 0}, {20, 0} };\n    path.addPoly(pts, SK_ARRAY_COUNT(pts), false);\n    debugster(\"addPoly\", path);\n}\n",
+    "hash": "81a2aac1b8f0ff3d4c8d35ccb9149b16",
+    "file": "SkPath_Reference",
+    "name": "SkPath::isRect",
+        "stdout": "empty is not rect\\naddRect is rect (10, 20, 30, 40); is closed; direction CW\\nmoveTo is rect (10, 20, 30, 40); is closed; direction CW\\nlineTo is not rect\\naddPoly is rect (0, 0, 80, 80); is not closed; direction CCW\\n"
+    },
+        "SkPath_isVolatile": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    SkDebugf(\"volatile by default is %s\\n\", path.isVolatile() ? \"true\" : \"false\");\n}",
+    "hash": "c722ebe8ac991d77757799ce29e509e1",
+    "file": "SkPath_Reference",
+    "name": "SkPath::isVolatile",
+        "stdout": "volatile by default is false\\n"
+    },
+        "SkPath_notequal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& a, const SkPath& b) -> void {\n                SkDebugf(\"%s one %c= two\\n\", prefix, a != b ? '!' : '=');\n    };\n    SkPath one;\n    SkPath two;\n    debugster(\"empty\", one, two);\n    one.addRect({10, 20, 30, 40});\n    two.addRect({10, 20, 30, 40});\n    debugster(\"add rect\", one, two);\n    one.setConvexity(SkPath::kConcave_Convexity);\n    debugster(\"setConvexity\", one, two);\n    SkDebugf(\"convexity %c=\\n\", one.getConvexity() == two.getConvexity() ? '=' : '!');\n}\n",
+    "hash": "bbbda1cc818d96c9c0d2a06c0c48902b",
+    "file": "SkPath_Reference",
+    "name": "SkPath::operator!=(const SkPath& a, const SkPath& b)",
+        "stdout": "empty one == two\\nadd rect one == two\\nsetConvexity one == two\\nconvexity !=\\n"
+    },
+        "SkPath_readFromMemory": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path, copy;\n    path.lineTo(6.f / 7, 2.f / 3);\n    size_t size = path.writeToMemory(nullptr);\n    SkTDArray<char> storage;\n    storage.setCount(size);\n    path.writeToMemory(storage.begin());\n    size_t wrongSize = size - 4;\n    size_t bytesRead = copy.readFromMemory(storage.begin(), wrongSize);\n    SkDebugf(\"length = %u; returned by readFromMemory = %u\\n\", wrongSize, bytesRead);\n    size_t largerSize = size + 4;\n    bytesRead = copy.readFromMemory(storage.begin(), largerSize);\n    SkDebugf(\"length = %u; returned by readFromMemory = %u\\n\", largerSize, bytesRead);\n}\n",
+    "hash": "9c6edd836c573a0fd232d2b8aa11a678",
+    "file": "SkPath_Reference",
+    "name": "SkPath::readFromMemory",
+        "stdout": "length = 32; returned by readFromMemory = 0\\nlength = 40; returned by readFromMemory = 36\\n"
+    },
+        "SkPath_reset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path1, path2;\n    path1.setFillType(SkPath::kInverseWinding_FillType);\n    path1.addRect({10, 20, 30, 40});\n    SkDebugf(\"path1 %c= path2\\n\", path1 == path2 ? '=' : '!');\n    path1.reset();\n    SkDebugf(\"path1 %c= path2\\n\", path1 == path2 ? '=' : '!');\n}",
+    "hash": "8cdca35d2964bbbecb93d79a13f71c65",
+    "file": "SkPath_Reference",
+    "name": "SkPath::reset()",
+        "stdout": "path1 != path2\\npath1 == path2\\n"
+    },
+        "SkPath_rewind": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path1, path2;\n    path1.setFillType(SkPath::kInverseWinding_FillType);\n    path1.addRect({10, 20, 30, 40});\n    SkDebugf(\"path1 %c= path2\\n\", path1 == path2 ? '=' : '!');\n    path1.rewind();\n    SkDebugf(\"path1 %c= path2\\n\", path1 == path2 ? '=' : '!');\n}",
+    "hash": "f1fedbb89da9c2a33a91805175663012",
+    "file": "SkPath_Reference",
+    "name": "SkPath::rewind()",
+        "stdout": "path1 != path2\\npath1 == path2\\n"
+    },
+        "SkPath_serialize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path, copy;\n    path.lineTo(6.f / 7, 2.f / 3);\n    sk_sp<SkData> data = path.serialize();\n    copy.readFromMemory(data->data(), data->size());\n    SkDebugf(\"path is \" \"%s\" \"equal to copy\\n\", path == copy ? \"\" : \"not \");\n}\n",
+    "hash": "2c6aff73608cd198659db6d1eeaaae4f",
+    "file": "SkPath_Reference",
+    "name": "SkPath::serialize()",
+        "stdout": "path is equal to copy\\n"
+    },
+        "SkPath_setConvexity": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkPath& path) -> void {\n        SkDebugf(\"%s path convexity is %s\\n\", prefix,\n                SkPath::kUnknown_Convexity == path.getConvexity() ? \"unknown\" :\n                SkPath::kConvex_Convexity == path.getConvexity() ? \"convex\" : \"concave\"); };\n        SkPoint quad[] = {{70, 70}, {20, 20}, {120, 20}, {120, 120}};\n        SkPath path;\n        path.addPoly(quad, SK_ARRAY_COUNT(quad), true);\n        debugster(\"initial\", path);\n        path.setConvexity(SkPath::kConcave_Convexity);\n        debugster(\"after forcing concave\", path);\n        path.setConvexity(SkPath::kUnknown_Convexity);\n        debugster(\"after forcing unknown\", path);\n}\n",
+    "hash": "875e32b4b1cb48d739325705fc0fa42c",
+    "file": "SkPath_Reference",
+    "name": "SkPath::setConvexity",
+        "stdout": "initial path convexity is convex\\nafter forcing concave path convexity is concave\\nafter forcing unknown path convexity is convex\\n"
+    },
+        "SkPath_swap": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path1, path2;\n    path1.addRect({10, 20, 30, 40});\n    path1.swap(path2);\n    const SkRect& b1 = path1.getBounds();\n    SkDebugf(\"path1 bounds = %g, %g, %g, %g\\n\", b1.fLeft, b1.fTop, b1.fRight, b1.fBottom);\n    const SkRect& b2 = path2.getBounds();\n    SkDebugf(\"path2 bounds = %g, %g, %g, %g\\n\", b2.fLeft, b2.fTop, b2.fRight, b2.fBottom);\n}",
+    "hash": "4c5ebee2b5039e5faefa07ae63a15467",
+    "file": "SkPath_Reference",
+    "name": "SkPath::swap()",
+        "stdout": "path1 bounds = 0, 0, 0, 0\\npath2 bounds = 10, 20, 30, 40\\n"
+    },
+        "SkPath_updateBoundsCache": {
+    "code": "void draw(SkCanvas* canvas) {\n    double times[2] = { 0, 0 };\n    for (int i = 0; i < 10000; ++i) {\n      SkPath path;\n      for (int j = 1; j < 100; ++ j) {\n        path.addCircle(50 + j, 45 + j, 25 + j);\n      }\n      if (1 & i) {\n        path.updateBoundsCache();\n      }\n      double start = SkTime::GetNSecs();\n      (void) path.getBounds();\n      times[1 & i] += SkTime::GetNSecs() - start;\n    }\n    SkDebugf(\"uncached avg: %g ms\\n\", times[0] * 1e-6);\n    SkDebugf(\"cached avg: %g ms\\n\", times[1] * 1e-6);\n}",
+    "hash": "bb761cd858e6d0ca05627262cd22ff5e",
+    "file": "SkPath_Reference",
+    "name": "SkPath::updateBoundsCache",
+        "stdout": "uncached avg: 0.18048 ms\\ncached avg: 0.182784 ms\\n\\n"
+    },
+        "SkPath_writeToMemory": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path, copy;\n    path.lineTo(6.f / 7, 2.f / 3);\n    size_t size = path.writeToMemory(nullptr);\n    SkTDArray<char> storage;\n    storage.setCount(size);\n    path.writeToMemory(storage.begin());\n    copy.readFromMemory(storage.begin(), size);\n    SkDebugf(\"path is \" \"%s\" \"equal to copy\\n\", path == copy ? \"\" : \"not \");\n}\n",
+    "hash": "e5f16eda6a1c2d759556285f72598445",
+    "file": "SkPath_Reference",
+    "name": "SkPath::writeToMemory",
+        "stdout": "path is equal to copy\\n"
+    },
+        "SkPicture_uniqueID": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    recorder.beginRecording({0, 0, 0, 0});\n    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();\n    SkDebugf(\"empty picture id = %d\\n\", picture->uniqueID());\n    sk_sp<SkPicture> placeholder = SkPicture::MakePlaceholder({0, 0, 0, 0});\n    SkDebugf(\"placeholder id = %d\\n\", placeholder->uniqueID());\n}",
+    "hash": "8e4257245c988c600410fe4fd7293f07",
+    "file": "SkPicture_Reference",
+    "name": "SkPicture::uniqueID",
+        "stdout": "empty picture id = 1\\nplaceholder id = 2\\n"
+    },
+        "SkPixmap_addr": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<int32_t> pixels;\n    pixels.resize(image->height() * image->width() * 4);\n    SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType,\n            image->alphaType()), (const void*) &pixels.front(), image->width() * 4);\n    image->readPixels(pixmap, 0, 0);\n    SkDebugf(\"pixels address: 0x%llx\\n\", pixmap.addr());\n    SkPixmap inset;\n    if (pixmap.extractSubset(&inset, {128, 128, 512, 512})) {\n         SkDebugf(\"inset address:  0x%llx\\n\", inset.addr());\n    }\n}",
+    "hash": "17bcabaaee2dbb7beba562e9ca50b55e",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::addr()",
+        "stdout": "pixels address: 0x7f2a440bb010\\ninset address:  0x7f2a440fb210\\n\\n"
+    },
+        "SkPixmap_addr16": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    uint16_t storage[w * h];\n    SkPixmap pixmap(SkImageInfo::Make(w, h, kARGB_4444_SkColorType, kPremul_SkAlphaType),\n                    storage, w * sizeof(storage[0]));\n    SkDebugf(\"pixmap.addr16() %c= storage\\n\",\n              pixmap.addr16()  == storage ? '=' : '!');\n}",
+    "hash": "9b16012d265c954c6de13f3fc960da52",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::addr16",
+        "stdout": "pixmap.addr16() == storage\\n"
+    },
+        "SkPixmap_addr16_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    uint16_t storage[w * h];\n    SkPixmap pixmap(SkImageInfo::Make(w, h, kARGB_4444_SkColorType, kPremul_SkAlphaType),\n                    storage, w * sizeof(storage[0]));\n    SkDebugf(\"pixmap.addr16(1, 2) %c= &storage[1 + 2 * w]\\n\",\n              pixmap.addr16(1, 2)  == &storage[1 + 2 * w] ? '=' : '!');\n}",
+    "hash": "2c0c88a546d4ef093ab63ff72dac00b9",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::addr16_2",
+        "stdout": "pixmap.addr16(1, 2) == &storage[1 + 2 * w]\\n"
+    },
+        "SkPixmap_addr32": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    uint32_t storage[w * h];\n    SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType),\n                    storage, w * sizeof(storage[0]));\n    SkDebugf(\"pixmap.addr32() %c= storage\\n\",\n              pixmap.addr32()  == storage ? '=' : '!');\n}",
+    "hash": "6b90c7ae9f254fe4ea9ef638f893a3e6",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::addr32",
+        "stdout": "pixmap.addr32() == storage\\n"
+    },
+        "SkPixmap_addr32_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    uint32_t storage[w * h];\n    SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_8888_SkColorType, kPremul_SkAlphaType),\n                    storage, w * sizeof(storage[0]));\n    SkDebugf(\"pixmap.addr32(1, 2) %c= &storage[1 + 2 * w]\\n\",\n              pixmap.addr32(1, 2)  == &storage[1 + 2 * w] ? '=' : '!');\n}",
+    "hash": "12f8b5ce9fb25604f33df336677f5d62",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::addr32_2",
+        "stdout": "pixmap.addr32(1, 2) == &storage[1 + 2 * w]\\n"
+    },
+        "SkPixmap_addr64": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    uint64_t storage[w * h];\n    SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_F16_SkColorType, kPremul_SkAlphaType),\n                    storage, w * sizeof(storage[0]));\n    SkDebugf(\"pixmap.addr64() %c= storage\\n\",\n              pixmap.addr64()  == storage ? '=' : '!');\n}",
+    "hash": "0d17085a4698a8a2e2235fad9041b4b4",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::addr64",
+        "stdout": "pixmap.addr64() == storage\\n"
+    },
+        "SkPixmap_addr64_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    uint64_t storage[w * h];\n    SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_F16_SkColorType, kPremul_SkAlphaType),\n                    storage, w * sizeof(storage[0]));\n    SkDebugf(\"pixmap.addr64(1, 2) %c= &storage[1 + 2 * w]\\n\",\n              pixmap.addr64(1, 2)  == &storage[1 + 2 * w] ? '=' : '!');\n}",
+    "hash": "5449f65fd7673273b0b57807fd3117ff",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::addr64_2",
+        "stdout": "pixmap.addr64(1, 2) == &storage[1 + 2 * w]\\n"
+    },
+        "SkPixmap_addr8": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    uint8_t storage[w * h];\n    SkPixmap pixmap(SkImageInfo::Make(w, h, kGray_8_SkColorType, kPremul_SkAlphaType),\n                    storage, w * sizeof(storage[0]));\n    SkDebugf(\"pixmap.addr8() %c= storage\\n\",\n              pixmap.addr8()  == storage ? '=' : '!');\n}",
+    "hash": "9adda80b2dd1b08ec5ccf66da7c8bd91",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::addr8",
+        "stdout": "pixmap.addr8() == storage\\n"
+    },
+        "SkPixmap_addr8_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    uint8_t storage[w * h];\n    SkPixmap pixmap(SkImageInfo::Make(w, h, kGray_8_SkColorType, kPremul_SkAlphaType),\n                    storage, w * sizeof(storage[0]));\n    SkDebugf(\"pixmap.addr8(1, 2) %c= &storage[1 + 2 * w]\\n\",\n              pixmap.addr8(1, 2)  == &storage[1 + 2 * w] ? '=' : '!');\n}",
+    "hash": "5b986272268ef2c52045c1856f8b6107",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::addr8_2",
+        "stdout": "pixmap.addr8(1, 2) == &storage[1 + 2 * w]\\n"
+    },
+        "SkPixmap_addrF16": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    uint16_t storage[w * h * 4];\n    SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_F16_SkColorType, kPremul_SkAlphaType),\n                    storage, w * 4 * sizeof(storage[0]));\n    SkDebugf(\"pixmap.addrF16() %c= storage\\n\",\n              pixmap.addrF16()  == storage ? '=' : '!');\n}",
+    "hash": "54e8525a592f05623c33b375aebc90c1",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::addrF16",
+        "stdout": "pixmap.addrF16() == storage\\n"
+    },
+        "SkPixmap_addrF16_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    const int wordsPerPixel = 4;\n    const int rowWords = w * wordsPerPixel;\n    uint16_t storage[rowWords * h];\n    SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_F16_SkColorType, kPremul_SkAlphaType),\n                    storage, rowWords * sizeof(storage[0]));\n    SkDebugf(\"pixmap.addrF16(1, 2) %c= &storage[1 * wordsPerPixel + 2 * rowWords]\\n\",\n              pixmap.addrF16(1, 2)  == &storage[1 * wordsPerPixel + 2 * rowWords] ? '=' : '!');\n}",
+    "hash": "f6076cad455bc80af5d06eb121d3b6f2",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::addrF16_2",
+        "stdout": "pixmap.addrF16(1, 2) == &storage[1 * wordsPerPixel + 2 * rowWords]\\n"
+    },
+        "SkPixmap_addr_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    std::vector<SkPMColor> storage;\n    storage.resize(w * h);\n    SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), &storage.front(), w * 4);\n    SkDebugf(\"pixmap.addr(1, 2) %c= &storage[1 + 2 * w]\\n\",\n              pixmap.addr(1, 2)  == &storage[1 + 2 * w] ? '=' : '!');\n}",
+    "hash": "6e6e29e860eafed77308c973400cc84d",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::addr_2",
+        "stdout": "pixmap.addr(1, 2) == &storage[1 + 2 * w]\\n"
+    },
+        "SkPixmap_alphaType": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* alphas[] = {\"Unknown\", \"Opaque\", \"Premul\", \"Unpremul\"};\n    SkPixmap pixmap(SkImageInfo::MakeA8(16, 32), nullptr, 64);\n    SkDebugf(\"alpha type: k\" \"%s\" \"_SkAlphaType\\n\", alphas[pixmap.alphaType()]);\n}",
+    "hash": "070b1a60232be499eb10c6ea62371804",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::alphaType",
+        "stdout": "alpha type: kPremul_SkAlphaType\\n"
+    },
+        "SkPixmap_bounds": {
+    "code": "void draw(SkCanvas* canvas) {\n    for (int width : { 0, 2 } ) {\n        for (int height : { 0, 2 } ) {\n             SkPixmap pixmap(SkImageInfo::MakeA8(width, height), nullptr, width);\n             SkDebugf(\"width: %d height: %d empty: %s\\n\", width, height,\n                      pixmap.bounds().isEmpty() ? \"true\" : \"false\");\n        }\n    }\n}",
+    "hash": "79750fb1d898a4e5c8c828b7bc9acec5",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::bounds()",
+        "stdout": "width: 0 height: 0 empty: true\\nwidth: 0 height: 2 empty: true\\nwidth: 2 height: 0 empty: true\\nwidth: 2 height: 2 empty: false\\n"
+    },
+        "SkPixmap_colorSpace": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPixmap pixmap(SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,\n            SkColorSpace::MakeSRGBLinear()), nullptr, 64);\n    SkColorSpace* colorSpace = pixmap.colorSpace();\n    SkDebugf(\"gammaCloseToSRGB: %s  gammaIsLinear: %s  isSRGB: %s\\n\",\n            colorSpace->gammaCloseToSRGB() ? \"true\" : \"false\",\n            colorSpace->gammaIsLinear() ? \"true\" : \"false\",\n            colorSpace->isSRGB() ? \"true\" : \"false\");\n}",
+    "hash": "3421bb20a302d563832ba7bb45e0cc58",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::colorSpace",
+        "stdout": "gammaCloseToSRGB: false  gammaIsLinear: true  isSRGB: false\\n"
+    },
+        "SkPixmap_colorType": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* colors[] = {\"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                            \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\"};\n    SkPixmap pixmap(SkImageInfo::MakeA8(16, 32), nullptr, 64);\n    SkDebugf(\"color type: k\" \"%s\" \"_SkColorType\\n\", colors[pixmap.colorType()]);\n}",
+    "hash": "0ab5c7af272685f2ce177cc79e6b9457",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::colorType",
+        "stdout": "color type: kAlpha_8_SkColorType\\n"
+    },
+        "SkPixmap_computeByteSize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPixmap pixmap;\n    for (int width : { 1, 1000, 1000000 } ) {\n        for (int height: { 1, 1000, 1000000 } ) {\n            SkImageInfo imageInfo = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType);\n            pixmap.reset(imageInfo, nullptr, width * 5);\n            SkDebugf(\"width: %7d height: %7d computeByteSize: %13lld\\n\", width, height,\n                     pixmap.computeByteSize());\n        }\n    }\n}",
+    "hash": "410d14ddc45d272598c5a4e52bb047de",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::computeByteSize",
+        "stdout": "width:       1 height:       1 computeByteSize:             4\\nwidth:       1 height:    1000 computeByteSize:          4999\\nwidth:       1 height: 1000000 computeByteSize:       4999999\\nwidth:    1000 height:       1 computeByteSize:          4000\\nwidth:    1000 height:    1000 computeByteSize:       4999000\\nwidth:    1000 height: 1000000 computeByteSize:    4999999000\\nwidth: 1000000 height:       1 computeByteSize:       4000000\\nwidth: 1000000 height:    1000 computeByteSize:    4999000000\\nwidth: 1000000 height: 1000000 computeByteSize: 4999999000000\\n"
+    },
+        "SkPixmap_computeIsOpaque": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<uint32_t> pixels;\n    const int height = 2;\n    const int width = 2;\n    pixels.resize(height * width * 4);\n    SkPixmap pixmap(SkImageInfo::Make(width, height, kN32_SkColorType,\n            kPremul_SkAlphaType), (const void*) &pixels.front(), width * 4);\n    for (int index = 0; index < 2; ++index) {\n        pixmap.erase(0x00000000);\n        SkDebugf(\"computeIsOpaque: %s\\n\", pixmap.computeIsOpaque() ? \"true\" : \"false\");\n        pixmap.erase(0xFFFFFFFF);\n        SkDebugf(\"computeIsOpaque: %s\\n\", pixmap.computeIsOpaque() ? \"true\" : \"false\");\n        pixmap.reset(pixmap.info().makeAlphaType(kOpaque_SkAlphaType),\n                     (const void*) &pixels.front(), width * 4);\n    }\n}",
+    "hash": "6ef37d5be03d0bfaec992dbb5a94c66f",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::computeIsOpaque",
+        "stdout": "computeIsOpaque: false\\ncomputeIsOpaque: true\\ncomputeIsOpaque: false\\ncomputeIsOpaque: true\\n"
+    },
+        "SkPixmap_const_SkImageInfo_const_star": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkDebugf(\"image alpha only = %s\\n\", image->isAlphaOnly() ? \"true\" : \"false\");\n    SkPMColor pmColors = 0;\n    sk_sp<SkImage> copy = SkImage::MakeRasterCopy({SkImageInfo::MakeA8(1, 1),\n                                                  (uint8_t*)&pmColors,\n                                                  1});\n    SkDebugf(\"copy alpha only = %s\\n\", copy->isAlphaOnly() ? \"true\" : \"false\");\n}",
+    "hash": "9a00774be57d7308313b3a9073e6e696",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::SkPixmap(const SkImageInfo& info, const void* addr, size_t rowBytes)",
+        "stdout": "image alpha only = false\\ncopy alpha only = true\\n"
+    },
+        "SkPixmap_empty_constructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* alphas[] = {\"Unknown\", \"Opaque\", \"Premul\", \"Unpremul\"};\n    const char* colors[] = {\"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                            \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\"};\n    SkPixmap pixmap;\n    for (int i = 0; i < 2; ++i) {\n       SkDebugf(\"width: %2d  height: %2d\", pixmap.width(), pixmap.height());\n       SkDebugf(\"  color: k%s_SkColorType\", colors[pixmap.colorType()]);\n       SkDebugf(\"  alpha: k%s_SkAlphaType\\n\", alphas[pixmap.alphaType()]);\n       pixmap.reset(SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType),\n                    nullptr, 0);\n    }\n}\n",
+    "hash": "9547e74a9d37553a667b913ffd1312dd",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::SkPixmap()",
+        "stdout": "width:  0  height:  0  color: kUnknown_SkColorType  alpha: kUnknown_SkAlphaType\\nwidth: 25  height: 35  color: kRGBA_8888_SkColorType  alpha: kOpaque_SkAlphaType\\n"
+    },
+        "SkPixmap_getColor": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    std::vector<SkPMColor> storage;\n    storage.resize(w * h);\n    SkDebugf(\"Premultiplied:\\n\");\n    for (int y = 0; y < h; ++y) {\n        SkDebugf(\"(0, %d) \", y);\n        for (int x = 0; x < w; ++x) {\n            int a = 0xFF * (x + y) / (w - 1 + h - 1);\n            storage[x + y * w] = SkPackARGB32(a, a * x / (w - 1), a * y / (h - 1), a);\n            SkDebugf(\"0x%08x%c\", storage[x + y * w], x == w - 1 ? '\\n' : ' ');\n        }\n    }\n    SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), &storage.front(), w * 4);\n    SkDebugf(\"Unpremultiplied:\\n\");\n    for (int y = 0; y < h; ++y) {\n        SkDebugf(\"(0, %d) \", y);\n        for (int x = 0; x < w; ++x) {\n            SkDebugf(\"0x%08x%c\", pixmap.getColor(x, y), x == w - 1 ? '\\n' : ' ');\n        }\n    }\n}",
+    "hash": "94ad244056dc80ecd87daae004266334",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::getColor",
+        "stdout": "Premultiplied:\\n(0, 0) 0x00000000 0x2a0e002a 0x55380055 0x7f7f007f\\n(0, 1) 0x2a000e2a 0x551c1c55 0x7f542a7f 0xaaaa38aa\\n(0, 2) 0x55003855 0x7f2a547f 0xaa7171aa 0xd4d48dd4\\n(0, 3) 0x7f007f7f 0xaa38aaaa 0xd48dd4d4 0xffffffff\\nUnpremultiplied:\\n(0, 0) 0x00000000 0x2a5500ff 0x55a800ff 0x7fff00ff\\n(0, 1) 0x2a0055ff 0x555454ff 0x7fa954ff 0xaaff54ff\\n(0, 2) 0x5500a8ff 0x7f54a9ff 0xaaaaaaff 0xd4ffaaff\\n(0, 3) 0x7f00ffff 0xaa54ffff 0xd4aaffff 0xffffffff\\n"
+    },
+        "SkPixmap_height": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPixmap pixmap(SkImageInfo::MakeA8(16, 32), nullptr, 64);\n    SkDebugf(\"pixmap height: %d  info height: %d\\n\", pixmap.height(), pixmap.info().height());\n}",
+    "hash": "4a996d32122f469d51ddd0186efb48cc",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::height()",
+        "stdout": "pixmap height: 32  info height: 32\\n"
+    },
+        "SkPixmap_info": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<int32_t> pixels;\n    pixels.resize(image->height() * image->width() * 4);\n    SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType,\n            image->alphaType()), (const void*) &pixels.front(), image->width() * 4);\n    image->readPixels(pixmap, 0, 0);\n    SkPixmap inset;\n    if (pixmap.extractSubset(&inset, {128, 128, 512, 512})) {\n        const SkImageInfo& info = inset.info();\n        const char* alphas[] = {\"Unknown\", \"Opaque\", \"Premul\", \"Unpremul\"};\n        const char* colors[] = {\"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\",\n                \"RGB_888x\", \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\"};\n        SkDebugf(\"width: %d height: %d color: %s alpha: %s\\n\", info.width(), info.height(),\n                 colors[info.colorType()], alphas[info.alphaType()]);\n    }\n}",
+    "hash": "6e0f558bf7fabc655041116288559134",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::info()",
+        "stdout": "width: 384 height: 384 color: BGRA_8888 alpha: Opaque\\n"
+    },
+        "SkPixmap_isOpaque": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<uint32_t> pixels;\n    const int height = 2;\n    const int width = 2;\n    pixels.resize(height * width * 4);\n    SkPixmap pixmap(SkImageInfo::Make(width, height, kN32_SkColorType,\n            kPremul_SkAlphaType), (const void*) &pixels.front(), width * 4);\n    for (int index = 0; index < 2; ++index) {\n        pixmap.erase(0x00000000);\n        SkDebugf(\"isOpaque: %s\\n\", pixmap.isOpaque() ? \"true\" : \"false\");\n        pixmap.erase(0xFFFFFFFF);\n        SkDebugf(\"isOpaque: %s\\n\", pixmap.isOpaque() ? \"true\" : \"false\");\n        pixmap.reset(pixmap.info().makeAlphaType(kOpaque_SkAlphaType),\n                     (const void*) &pixels.front(), width * 4);\n    }\n}",
+    "hash": "efd083f121e888a523455ea8a49e50d1",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::isOpaque",
+        "stdout": "isOpaque: false\\nisOpaque: false\\nisOpaque: true\\nisOpaque: true\\n"
+    },
+        "SkPixmap_reset": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* alphas[] = {\"Unknown\", \"Opaque\", \"Premul\", \"Unpremul\"};\n    const char* colors[] = {\"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                            \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\"};\n    SkPixmap pixmap(SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType),\n                    nullptr, 0);\n    for (int i = 0; i < 2; ++i) {\n       SkDebugf(\"width: %2d  height: %2d\", pixmap.width(), pixmap.height());\n       SkDebugf(\"  color: k%s_SkColorType\", colors[pixmap.colorType()]);\n       SkDebugf(\"  alpha: k%s_SkAlphaType\\n\", alphas[pixmap.alphaType()]);\n       pixmap.reset();\n    }\n}\n",
+    "hash": "d9eb583c39f4f0baea79896b89245c98",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::reset()",
+        "stdout": "width: 25  height: 35  color: kRGBA_8888_SkColorType  alpha: kOpaque_SkAlphaType\\nwidth:  0  height:  0  color: kUnknown_SkColorType  alpha: kUnknown_SkAlphaType\\n"
+    },
+        "SkPixmap_rowBytes": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPixmap badPixmap = {SkImageInfo::MakeA8(4, 4), nullptr, 2};\n    SkPixmap okPixmap = {SkImageInfo::MakeA8(4, 4), nullptr, 8};\n    for (auto& pixmap : { badPixmap, okPixmap } ) {\n        SkDebugf(\"rowBytes: %d minRowBytes: %d\\n\", pixmap.rowBytes(),\n           pixmap.info().minRowBytes());\n    }\n}",
+    "hash": "19ac8bb81854680bd408fec8cb797d5c",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::rowBytes",
+        "stdout": "rowBytes: 2 minRowBytes: 4\\nrowBytes: 8 minRowBytes: 4\\n"
+    },
+        "SkPixmap_rowBytesAsPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    for (int rowBytes : { 4, 5, 6, 7, 8} ) {\n        SkPixmap pixmap(SkImageInfo::MakeN32(1, 1, kPremul_SkAlphaType), nullptr, rowBytes);\n        SkDebugf(\"rowBytes: %d rowBytesAsPixels: %d\\n\", rowBytes, pixmap.rowBytesAsPixels());\n    }\n}",
+    "hash": "6231bb212d0c231b5bc44eac626fbcb5",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::rowBytesAsPixels",
+        "stdout": "rowBytes: 4 rowBytesAsPixels: 1\\nrowBytes: 5 rowBytesAsPixels: 1\\nrowBytes: 6 rowBytesAsPixels: 1\\nrowBytes: 7 rowBytesAsPixels: 1\\nrowBytes: 8 rowBytesAsPixels: 2\\n"
+    },
+        "SkPixmap_setColorSpace": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPixmap pixmap;\n    sk_sp<SkColorSpace> colorSpace1 = SkColorSpace::MakeRGB(SkColorSpace::kLinear_RenderTargetGamma,\n                                                            SkColorSpace::kRec2020_Gamut);\n    SkDebugf(\"is %sunique\\n\", colorSpace1->unique() ? \"\" : \"not \");\n    pixmap.setColorSpace(colorSpace1);\n    SkDebugf(\"is %sunique\\n\", colorSpace1->unique() ? \"\" : \"not \");\n}\n",
+    "hash": "30d70aec4de17c831dba71e03dc9664a",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::setColorSpace",
+        "stdout": "is unique\\nis not unique\\n"
+    },
+        "SkPixmap_shiftPerPixel": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* colors[] = {\"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                            \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\"};\n    SkImageInfo info = SkImageInfo::MakeA8(1, 1);\n    for (SkColorType colorType : { kUnknown_SkColorType,   kAlpha_8_SkColorType,\n                                   kRGB_565_SkColorType,   kARGB_4444_SkColorType,\n                                   kRGBA_8888_SkColorType, kBGRA_8888_SkColorType,\n                                   kGray_8_SkColorType,    kRGBA_F16_SkColorType } ) {\n        SkPixmap pixmap(info.makeColorType(colorType), nullptr, 4);\n        SkDebugf(\"color: k\" \"%s\" \"_SkColorType\" \"%*s\" \"bytesPerPixel: %d shiftPerPixel: %d\\n\",\n                colors[colorType], 10 - strlen(colors[colorType]), \" \",\n                pixmap.info().bytesPerPixel(), pixmap.shiftPerPixel());\n    }\n}",
+    "hash": "bf31ee140e2c163c3957276e6d4c4f0c",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::shiftPerPixel",
+        "stdout": "color: kUnknown_SkColorType   bytesPerPixel: 0 shiftPerPixel: 0\\ncolor: kAlpha_8_SkColorType   bytesPerPixel: 1 shiftPerPixel: 0\\ncolor: kRGB_565_SkColorType   bytesPerPixel: 2 shiftPerPixel: 1\\ncolor: kARGB_4444_SkColorType bytesPerPixel: 2 shiftPerPixel: 1\\ncolor: kRGBA_8888_SkColorType bytesPerPixel: 4 shiftPerPixel: 2\\ncolor: kBGRA_8888_SkColorType bytesPerPixel: 4 shiftPerPixel: 2\\ncolor: kGray_8_SkColorType    bytesPerPixel: 1 shiftPerPixel: 0\\ncolor: kRGBA_F16_SkColorType  bytesPerPixel: 8 shiftPerPixel: 3\\n"
+    },
+        "SkPixmap_width": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::MakeA8(16, 32);\n    SkPixmap pixmap(info, nullptr, 64);\n    SkDebugf(\"pixmap width: %d  info width: %d\\n\", pixmap.width(), info.width());\n}",
+    "hash": "f68617b7153a20b2ed3d7f9ed5c6e5e4",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::width()",
+        "stdout": "pixmap width: 16  info width: 16\\n"
+    },
+        "SkPixmap_writable_addr": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    SkPMColor storage[w * h * 4];\n    SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), storage, w * 4);\n    SkDebugf(\"pixmap.writable_addr() %c= (void *)storage\\n\",\n              pixmap.writable_addr()  == (void *)storage ? '=' : '!');\n    pixmap.erase(0x00000000);\n    *(SkPMColor*)pixmap.writable_addr() = 0xFFFFFFFF;\n    SkDebugf(\"pixmap.getColor(0, 1) %c= 0x00000000\\n\",\n              pixmap.getColor(0, 1)  == 0x00000000 ? '=' : '!');\n    SkDebugf(\"pixmap.getColor(0, 0) %c= 0xFFFFFFFF\\n\",\n              pixmap.getColor(0, 0)  == 0xFFFFFFFF ? '=' : '!');\n}",
+    "hash": "74ef460f89ed5904334d0f8883e781c4",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::writable_addr",
+        "stdout": "pixmap.writable_addr() == (void *)storage\\npixmap.getColor(0, 1) == 0x00000000\\npixmap.getColor(0, 0) == 0xFFFFFFFF\\n"
+    },
+        "SkPixmap_writable_addr_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int w = 4;\n    const int h = 4;\n    SkPMColor storage[w * h * 4];\n    SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), storage, w * 4);\n    SkDebugf(\"pixmap.writable_addr() %c= (void *)storage\\n\",\n              pixmap.writable_addr()  == (void *)storage ? '=' : '!');\n    pixmap.erase(0x00000000);\n    *(SkPMColor*)pixmap.writable_addr(1, 2) = 0xFFFFFFFF;\n    SkDebugf(\"pixmap.getColor(0, 0) %c= 0x00000000\\n\",\n              pixmap.getColor(0, 0)  == 0x00000000 ? '=' : '!');\n    SkDebugf(\"pixmap.getColor(1, 2) %c= 0xFFFFFFFF\\n\",\n              pixmap.getColor(1, 2)  == 0xFFFFFFFF ? '=' : '!');\n}",
+    "hash": "559eaca89c765bc8466ea1ba3331d4db",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::writable_addr_2",
+        "stdout": "pixmap.writable_addr() == (void *)storage\\npixmap.getColor(0, 0) == 0x00000000\\npixmap.getColor(1, 2) == 0xFFFFFFFF\\n"
+    },
+        "SkPoint_Make": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint pt1 = {45, 66};\n    SkPoint pt2 = SkPoint::Make(45, 66);\n    SkVector v1 = {45, 66};\n    SkVector v2 = SkPoint::Make(45, 66);\n    SkDebugf(\"all %s\" \"equal\\n\", pt1 == pt2 && pt2 == v1 && v1 == v2 ? \"\" : \"not \");\n}",
+    "hash": "d266e70977847001f7c42f8a2513bee7",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::Make",
+        "stdout": "all equal\\n"
+    },
+        "SkPoint_equal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };\n    for (const SkPoint& pt : test) {\n        SkDebugf(\"pt: %g, %g  %c= pt\\n\", pt.fX, pt.fY, pt == pt ? '=' : '!');\n    }\n}",
+    "hash": "741f793334a48a35dadf4310d7ea52cb",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::operator==(const SkPoint& a, const SkPoint& b)",
+        "stdout": "pt: 0, -0  == pt\\npt: -1, -2  == pt\\npt: inf, 1  == pt\\npt: nan, -1  != pt\\n"
+    },
+        "SkPoint_equals": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };\n    for (const SkPoint& pt : test) {\n        SkDebugf(\"pt: %g, %g  %c= pt\\n\", pt.fX, pt.fY, pt.equals(pt.fX, pt.fY) ? '=' : '!');\n    }\n}",
+    "hash": "4cecb878c8b66beffda051f26c00f817",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::equals()",
+        "stdout": "pt: 0, -0  == pt\\npt: -1, -2  == pt\\npt: inf, 1  == pt\\npt: nan, -1  != pt\\n"
+    },
+        "SkPoint_isFinite": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };\n    for (const SkPoint& pt : test) {\n        SkDebugf(\"pt: %g, %g  finite: %s\\n\", pt.fX, pt.fY, pt.isFinite() ? \"true\" : \"false\");\n    }\n}",
+    "hash": "937cc166cc0e220f33fb82501141d0b3",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::isFinite",
+        "stdout": "pt: 0, -0  finite: true\\npt: -1, -2  finite: true\\npt: inf, 1  finite: false\\npt: nan, -1  finite: false\\n"
+    },
+        "SkPoint_isZero": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint pt = { 0.f, -0.f};\n    SkDebugf(\"pt.fX=%c%g pt.fY=%c%g\\n\", std::signbit(pt.fX) ? '-' : '+', fabsf(pt.fX),\n                                        std::signbit(pt.fY) ? '-' : '+', fabsf(pt.fY));\n    SkDebugf(\"pt.isZero() == %s\\n\", pt.isZero() ? \"true\" : \"false\");\n}",
+    "hash": "81b9665110b88ef6bcbc20464aed7da1",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::isZero",
+        "stdout": "pt.fX=+0 pt.fY=-0\\npt.isZero() == true\\n"
+    },
+        "SkPoint_iset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint pt1, pt2 = { SK_MinS16, SK_MaxS16 };\n    pt1.iset(SK_MinS16, SK_MaxS16);\n    SkDebugf(\"pt1 %c= pt2\\n\", pt1 == pt2 ? '=' : '!');\n}",
+    "hash": "0d9e8ed734981b5b113f22c7bfde5357",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::iset()",
+        "stdout": "pt1 == pt2\\n"
+    },
+        "SkPoint_iset_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIPoint iPt = { SK_MinS32, SK_MaxS32 };\n    SkPoint fPt;\n    fPt.iset(iPt);\n    SkDebugf(\"iPt: %d, %d\\n\", iPt.fX, iPt.fY);\n    SkDebugf(\"fPt: %g, %g\\n\", fPt.fX, fPt.fY);\n}",
+    "hash": "12b7164a769e232bb772f19c59600ee7",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::iset_2",
+        "stdout": "iPt: -2147483647, 2147483647\\nfPt: -2.14748e+09, 2.14748e+09\\n"
+    },
+        "SkPoint_minus_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint test[] = { {0.f, -0.f}, {-1, -2},\n                       { SK_ScalarInfinity, SK_ScalarNegativeInfinity },\n                       { SK_ScalarNaN, -SK_ScalarNaN } };\n    for (const SkPoint& pt : test) {\n        SkPoint negPt = -pt;\n        SkDebugf(\"pt: %g, %g  negate: %g, %g\\n\", pt.fX, pt.fY, negPt.fX, negPt.fY);\n    }\n}",
+    "hash": "9baf247cfcd8272c0ddf6ce93f676b37",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::operator-() const",
+        "stdout": "pt: 0, -0  negate: -0, 0\\npt: -1, -2  negate: 1, 2\\npt: inf, -inf  negate: -inf, inf\\npt: nan, -nan  negate: -nan, nan\\n"
+    },
+        "SkPoint_negate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint test[] = { {0.f, -0.f}, {-1, -2},\n                       { SK_ScalarInfinity, SK_ScalarNegativeInfinity },\n                       { SK_ScalarNaN, -SK_ScalarNaN } };\n    for (const SkPoint& pt : test) {\n        SkPoint negPt = pt;\n        negPt.negate();\n        SkDebugf(\"pt: %g, %g  negate: %g, %g\\n\", pt.fX, pt.fY, negPt.fX, negPt.fY);\n    }\n}",
+    "hash": "312c0c8065ab5d0adfda80cccf2d11e6",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::negate()",
+        "stdout": "pt: 0, -0  negate: -0, 0\\npt: -1, -2  negate: 1, 2\\npt: inf, -inf  negate: -inf, inf\\npt: nan, -nan  negate: -nan, nan\\n"
+    },
+        "SkPoint_notequal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };\n    for (const SkPoint& pt : test) {\n        SkDebugf(\"pt: %g, %g  %c= pt\\n\", pt.fX, pt.fY, pt != pt ? '!' : '=');\n    }\n}",
+    "hash": "8fe8572685eaa617f25a5a6767a874dc",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::operator!=(const SkPoint& a, const SkPoint& b)",
+        "stdout": "pt: 0, -0  == pt\\npt: -1, -2  == pt\\npt: inf, 1  == pt\\npt: nan, -1  != pt\\n"
+    },
+        "SkPoint_set": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint pt1, pt2 = { SK_ScalarPI, SK_ScalarSqrt2 };\n    pt1.set(SK_ScalarPI, SK_ScalarSqrt2);\n    SkDebugf(\"pt1 %c= pt2\\n\", pt1 == pt2 ? '=' : '!');\n}",
+    "hash": "d08d1e7dafcad4342d1619fdbb2f5781",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::set()",
+        "stdout": "pt1 == pt2\\n"
+    },
+        "SkPoint_setAbs": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint test[] = { {0.f, -0.f}, {-1, -2},\n                       { SK_ScalarInfinity, SK_ScalarNegativeInfinity },\n                       { SK_ScalarNaN, -SK_ScalarNaN } };\n    for (const SkPoint& pt : test) {\n        SkPoint absPt;\n        absPt.setAbs(pt);\n        SkDebugf(\"pt: %g, %g  abs: %g, %g\\n\", pt.fX, pt.fY, absPt.fX, absPt.fY);\n    }\n}",
+    "hash": "7f70860e820b67a347cff03c00488426",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::setAbs",
+        "stdout": "pt: 0, -0  abs: 0, 0\\npt: -1, -2  abs: 1, 2\\npt: inf, -inf  abs: inf, inf\\npt: nan, -nan  abs: nan, nan\\n"
+    },
+        "SkPoint_x": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint pt1 = {45, 66};\n    SkDebugf(\"pt1.fX %c= pt1.x()\\n\", pt1.fX == pt1.x() ? '=' : '!');\n}",
+    "hash": "9f3fe446b800ae1d940785d438634941",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::x()",
+        "stdout": "pt1.fX == pt1.x()\\n"
+    },
+        "SkPoint_y": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint pt1 = {45, 66};\n    SkDebugf(\"pt1.fY %c= pt1.y()\\n\", pt1.fY == pt1.y() ? '=' : '!');\n}",
+    "hash": "4c962850c2dbea4d2325df469400680e",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::y()",
+        "stdout": "pt1.fY == pt1.y()\\n"
+    },
+        "SkRGBA4f_FromColor": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t red = 77, green = 101, blue = 153, alpha = 43;\n    SkColor argb = SkColorSetARGB(alpha, red, green, blue);\n    SkColor4f color4f = SkColor4f::FromColor(argb);\n    SkDebugf(\"red=%g green=%g blue=%g alpha=%g\\n\", color4f.fR, color4f.fG, color4f.fB, color4f.fA);\n    SkColor fromColor4f = color4f.toSkColor();\n    SkDebugf(\"red=%d green=%d blue=%d alpha=%d\\n\", SkColorGetR(fromColor4f),\n             SkColorGetG(fromColor4f), SkColorGetB(fromColor4f), SkColorGetA(fromColor4f));\n}",
+    "hash": "33b029064e8d1928e42a587c953d0e4e",
+    "file": "SkColor4f_Reference",
+    "name": "SkRGBA4f::FromColor",
+        "stdout": "red=0.301961 green=0.396078 blue=0.6 alpha=0.168627\\nred=77 green=101 blue=153 alpha=43\\n"
+    },
+        "SkRGBA4f_equal1_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor4f colorRed = { 1, 0, 0, 1 };\n    SkColor4f colorNamedRed = SkColor4f::FromColor(SK_ColorRED);\n    SkDebugf(\"colorRed %c= colorNamedRed\", colorRed == colorNamedRed ? '=' : '!');\n}",
+    "hash": "e5b34bcb7f80f2ed890cdacaa059db0d",
+    "file": "SkColor4f_Reference",
+    "name": "SkRGBA4f::operator==(const SkRGBA4f& other) const",
+        "stdout": "colorRed == colorNamedRed"
+    },
+        "SkRGBA4f_notequal1_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor4f colorGray = { .5, .5, .5, 1 };\n    SkColor4f colorNamedGray = SkColor4f::FromColor(SK_ColorGRAY);\n    SkDebugf(\"colorGray %c= colorNamedGray \", colorGray != colorNamedGray ? '!' : '=');\n}",
+    "hash": "82f1a9b4c2b27aa547061786d1f33dab",
+    "file": "SkColor4f_Reference",
+    "name": "SkRGBA4f::operator!=(const SkRGBA4f& other) const",
+        "stdout": "colorGray != colorNamedGray"
+    },
+        "SkRGBA4f_toSkColor": {
+    "code": "void draw(SkCanvas* canvas) {\n    float red = 0.07, green = 0.13, blue = 0.32, alpha = 0.17;\n    SkColor4f color4f = { red, green, blue, alpha };\n    SkColor argb = color4f.toSkColor();\n    SkDebugf(\"red=%d green=%d blue=%d alpha=%d\\n\", SkColorGetR(argb),\n             SkColorGetG(argb), SkColorGetB(argb), SkColorGetA(argb));\n    SkColor4f fromSkColor = SkColor4f::FromColor(argb);\n    SkDebugf(\"red=%g green=%g blue=%g alpha=%g\\n\", fromSkColor.fR, fromSkColor.fG,\n                                                   fromSkColor.fB, fromSkColor.fA);\n}",
+    "hash": "edc5fd18d961f7607d2bcbf7f7d427e5",
+    "file": "SkColor4f_Reference",
+    "name": "SkRGBA4f::toSkColor",
+        "stdout": "red=18 green=33 blue=82 alpha=43\\nred=0.0705882 green=0.129412 blue=0.321569 alpha=0.168627\\n"
+    },
+        "SkRGBA4f_vec": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor4f color = SkColor4f::FromColor(0x884488CC);\n    SkDebugf(\"red=%g green=%g blue=%g alpha=%g\\n\", color.fR, color.fG, color.fB, color.fA);\n    const float* array = color.vec();\n    SkDebugf(\"[0]=%g [1]=%g [2]=%g [3]=%g\\n\", array[0], array[1], array[2], array[3]);\n}",
+    "hash": "229057023515224358a36acf15508cf6",
+    "file": "SkColor4f_Reference",
+    "name": "SkRGBA4f::vec()",
+        "stdout": "red=0.266667 green=0.533333 blue=0.8 alpha=0.533333\\n[0]=0.266667 [1]=0.533333 [2]=0.8 [3]=0.533333\\n"
+    },
+        "SkRGBA4f_vec_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor4f color = SkColor4f::FromColor(0x884488CC);\n    SkDebugf(\"red=%g green=%g blue=%g alpha=%g\\n\", color.fR, color.fG, color.fB, color.fA);\n    float* array = color.vec();\n    array[3] = 1;\n    SkDebugf(\"[0]=%g [1]=%g [2]=%g [3]=%g\\n\", array[0], array[1], array[2], array[3]);\n}",
+    "hash": "7420bf0a7cae5c6577c4c4a4613e7e7e",
+    "file": "SkColor4f_Reference",
+    "name": "SkRGBA4f::vec_2",
+        "stdout": "red=0.266667 green=0.533333 blue=0.8 alpha=0.533333\\n[0]=0.266667 [1]=0.533333 [2]=0.8 [3]=1\\n"
+    },
+        "SkRRect_dump": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect rrect = SkRRect::MakeRect({6.f / 7, 2.f / 3, 6.f / 7, 2.f / 3});\n    for (bool dumpAsHex : { false, true } ) {\n        rrect.dump(dumpAsHex);\n    }\n}",
+    "hash": "265b8d23288dc8026ff788e809360af7",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::dump()",
+        "stdout": "SkRect::MakeLTRB(0.857143f, 0.666667f, 0.857143f, 0.666667f);\\nconst SkPoint corners[] = {\\n    { 0, 0 },\\n    { 0, 0 },\\n    { 0, 0 },\\n    { 0, 0 },\\n};\\nSkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */\\n                 SkBits2Float(0x3f2aaaab), /* 0.666667 */\\n                 SkBits2Float(0x3f5b6db7), /* 0.857143 */\\n                 SkBits2Float(0x3f2aaaab)  /* 0.666667 */);\\nconst SkPoint corners[] = {\\n    { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */\\n    { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */\\n    { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */\\n    { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */\\n};\\n"
+    },
+        "SkRRect_dumpHex": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect rrect = SkRRect::MakeRect({6.f / 7, 2.f / 3, 6.f / 7, 2.f / 3});\n    rrect.dumpHex();\n    SkRect bounds = SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */\n                     SkBits2Float(0x3f2aaaab), /* 0.666667 */\n                     SkBits2Float(0x3f5b6db7), /* 0.857143 */\n                     SkBits2Float(0x3f2aaaab)  /* 0.666667 */);\n    const SkPoint corners[] = {\n        { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */\n        { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */\n        { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */\n        { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */\n    };\n    SkRRect copy;\n    copy.setRectRadii(bounds, corners);\n    SkDebugf(\"rrect is \" \"%s\" \"equal to copy\\n\", rrect == copy ? \"\" : \"not \");\n}",
+    "hash": "c73f5e2644d949b859f05bd367883454",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::dumpHex",
+        "stdout": "SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */\\n                 SkBits2Float(0x3f2aaaab), /* 0.666667 */\\n                 SkBits2Float(0x3f5b6db7), /* 0.857143 */\\n                 SkBits2Float(0x3f2aaaab)  /* 0.666667 */);\\nconst SkPoint corners[] = {\\n    { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */\\n    { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */\\n    { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */\\n    { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */\\n};\\nrrect is equal to copy\\n"
+    },
+        "SkRRect_dump_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect rrect = SkRRect::MakeRect({6.f / 7, 2.f / 3, 6.f / 7, 2.f / 3});\n    rrect.dump();\n    SkRect bounds = SkRect::MakeLTRB(0.857143f, 0.666667f, 0.857143f, 0.666667f);\n    const SkPoint corners[] = {\n        { 0, 0 },\n        { 0, 0 },\n        { 0, 0 },\n        { 0, 0 },\n    };\n    SkRRect copy;\n    copy.setRectRadii(bounds, corners);\n    SkDebugf(\"rrect is \" \"%s\" \"equal to copy\\n\", rrect == copy ? \"\" : \"not \");\n}",
+    "hash": "f850423c7c0c4f803d479ecd92221059",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::dump_2",
+        "stdout": "SkRect::MakeLTRB(0.857143f, 0.666667f, 0.857143f, 0.666667f);\\nconst SkPoint corners[] = {\\n    { 0, 0 },\\n    { 0, 0 },\\n    { 0, 0 },\\n    { 0, 0 },\\n};\\nrrect is not equal to copy\\n"
+    },
+        "SkRRect_height": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect unsorted = SkRRect::MakeRect({ 15, 25, 10, 20 });\n    SkDebugf(\"unsorted height: %g\\n\", unsorted.height());\n    SkRRect large = SkRRect::MakeRect({ 1, -FLT_MAX, 2, FLT_MAX });\n    SkDebugf(\"large height: %.0f\\n\", large.height());\n}",
+    "hash": "5a3eb1755164a7becec33cec6e6eca31",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::height()",
+        "stdout": "unsorted height: 5\\nlarge height: inf\\n"
+    },
+        "SkRRect_radii": {
+    "code": "void draw(SkCanvas* canvas) {\n    for (SkScalar radiusX : { SK_ScalarNaN, SK_ScalarInfinity, 100.f, 50.f, 25.f} ) {\n        SkRRect rrect1 = SkRRect::MakeRectXY({10, 20, 60, 220}, radiusX, 200);\n        SkDebugf(\"left corner: (%g) %g\\n\", radiusX, rrect1.radii(SkRRect::kUpperLeft_Corner).fX);\n    }\n}",
+    "hash": "8d5c88478528584913867ada423e0d59",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::radii()",
+        "stdout": "left corner: (nan) 0\\nleft corner: (inf) 0\\nleft corner: (100) 25\\nleft corner: (50) 25\\nleft corner: (25) 12.5\\n"
+    },
+        "SkRRect_rect": {
+    "code": "void draw(SkCanvas* canvas) {\n    for (SkScalar left : { SK_ScalarNaN, SK_ScalarInfinity, 100.f, 50.f, 25.f} ) {\n        SkRRect rrect1 = SkRRect::MakeRectXY({left, 20, 60, 220}, 50, 200);\n        SkDebugf(\"left bounds: (%g) %g\\n\", left, rrect1.rect().fLeft);\n    }\n}",
+    "hash": "6831adf4c536047f4709c686feb10c48",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::rect()",
+        "stdout": "left bounds: (nan) 0\\nleft bounds: (inf) 0\\nleft bounds: (100) 60\\nleft bounds: (50) 50\\nleft bounds: (25) 25\\n"
+    },
+        "SkRRect_width": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect unsorted = SkRRect::MakeRect({ 15, 25, 10, 5 });\n    SkDebugf(\"unsorted width: %g\\n\", unsorted.width());\n    SkRRect large = SkRRect::MakeRect({ -FLT_MAX, 1, FLT_MAX, 2 });\n    SkDebugf(\"large width: %.0f\\n\", large.width());\n}",
+    "hash": "c675a480b41dee157f84fa2550a2a53c",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::width()",
+        "stdout": "unsorted width: 5\\nlarge width: inf\\n"
+    },
+        "SkRect_Intersects": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkDebugf(\"%s intersection\", SkRect::Intersects({10, 40, 50, 80}, {30, 60, 70, 90}) ? \"\" : \"no \");\n}",
+    "hash": "795061764b10c9e05efb466c9cb60644",
+    "file": "SkRect_Reference",
+    "name": "SkRect::Intersects",
+        "stdout": "intersection"
+    },
+        "SkRect_Make": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect1 = SkRect::MakeSize({2, 35});\n    SkRect rect2 = SkRect::MakeIWH(2, 35);\n    SkDebugf(\"rect1 %c= rect2\\n\", rect1 == rect2 ? '=' : '!');\n}",
+    "hash": "e866f5e4f6ac52e89acadf48e54ac8e0",
+    "file": "SkRect_Reference",
+    "name": "SkRect::Make",
+        "stdout": "rect1 == rect2\\n"
+    },
+        "SkRect_MakeEmpty": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = SkRect::MakeEmpty();\n    SkDebugf(\"MakeEmpty isEmpty: %s\\n\", rect.isEmpty() ? \"true\" : \"false\");\n    rect.offset(10, 10);\n    SkDebugf(\"offset rect isEmpty: %s\\n\", rect.isEmpty() ? \"true\" : \"false\");\n    rect.inset(10, 10);\n    SkDebugf(\"inset rect isEmpty: %s\\n\", rect.isEmpty() ? \"true\" : \"false\");\n    rect.outset(20, 20);\n    SkDebugf(\"outset rect isEmpty: %s\\n\", rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "2e262d0ac4b8ef51695e0525fc3ecdf6",
+    "file": "SkRect_Reference",
+    "name": "SkRect::MakeEmpty",
+        "stdout": "MakeEmpty isEmpty: true\\noffset rect isEmpty: true\\ninset rect isEmpty: true\\noutset rect isEmpty: false\\n"
+    },
+        "SkRect_MakeIWH": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect i_rect = SkIRect::MakeWH(25, 35);\n    SkRect  f_rect = SkRect::MakeIWH(25, 35);\n    SkDebugf(\"i_rect width: %d f_rect width:%g\\n\", i_rect.width(), f_rect.width());\n    i_rect = SkIRect::MakeWH(125000111, 0);\n    f_rect = SkRect::MakeIWH(125000111, 0);\n    SkDebugf(\"i_rect width: %d f_rect width:%.0f\\n\", i_rect.width(), f_rect.width());\n}",
+    "hash": "faa660ac19eaddc3f3eab57a0bddfdcb",
+    "file": "SkRect_Reference",
+    "name": "SkRect::MakeIWH",
+        "stdout": "i_rect width: 25 f_rect width:25\\ni_rect width: 125000111 f_rect width:125000112\\n"
+    },
+        "SkRect_MakeLTRB": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = SkRect::MakeLTRB(5, 35, 15, 25);\n    SkDebugf(\"rect: %g, %g, %g, %g  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n    rect.sort();\n    SkDebugf(\"rect: %g, %g, %g, %g  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "158b8dd9d02d65a5ae5ab7d1595a5b4c",
+    "file": "SkRect_Reference",
+    "name": "SkRect::MakeLTRB",
+        "stdout": "rect: 5, 35, 15, 25  isEmpty: true\\nrect: 5, 25, 15, 35  isEmpty: false\\n"
+    },
+        "SkRect_MakeSize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkSize size = {25.5f, 35.5f};\n    SkRect rect = SkRect::MakeSize(size);\n    SkDebugf(\"rect width: %g  height: %g\\n\", rect.width(), rect.height());\n    SkISize floor = size.toFloor();\n    rect = SkRect::MakeSize(SkSize::Make(floor));\n    SkDebugf(\"floor width: %g  height: %g\\n\", rect.width(), rect.height());\n}",
+    "hash": "ab2c1a55016c8de9172b77fdf69e00a2",
+    "file": "SkRect_Reference",
+    "name": "SkRect::MakeSize",
+        "stdout": "rect width: 25.5  height: 35.5\\nfloor width: 25  height: 35\\n"
+    },
+        "SkRect_MakeWH": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect1 = SkRect::MakeWH(25, 35);\n    SkRect rect2 = SkRect::MakeIWH(25, 35);\n    SkRect rect3 = SkRect::MakeXYWH(0, 0, 25, 35);\n    SkRect rect4 = SkRect::MakeLTRB(0, 0, 25, 35);\n    SkDebugf(\"all %s\" \"equal\\n\", rect1 == rect2 && rect2 == rect3 && rect3 == rect4 ?\n             \"\" : \"not \");\n}",
+    "hash": "8009d30f431e01f8aea4808e9017d9bf",
+    "file": "SkRect_Reference",
+    "name": "SkRect::MakeWH",
+        "stdout": "all equal\\n"
+    },
+        "SkRect_MakeXYWH": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = SkRect::MakeXYWH(5, 35, -15, 25);\n    SkDebugf(\"rect: %g, %g, %g, %g  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n    rect.sort();\n    SkDebugf(\"rect: %g, %g, %g, %g  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "38e464dba13be11ac21e210fbf3b5afc",
+    "file": "SkRect_Reference",
+    "name": "SkRect::MakeXYWH",
+        "stdout": "rect: 5, 35, -10, 60  isEmpty: true\\nrect: -10, 35, 5, 60  isEmpty: false\\n"
+    },
+        "SkRect_Make_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect i_rect1 = {2, 35, 22, 53};\n    SkRect f_rect = SkRect::Make(i_rect1);\n    f_rect.offset(0.49f, 0.49f);\n    SkIRect i_rect2;\n    f_rect.round(&i_rect2);\n    SkDebugf(\"i_rect1 %c= i_rect2\\n\", i_rect1 == i_rect2? '=' : '!');\n}",
+    "hash": "dd801faa1e60a0fe9e0657674461e063",
+    "file": "SkRect_Reference",
+    "name": "SkRect::Make_2",
+        "stdout": "i_rect1 == i_rect2\\n"
+    },
+        "SkRect_asScalars": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = {7, 11, 13, 17};\n SkDebugf(\"rect.asScalars() %c= &rect.fLeft\\n\", rect.asScalars() == &rect.fLeft? '=' : '!');\n}",
+    "hash": "e1ea5f949d80276f3637931eae93a07c",
+    "file": "SkRect_Reference",
+    "name": "SkRect::asScalars",
+        "stdout": "rect.asScalars() == &rect.fLeft\\n"
+    },
+        "SkRect_bottom": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect unsorted = { 15, 25, 10, 5 };\n    SkDebugf(\"unsorted.fBottom: %g unsorted.bottom(): %g\\n\", unsorted.fBottom, unsorted.bottom());\n    SkRect sorted = unsorted.makeSorted();\n    SkDebugf(\"sorted.fBottom: %g sorted.bottom(): %g\\n\", sorted.fBottom, sorted.bottom());\n}",
+    "hash": "a98993a66616ae406d8bdc54adfb1411",
+    "file": "SkRect_Reference",
+    "name": "SkRect::bottom()",
+        "stdout": "unsorted.fBottom: 5 unsorted.bottom(): 5\\nsorted.fBottom: 25 sorted.bottom(): 25\\n"
+    },
+        "SkRect_centerX": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect tests[] = {{20, 30, 41, 51}, {-20, -30, -41, -51}};\n    for (auto rect : tests) {\n        SkDebugf(\"left: %3g right: %3g centerX: %3g\\n\", rect.left(), rect.right(), rect.centerX());\n        rect.sort();\n        SkDebugf(\"left: %3g right: %3g centerX: %3g\\n\", rect.left(), rect.right(), rect.centerX());\n    }\n}",
+    "hash": "d8439ba8d23a424fa032fb97147fd2d2",
+    "file": "SkRect_Reference",
+    "name": "SkRect::centerX",
+        "stdout": "left:  20 right:  41 centerX: 30.5\\nleft:  20 right:  41 centerX: 30.5\\nleft: -20 right: -41 centerX: -30.5\\nleft: -41 right: -20 centerX: -30.5\\n"
+    },
+        "SkRect_centerY": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 2e+38, 2e+38, 3e+38, 3e+38 };\n    SkDebugf(\"left: %g right: %g centerX: %g \", rect.left(), rect.right(), rect.centerX());\n    SkDebugf(\"safe mid x: %g\\n\", rect.left() / 2 + rect.right() / 2);\n}",
+    "hash": "ebeeafafeb8fe39d5ffc9115b02c2340",
+    "file": "SkRect_Reference",
+    "name": "SkRect::centerY",
+        "stdout": "left: 2e+38 right: 3e+38 centerX: 2.5e+38 safe mid x: 2.5e+38\\n"
+    },
+        "SkRect_contains": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 30, 50, 40, 60 };\n    SkPoint tests[] = { { 30, 50 }, { 39, 49 }, { 29, 59 } };\n    for (auto contained : tests) {\n        SkDebugf(\"rect: (%g, %g, %g, %g) %s (%g, %g)\\n\",\n                 rect.left(), rect.top(), rect.right(), rect.bottom(),\n                 rect.contains(contained.x(), contained.y()) ? \"contains\" : \"does not contain\",\n                 contained.x(), contained.y());\n    }\n}",
+    "hash": "85be528a78945a6dc4f7dccb80a80746",
+    "file": "SkRect_Reference",
+    "name": "SkRect::contains()",
+        "stdout": "rect: (30, 50, 40, 60) contains (30, 50)\\nrect: (30, 50, 40, 60) does not contain (39, 49)\\nrect: (30, 50, 40, 60) does not contain (29, 59)\\n"
+    },
+        "SkRect_contains_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 30, 50, 40, 60 };\n    SkRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };\n    for (auto contained : tests) {\n        SkDebugf(\"rect: (%g, %g, %g, %g) %s (%g, %g, %g, %g)\\n\",\n                 rect.left(), rect.top(), rect.right(), rect.bottom(),\n                 rect.contains(contained) ? \"contains\" : \"does not contain\",\n                 contained.left(), contained.top(), contained.right(), contained.bottom());\n    }\n}",
+    "hash": "92f9e6aa5bb76791139a24cf7d8df99e",
+    "file": "SkRect_Reference",
+    "name": "SkRect::contains_2",
+        "stdout": "rect: (30, 50, 40, 60) contains (30, 50, 31, 51)\\nrect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)\\nrect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)\\n"
+    },
+        "SkRect_contains_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 30, 50, 40, 60 };\n    SkIRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };\n    for (auto contained : tests) {\n        SkDebugf(\"rect: (%g, %g, %g, %g) %s (%d, %d, %d, %d)\\n\",\n                 rect.left(), rect.top(), rect.right(), rect.bottom(),\n                 rect.contains(contained) ? \"contains\" : \"does not contain\",\n                 contained.left(), contained.top(), contained.right(), contained.bottom());\n    }\n}",
+    "hash": "dd58b699551dd44026a2c6386be27d88",
+    "file": "SkRect_Reference",
+    "name": "SkRect::contains_3",
+        "stdout": "rect: (30, 50, 40, 60) contains (30, 50, 31, 51)\\nrect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)\\nrect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)\\n"
+    },
+        "SkRect_dump": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = {20, 30, 40, 50};\n     for (bool dumpAsHex : { false, true } ) {\n         rect.dump(dumpAsHex);\n         SkDebugf(\"\\n\");\n     }\n}",
+    "hash": "cea049ffff702a5923da41fe0ae0763b",
+    "file": "SkRect_Reference",
+    "name": "SkRect::dump()",
+        "stdout": "SkRect::MakeLTRB(20, 30, 40, 50);\\n\\nSkRect::MakeLTRB(SkBits2Float(0x41a00000), /* 20.000000 */\\n                 SkBits2Float(0x41f00000), /* 30.000000 */\\n                 SkBits2Float(0x42200000), /* 40.000000 */\\n                 SkBits2Float(0x42480000)  /* 50.000000 */);\\n\\n"
+    },
+        "SkRect_dumpHex": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = {6.f / 7, 2.f / 3, 26.f / 10, 42.f / 6};\n rect.dumpHex();\n SkRect copy = SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */\n                  SkBits2Float(0x3f2aaaab), /* 0.666667 */\n                  SkBits2Float(0x40266666), /* 2.600000 */\n                  SkBits2Float(0x40e00000)  /* 7.000000 */);\n SkDebugf(\"rect is \" \"%s\" \"equal to copy\\n\", rect == copy ? \"\" : \"not \");\n}",
+    "hash": "824b5a3fcfd46a7e1c5f9e3c16e6bb39",
+    "file": "SkRect_Reference",
+    "name": "SkRect::dumpHex",
+        "stdout": "SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */\\n                 SkBits2Float(0x3f2aaaab), /* 0.666667 */\\n                 SkBits2Float(0x40266666), /* 2.600000 */\\n                 SkBits2Float(0x40e00000)  /* 7.000000 */);\\nrect is equal to copy\\n"
+    },
+        "SkRect_dump_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = {6.f / 7, 2.f / 3, 26.f / 10, 42.f / 6};\n    rect.dump();\n    SkRect copy = SkRect::MakeLTRB(0.857143f, 0.666667f, 2.6f, 7);\n    SkDebugf(\"rect is \" \"%s\" \"equal to copy\\n\", rect == copy ? \"\" : \"not \");\n}",
+    "hash": "9fb76971b1a104a2a59816e0392267a7",
+    "file": "SkRect_Reference",
+    "name": "SkRect::dump_2",
+        "stdout": "SkRect::MakeLTRB(0.857143f, 0.666667f, 2.6f, 7);\\nrect is not equal to copy\\n"
+    },
+        "SkRect_equal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const SkRect& test) -> void {\n        SkRect negZero = {-0.0f, -0.0f, 2, 2};\n        SkDebugf(\"{%g, %g, %g, %g} %c= {%g, %g, %g, %g} %s numerically equal\\n\",\n                 test.fLeft, test.fTop, test.fRight, test.fBottom,\n                 negZero.fLeft, negZero.fTop, negZero.fRight, negZero.fBottom,\n                 test == negZero ? '=' : '!',\n                 test.fLeft == negZero.fLeft && test.fTop == negZero.fTop &&\n                 test.fRight == negZero.fRight && test.fBottom == negZero.fBottom ?\n                 \"and are\" : \"yet are not\");\n    };\n    SkRect tests[] = {{0, 0, 2, 2}, {-0, -0, 2, 2}, {0.0f, 0.0f, 2, 2}};\n    SkDebugf(\"tests are %s\" \"equal\\n\", tests[0] == tests[1] && tests[1] == tests[2] ? \"\" : \"not \");\n    for (auto rect : tests) {\n        debugster(rect);\n    }\n}",
+    "hash": "c6c5b40cad7c3a839fdf576b380391a6",
+    "file": "SkRect_Reference",
+    "name": "SkRect::operator==(const SkRect& a, const SkRect& b)",
+        "stdout": "tests are equal\\n{0, 0, 2, 2} == {-0, -0, 2, 2} and are numerically equal\\n{0, 0, 2, 2} == {-0, -0, 2, 2} and are numerically equal\\n{0, 0, 2, 2} == {-0, -0, 2, 2} and are numerically equal\\n"
+    },
+        "SkRect_height": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect unsorted = { 15, 25, 10, 20 };\n    SkDebugf(\"unsorted height: %g\\n\", unsorted.height());\n    SkRect large = { 1, -2147483647.f, 2, 2147483644.f };\n    SkDebugf(\"large height: %.0f\\n\", large.height());\n}",
+    "hash": "39429e45f05240218ecd511443ab3e44",
+    "file": "SkRect_Reference",
+    "name": "SkRect::height()",
+        "stdout": "unsorted height: -5\\nlarge height: 4294967296\\n"
+    },
+        "SkRect_inset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 10, 14, 50, 73 };\n    rect.inset(5, 13);\n    SkDebugf(\"rect: %g, %g, %g, %g\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "dae21340941dc6e4d048816dfd9f204c",
+    "file": "SkRect_Reference",
+    "name": "SkRect::inset()",
+        "stdout": "rect: 15, 27, 45, 60\\n"
+    },
+        "SkRect_intersect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect leftRect =  { 10, 40, 50, 80 };\n    SkRect rightRect = { 30, 60, 70, 90 };\n    SkDebugf(\"%s intersection: \", leftRect.intersect(rightRect) ? \"\" : \"no \");\n    SkDebugf(\"%g, %g, %g, %g\\n\", leftRect.left(), leftRect.top(),\n                                 leftRect.right(), leftRect.bottom());\n}",
+    "hash": "5d0b12e0ef6f1c181dddded4274230ca",
+    "file": "SkRect_Reference",
+    "name": "SkRect::intersect()",
+        "stdout": "intersection: 30, 60, 50, 80\\n"
+    },
+        "SkRect_intersect_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect leftRect =  { 10, 40, 50, 80 };\n    SkDebugf(\"%s intersection: \", leftRect.intersect(30, 60, 70, 90) ? \"\" : \"no \");\n    SkDebugf(\"%g, %g, %g, %g\\n\", leftRect.left(), leftRect.top(),\n                                 leftRect.right(), leftRect.bottom());\n}",
+    "hash": "5002f65a72def2787086a33131933e70",
+    "file": "SkRect_Reference",
+    "name": "SkRect::intersect_2",
+        "stdout": "intersection: 30, 60, 50, 80\\n"
+    },
+        "SkRect_intersect_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect result;\n    bool intersected = result.intersect({ 10, 40, 50, 80 }, { 30, 60, 70, 90 });\n    SkDebugf(\"%s intersection: %g, %g, %g, %g\\n\", intersected ? \"\" : \"no \",\n             result.left(), result.top(), result.right(), result.bottom());\n}",
+    "hash": "d610437a65dd3e952719efe605cbd0c7",
+    "file": "SkRect_Reference",
+    "name": "SkRect::intersect_3",
+        "stdout": "intersection: 30, 60, 50, 80\\n"
+    },
+        "SkRect_intersects": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 10, 40, 50, 80 };\n    SkDebugf(\"%s intersection\", rect.intersects(30, 60, 70, 90) ? \"\" : \"no \");\n}",
+    "hash": "7145dc17ebce4f54e892102f6c98e811",
+    "file": "SkRect_Reference",
+    "name": "SkRect::intersects()",
+        "stdout": "intersection"
+    },
+        "SkRect_intersects_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 10, 40, 50, 80 };\n    SkDebugf(\"%s intersection\", rect.intersects({30, 60, 70, 90}) ? \"\" : \"no \");\n}",
+    "hash": "ca37b4231b21eb8296cb19ba9e0c781b",
+    "file": "SkRect_Reference",
+    "name": "SkRect::intersects_2",
+        "stdout": "intersection"
+    },
+        "SkRect_isEmpty": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect tests[] = {{20, 40, 10, 50}, {20, 40, 20, 50}};\n    for (auto rect : tests) {\n        SkDebugf(\"rect: {%g, %g, %g, %g} is\" \"%s empty\\n\", rect.left(), rect.top(), rect.right(),\n                 rect.bottom(), rect.isEmpty() ? \"\" : \" not\");\n        rect.sort();\n        SkDebugf(\"sorted: {%g, %g, %g, %g} is\" \"%s empty\\n\", rect.left(), rect.top(), rect.right(),\n                 rect.bottom(), rect.isEmpty() ? \"\" : \" not\");\n    }\n}",
+    "hash": "1d7b924d6ca2a6aef09684a8a632439c",
+    "file": "SkRect_Reference",
+    "name": "SkRect::isEmpty",
+        "stdout": "rect: {20, 40, 10, 50} is empty\\nsorted: {10, 40, 20, 50} is not empty\\nrect: {20, 40, 20, 50} is empty\\nsorted: {20, 40, 20, 50} is empty\\n"
+    },
+        "SkRect_isFinite": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect largest = { SK_ScalarMin, SK_ScalarMin, SK_ScalarMax, SK_ScalarMax };\n        SkDebugf(\"largest is finite: %s\\n\", largest.isFinite() ? \"true\" : \"false\");\n        SkDebugf(\"large width %g\\n\", largest.width());\n        SkRect widest = SkRect::MakeWH(largest.width(), largest.height());\n        SkDebugf(\"widest is finite: %s\\n\", widest.isFinite() ? \"true\" : \"false\");\n}",
+    "hash": "443fe5f8296d4cdb19cc9862a9cf77a4",
+    "file": "SkRect_Reference",
+    "name": "SkRect::isFinite",
+        "stdout": "largest is finite: true\\nlarge width inf\\nwidest is finite: false\\n"
+    },
+        "SkRect_isSorted": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect tests[] = {{20, 40, 10, 50}, {20, 40, 20, 50}};\n    for (auto rect : tests) {\n        SkDebugf(\"rect: {%g, %g, %g, %g} is\" \"%s sorted\\n\", rect.left(), rect.top(), rect.right(),\n                 rect.bottom(), rect.isSorted() ? \"\" : \" not\");\n        rect.sort();\n        SkDebugf(\"sorted: {%g, %g, %g, %g} is\" \"%s sorted\\n\", rect.left(), rect.top(), rect.right(),\n                 rect.bottom(), rect.isSorted() ? \"\" : \" not\");\n    }\n}",
+    "hash": "c7065a83b220a96f903dbbb65906fe7b",
+    "file": "SkRect_Reference",
+    "name": "SkRect::isSorted",
+        "stdout": "rect: {20, 40, 10, 50} is not sorted\\nsorted: {10, 40, 20, 50} is sorted\\nrect: {20, 40, 20, 50} is sorted\\nsorted: {20, 40, 20, 50} is sorted\\n"
+    },
+        "SkRect_iset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect1 = {3, 4, 1, 2};\n    SkDebugf(\"rect1: {%g, %g, %g, %g}\\n\", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);\n    SkRect rect2;\n    rect2.iset(3, 4, 1, 2);\n    SkDebugf(\"rect2: {%g, %g, %g, %g}\\n\", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);\n}",
+    "hash": "18532f1aa90b76364fb8d7ea072f1892",
+    "file": "SkRect_Reference",
+    "name": "SkRect::iset()",
+        "stdout": "rect1: {3, 4, 1, 2}\\nrect2: {3, 4, 1, 2}\\n"
+    },
+        "SkRect_isetWH": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect1 = {0, 0, 1, 2};\n    SkDebugf(\"rect1: {%g, %g, %g, %g}\\n\", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);\n    SkRect rect2;\n    rect2.isetWH(1, 2);\n    SkDebugf(\"rect2: {%g, %g, %g, %g}\\n\", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);\n}",
+    "hash": "ee6000080fc7123214ea404018cf9176",
+    "file": "SkRect_Reference",
+    "name": "SkRect::isetWH",
+        "stdout": "rect1: {0, 0, 1, 2}\\nrect2: {0, 0, 1, 2}\\n"
+    },
+        "SkRect_join": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 10, 20, 15, 25};\n    rect.join(50, 60, 55, 65);\n    SkDebugf(\"join: %g, %g, %g, %g\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "afa9c6b4d05bb669db07fe0b7b97e6aa",
+    "file": "SkRect_Reference",
+    "name": "SkRect::join()",
+        "stdout": "join: 10, 20, 55, 65\\n"
+    },
+        "SkRect_joinNonEmptyArg": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 10, 100, 15, 0};\n    SkRect sorted = rect.makeSorted();\n    SkRect toJoin = { 50, 60, 55, 65 };\n    rect.joinNonEmptyArg(toJoin);\n    SkDebugf(\"rect: %g, %g, %g, %g\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n    sorted.joinNonEmptyArg(toJoin);\n    SkDebugf(\"sorted: %g, %g, %g, %g\\n\", sorted.fLeft, sorted.fTop, sorted.fRight, sorted.fBottom);\n}",
+    "hash": "88439de2aa0911262c60c0eb506396cb",
+    "file": "SkRect_Reference",
+    "name": "SkRect::joinNonEmptyArg",
+        "stdout": "rect: 50, 60, 55, 65\\nsorted: 10, 0, 55, 100\\n"
+    },
+        "SkRect_joinPossiblyEmptyRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 10, 100, 15, 0};\n    SkRect sorted = rect.makeSorted();\n    SkRect toJoin = { 50, 60, 55, 65 };\n    rect.joinPossiblyEmptyRect(toJoin);\n    SkDebugf(\"rect: %g, %g, %g, %g\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n    sorted.joinPossiblyEmptyRect(toJoin);\n    SkDebugf(\"sorted: %g, %g, %g, %g\\n\", sorted.fLeft, sorted.fTop, sorted.fRight, sorted.fBottom);\n}",
+    "hash": "a476548d0001296afd8e58c1eba1b70b",
+    "file": "SkRect_Reference",
+    "name": "SkRect::joinPossiblyEmptyRect",
+        "stdout": "rect: 10, 60, 55, 65\\nsorted: 10, 0, 55, 100\\n"
+    },
+        "SkRect_join_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 10, 20, 15, 25};\n    rect.join({50, 60, 55, 65});\n    SkDebugf(\"join: %g, %g, %g, %g\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "26500032494cf93c5fa3423110fe82af",
+    "file": "SkRect_Reference",
+    "name": "SkRect::join_2",
+        "stdout": "join: 10, 20, 55, 65\\n"
+    },
+        "SkRect_left": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect unsorted = { 15, 5, 10, 25 };\n    SkDebugf(\"unsorted.fLeft: %g unsorted.left(): %g\\n\", unsorted.fLeft, unsorted.left());\n    SkRect sorted = unsorted.makeSorted();\n    SkDebugf(\"sorted.fLeft: %g sorted.left(): %g\\n\", sorted.fLeft, sorted.left());\n}",
+    "hash": "900dc96c3549795a87036d6458c4fde6",
+    "file": "SkRect_Reference",
+    "name": "SkRect::left()",
+        "stdout": "unsorted.fLeft: 15 unsorted.left(): 15\\nsorted.fLeft: 10 sorted.left(): 10\\n"
+    },
+        "SkRect_makeInset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 10, 50, 20, 60 };\n    SkDebugf(\"rect: %g, %g, %g, %g  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n    rect = rect.makeInset(15, 32);\n    SkDebugf(\"rect: %g, %g, %g, %g  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "b8d32ab2f7ea3d4d5fb5a4ea2156f1c5",
+    "file": "SkRect_Reference",
+    "name": "SkRect::makeInset",
+        "stdout": "rect: 10, 50, 20, 60  isEmpty: false\\nrect: 25, 82, 5, 28  isEmpty: true\\n"
+    },
+        "SkRect_makeOffset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 10, 50, 20, 60 };\n    SkDebugf(\"rect: %g, %g, %g, %g  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n    rect = rect.makeOffset(15, 32);\n    SkDebugf(\"rect: %g, %g, %g, %g  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "98841ab0a932f99cccd8e6a34d94ba05",
+    "file": "SkRect_Reference",
+    "name": "SkRect::makeOffset",
+        "stdout": "rect: 10, 50, 20, 60  isEmpty: false\\nrect: 25, 82, 35, 92  isEmpty: false\\n"
+    },
+        "SkRect_makeOutset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 10, 50, 20, 60 };\n    SkDebugf(\"rect: %g, %g, %g, %g  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n    rect = rect.makeOutset(15, 32);\n    SkDebugf(\"rect: %g, %g, %g, %g  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "87176fc60914cbca9c6a20998a033c24",
+    "file": "SkRect_Reference",
+    "name": "SkRect::makeOutset",
+        "stdout": "rect: 10, 50, 20, 60  isEmpty: false\\nrect: -5, 18, 35, 92  isEmpty: false\\n"
+    },
+        "SkRect_makeSorted": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 30.5f, 50.5f, 20.5f, 10.5f };\n    SkDebugf(\"rect: %g, %g, %g, %g\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n    SkRect sort = rect.makeSorted();\n    SkDebugf(\"sorted: %g, %g, %g, %g\\n\", sort.fLeft, sort.fTop, sort.fRight, sort.fBottom);\n}",
+    "hash": "f59567042b87f6b26f9bfeeb04468032",
+    "file": "SkRect_Reference",
+    "name": "SkRect::makeSorted",
+        "stdout": "rect: 30.5, 50.5, 20.5, 10.5\\nsorted: 20.5, 10.5, 30.5, 50.5\\n"
+    },
+        "SkRect_notequal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect test = {0, 0, 2, SK_ScalarNaN};\n    SkDebugf(\"test with NaN is %s\" \"equal to itself\\n\", test == test ? \"\" : \"not \");\n}",
+    "hash": "286072f8c27ff15be9eb945fa38dc9f7",
+    "file": "SkRect_Reference",
+    "name": "SkRect::operator!=(const SkRect& a, const SkRect& b)",
+        "stdout": "test with NaN is not equal to itself\\n"
+    },
+        "SkRect_offset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 10, 14, 50, 73 };\n    rect.offset(5, 13);\n    SkDebugf(\"rect: %g, %g, %g, %g\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "04eb33f0fd376f2942ca5f1c7f6cbcfc",
+    "file": "SkRect_Reference",
+    "name": "SkRect::offset()",
+        "stdout": "rect: 15, 27, 55, 86\\n"
+    },
+        "SkRect_offsetTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 10, 14, 50, 73 };\n    rect.offsetTo(15, 27);\n    SkDebugf(\"rect: %g, %g, %g, %g\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "bedb04b7b3e1af3e8039f9cffe66989e",
+    "file": "SkRect_Reference",
+    "name": "SkRect::offsetTo",
+        "stdout": "rect: 15, 27, 55, 86\\n"
+    },
+        "SkRect_offset_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 10, 14, 50, 73 };\n    rect.offset({5, 13});\n    SkDebugf(\"rect: %g, %g, %g, %g\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "b24cf65561c98c1858a06c39f10fb797",
+    "file": "SkRect_Reference",
+    "name": "SkRect::offset_2",
+        "stdout": "rect: 15, 27, 55, 86\\n"
+    },
+        "SkRect_outset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 10, 14, 50, 73 };\n    rect.outset(5, 13);\n    SkDebugf(\"rect: %g, %g, %g, %g\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "861f873ba660af8c8bf8b0b83d829cf4",
+    "file": "SkRect_Reference",
+    "name": "SkRect::outset()",
+        "stdout": "rect: 5, 1, 55, 86\\n"
+    },
+        "SkRect_right": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect unsorted = { 15, 25, 10, 5 };\n    SkDebugf(\"unsorted.fRight: %g unsorted.right(): %g\\n\", unsorted.fRight, unsorted.right());\n    SkRect sorted = unsorted.makeSorted();\n    SkDebugf(\"sorted.fRight: %g sorted.right(): %g\\n\", sorted.fRight, sorted.right());\n}",
+    "hash": "ca3de7e5e292b3ad3633b1c39a31d3ab",
+    "file": "SkRect_Reference",
+    "name": "SkRect::right()",
+        "stdout": "unsorted.fRight: 10 unsorted.right(): 10\\nsorted.fRight: 15 sorted.right(): 15\\n"
+    },
+        "SkRect_round": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };\n    SkIRect round;\n    rect.round(&round);\n    SkDebugf(\"round: %d, %d, %d, %d\\n\", round.fLeft, round.fTop, round.fRight, round.fBottom);\n}",
+    "hash": "8b9e5a9af0a9b878f76919534d88f41e",
+    "file": "SkRect_Reference",
+    "name": "SkRect::round()",
+        "stdout": "round: 31, 51, 41, 61\\n"
+    },
+        "SkRect_roundIn": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };\n    SkIRect round;\n    rect.roundIn(&round);\n    SkDebugf(\"round: %d, %d, %d, %d\\n\", round.fLeft, round.fTop, round.fRight, round.fBottom);\n}",
+    "hash": "abb337da8fc1891f016c61258681c64c",
+    "file": "SkRect_Reference",
+    "name": "SkRect::roundIn",
+        "stdout": "round: 31, 51, 40, 60\\n"
+    },
+        "SkRect_roundOut": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };\n    SkIRect round;\n    rect.roundOut(&round);\n    SkDebugf(\"round: %d, %d, %d, %d\\n\", round.fLeft, round.fTop, round.fRight, round.fBottom);\n}",
+    "hash": "0bd13d7e6426ae7a3befa2ab151ac5fc",
+    "file": "SkRect_Reference",
+    "name": "SkRect::roundOut",
+        "stdout": "round: 30, 50, 41, 61\\n"
+    },
+        "SkRect_roundOut_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };\n    SkRect round;\n    rect.roundOut(&round);\n    SkDebugf(\"round: %g, %g, %g, %g\\n\", round.fLeft, round.fTop, round.fRight, round.fBottom);\n}",
+    "hash": "e09a6a12869a8ac21e9c2af98a5bb686",
+    "file": "SkRect_Reference",
+    "name": "SkRect::roundOut_2",
+        "stdout": "round: 30, 50, 41, 61\\n"
+    },
+        "SkRect_roundOut_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };\n    SkIRect round = rect.roundOut();\n    SkDebugf(\"round: %d, %d, %d, %d\\n\", round.fLeft, round.fTop, round.fRight, round.fBottom);\n}",
+    "hash": "05f0f65ae148f192656cd87df90f1d57",
+    "file": "SkRect_Reference",
+    "name": "SkRect::roundOut_3",
+        "stdout": "round: 30, 50, 41, 61\\n"
+    },
+        "SkRect_round_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };\n    SkIRect round = rect.round();\n    SkDebugf(\"round: %d, %d, %d, %d\\n\", round.fLeft, round.fTop, round.fRight, round.fBottom);\n}",
+    "hash": "ef7ae1dd522c235b0afe41b55a624f46",
+    "file": "SkRect_Reference",
+    "name": "SkRect::round_2",
+        "stdout": "round: 31, 51, 41, 61\\n"
+    },
+        "SkRect_set": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect i_rect = {3, 4, 1, 2};\n    SkDebugf(\"i_rect: {%d, %d, %d, %d}\\n\", i_rect.fLeft, i_rect.fTop, i_rect.fRight, i_rect.fBottom);\n    SkRect f_rect;\n    f_rect.set(i_rect);\n    SkDebugf(\"f_rect: {%g, %g, %g, %g}\\n\", f_rect.fLeft, f_rect.fTop, f_rect.fRight, f_rect.fBottom);\n}",
+    "hash": "a10ad8d97062bc3f40942f47e5108917",
+    "file": "SkRect_Reference",
+    "name": "SkRect::set()",
+        "stdout": "i_rect: {3, 4, 1, 2}\\nf_rect: {3, 4, 1, 2}\\n"
+    },
+        "SkRect_setBounds": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint points[] = {{3, 4}, {1, 2}, {5, 6}, {SK_ScalarNaN, 8}};\n    for (int count = 0; count <= (int) SK_ARRAY_COUNT(points); ++count) {\n        SkRect rect;\n        rect.setBounds(points, count);\n        if (count > 0) {\n            SkDebugf(\"added: %3g, %g \", points[count - 1].fX,  points[count - 1].fY);\n        } else {\n            SkDebugf(\"%14s\", \" \");\n        }\n        SkDebugf(\"count: %d rect: %g, %g, %g, %g\\n\", count,\n                rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n    }\n}",
+    "hash": "cf0da15f48aa54fd1889e7f913601710",
+    "file": "SkRect_Reference",
+    "name": "SkRect::setBounds",
+        "stdout": "count: 0 rect: 0, 0, 0, 0\\nadded:   3, 4 count: 1 rect: 3, 4, 3, 4\\nadded:   1, 2 count: 2 rect: 1, 2, 3, 4\\nadded:   5, 6 count: 3 rect: 1, 2, 5, 6\\nadded: nan, 8 count: 4 rect: 0, 0, 0, 0\\n"
+    },
+        "SkRect_setBoundsCheck": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint points[] = {{3, 4}, {1, 2}, {5, 6}, {SK_ScalarNaN, 8}};\n    for (int count = 0; count <= (int) SK_ARRAY_COUNT(points); ++count) {\n        SkRect rect;\n        bool success = rect.setBoundsCheck(points, count);\n        if (count > 0) {\n            SkDebugf(\"added: %3g, %g \", points[count - 1].fX,  points[count - 1].fY);\n        } else {\n            SkDebugf(\"%14s\", \" \");\n        }\n        SkDebugf(\"count: %d rect: %g, %g, %g, %g success: %s\\n\", count,\n                rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, success ? \"true\" : \"false\");\n    }\n}",
+    "hash": "83d879b92683b15f9daaf0c9e71c5b35",
+    "file": "SkRect_Reference",
+    "name": "SkRect::setBoundsCheck",
+        "stdout": "count: 0 rect: 0, 0, 0, 0 success: true\\nadded:   3, 4 count: 1 rect: 3, 4, 3, 4 success: true\\nadded:   1, 2 count: 2 rect: 1, 2, 3, 4 success: true\\nadded:   5, 6 count: 3 rect: 1, 2, 5, 6 success: true\\nadded: nan, 8 count: 4 rect: 0, 0, 0, 0 success: false\\n"
+    },
+        "SkRect_setBoundsNoCheck": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint points[] = {{3, 4}, {1, 2}, {SK_ScalarInfinity, 6}, {SK_ScalarNaN, 8}};\n    for (int count = 0; count <= (int) SK_ARRAY_COUNT(points); ++count) {\n        SkRect rect;\n        rect.setBoundsNoCheck(points, count);\n        if (count > 0) {\n            SkDebugf(\"added: %3g, %g \", points[count - 1].fX,  points[count - 1].fY);\n        } else {\n            SkDebugf(\"%14s\", \" \");\n        }\n        SkDebugf(\"count: %d rect: %g, %g, %g, %g\\n\", count,\n                rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n    }\n}",
+    "hash": "be10cb1411dbcf7e38e0198e8a9b8b0e",
+    "file": "SkRect_Reference",
+    "name": "SkRect::setBoundsNoCheck",
+        "stdout": "count: 0 rect: 0, 0, 0, 0\\nadded:   3, 4 count: 1 rect: 3, 4, 3, 4\\nadded:   1, 2 count: 2 rect: 1, 2, 3, 4\\nadded: inf, 6 count: 3 rect: nan, nan, nan, nan\\nadded: nan, 8 count: 4 rect: nan, nan, nan, nan\\n"
+    },
+        "SkRect_setEmpty": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = {3, 4, 1, 2};\n    for (int i = 0; i < 2; ++i) {\n    SkDebugf(\"rect: {%g, %g, %g, %g} is %s\" \"empty\\n\", rect.fLeft, rect.fTop,\n             rect.fRight, rect.fBottom, rect.isEmpty() ? \"\" : \"not \");\n    rect.setEmpty();\n    }\n}",
+    "hash": "2cf67542d45ef5d7a7efb673b651ff54",
+    "file": "SkRect_Reference",
+    "name": "SkRect::setEmpty",
+        "stdout": "rect: {3, 4, 1, 2} is empty\\nrect: {0, 0, 0, 0} is empty\\n"
+    },
+        "SkRect_setLTRB": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect1 = {3, 4, 1, 2};\n    SkDebugf(\"rect1: {%g, %g, %g, %g}\\n\", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);\n    SkRect rect2;\n    rect2.setLTRB(3, 4, 1, 2);\n    SkDebugf(\"rect2: {%g, %g, %g, %g}\\n\", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);\n}",
+    "hash": "70692838793454c8e045d6eaf7edcbff",
+    "file": "SkRect_Reference",
+    "name": "SkRect::setLTRB",
+        "stdout": "rect1: {3, 4, 1, 2}\\nrect2: {3, 4, 1, 2}\\n"
+    },
+        "SkRect_setWH": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect;\n    rect.setWH(-15, 25);\n    SkDebugf(\"rect: %g, %g, %g, %g  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n    rect.sort();\n    SkDebugf(\"rect: %g, %g, %g, %g  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "9cb5fee17802fa49341f3707bdf5d235",
+    "file": "SkRect_Reference",
+    "name": "SkRect::setWH",
+        "stdout": "rect: 0, 0, -15, 25  isEmpty: true\\nrect: -15, 0, 0, 25  isEmpty: false\\n"
+    },
+        "SkRect_setXYWH": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect;\n    rect.setXYWH(5, 35, -15, 25);\n    SkDebugf(\"rect: %g, %g, %g, %g  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n    rect.sort();\n    SkDebugf(\"rect: %g, %g, %g, %g  isEmpty: %s\\n\", rect.left(), rect.top(), rect.right(),\n              rect.bottom(), rect.isEmpty() ? \"true\" : \"false\");\n}",
+    "hash": "373cce4c61b9da0384b735b838765163",
+    "file": "SkRect_Reference",
+    "name": "SkRect::setXYWH",
+        "stdout": "rect: 5, 35, -10, 60  isEmpty: true\\nrect: -10, 35, 5, 60  isEmpty: false\\n"
+    },
+        "SkRect_set_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect1 = {3, 4, 1, 2};\n    SkDebugf(\"rect1: {%g, %g, %g, %g}\\n\", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);\n    SkRect rect2;\n    rect2.set(3, 4, 1, 2);\n    SkDebugf(\"rect2: {%g, %g, %g, %g}\\n\", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);\n}",
+    "hash": "9b29ea460d69b4d47323fd9e3e17721e",
+    "file": "SkRect_Reference",
+    "name": "SkRect::set_2",
+        "stdout": "rect1: {3, 4, 1, 2}\\nrect2: {3, 4, 1, 2}\\n"
+    },
+        "SkRect_set_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint points[] = {{3, 4}, {1, 2}, {5, 6}, {SK_ScalarNaN, 8}};\n    for (int count = 0; count <= (int) SK_ARRAY_COUNT(points); ++count) {\n        SkRect rect;\n        rect.set(points, count);\n        if (count > 0) {\n            SkDebugf(\"added: %3g, %g \", points[count - 1].fX,  points[count - 1].fY);\n        } else {\n            SkDebugf(\"%14s\", \" \");\n        }\n        SkDebugf(\"count: %d rect: %g, %g, %g, %g\\n\", count,\n                rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n    }\n}",
+    "hash": "94295fa5197e21256171b99b4023dd48",
+    "file": "SkRect_Reference",
+    "name": "SkRect::set_3",
+        "stdout": "count: 0 rect: 0, 0, 0, 0\\nadded:   3, 4 count: 1 rect: 3, 4, 3, 4\\nadded:   1, 2 count: 2 rect: 1, 2, 3, 4\\nadded:   5, 6 count: 3 rect: 1, 2, 5, 6\\nadded: nan, 8 count: 4 rect: 0, 0, 0, 0\\n"
+    },
+        "SkRect_set_4": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint point1 = {SK_ScalarNaN, 8};\n    SkPoint point2 = {3, 4};\n    SkRect rect;\n    rect.set(point1, point2);\n    SkDebugf(\"rect: %g, %g, %g, %g\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n    rect.set(point2, point1);\n    SkDebugf(\"rect: %g, %g, %g, %g\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "ee72450381f768f3869153cdbeccdc3e",
+    "file": "SkRect_Reference",
+    "name": "SkRect::set_4",
+        "stdout": "rect: 3, 4, 3, 8\\nrect: nan, 4, nan, 8\\n"
+    },
+        "SkRect_sort": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 30.5f, 50.5f, 20.5f, 10.5f };\n    SkDebugf(\"rect: %g, %g, %g, %g\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n    rect.sort();\n    SkDebugf(\"sorted: %g, %g, %g, %g\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n}",
+    "hash": "e624fe398e3d770b573c09fc74c0c400",
+    "file": "SkRect_Reference",
+    "name": "SkRect::sort()",
+        "stdout": "rect: 30.5, 50.5, 20.5, 10.5\\nsorted: 20.5, 10.5, 30.5, 50.5\\n"
+    },
+        "SkRect_toQuad": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = {1, 2, 3, 4};\n    SkPoint corners[4];\n    rect.toQuad(corners);\n    SkDebugf(\"rect: {%g, %g, %g, %g}\\n\", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);\n    SkDebugf(\"corners:\");\n    for (auto corner : corners) {\n        SkDebugf(\" {%g, %g}\", corner.fX, corner.fY);\n    }\n    SkDebugf(\"\\n\");\n}",
+    "hash": "59a6e7d202ac17ab80ec21b233e51f59",
+    "file": "SkRect_Reference",
+    "name": "SkRect::toQuad",
+        "stdout": "rect: {1, 2, 3, 4}\\ncorners: {1, 2} {3, 2} {3, 4} {1, 4}\\n"
+    },
+        "SkRect_top": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect unsorted = { 15, 25, 10, 5 };\n    SkDebugf(\"unsorted.fTop: %g unsorted.top(): %g\\n\", unsorted.fTop, unsorted.top());\n    SkRect sorted = unsorted.makeSorted();\n    SkDebugf(\"sorted.fTop: %g sorted.top(): %g\\n\", sorted.fTop, sorted.top());\n}",
+    "hash": "3cfc24b011aef1ca8ccb57c05711620c",
+    "file": "SkRect_Reference",
+    "name": "SkRect::top()",
+        "stdout": "unsorted.fTop: 25 unsorted.top(): 25\\nsorted.fTop: 5 sorted.top(): 5\\n"
+    },
+        "SkRect_width": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect unsorted = { 15, 25, 10, 5 };\n    SkDebugf(\"unsorted width: %g\\n\", unsorted.width());\n    SkRect large = { -2147483647.f, 1, 2147483644.f, 2 };\n    SkDebugf(\"large width: %.0f\\n\", large.width());\n}",
+    "hash": "11f8f0efe6291019fee0ac17844f6c1a",
+    "file": "SkRect_Reference",
+    "name": "SkRect::width()",
+        "stdout": "unsorted width: -5\\nlarge width: 4294967296\\n"
+    },
+        "SkRect_x": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect unsorted = { 15, 5, 10, 25 };\n    SkDebugf(\"unsorted.fLeft: %g unsorted.x(): %g\\n\", unsorted.fLeft, unsorted.x());\n    SkRect sorted = unsorted.makeSorted();\n    SkDebugf(\"sorted.fLeft: %g sorted.x(): %g\\n\", sorted.fLeft, sorted.x());\n}",
+    "hash": "23c77a35ac54a439a2989f840aa5cb99",
+    "file": "SkRect_Reference",
+    "name": "SkRect::x()",
+        "stdout": "unsorted.fLeft: 15 unsorted.x(): 15\\nsorted.fLeft: 10 sorted.x(): 10\\n"
+    },
+        "SkRect_y": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect unsorted = { 15, 25, 10, 5 };\n    SkDebugf(\"unsorted.fTop: %g unsorted.y(): %g\\n\", unsorted.fTop, unsorted.y());\n    SkRect sorted = unsorted.makeSorted();\n    SkDebugf(\"sorted.fTop: %g sorted.y(): %g\\n\", sorted.fTop, sorted.y());\n}",
+    "hash": "c653d9017983d2a047b1fee6a481d82b",
+    "file": "SkRect_Reference",
+    "name": "SkRect::y()",
+        "stdout": "unsorted.fTop: 25 unsorted.y(): 25\\nsorted.fTop: 5 sorted.y(): 5\\n"
+    },
+        "SkRegion_Cliperator_const_SkRegion_const_SkIRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region;\n    region.setRect({1, 2, 3, 4});\n    SkRegion::Cliperator clipper(region, {0, 0, 2, 3});\n    auto r = clipper.rect();\n    SkDebugf(\"rect={%d,%d,%d,%d}\\n\", r.fLeft, r.fTop, r.fRight, r.fBottom);\n}",
+    "hash": "3831fb6006a7e0ad5d140c266c22be78",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Cliperator::Cliperator(const SkRegion& region, const SkIRect& clip)",
+        "stdout": "rect={1,2,2,3}\\n"
+    },
+        "SkRegion_Cliperator_done": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, SkRegion& region) -> void {\n        SkRegion::Cliperator clipper(region, {0, 0, 5, 5});\n        SkDebugf(\"%14s done=%s\\n\", label, clipper.done() ? \"true\" : \"false\"); \n    };\n    SkRegion region;\n    debugster(\"empty region\", region);\n    region.setRect({1, 2, 3, 4});\n    debugster(\"after add rect\", region);\n}",
+    "hash": "6cca7b96836266800d852664a1366453",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Cliperator::done()",
+        "stdout": "empty region done=true\\nafter add rect done=false\\n"
+    },
+        "SkRegion_Cliperator_next": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region;\n    SkIRect rects[] = {{1, 2, 3, 4}, {5, 6, 7, 8}};\n    region.setRects(rects, SK_ARRAY_COUNT(rects));\n    SkRegion::Cliperator clipper(region, {0, 3, 8, 7});\n    do {\n        auto r2 = clipper.rect();\n        SkDebugf(\"rect={%d,%d,%d,%d}\\n\", r2.fLeft, r2.fTop, r2.fRight, r2.fBottom);\n        clipper.next();\n    } while (!clipper.done());\n}",
+    "hash": "3bbcc7eec19c808a8167bbcc987199f8",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Cliperator::next()",
+        "stdout": "rect={1,3,3,4}\\nrect={5,6,7,7}\\n"
+    },
+        "SkRegion_Cliperator_rect": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, SkRegion& region) -> void {\n        SkRegion::Cliperator clipper(region, {0, 0, 5, 3});\n        auto r = clipper.rect();\n        SkDebugf(\"%14s rect={%d,%d,%d,%d}\\n\", label, r.fLeft, r.fTop, r.fRight, r.fBottom); \n    };\n    SkRegion region;\n    debugster(\"empty region\", region);\n    region.setRect({1, 2, 3, 4});\n    debugster(\"after set rect\", region);\n}",
+    "hash": "05791751f00b4c2426093fa143b43bc7",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Cliperator::rect()",
+        "stdout": "empty region rect={1094713344,1065353216,0,-1}\\nafter set rect rect={1,2,3,3}\\n\\n"
+    },
+        "SkRegion_Iterator_Iterator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion::Iterator iter;\n    SkRegion region;\n    region.setRect({1, 2, 3, 4});\n    iter.reset(region);\n    auto r = iter.rect();\n    SkDebugf(\"rect={%d,%d,%d,%d}\\n\", r.fLeft, r.fTop, r.fRight, r.fBottom);\n}",
+    "hash": "a2db43ee3cbf6893e9b23927fb44298a",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Iterator::Iterator()",
+        "stdout": "rect={1,2,3,4}\\n"
+    },
+        "SkRegion_Iterator_copy_const_SkRegion": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region;\n    region.setRect({1, 2, 3, 4});\n    SkRegion::Iterator iter(region);\n    auto r = iter.rect();\n    SkDebugf(\"rect={%d,%d,%d,%d}\\n\", r.fLeft, r.fTop, r.fRight, r.fBottom);\n}",
+    "hash": "e317ceca48a6a7504219af58f35d2c95",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Iterator::Iterator(const SkRegion& region)",
+        "stdout": "rect={1,2,3,4}\\n"
+    },
+        "SkRegion_Iterator_done": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region;\n    SkRegion::Iterator iter(region);\n    SkDebugf(\"done=%s\\n\", iter.done() ? \"true\" : \"false\"); \n    region.setRect({1, 2, 3, 4});\n    iter.rewind();\n    SkDebugf(\"done=%s\\n\", iter.done() ? \"true\" : \"false\");\n}",
+    "hash": "814efa7d7f4ae52dfc861a937c1b5c25",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Iterator::done()",
+        "stdout": "done=true\\ndone=false\\n"
+    },
+        "SkRegion_Iterator_next": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region;\n    SkIRect rects[] = {{1, 2, 3, 4}, {5, 6, 7, 8}};\n    region.setRects(rects, SK_ARRAY_COUNT(rects));\n    SkRegion::Iterator iter(region);\n    do {\n        auto r2 = iter.rect();\n        SkDebugf(\"rect={%d,%d,%d,%d}\\n\", r2.fLeft, r2.fTop, r2.fRight, r2.fBottom);\n        iter.next();\n    } while (!iter.done());\n}",
+    "hash": "771236c2eadfc2fcd02a3e61a0875d39",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Iterator::next()",
+        "stdout": "rect={1,2,3,4}\\nrect={5,6,7,8}\\n"
+    },
+        "SkRegion_Iterator_rect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region;\n    SkRegion::Iterator iter(region);\n    auto r1 = iter.rect();\n    SkDebugf(\"rect={%d,%d,%d,%d}\\n\", r1.fLeft, r1.fTop, r1.fRight, r1.fBottom); \n    region.setRect({1, 2, 3, 4});\n    iter.rewind();\n    auto r2 = iter.rect();\n    SkDebugf(\"rect={%d,%d,%d,%d}\\n\", r2.fLeft, r2.fTop, r2.fRight, r2.fBottom);\n}",
+    "hash": "0e7c58ab5d3bcfb36b1f8464cf6c7d89",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Iterator::rect()",
+        "stdout": "rect={0,0,0,0}\\nrect={1,2,3,4}\\n\\n"
+    },
+        "SkRegion_Iterator_reset": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, SkRegion::Iterator& iter) -> void {\n        SkDebugf(\"%14s: done=%s\\n\", label, iter.done() ? \"true\" : \"false\");\n    };\n    SkRegion region;\n    SkRegion::Iterator iter(region);\n    debugster(\"empty region\", iter);\n    region.setRect({1, 2, 3, 4});\n    debugster(\"after set rect\", iter);\n    iter.reset(region);\n    debugster(\"after reset\", iter);\n}",
+    "hash": "d153f87bd518a4ab947b7e407ea1db79",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Iterator::reset()",
+        "stdout": "empty region: done=true\\nafter set rect: done=true\\n   after reset: done=false\\n"
+    },
+        "SkRegion_Iterator_rewind": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, SkRegion::Iterator& iter, bool addRewind) -> void {\n        if (addRewind) {\n            bool success = iter.rewind();\n            SkDebugf(\"%14s rewind success=%s\\n\", label, success ? \"true\" : \"false\");\n        }\n        auto r = iter.rect();\n        SkDebugf(\"%14s rect={%d,%d,%d,%d}\\n\", label, r.fLeft, r.fTop, r.fRight, r.fBottom);\n    };\n    SkRegion::Iterator iter;\n    debugster(\"empty iter\", iter, true);\n    SkRegion region;\n    iter.reset(region);\n    debugster(\"empty region\", iter, true);\n    region.setRect({1, 2, 3, 4});\n    iter.reset(region);\n    debugster(\"after set rect\", iter, false);\n    debugster(\"after rewind\", iter, true);\n}",
+    "hash": "32d51e959d6cc720a74ec4822511e2cd",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Iterator::rewind()",
+        "stdout": "empty iter rewind success=false\\nempty iter rect={0,0,0,0}\\nempty region rewind success=true\\nempty region rect={0,0,0,0}\\nafter set rect rect={1,2,3,4}\\nafter rewind rewind success=true\\nafter rewind rect={1,2,3,4}\\n\\n"
+    },
+        "SkRegion_Iterator_rgn": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region;\n    SkIRect rects[] = {{1, 2, 3, 4}, {3, 4, 5, 6}};\n    region.setRects(rects, SK_ARRAY_COUNT(rects));\n    SkRegion::Iterator iter(region);\n    auto r = iter.rect();\n    SkDebugf(\"rect={%d,%d,%d,%d}\\n\", r.fLeft, r.fTop, r.fRight, r.fBottom);\n    auto b = iter.rgn()->getBounds();\n    SkDebugf(\"bounds={%d,%d,%d,%d}\\n\", b.fLeft, b.fTop, b.fRight, b.fBottom);\n}",
+    "hash": "bbc3c454a21186e2a16e843a5b061c44",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Iterator::rgn()",
+        "stdout": "rect={1,2,3,4}\\nbounds={1,2,5,6}\\n"
+    },
+        "SkRegion_Spanerator_const_SkRegion_int_int_int": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region;\n    region.setRect({1, 2, 3, 4});\n    SkRegion::Spanerator spanner(region, 3, 2, 4);\n    int left, right;\n    bool result = spanner.next(&left, &right);\n    SkDebugf(\"result=%s left=%d right=%d\\n\", result ? \"true\" : \"false\", left, right);\n}",
+    "hash": "3073b3f8ea7252871b6156ff674dc385",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Spanerator::Spanerator(const SkRegion& region, int y, int left, int right)",
+        "stdout": "result=true left=2 right=3\\n"
+    },
+        "SkRegion_Spanerator_next": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, SkRegion& region) -> void {\n        SkRegion::Spanerator spanner(region, 3, 2, 4);\n        int left, right;\n        bool result = spanner.next(&left, &right);\n        SkDebugf(\"%14s: result=%s\", label, result ? \"true\" : \"false\");\n        if (result) SkDebugf(\" left=%d right=%d\", left, right);\n        SkDebugf(\"\\n\");\n    };\n    SkRegion region;\n    debugster(\"empty region\", region);\n    region.setRect({1, 2, 3, 4});\n    debugster(\"after set rect\", region);\n}",
+    "hash": "03d02180fee5f64ec4a3347e118fb2ec",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Spanerator::next()",
+        "stdout": "empty region: result=false\\nafter set rect: result=true left=2 right=3\\n"
+    },
+        "SkRegion_computeRegionComplexity": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, const SkRegion& region) -> void {\n                SkDebugf(\"%s: region complexity %d\\n\", label, region.computeRegionComplexity());\n    };\n    SkRegion region;\n    debugster(\"initial\", region);\n    region.setRect({1, 2, 3, 4});\n    debugster(\"set rect\", region);\n    region.op({2, 3, 4, 5}, SkRegion::kUnion_Op);\n    debugster(\"op rect\", region);\n}",
+    "hash": "c4984fefdcecdd1090be160f80939d87",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::computeRegionComplexity",
+        "stdout": "initial: region complexity 0\\nset rect: region complexity 1\\nop rect: region complexity 3\\n"
+    },
+        "SkRegion_copy_const_SkIRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region({1, 2, 3, 4});\n    SkRegion region2;\n    region2.setRect({1, 2, 3, 4});\n    SkDebugf(\"region %c= region2\\n\", region == region2 ? '=' : '!');\n}",
+    "hash": "5253910233f7961c30b4c18ab911e917",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::SkRegion(const SkIRect& rect)",
+        "stdout": "region == region2\\n"
+    },
+        "SkRegion_copy_const_SkRegion": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, SkRegion& region) -> void {\n        auto r = region.getBounds();\n        SkDebugf(\"%14s: {%d,%d,%d,%d}\\n\", label, r.fLeft, r.fTop, r.fRight, r.fBottom);\n    };\n    SkRegion region({1, 2, 3, 4});\n    SkRegion region2(region);\n    debugster(\"region bounds\", region);\n    debugster(\"region2 bounds\", region2);\n    region.setEmpty();\n    SkDebugf(\"    after region set empty:\\n\");\n    debugster(\"region bounds\", region);\n    debugster(\"region2 bounds\", region2);\n}",
+    "hash": "3daa83fca809b9ec6560d2ef9e2da5e6",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::SkRegion(const SkRegion& region)",
+        "stdout": "region bounds: {1,2,3,4}\\nregion2 bounds: {1,2,3,4}\\n    after region set empty:\\n region bounds: {0,0,0,0}\\nregion2 bounds: {1,2,3,4}\\n"
+    },
+        "SkRegion_copy_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, SkRegion& region) -> void {\n        auto r = region.getBounds();\n        SkDebugf(\"%14s: {%d,%d,%d,%d}\\n\", label, r.fLeft, r.fTop, r.fRight, r.fBottom);\n    };\n    SkRegion region1({1, 2, 3, 4});\n    SkRegion region2 = region1;\n    debugster(\"region1 bounds\", region1);\n    debugster(\"region2 bounds\", region2);\n}",
+    "hash": "e8513f6394c24efaa301d41921c5241a",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::operator=(const SkRegion& region)",
+        "stdout": "region1 bounds: {1,2,3,4}\\nregion2 bounds: {1,2,3,4}\\n"
+    },
+        "SkRegion_destructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion* region = new SkRegion({1, 2, 3, 4});\n    SkRegion region2(*region);\n    delete region;\n    auto r = region2.getBounds();\n    SkDebugf(\"region2 bounds: {%d,%d,%d,%d}\\n\", r.fLeft, r.fTop, r.fRight, r.fBottom);\n}",
+    "hash": "985ff654a6b67288d322c748132a088e",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::~SkRegion()",
+        "stdout": "region2 bounds: {1,2,3,4}\\n"
+    },
+        "SkRegion_empty_constructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region;\n    SkIRect r = region.getBounds();\n    SkDebugf(\"region bounds: {%d, %d, %d, %d}\\n\", r.fLeft, r.fTop, r.fRight, r.fBottom);\n}",
+    "hash": "4549dcda3e0f9a41b3daee0ed37deca8",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::SkRegion()",
+        "stdout": "region bounds: {0, 0, 0, 0}\\n"
+    },
+        "SkRegion_equal1_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkRegion& a, const SkRegion& b) -> void {\n                SkDebugf(\"%s one %c= two\\n\", prefix, a == b ? '=' : '!');\n    };\n    SkRegion one;\n    SkRegion two;\n    debugster(\"empty\", one, two);\n    one.setRect({1, 2, 3, 4});\n    debugster(\"set rect\", one, two);\n    one.setEmpty();\n    debugster(\"set empty\", one, two);\n}",
+    "hash": "d7f4fdc8bc63ca8410ed166ecef0aef3",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::operator==(const SkRegion& other) const",
+        "stdout": "empty one == two\\nset rect one != two\\nset empty one == two\\n"
+    },
+        "SkRegion_getBounds": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region({1, 2, 3, 4});\n    region.op({2, 3, 4, 5}, SkRegion::kUnion_Op);\n    auto r = region.getBounds();\n    SkDebugf(\"bounds: {%d,%d,%d,%d}\\n\", r.fLeft, r.fTop, r.fRight, r.fBottom);\n}",
+    "hash": "651632582d385d2531e7aa551c31e331",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::getBounds",
+        "stdout": "bounds: {1,2,4,5}\\n"
+    },
+        "SkRegion_isComplex": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, const SkRegion& region) -> void {\n                SkDebugf(\"%s: region is %s\" \"complex\\n\", label, region.isComplex() ? \"\" : \"not \");\n    };\n    SkRegion region;\n    debugster(\"initial\", region);\n    region.setRect({1, 2, 3, 4});\n    debugster(\"set rect\", region);\n    region.op({2, 3, 4, 5}, SkRegion::kUnion_Op);\n    debugster(\"op rect\", region);\n}",
+    "hash": "1fbd76d75ca2d280e81856311de4e54e",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::isComplex",
+        "stdout": "initial: region is not complex\\nset rect: region is not complex\\nop rect: region is complex\\n"
+    },
+        "SkRegion_isEmpty": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, SkRegion& region) -> void {\n        SkDebugf(\"%14s: region is %s\" \"empty\\n\", label, region.isEmpty() ? \"\" : \"not \");\n    };\n    SkRegion region;\n    debugster(\"initial\", region);\n    region.setRect({1, 2, 3, 4});\n    debugster(\"set rect\", region);\n    region.setEmpty();\n    debugster(\"set empty\", region);\n}",
+    "hash": "10ef0de39e8553dd97cf8668ce185070",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::isEmpty",
+        "stdout": "initial: region is empty\\n      set rect: region is not empty\\n     set empty: region is empty\\n"
+    },
+        "SkRegion_isRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, const SkRegion& region) -> void {\n                SkDebugf(\"%s: region is %s\" \"rect\\n\", label, region.isRect() ? \"\" : \"not \");\n    };\n    SkRegion region;\n    debugster(\"initial\", region);\n    region.setRect({1, 2, 3, 4});\n    debugster(\"set rect\", region);\n    region.setEmpty();\n    debugster(\"set empty\", region);\n}",
+    "hash": "b6adbdddf7fe45a1098121c4e5fd57ea",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::isRect",
+        "stdout": "initial: region is not rect\\nset rect: region is rect\\nset empty: region is not rect\\n"
+    },
+        "SkRegion_notequal1_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* prefix, const SkRegion& a, const SkRegion& b) -> void {\n                SkDebugf(\"%s one %c= two\\n\", prefix, a != b ? '!' : '=');\n    };\n    SkRegion one;\n    SkRegion two;\n    debugster(\"empty\", one, two);\n    one.setRect({1, 2, 3, 4});\n    two.setRect({1, 2, 3, 3});\n    debugster(\"set rect\", one, two);\n    two.op({1, 3, 3, 4}, SkRegion::kUnion_Op);\n    debugster(\"union rect\", one, two);\n}",
+    "hash": "3357caa9d8d810f200cbccb668182496",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::operator!=(const SkRegion& other) const",
+        "stdout": "empty one == two\\nset rect one != two\\nunion rect one == two\\n"
+    },
+        "SkRegion_quickContains": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region({1, 2, 3, 4});\n    SkIRect test = {2, 2, 3, 3};\n    SkDebugf(\"quickContains 1: %s\\n\", region.quickContains(test) ? \"true\" : \"false\");\n    region.op({1, 4, 3, 6}, SkRegion::kUnion_Op);\n    SkDebugf(\"quickContains 2: %s\\n\", region.quickContains(test) ? \"true\" : \"false\");\n    region.op({1, 7, 3, 8}, SkRegion::kUnion_Op);\n    SkDebugf(\"quickContains 3: %s\\n\", region.quickContains(test) ? \"true\" : \"false\");\n}",
+    "hash": "d8e5eac373e2e7cfc1b8cd0229647ba6",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::quickContains",
+        "stdout": "quickContains 1: true\\nquickContains 2: true\\nquickContains 3: false\\n"
+    },
+        "SkRegion_quickContains_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, SkRegion& region) -> void {\n        SkDebugf(\"%s: %s\\n\", label, region.quickContains(2, 2, 3, 3) ? \"true\" : \"false\");\n    };\n    SkRegion region({1, 2, 3, 4});\n    debugster(\"quickContains 1\", region);\n    region.op({1, 4, 3, 6}, SkRegion::kUnion_Op);\n    debugster(\"quickContains 2\", region);\n    region.op({1, 7, 3, 8}, SkRegion::kUnion_Op);\n    debugster(\"quickContains 3\", region);\n}",
+    "hash": "eb6d290887e1a3a0b051b4d7b012f5e1",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::quickContains_2",
+        "stdout": "quickContains 1: true\\nquickContains 2: true\\nquickContains 3: false\\n"
+    },
+        "SkRegion_quickReject": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region({1, 2, 3, 4});\n    SkIRect test = {4, 2, 5, 3};\n    SkDebugf(\"quickReject 1: %s\\n\", region.quickReject(test) ? \"true\" : \"false\");\n    region.op({1, 4, 3, 6}, SkRegion::kUnion_Op);\n    SkDebugf(\"quickReject 2: %s\\n\", region.quickReject(test) ? \"true\" : \"false\");\n    region.op({4, 7, 5, 8}, SkRegion::kUnion_Op);\n    SkDebugf(\"quickReject 3: %s\\n\", region.quickReject(test) ? \"true\" : \"false\");\n}",
+    "hash": "71ac24b7d91ac5ca7c14b43930d5f85d",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::quickReject",
+        "stdout": "quickReject 1: true\\nquickReject 2: true\\nquickReject 3: false\\n"
+    },
+        "SkRegion_quickReject_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region({1, 2, 3, 4});\n    SkRegion test;\n    SkIRect rects[] = {{4, 2, 5, 3}, {7, 2, 8, 3}};\n    test.setRects(rects, SK_ARRAY_COUNT(rects));\n    SkDebugf(\"quickReject 1: %s\\n\", region.quickReject(test) ? \"true\" : \"false\");\n    region.op({1, 4, 3, 6}, SkRegion::kUnion_Op);\n    SkDebugf(\"quickReject 2: %s\\n\", region.quickReject(test) ? \"true\" : \"false\");\n    region.op({4, 7, 5, 8}, SkRegion::kUnion_Op);\n    SkDebugf(\"quickReject 3: %s\\n\", region.quickReject(test) ? \"true\" : \"false\");\n}",
+    "hash": "def7dba38947c33b203e4f9db6c88be3",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::quickReject_2",
+        "stdout": "quickReject 1: true\\nquickReject 2: true\\nquickReject 3: false\\n"
+    },
+        "SkRegion_set": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, SkRegion& region) -> void {\n        auto r = region.getBounds();\n        SkDebugf(\"%14s: {%d,%d,%d,%d}\\n\", label, r.fLeft, r.fTop, r.fRight, r.fBottom);\n    };\n    SkRegion region1({1, 2, 3, 4});\n    SkRegion region2;\n    region2.set(region1);\n    debugster(\"region1 bounds\", region1);\n    debugster(\"region2 bounds\", region2);\n}",
+    "hash": "b3538117c7ae2cb7de3b42ca45fe1b13",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::set()",
+        "stdout": "region1 bounds: {1,2,3,4}\\nregion2 bounds: {1,2,3,4}\\n"
+    },
+        "SkRegion_setEmpty": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, SkRegion& region) -> void {\n        auto r = region.getBounds();\n        SkDebugf(\"%14s: {%d,%d,%d,%d}\\n\", label, r.fLeft, r.fTop, r.fRight, r.fBottom);\n    };\n    SkRegion region({1, 2, 3, 4});\n    debugster(\"region bounds\", region);\n    region.setEmpty();\n    SkDebugf(\"    after region set empty:\\n\");\n    debugster(\"region bounds\", region);\n}",
+    "hash": "1314f7250963775c5ee89cc5981eee24",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::setEmpty",
+        "stdout": "region bounds: {1,2,3,4}\\n    after region set empty:\\n region bounds: {0,0,0,0}\\n"
+    },
+        "SkRegion_setRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region({1, 2, 3, 4});\n    SkDebugf(\"region is %s\" \"empty\\n\", region.isEmpty() ? \"\" : \"not \");\n    bool setEmpty = region.setRect({1, 2, 1, 4});\n    SkDebugf(\"region is %s\" \"empty\\n\", region.isEmpty() ? \"\" : \"not \");\n    SkDebugf(\"setEmpty: %s\\n\", setEmpty ? \"true\" : \"false\");\n}",
+    "hash": "e12575ffcd262f2364e0e6bece98a825",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::setRect",
+        "stdout": "region is not empty\\nregion is empty\\nsetEmpty: false\\n"
+    },
+        "SkRegion_setRect_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, bool success, SkRegion& region) -> void {\n        auto r = region.getBounds();\n        SkDebugf(\"%14s: success:%s {%d,%d,%d,%d}\\n\", label, success ? \"true\" : \"false\",\n                 r.fLeft, r.fTop, r.fRight, r.fBottom);\n    };\n    SkRegion region;\n    bool success = region.setRect(1, 2, 3, 4);\n    debugster(\"set to: 1,2,3,4\", success, region);\n    success = region.setRect(3, 2, 1, 4);\n    debugster(\"set to: 3,2,1,4\", success, region);\n}",
+    "hash": "5b31a1b077818a8150ad50f3b19e7bfe",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::setRect_2",
+        "stdout": "set to: 1,2,3,4: success:true {1,2,3,4}\\nset to: 3,2,1,4: success:false {0,0,0,0}\\n"
+    },
+        "SkRegion_setRegion": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, SkRegion& region) -> void {\n        auto r = region.getBounds();\n        SkDebugf(\"%14s: {%d,%d,%d,%d}\\n\", label, r.fLeft, r.fTop, r.fRight, r.fBottom);\n    };\n    SkRegion region({1, 2, 3, 4});\n    SkRegion region2;\n    region2.setRegion(region);\n    debugster(\"region bounds\", region);\n    debugster(\"region2 bounds\", region2);\n    region2.setEmpty();\n    SkDebugf(\"    after region set empty:\\n\");\n    debugster(\"region bounds\", region);\n    debugster(\"region2 bounds\", region2);\n}",
+    "hash": "5d75d22bd155576838155762ab040751",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::setRegion",
+        "stdout": "region bounds: {1,2,3,4}\\nregion2 bounds: {1,2,3,4}\\n    after region set empty:\\n region bounds: {1,2,3,4}\\nregion2 bounds: {0,0,0,0}\\n"
+    },
+        "SkRegion_swap": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto debugster = [](const char* label, SkRegion& region) -> void {\n        auto r = region.getBounds();\n        SkDebugf(\"%14s: {%d,%d,%d,%d}\\n\", label, r.fLeft, r.fTop, r.fRight, r.fBottom);\n    };\n    SkRegion region1({1, 2, 3, 4});\n    SkRegion region2;\n    region1.swap(region2);\n    debugster(\"region1 bounds\", region1);\n    debugster(\"region2 bounds\", region2);\n}",
+    "hash": "ae67b7b4c198b46c58e48f5af061c8f1",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::swap()",
+        "stdout": "region1 bounds: {0,0,0,0}\\nregion2 bounds: {1,2,3,4}\\n"
+    },
+        "SkSurface_MakeNull": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkDebugf(\"SkSurface::MakeNull(0, 0) %c= nullptr\\n\", SkSurface::MakeNull(0, 0) == nullptr ?\n             '=' : '!');\n    const int w = 37;\n    const int h = 1000;\n    auto surf = SkSurface::MakeNull(w, h);\n    auto nullCanvas = surf->getCanvas();\n    nullCanvas->drawPaint(SkPaint());   // does not crash, nothing draws\n    SkDebugf(\"surf->makeImageSnapshot() %c= nullptr\\n\", surf->makeImageSnapshot() == nullptr ?\n            '=' : '!');\n}",
+    "hash": "99a54b814ccab7d2b1143c88581649ff",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::MakeNull",
+        "stdout": "SkSurface::MakeNull(0, 0) == nullptr\\nsurf->makeImageSnapshot() == nullptr\\n"
+    },
+        "SkSurface_MakeRaster": {
+    "code": "void draw(SkCanvas* ) {\n    SkImageInfo info = SkImageInfo::MakeN32Premul(3, 3);\n    const size_t rowBytes = 64;\n    sk_sp<SkSurface> surface(SkSurface::MakeRaster(info, rowBytes, nullptr));\n    SkCanvas* canvas = surface->getCanvas();\n    canvas->clear(SK_ColorWHITE);\n    SkPixmap pixmap;\n    if (surface->peekPixels(&pixmap)) {\n        const uint32_t* colorPtr = pixmap.addr32();\n        SkPMColor pmWhite = colorPtr[0];\n        SkPaint paint;\n        canvas->drawPoint(1, 1, paint);\n        canvas->flush();  // ensure that point was drawn\n        for (int y = 0; y < info.height(); ++y) {\n            for (int x = 0; x < info.width(); ++x) {\n                SkDebugf(\"%c\", colorPtr[x] == pmWhite ? '-' : 'x');\n            }\n            colorPtr += rowBytes / sizeof(colorPtr[0]);\n            SkDebugf(\"\\n\");\n        }\n    }\n}\n",
+    "hash": "a803910ada4f8733f0b62456afead55f",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::MakeRaster",
+        "stdout": "---\\n-x-\\n---\\n"
+    },
+        "SkSurface_MakeRasterDirect": {
+    "code": "void draw(SkCanvas* ) {\n    SkImageInfo info = SkImageInfo::MakeN32Premul(3, 3);\n    const size_t size = info.computeMinByteSize();\n    SkAutoTMalloc<SkPMColor> storage(size);\n    SkPMColor* pixels = storage.get();\n    sk_sp<SkSurface> surface(SkSurface::MakeRasterDirect(info, pixels, info.minRowBytes()));\n    SkCanvas* canvas = surface->getCanvas();\n    canvas->clear(SK_ColorWHITE);\n    SkPMColor pmWhite = pixels[0];\n    SkPaint paint;\n    canvas->drawPoint(1, 1, paint);\n    canvas->flush();  // ensure that point was drawn\n    for (int y = 0; y < info.height(); ++y) {\n        for (int x = 0; x < info.width(); ++x) {\n            SkDebugf(\"%c\", *pixels++ == pmWhite ? '-' : 'x');\n        }\n        SkDebugf(\"\\n\");\n    }\n}\n",
+    "hash": "3f5aeb870104187643197354a7f1d27a",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::MakeRasterDirect",
+        "stdout": "---\\n-x-\\n---\\n"
+    },
+        "SkSurface_MakeRasterDirectReleaseProc": {
+    "code": "static void release_direct_surface_storage(void* pixels, void* context) {\n    if (pixels == context) {\n        SkDebugf(\"expected release context\\n\");\n    }\n    sk_free(pixels);\n}\n\nvoid draw(SkCanvas* ) {\n    SkImageInfo info = SkImageInfo::MakeN32Premul(3, 3);\n    const size_t rowBytes = info.minRowBytes();\n    void* pixels = sk_malloc_throw(info.computeByteSize(rowBytes));\n    sk_sp<SkSurface> surface(SkSurface::MakeRasterDirectReleaseProc(info, pixels, rowBytes,\n            release_direct_surface_storage, pixels));\n    SkCanvas* canvas = surface->getCanvas();\n    canvas->clear(SK_ColorWHITE);\n    SkPMColor* colorPtr = (SkPMColor*) pixels;\n    SkPMColor pmWhite = colorPtr[0];\n    SkPaint paint;\n    canvas->drawPoint(1, 1, paint);\n    canvas->flush();  // ensure that point was drawn\n    for (int y = 0; y < info.height(); ++y) {\n        for (int x = 0; x < info.width(); ++x) {\n            SkDebugf(\"%c\", *colorPtr++ == pmWhite ? '-' : 'x');\n        }\n        SkDebugf(\"\\n\");\n    }\n}\n",
+    "hash": "8e6530b26ab4096a9a91cfaadda1c568",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::MakeRasterDirectReleaseProc",
+        "stdout": "---\\n-x-\\n---\\nexpected release context\\n"
+    },
+        "SkSurface_MakeRasterN32Premul": {
+    "code": "void draw(SkCanvas* ) {\n    sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(3, 3));\n    SkCanvas* canvas = surface->getCanvas();\n    canvas->clear(SK_ColorWHITE);\n    SkPixmap pixmap;\n    if (surface->peekPixels(&pixmap)) {\n        const uint32_t* colorPtr = pixmap.addr32();\n        SkPMColor pmWhite = colorPtr[0];\n        SkPaint paint;\n        canvas->drawPoint(1, 1, paint);\n        canvas->flush();  // ensure that point was drawn\n        for (int y = 0; y < surface->height(); ++y) {\n            for (int x = 0; x < surface->width(); ++x) {\n                SkDebugf(\"%c\", colorPtr[x] == pmWhite ? '-' : 'x');\n            }\n            colorPtr += surface->width();\n            SkDebugf(\"\\n\");\n        }\n    }\n}\n",
+    "hash": "b932a2bd68455fb0af2e7a1ed19e36b3",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::MakeRasterN32Premul",
+        "stdout": "---\\n-x-\\n---\\n"
+    },
+        "SkSurface_MakeRaster_2": {
+    "code": "void draw(SkCanvas* ) {\n    SkImageInfo info = SkImageInfo::MakeN32Premul(3, 3);\n    sk_sp<SkSurface> surface(SkSurface::MakeRaster(info));\n    SkCanvas* canvas = surface->getCanvas();\n    canvas->clear(SK_ColorWHITE);\n    SkPixmap pixmap;\n    if (surface->peekPixels(&pixmap)) {\n        const uint32_t* colorPtr = pixmap.addr32();\n        SkPMColor pmWhite = colorPtr[0];\n        SkPaint paint;\n        canvas->drawPoint(1, 1, paint);\n        canvas->flush();  // ensure that point was drawn\n        for (int y = 0; y < info.height(); ++y) {\n            for (int x = 0; x < info.width(); ++x) {\n                SkDebugf(\"%c\", colorPtr[x] == pmWhite ? '-' : 'x');\n            }\n            colorPtr += info.width();\n            SkDebugf(\"\\n\");\n        }\n    }\n}\n",
+    "hash": "c6197d204ef9e4ccfb583242651fb2a7",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::MakeRaster_2",
+        "stdout": "---\\n-x-\\n---\\n"
+    },
+        "SkSurface_generationID": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto surface = SkSurface::MakeRasterN32Premul(1, 1);\n    for (int i = 0; i < 3; ++i) {\n        SkDebugf(\"surface generationID: %d\\n\", surface->generationID());\n        if (0 == i) {\n            surface->getCanvas()->drawColor(SK_ColorBLACK);\n        } else {\n            surface->notifyContentWillChange(SkSurface::kDiscard_ContentChangeMode);\n        }\n    }\n}",
+    "hash": "be9574c4a14f891e1abb4ec2b1e51d6c",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::generationID",
+        "stdout": "surface generationID: 1\\nsurface generationID: 2\\nsurface generationID: 3\\n"
+    },
+        "SkSurface_height": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int width = 37;\n    const int height = 1000;\n    auto surf = SkSurface::MakeNull(width, height);\n    auto nullCanvas = surf->getCanvas();\n    SkDebugf(\"surface height=%d  canvas height=%d\\n\", surf->height(),\n             nullCanvas->getBaseLayerSize().fHeight);\n}",
+    "hash": "20571cc23e3146deaa09046b64cc0aef",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::height()",
+        "stdout": "surface height=1000  canvas height=1000\\n"
+    },
+        "SkSurface_notifyContentWillChange": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto surface = SkSurface::MakeRasterN32Premul(1, 1);\n    for (int i = 0; i < 3; ++i) {\n        SkDebugf(\"surface generationID: %d\\n\", surface->generationID());\n        if (0 == i) {\n            surface->getCanvas()->drawColor(SK_ColorBLACK);\n        } else {\n            surface->notifyContentWillChange(SkSurface::kDiscard_ContentChangeMode);\n        }\n    }\n}",
+    "hash": "be9574c4a14f891e1abb4ec2b1e51d6c",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::notifyContentWillChange",
+        "stdout": "surface generationID: 1\\nsurface generationID: 2\\nsurface generationID: 3\\n"
+    },
+        "SkSurface_props": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* names[] = { \"Unknown\", \"RGB_H\", \"BGR_H\", \"RGB_V\", \"BGR_V\" };\n    sk_sp<SkSurface> surf(SkSurface::MakeRasterN32Premul(64, 64));\n    SkDebugf(\"surf.props(): k%s_SkPixelGeometry\\n\", names[surf->props().pixelGeometry()]);\n}",
+    "hash": "13cf9e7b2894ae6e98c1fd719040bf01",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::props()",
+        "stdout": "surf.props(): kRGB_H_SkPixelGeometry\\n"
+    },
+        "SkSurface_width": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int width = 37;\n    const int height = 1000;\n    auto surf = SkSurface::MakeNull(width, height);\n    auto nullCanvas = surf->getCanvas();\n    SkDebugf(\"surface width=%d  canvas width=%d\\n\", surf->width(),\n             nullCanvas->getBaseLayerSize().fWidth);\n}",
+    "hash": "df066b56dd97c7c589fd2bb6a2539de8",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::width()",
+        "stdout": "surface width=37  canvas width=37\\n"
+    },
+        "SkTextBlobBuilder_empty_constructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkTextBlobBuilder builder;\n    sk_sp<SkTextBlob> blob = builder.make();\n    SkDebugf(\"blob \" \"%s\" \" nullptr\", blob == nullptr ? \"equals\" : \"does not equal\");\n}",
+    "hash": "d9dbabfe24aad92ee3c8144513e90d81",
+    "file": "SkTextBlobBuilder_Reference",
+    "name": "SkTextBlobBuilder::SkTextBlobBuilder()",
+        "stdout": "blob equals nullptr"
+    },
+        "SkTextBlobBuilder_make": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkTextBlobBuilder builder;\n    sk_sp<SkTextBlob> blob = builder.make();\n    SkDebugf(\"blob \" \"%s\" \" nullptr\\n\", blob == nullptr ? \"equals\" : \"does not equal\");\n    SkPaint paint;\n    paint.setTextEncoding(SkTextEncoding::kGlyphID);\n    SkFont font;\n    paint.textToGlyphs(\"x\", 1, builder.allocRun(font, 1, 20, 20).glyphs);\n    blob = builder.make();\n    SkDebugf(\"blob \" \"%s\" \" nullptr\\n\", blob == nullptr ? \"equals\" : \"does not equal\");\n    blob = builder.make();\n    SkDebugf(\"blob \" \"%s\" \" nullptr\\n\", blob == nullptr ? \"equals\" : \"does not equal\");\n}",
+    "hash": "34c37c0212cc0aef670d96945d08fe24",
+    "file": "SkTextBlobBuilder_Reference",
+    "name": "SkTextBlobBuilder::make()",
+        "stdout": "blob equals nullptr\\nblob does not equal nullptr\\nblob equals nullptr\\n"
+    }
+    }
+
+    var pngs = {"Blend_Mode_Clear": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->saveLayer(nullptr, nullptr);\n    canvas->drawColor(SK_ColorYELLOW, SkBlendMode::kClear);\n    SkPaint paint;\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {\n        SkColor colors[] = { color, SkColorSetA(color, 0) }; \n        paint.setShader(SkGradientShader::MakeRadial({ 64, 64}, 100,\n                colors, nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));\n        canvas->drawCircle(64, 64, 100, paint);\n        canvas->translate(64, 64);\n    }\n    canvas->restore();\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "a9b56a26ca469bab9ab10e16f62fb2e2",
+    "file": "SkBlendMode_Reference",
+    "name": "Clear"
+},
+    "Blend_Mode_Color": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawImage(image, 0, 0);\n    canvas->drawColor(0xFF00FF00, SkBlendMode::kColor);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "5d7c6e23a34ca9bf3ba8cda4cdc94cc4",
+    "file": "SkBlendMode_Reference",
+    "name": "Color"
+},
+    "Blend_Mode_Color_Burn": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawImage(image, 0, 0);\n    canvas->clipRect({128, 0, 256, 256});\n    canvas->drawColor(SkColorSetARGB(0x80, 0x90, 0x90, 0x90), SkBlendMode::kColorBurn);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "3eeef529375d8083ae0d615789d55e89",
+    "file": "SkBlendMode_Reference",
+    "name": "Color_Burn"
+},
+    "Blend_Mode_Color_Dodge": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawImage(image, 0, 0);\n    canvas->clipRect({128, 0, 256, 256});\n    canvas->drawColor(SkColorSetARGB(0x80, 0x90, 0x90, 0x90), SkBlendMode::kColorDodge);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "280ad6267a7d2d77b6d2c4531c6fc0bf",
+    "file": "SkBlendMode_Reference",
+    "name": "Color_Dodge"
+},
+    "Blend_Mode_Darken": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawImage(image, 0, 0);\n    SkColor colors[] = { SK_ColorWHITE, SK_ColorBLACK };\n    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),\n            SkShader::kClamp_TileMode));\n    paint.setBlendMode(SkBlendMode::kDarken);\n    canvas->drawPaint(paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "23c974d2759f523ca2f4a78ae86855c3",
+    "file": "SkBlendMode_Reference",
+    "name": "Darken"
+},
+    "Blend_Mode_Difference": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawImage(image, 0, 0);\n    canvas->drawImage(image, 128, 0);\n    canvas->drawImage(image, 0, 128);\n    canvas->drawImage(image, 128, 128);\n    SkPaint paint;\n    paint.setBlendMode(SkBlendMode::kDstATop);\n    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };\n    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };\n    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    canvas->clipRect( { 30, 30, 226, 226 } );\n    canvas->drawColor(0x80bb9977, SkBlendMode::kDifference);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "52d2c8d1b9b428de4477b4caa1543a3d",
+    "file": "SkBlendMode_Reference",
+    "name": "Difference"
+},
+    "Blend_Mode_Dst": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRSXform xforms[] = { { .5f, 0, 0, 0 }, {0, .5f, 125, 128 } };\n    SkRect tex[] = { { 0, 0, 250, 250 }, { 0, 0, 250, 250 } };\n    SkColor colors[] = { 0x7f55aa00, 0x7f3333bf };\n    canvas->drawAtlas(image.get(), xforms, tex, colors, 2, SkBlendMode::kSrc, nullptr, nullptr);\n    canvas->translate(128, 0);\n    canvas->drawAtlas(image.get(), xforms, tex, colors, 2, SkBlendMode::kDst, nullptr, nullptr);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "35915a2273be1076f00f2e47998ce808",
+    "file": "SkBlendMode_Reference",
+    "name": "Dst"
+},
+    "Blend_Mode_Dst_Atop": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };\n    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    paint.setBlendMode(SkBlendMode::kDstATop);\n    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };\n    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };\n    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    canvas->clipRect( { 30, 30, 226, 226 } );\n    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcATop);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "1955856d45773a4fd914fcc1f813222f",
+    "file": "SkBlendMode_Reference",
+    "name": "Dst_Atop"
+},
+    "Blend_Mode_Dst_In": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };\n    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    paint.setBlendMode(SkBlendMode::kDstIn);\n    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };\n    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };\n    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    canvas->clipRect( { 30, 30, 226, 226 } );\n    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kDstIn);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "a5eeba05ccf6097a5d110a9d64f97c25",
+    "file": "SkBlendMode_Reference",
+    "name": "Dst_In"
+},
+    "Blend_Mode_Dst_Out": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };\n    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    paint.setBlendMode(SkBlendMode::kDstIn);\n    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };\n    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };\n    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    canvas->clipRect( { 30, 30, 226, 226 } );\n    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kDstOut);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "b9a894c9accfc5d94081bbd77d5d790a",
+    "file": "SkBlendMode_Reference",
+    "name": "Dst_Out"
+},
+    "Blend_Mode_Dst_Over": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };\n    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    paint.setBlendMode(SkBlendMode::kDstIn);\n    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };\n    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };\n    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    canvas->clipRect( { 30, 30, 226, 226 } );\n    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kDstOver);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "10dbb4d97902956ef5f5f8562f65119e",
+    "file": "SkBlendMode_Reference",
+    "name": "Dst_Over"
+},
+    "Blend_Mode_Exclusion": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawImage(image, 0, 0);\n    canvas->drawImage(image, 128, 0);\n    canvas->drawImage(image, 0, 128);\n    canvas->drawImage(image, 128, 128);\n    SkPaint paint;\n    paint.setBlendMode(SkBlendMode::kDstATop);\n    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };\n    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };\n    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    canvas->clipRect( { 30, 30, 226, 226 } );\n    canvas->drawColor(0x80bb9977, SkBlendMode::kExclusion);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "a544ee1c67c7c557a9e54d5e99f94bb6",
+    "file": "SkBlendMode_Reference",
+    "name": "Exclusion"
+},
+    "Blend_Mode_Hard_Light": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawImage(image, 0, 0);\n    const SkColor colors[] = { 0xFFFFFFFF, 0x00000000 };\n    SkPaint paint;\n    paint.setBlendMode(SkBlendMode::kHardLight);\n    paint.setShader(SkGradientShader::MakeRadial({ 128, 128}, 100, colors,\n         nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));\n    canvas->clipRect({0, 128, 256, 256});\n    canvas->drawPaint(paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "ac2fe555e2196e15863ea4ce74db3d54",
+    "file": "SkBlendMode_Reference",
+    "name": "Hard_Light"
+},
+    "Blend_Mode_Hue": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawImage(image, 0, 0);\n    canvas->drawColor(0xFF00FF00, SkBlendMode::kHue);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "41e45570d682397d3b8ff2f51bd9c574",
+    "file": "SkBlendMode_Reference",
+    "name": "Hue"
+},
+    "Blend_Mode_Lighten": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawImage(image, 0, 0);\n    SkColor colors[] = { SK_ColorBLACK, SK_ColorWHITE };\n    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),\n            SkShader::kClamp_TileMode));\n    paint.setBlendMode(SkBlendMode::kLighten);\n    canvas->drawPaint(paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "95cb08b8c8db3af3b2c9ad56ae7d6bc1",
+    "file": "SkBlendMode_Reference",
+    "name": "Lighten"
+},
+    "Blend_Mode_Luminosity": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawImage(image, 0, 0);\n    canvas->drawColor(0xFF00FF00, SkBlendMode::kLuminosity);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "7d42fe34ae20dd9e12c39dc3950e9989",
+    "file": "SkBlendMode_Reference",
+    "name": "Luminosity"
+},
+    "Blend_Mode_Modulate": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto drawSquare = [=](int dx, int dy, SkBlendMode mode, const char* label) -> void {\n        const SkColor colors[] = { SK_ColorBLACK, SK_ColorWHITE };\n        const SkPoint horz[] = { { 0, 0 }, { 128, 0 } };\n        SkPaint paint;\n        paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),\n                SkShader::kClamp_TileMode));\n        paint.setBlendMode(mode);\n        canvas->translate(dx, dy);\n        canvas->drawRect({0, 0, 128, 128}, paint);\n        paint.setBlendMode(SkBlendMode::kXor);\n        canvas->drawString(label, 40, 100, paint);\n    };\n    drawSquare(0, 0, SkBlendMode::kSrc, \"destination\");\n    drawSquare(128, 0, SkBlendMode::kSrc, \"\");\n    drawSquare(0, 128, SkBlendMode::kSrc, \"\");\n    canvas->translate(-128, -128);\n    canvas->rotate(90, 0, 128);\n    drawSquare(0, 0, SkBlendMode::kSrc, \"source\");\n    drawSquare(0, -128, SkBlendMode::kModulate, \"modulate\");\n    drawSquare(-128, 0, SkBlendMode::kMultiply, \"multiply\");\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "3fdac2b2f48bd227d2e74234c260bc8e",
+    "file": "SkBlendMode_Reference",
+    "name": "Modulate"
+},
+    "Blend_Mode_Multiply": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawImage(image, 0, 0);\n    canvas->drawImage(image, 128, 0);\n    canvas->drawImage(image, 0, 128);\n    canvas->drawImage(image, 128, 128);\n    SkPaint paint;\n    paint.setBlendMode(SkBlendMode::kDstATop);\n    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };\n    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };\n    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    canvas->clipRect( { 30, 30, 226, 226 } );\n    canvas->drawColor(0x80bb9977, SkBlendMode::kMultiply);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "eb29c896f008dfbef09e16b85114fc3a",
+    "file": "SkBlendMode_Reference",
+    "name": "Multiply"
+},
+    "Blend_Mode_Overlay": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };\n    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    paint.setBlendMode(SkBlendMode::kDstATop);\n    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };\n    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };\n    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    canvas->clipRect( { 30, 30, 226, 226 } );\n    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kOverlay);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "03bf042201de02d6d131938ccd3172eb",
+    "file": "SkBlendMode_Reference",
+    "name": "Overlay"
+},
+    "Blend_Mode_Plus": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawColor(SK_ColorBLACK);\n    SkPaint paint;\n    paint.setBlendMode(SkBlendMode::kPlus);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {\n        SkColor colors[] = { color, SkColorSetA(color, 192), SkColorSetA(color, 128),\n                             SkColorSetA(color, 0) }; \n        paint.setShader(SkGradientShader::MakeRadial({ 64, 64}, 100,\n                colors, nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));\n        canvas->drawCircle(64, 64, 100, paint);\n        canvas->translate(64, 64);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "05383441e510d54008402e128fc8ad2b",
+    "file": "SkBlendMode_Reference",
+    "name": "Plus"
+},
+    "Blend_Mode_Saturation": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawImage(image, 0, 0);\n    canvas->drawColor(0xFF00FF00, SkBlendMode::kSaturation);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "a48698975d236573cef512f94a7e360b",
+    "file": "SkBlendMode_Reference",
+    "name": "Saturation"
+},
+    "Blend_Mode_Screen": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };\n    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    paint.setBlendMode(SkBlendMode::kDstATop);\n    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };\n    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };\n    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    canvas->clipRect( { 30, 30, 226, 226 } );\n    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kScreen);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "b7b42965927788d853f449f08ddf46de",
+    "file": "SkBlendMode_Reference",
+    "name": "Screen"
+},
+    "Blend_Mode_Soft_Light": {
+    "code": "void draw(SkCanvas* canvas) {\n    const SkColor colors[] = { 0xFFFFFFFF, 0x3FFFFFFF };\n    SkPaint paint;\n    paint.setBlendMode(SkBlendMode::kSoftLight);\n    paint.setShader(SkGradientShader::MakeRadial({ 128, 128}, 100, colors,\n         nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));\n    canvas->drawImage(image, 0, 0);\n    canvas->drawCircle(128, 128, 100, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "ac93f30dff13f8a8bb31398de370863b",
+    "file": "SkBlendMode_Reference",
+    "name": "Soft_Light"
+},
+    "Blend_Mode_Src": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawImage(image, 0, 0);\n    canvas->clipRect({50, 50, 200, 200});\n    SkPaint srcBlend;\n    srcBlend.setBlendMode(SkBlendMode::kSrc);\n    canvas->saveLayer(nullptr, &srcBlend);\n    canvas->drawColor(0);\n    SkPaint transRed;\n    transRed.setColor(SkColorSetA(SK_ColorRED, 127));\n    canvas->drawCircle(125, 125, 75, transRed);\n    canvas->restore();\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "0fc85dd916cc1a5896d36c80b9847391",
+    "file": "SkBlendMode_Reference",
+    "name": "Src"
+},
+    "Blend_Mode_Src_Atop": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };\n    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    paint.setBlendMode(SkBlendMode::kDstIn);\n    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };\n    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };\n    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    canvas->clipRect( { 30, 30, 226, 226 } );\n    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcATop);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "a13148977bfc985934a92752c83a2041",
+    "file": "SkBlendMode_Reference",
+    "name": "Src_Atop"
+},
+    "Blend_Mode_Src_In": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };\n    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    paint.setBlendMode(SkBlendMode::kDstIn);\n    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };\n    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };\n    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    canvas->clipRect( { 30, 30, 226, 226 } );\n    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcIn);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "b0833c18fe8b0eeaab9bd6d2160d272f",
+    "file": "SkBlendMode_Reference",
+    "name": "Src_In"
+},
+    "Blend_Mode_Src_Out": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };\n    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    paint.setBlendMode(SkBlendMode::kDstIn);\n    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };\n    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };\n    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    canvas->clipRect( { 30, 30, 226, 226 } );\n    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcOut);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "ccc1e74226e0c9eacbc21f1eed017b84",
+    "file": "SkBlendMode_Reference",
+    "name": "Src_Out"
+},
+    "Blend_Mode_Src_Over": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };\n    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    paint.setBlendMode(SkBlendMode::kDstIn);\n    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };\n    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };\n    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),\n            SkShader::kClamp_TileMode));\n    canvas->drawPaint(paint);\n    canvas->clipRect( { 30, 30, 226, 226 } );\n    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcOver);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "2ea9c149964a06cdb4929158cb4f15f8",
+    "file": "SkBlendMode_Reference",
+    "name": "Src_Over"
+},
+    "Blend_Mode_Xor": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setBlendMode(SkBlendMode::kXor);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {\n        SkColor colors[] = { color, SkColorSetA(color, 192), SkColorSetA(color, 128),\n                             SkColorSetA(color, 0) }; \n        paint.setShader(SkGradientShader::MakeRadial({ 64, 64}, 100,\n                colors, nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));\n        canvas->drawCircle(64, 64, 100, paint);\n        canvas->translate(64, 64);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "29db2c7493d9098b8a086ddbe30dd6d6",
+    "file": "SkBlendMode_Reference",
+    "name": "Xor"
+},
+    "Canvas_Clip": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint redPaint, scalePaint;\n    redPaint.setAntiAlias(true);\n    redPaint.setColor(SK_ColorRED);\n    canvas->save();\n    for (bool antialias : { false, true } ) {\n        canvas->save();\n        canvas->clipRect(SkRect::MakeWH(19.5f, 11.5f), antialias);\n        canvas->drawCircle(17, 11, 8, redPaint);\n        canvas->restore();\n        canvas->translate(16, 0);\n    }\n    canvas->restore();\n    SkMatrix matrix;\n    matrix.setScale(6, 6);\n    scalePaint.setImageFilter(\n            SkImageFilter::MakeMatrixFilter(matrix, kNone_SkFilterQuality, nullptr));\n    SkCanvas::SaveLayerRec saveLayerRec(\n            nullptr, &scalePaint, SkCanvas::kInitWithPrevious_SaveLayerFlag);\n    canvas->saveLayer(saveLayerRec);\n    canvas->restore();\n}",
+    "width": 256,
+    "height": 90,
+    "hash": "862cc026601a41a58df49c0b9f0d7777",
+    "file": "SkCanvas_Reference",
+    "name": "Clip"
+},
+    "Canvas_State_Stack": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    canvas->save();                             // records stack depth to restore\n    canvas->clipRect(SkRect::MakeWH(100, 100)); // constrains drawing to clip\n    canvas->clear(SK_ColorRED);                 // draws to limit of clip\n    canvas->save();                             // records stack depth to restore\n    canvas->clipRect(SkRect::MakeWH(50, 150));  // Rect below 100 is ignored\n    canvas->clear(SK_ColorBLUE);                // draws to smaller clip\n    canvas->restore();                          // enlarges clip\n    canvas->drawLine(20, 20, 150, 150, paint);  // line below 100 is not drawn\n    canvas->restore();                          // enlarges clip\n    canvas->drawLine(150, 20, 50, 120, paint);  // line below 100 is drawn\n}\n",
+    "width": 256,
+    "height": 160,
+    "hash": "bb1dbfdca3aedf716beb6f07e2aab065",
+    "file": "SkCanvas_Reference",
+    "name": "State_Stack"
+},
+    "Canvas_State_Stack_a": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->clipRect(SkRect::MakeWH(100, 100));\n    canvas->clear(SK_ColorRED);\n    canvas->scale(.5, .5);\n    canvas->clipRect(SkRect::MakeWH(100, 100));\n    canvas->clear(SK_ColorBLUE);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "9f563a2d60aa31d4b26742e5aa17aa4e",
+    "file": "SkCanvas_Reference",
+    "name": "State_Stack_2"
+},
+    "Color_Alpha_Constants": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<int32_t> srcPixels;\n    srcPixels.resize(source.height() * source.rowBytes());\n    SkPixmap pixmap(SkImageInfo::MakeN32Premul(source.width(), source.height()),\n                    &srcPixels.front(), source.rowBytes());\n    source.readPixels(pixmap, 0, 0);\n    for (int y = 0; y < 16; ++y) {\n        for (int x = 0; x < 16; ++x) {\n            int32_t* blockStart = &srcPixels.front() + y * source.width() * 16 + x * 16;\n            size_t transparentCount = 0;\n            for (int fillY = 0; fillY < source.height() / 16; ++fillY) {\n                for (int fillX = 0; fillX < source.width() / 16; ++fillX) {\n                    const SkColor color = SkUnPreMultiply::PMColorToColor(blockStart[fillX]);\n                    transparentCount += SkColorGetA(color) == SK_AlphaTRANSPARENT;\n                }\n                blockStart += source.width();\n            }\n            if (transparentCount > 200) {\n                blockStart = &srcPixels.front() + y * source.width() * 16 + x * 16;\n                for (int fillY = 0; fillY < source.height() / 16; ++fillY) {\n                    for (int fillX = 0; fillX < source.width() / 16; ++fillX) {\n                        blockStart[fillX] = SK_ColorRED;\n                    }\n                    blockStart += source.width();\n                }\n            }\n        }\n    }\n    SkBitmap bitmap;\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "bc9c7ea424d10bbcd1e5a88770d4794e",
+    "file": "SkColor_Reference",
+    "name": "Alpha_Constants"
+},
+    "Color_Alpha_Constants_a": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<int32_t> srcPixels;\n    srcPixels.resize(source.height() * source.rowBytes());\n    SkPixmap pixmap(SkImageInfo::MakeN32Premul(source.width(), source.height()),\n                    &srcPixels.front(), source.rowBytes());\n    source.readPixels(pixmap, 0, 0);\n    for (int y = 0; y < source.height(); ++y) {\n        for (int x = 0; x < source.width(); ++x) {\n            SkPMColor pixel = srcPixels[y * source.width() + x];\n            const SkColor color = SkUnPreMultiply::PMColorToColor(pixel);\n            if (SkColorGetA(color) == SK_AlphaOPAQUE) {\n                srcPixels[y * source.width() + x] = SK_ColorGREEN;\n            }\n        }\n    }\n    SkBitmap bitmap;\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "0424f67ebc2858e8fd04ae3367b115ff",
+    "file": "SkColor_Reference",
+    "name": "Alpha_Constants_2"
+},
+    "Color_Color_Constants": {
+    "code": "#define SKIA_COLOR_PAIR(name) \"SK_Color\" #name, SK_Color##name\n\nvoid draw(SkCanvas* canvas) {\n    struct ColorCompare {\n        const char* fSVGName;\n        SkColor fSVGColor;\n        const char* fSkiaName;\n        SkColor fSkiaColor;\n    } colorCompare[] = {  // see https://www.w3.org/TR/SVG/types.html#ColorKeywords\n        {\"black\",     SkColorSetRGB(  0,   0,   0),    SKIA_COLOR_PAIR(BLACK) },\n        {\"darkgray\",  SkColorSetRGB(169, 169, 169),    SKIA_COLOR_PAIR(DKGRAY) },\n        {\"gray\",      SkColorSetRGB(128, 128, 128),    SKIA_COLOR_PAIR(GRAY) },\n        {\"lightgray\", SkColorSetRGB(211, 211, 211),    SKIA_COLOR_PAIR(LTGRAY) },\n        {\"white\",     SkColorSetRGB(255, 255, 255),    SKIA_COLOR_PAIR(WHITE) },\n        {\"red\",       SkColorSetRGB(255,   0,   0),    SKIA_COLOR_PAIR(RED) },\n        {\"green\",     SkColorSetRGB(  0, 128,   0),    SKIA_COLOR_PAIR(GREEN) },\n        {\"blue\",      SkColorSetRGB(  0,   0, 255),    SKIA_COLOR_PAIR(BLUE) },\n        {\"yellow\",    SkColorSetRGB(255, 255,   0),    SKIA_COLOR_PAIR(YELLOW) },\n        {\"aqua\",      SkColorSetRGB(  0, 255, 255),    SKIA_COLOR_PAIR(CYAN) },\n        {\"fuchsia\",   SkColorSetRGB(255,   0, 255),    SKIA_COLOR_PAIR(MAGENTA) },\n    };\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(14);\n    for (auto compare : colorCompare) {\n        paint.setStyle(SkPaint::kFill_Style);\n        paint.setColor(compare.fSVGColor);\n        canvas->drawRect({5, 5, 15, 15}, paint);\n        paint.setColor(SK_ColorBLACK);\n        canvas->drawString(compare.fSVGName, 20, 16, paint);\n        paint.setColor(compare.fSkiaColor);\n        canvas->drawRect({105, 5, 115, 15}, paint);\n        paint.setColor(SK_ColorBLACK);\n        canvas->drawString(compare.fSkiaName, 120, 16, paint);\n        paint.setStyle(SkPaint::kStroke_Style);\n        canvas->drawRect({5, 5, 15, 15}, paint);\n        canvas->drawRect({105, 5, 115, 15}, paint);\n        canvas->translate(0, 20);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "1c2e38321464818847f953ddd45cb5a1",
+    "file": "SkColor_Reference",
+    "name": "Color_Constants"
+},
+    "Color_Color_Constants_a": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<uint32_t> srcPixels;\n    constexpr int width = 256;\n    constexpr int height = 256;\n    srcPixels.resize(width * height);\n    SkImageInfo imageInfo = SkImageInfo::MakeN32Premul(width, height);\n    SkPixmap pixmap(imageInfo, &srcPixels.front(), imageInfo.minRowBytes());\n    pixmap.erase(SK_ColorTRANSPARENT);\n    pixmap.erase(SK_ColorRED, { 24, 24, 192, 192 } );\n    pixmap.erase(SK_ColorTRANSPARENT, { 48, 48, 168, 168 } );\n    SkBitmap bitmap;\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 0, 0);\n    canvas->drawBitmap(bitmap, 48, 48);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "9ca1e2a5b9b4c92ecf4409d0813867d6",
+    "file": "SkColor_Reference",
+    "name": "Color_Constants_2"
+},
+    "Color_Color_Constants_b": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<uint32_t> srcPixels;\n    constexpr int width = 256;\n    constexpr int height = 256;\n    srcPixels.resize(width * height);\n    SkImageInfo imageInfo = SkImageInfo::MakeN32Premul(width, height);\n    SkPixmap pixmap(imageInfo, &srcPixels.front(), imageInfo.minRowBytes());\n    pixmap.erase(SK_ColorTRANSPARENT);\n    pixmap.erase(SK_ColorRED, { 24, 24, 192, 192 } );\n    pixmap.erase(SK_ColorBLACK, { 48, 48, 168, 168 } );\n    SkBitmap bitmap;\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 0, 0);\n    canvas->drawBitmap(bitmap, 48, 48);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "6971489f28291f08e429cc6ccc73b09b",
+    "file": "SkColor_Reference",
+    "name": "Color_Constants_3"
+},
+    "Color_Color_Constants_c": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<uint32_t> srcPixels;\n    constexpr int width = 256;\n    constexpr int height = 256;\n    srcPixels.resize(width * height);\n    SkImageInfo imageInfo = SkImageInfo::MakeN32Premul(width, height);\n    SkPixmap pixmap(imageInfo, &srcPixels.front(), imageInfo.minRowBytes());\n    pixmap.erase(SK_ColorTRANSPARENT);\n    pixmap.erase(SK_ColorRED, { 24, 24, 192, 192 } );\n    pixmap.erase(SK_ColorWHITE, { 48, 48, 168, 168 } );\n    SkBitmap bitmap;\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 0, 0);\n    canvas->drawBitmap(bitmap, 48, 48);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "fce650f997e802d4e55edf62b8437a2d",
+    "file": "SkColor_Reference",
+    "name": "Color_Constants_4"
+},
+    "Illustrations_Blend_Mode_Overview_Color_Blends": {
+    "code": "#include \"SkTextUtils.h\"\n\nvoid draw(SkCanvas* canvas) {\n    SkPaint srcPaint;\n    srcPaint.setAntiAlias(true);\n    SkPaint labelPaint = srcPaint;\n    labelPaint.setTextSize(16);\n    SkPaint dstPaint = labelPaint;\n    dstPaint.setTextSize(80);\n    dstPaint.setColor(0xFF606080);\n    dstPaint.setTypeface(SkTypeface::MakeFromName(\"Roboto\", SkFontStyle::Bold()));\n    srcPaint.setColor(0xFFcc6633);\n    SkPath srcPath;\n    const SkPoint points[] = {{20, 20}, {80, 45}, {45, 80}};\n    srcPath.addPoly(points, SK_ARRAY_COUNT(points), true);\n    canvas->drawColor(0, SkBlendMode::kClear);\n    for (auto blend : { SkBlendMode::kHue, SkBlendMode::kSaturation, SkBlendMode::kColor,\n                        SkBlendMode::kLuminosity } ) {\n        SkTextUtils::DrawString(canvas, \"&\", 50, 80, dstPaint, SkTextUtils::kCenter_Align);\n        srcPaint.setBlendMode(blend);\n        canvas->drawPath(srcPath, srcPaint);\n        SkTextUtils::DrawString(canvas, SkBlendMode_Name(blend), 50, 100, labelPaint,\n                SkTextUtils::kCenter_Align);\n        canvas->translate(90, 0);\n    }\n}\n",
+    "width": 480,
+    "height": 110,
+    "hash": "630fe21aea8369b307231f5bcf8b2d50",
+    "file": "illustrations",
+    "name": "Blend_Mode_Overview_Color_Blends"
+},
+    "Illustrations_Blend_Mode_Overview_Lighten_Darken": {
+    "code": "#include \"SkTextUtils.h\"\n\nvoid draw(SkCanvas* canvas) {\n    SkPaint srcPaint;\n    srcPaint.setAntiAlias(true);\n    SkPaint labelPaint = srcPaint;\n    labelPaint.setTextSize(16);\n    SkPaint dstPaint = labelPaint;\n    dstPaint.setTextSize(80);\n    dstPaint.setColor(0xFF606080);\n    dstPaint.setTypeface(SkTypeface::MakeFromName(\"Roboto\", SkFontStyle::Bold()));\n    srcPaint.setColor(0xFFcc6633);\n    SkPath srcPath;\n    const SkPoint points[] = {{20, 20}, {80, 45}, {45, 80}};\n    srcPath.addPoly(points, SK_ARRAY_COUNT(points), true);\n    canvas->drawColor(0, SkBlendMode::kClear);\n    for (auto blend : { SkBlendMode::kPlus, SkBlendMode::kScreen, SkBlendMode::kOverlay,\n            SkBlendMode::kDarken, SkBlendMode::kLighten, SkBlendMode::kColorDodge,\n            SkBlendMode::kColorBurn, SkBlendMode::kHardLight, SkBlendMode::kSoftLight,\n            SkBlendMode::kDifference, SkBlendMode::kExclusion, SkBlendMode::kMultiply } ) {\n        SkTextUtils::DrawString(canvas, \"&\", 50, 80, dstPaint, SkTextUtils::kCenter_Align);\n        srcPaint.setBlendMode(blend);\n        canvas->drawPath(srcPath, srcPaint);\n        SkTextUtils::DrawString(canvas, SkBlendMode_Name(blend), 50, 100, labelPaint, SkTextUtils::kCenter_Align);\n        canvas->translate(90, 0);\n        if (SkBlendMode::kLighten == blend || SkBlendMode::kDifference == blend) {\n            canvas->translate(-90 * 5, 100);\n        }\n    }\n}\n",
+    "width": 480,
+    "height": 330,
+    "hash": "23a33fa04cdd0204b2490d05e340f87c",
+    "file": "illustrations",
+    "name": "Blend_Mode_Overview_Lighten_Darken"
+},
+    "Illustrations_Blend_Mode_Overview_Modulate_Blend": {
+    "code": "#include \"SkTextUtils.h\"\n\nvoid draw(SkCanvas* canvas) {\n    SkPaint srcPaint;\n    srcPaint.setAntiAlias(true);\n    SkPaint labelPaint = srcPaint;\n    labelPaint.setTextSize(16);\n    SkPaint dstPaint = labelPaint;\n    dstPaint.setTextSize(80);\n    dstPaint.setColor(0xFF606080);\n    dstPaint.setTypeface(SkTypeface::MakeFromName(\"Roboto\", SkFontStyle::Bold()));\n    SkBitmap srcBits;\n    srcBits.allocN32Pixels(80, 84);\n    SkCanvas srcCanvas(srcBits);\n    srcPaint.setColor(0xFFcc6633);\n    SkPath srcPath;\n    const SkPoint points[] = {{20, 20}, {80, 45}, {45, 80}};\n    srcPath.addPoly(points, SK_ARRAY_COUNT(points), true);\n    srcBits.eraseColor(0);\n    srcCanvas.drawPath(srcPath, srcPaint);\n    canvas->drawColor(0, SkBlendMode::kClear);\n    srcPaint.setBlendMode(SkBlendMode::kModulate);\n    for (auto step: { 1, 2 } ) {\n        SkTextUtils::DrawString(canvas, \"&\", 50, 80, dstPaint, SkTextUtils::kCenter_Align);\n        if (1 == step) {\n            canvas->drawBitmap(srcBits, 0, 0, &srcPaint);\n            SkTextUtils::DrawString(canvas, \"Bitmap\", 50, 18, labelPaint, SkTextUtils::kCenter_Align);\n        } else {\n            canvas->drawPath(srcPath, srcPaint);\n            SkTextUtils::DrawString(canvas, \"Geometry\", 50, 18, labelPaint, SkTextUtils::kCenter_Align);\n        }\n        SkTextUtils::DrawString(canvas, SkBlendMode_Name(SkBlendMode::kModulate), 50, 100, labelPaint,\n                SkTextUtils::kCenter_Align);\n        canvas->translate(120, 0);\n    }\n}\n",
+    "width": 480,
+    "height": 110,
+    "hash": "877f96610ab7638a310432674b04f837",
+    "file": "illustrations",
+    "name": "Blend_Mode_Overview_Modulate_Blend"
+},
+    "Illustrations_Blend_Mode_Overview_Porter_Duff": {
+    "code": "#include \"SkTextUtils.h\"\n\nvoid draw(SkCanvas* canvas) {\n    SkPaint srcPaint;\n    srcPaint.setAntiAlias(true);\n    SkPaint labelPaint = srcPaint;\n    labelPaint.setTextSize(16);\n    SkPaint dstPaint = labelPaint;\n    dstPaint.setTextSize(80);\n    dstPaint.setColor(0xFF606080);\n    dstPaint.setTypeface(SkTypeface::MakeFromName(\"Roboto\", SkFontStyle::Bold()));\n    SkBitmap srcBits;\n    srcBits.allocN32Pixels(80, 84);\n    SkCanvas srcCanvas(srcBits);\n    srcPaint.setColor(0xFFcc6633);\n    SkPath srcPath;\n    const SkPoint points[] = {{20, 20}, {80, 45}, {45, 80}};\n    srcPath.addPoly(points, SK_ARRAY_COUNT(points), true);\n    srcBits.eraseColor(0);\n    srcCanvas.drawPath(srcPath, srcPaint);\n    canvas->drawColor(0, SkBlendMode::kClear);\n    for (auto blend : { SkBlendMode::kSrc, SkBlendMode::kSrcATop, SkBlendMode::kSrcOver,\n                        SkBlendMode::kSrcIn, SkBlendMode::kSrcOut,\n                        SkBlendMode::kDst, SkBlendMode::kDstATop, SkBlendMode::kDstOver,\n                        SkBlendMode::kDstIn, SkBlendMode::kDstOut,\n                        SkBlendMode::kClear, SkBlendMode::kXor } ) {\n        SkTextUtils::DrawString(canvas, \"&\", 50, 80, dstPaint, SkTextUtils::kCenter_Align);\n        srcPaint.setBlendMode(blend);\n        canvas->drawBitmap(srcBits, 0, 0, &srcPaint);\n        SkTextUtils::DrawString(canvas, SkBlendMode_Name(blend), 50, 100, labelPaint, SkTextUtils::kCenter_Align);\n        canvas->translate(80, 0);\n        if (SkBlendMode::kSrcOut == blend || SkBlendMode::kDstOut == blend) {\n            canvas->translate(-80 * 5, 100);\n        }\n    }\n}\n",
+    "width": 480,
+    "height": 330,
+    "hash": "819903e0bb125385269948474b6c8a84",
+    "file": "illustrations",
+    "name": "Blend_Mode_Overview_Porter_Duff"
+},
+    "Illustrations_Blend_Mode_Overview_Porter_Duff_2": {
+    "code": "#include \"SkTextUtils.h\"\n\nvoid draw(SkCanvas* canvas) {\n    SkPaint srcPaint;\n    srcPaint.setAntiAlias(true);\n    SkPaint labelPaint = srcPaint;\n    labelPaint.setTextSize(16);\n    SkPaint dstPaint = labelPaint;\n    dstPaint.setTextSize(80);\n    dstPaint.setColor(0xFF606080);\n    dstPaint.setTypeface(SkTypeface::MakeFromName(\"Roboto\", SkFontStyle::Bold()));\n    srcPaint.setColor(0xFFcc6633);\n    SkPath srcPath;\n    const SkPoint points[] = {{20, 20}, {80, 45}, {45, 80}};\n    srcPath.addPoly(points, SK_ARRAY_COUNT(points), true);\n    canvas->drawColor(0, SkBlendMode::kClear);\n    SkBitmap dstBits;\n    dstBits.allocN32Pixels(80, 80);\n    SkCanvas dstCanvas(dstBits);\n    for (auto blend : { SkBlendMode::kSrc, SkBlendMode::kSrcATop, SkBlendMode::kSrcOver,\n                        SkBlendMode::kSrcIn, SkBlendMode::kSrcOut,\n                        SkBlendMode::kDst, SkBlendMode::kDstATop, SkBlendMode::kDstOver,\n                        SkBlendMode::kDstIn, SkBlendMode::kDstOut,\n                        SkBlendMode::kClear, SkBlendMode::kXor } ) {\n        SkTextUtils::DrawString(canvas, \"&\", 50, 80, dstPaint, SkTextUtils::kCenter_Align);\n        srcPaint.setBlendMode(blend);\n        canvas->drawPath(srcPath, srcPaint);\n        SkTextUtils::DrawString(canvas, SkBlendMode_Name(blend), 50, 100, labelPaint, SkTextUtils::kCenter_Align);\n        canvas->translate(80, 0);\n        if (SkBlendMode::kSrcOut == blend || SkBlendMode::kDstOut == blend) {\n            canvas->translate(-80 * 5, 100);\n        }\n    }\n}\n",
+    "width": 480,
+    "height": 330,
+    "hash": "8f320c1e94e77046e00f7e9e843caa27",
+    "file": "illustrations",
+    "name": "Blend_Mode_Overview_Porter_Duff_2"
+},
+    "Illustrations_Image_Info_Color_Type_ARGB_4444": {
+    "code": "#include \"SkTextUtils.h\"\n\nvoid draw(SkCanvas* canvas) {\n    canvas->scale(1.25f, 1.25f);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(10);\n    SkTextUtils::DrawString(canvas, \"16-bit word\", 5 + 20 * 8, 20, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"little endian byte order\", 5 + 20 * 4, 85, paint, SkTextUtils::kCenter_Align);\n    auto drawBoxText = [=](SkScalar e[], const char* s[], int count, int n, SkScalar yPos) -> void {\n        SkPaint p(paint);\n        p.setColor(SK_ColorRED);\n        SkScalar xPos = 15;\n        int width = n % 32 + 1;\n        int lastN = n > 32 ? 32 : 0;\n        for (; n >= lastN; --n) {\n            for (int i = 0; i <= count; ++i) {\n                int a = width - e[i];\n                if (a == n || a == n + 1 || a == n - 32 || a == n - 31) {\n                    char num[3] = {(char) ('0' + n / 10), (char) ('0' + n % 10), '\\0'};\n                    SkTextUtils::DrawString(canvas, n >= 10 ? num : &num[1], xPos, yPos - 5, p, SkTextUtils::kCenter_Align);\n                    break;\n                }\n            }\n            xPos += 20;\n        }\n        p.setColor(SK_ColorBLACK);\n        for (int i = 0; i < count; ++i) {\n            SkTextUtils::DrawString(canvas, s[i], 5 + (e[i] + e[i + 1]) * 10, yPos + 10, p, SkTextUtils::kCenter_Align);\n        }\n        p.setStyle(SkPaint::kStroke_Style);\n        for (int i = 0; i <= count; ++i) {\n            canvas->drawLine(5 + e[i] * 20, yPos, 5 + e[i] * 20, yPos + 15, p);\n        }\n        for (int i = 0; i < 2; ++i) {\n            canvas->drawLine(5 + e[0] * 20, yPos + i * 15, 5 + e[count] * 20, yPos + i * 15, p);\n        }\n    };\n    SkScalar edges[] = { 0, 4, 8, 12, 16 };\n    const char* labels[] = { \"red\", \"green\", \"blue\", \"alpha\" };\n    drawBoxText(&edges[0], &labels[0], 4, 15, 45);\n    drawBoxText(&edges[0], &labels[2], 2, 7, 110);\n    drawBoxText(&edges[0], &labels[0], 2, 7, 160);\n}\n",
+    "width": 415,
+    "height": 250,
+    "hash": "e8008512f0d197051e3f26faa67bafc2",
+    "file": "illustrations",
+    "name": "Image_Info_Color_Type_ARGB_4444"
+},
+    "Illustrations_Image_Info_Color_Type_BGRA_8888": {
+    "code": "#include \"SkTextUtils.h\"\n\nvoid draw(SkCanvas* canvas) {\n    canvas->scale(1.25f, 1.25f);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(10);\n    SkTextUtils::DrawString(canvas, \"32-bit word\", 5 + 20 * 16, 20, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"little endian byte order\", 5 + 20 * 4, 85, paint, SkTextUtils::kCenter_Align);\n    auto drawBoxText = [=](SkScalar e[], const char* s[], int count, int n, SkScalar yPos) -> void {\n        SkPaint p(paint);\n        p.setColor(SK_ColorRED);\n        SkScalar xPos = 15;\n        int width = n % 32 + 1;\n        int lastN = n > 32 ? 32 : 0;\n        for (; n >= lastN; --n) {\n            for (int i = 0; i <= count; ++i) {\n                int a = width - e[i];\n                if (a == n || a == n + 1 || a == n - 32 || a == n - 31) {\n                    char num[3] = {(char) ('0' + n / 10), (char) ('0' + n % 10), '\\0'};\n                    SkTextUtils::DrawString(canvas, n >= 10 ? num : &num[1], xPos, yPos - 5, p, SkTextUtils::kCenter_Align);\n                    break;\n                }\n            }\n            xPos += 20;\n        }\n        p.setColor(SK_ColorBLACK);\n        for (int i = 0; i < count; ++i) {\n            SkTextUtils::DrawString(canvas, s[i], 5 + (e[i] + e[i + 1]) * 10, yPos + 10, p, SkTextUtils::kCenter_Align);\n        }\n        p.setStyle(SkPaint::kStroke_Style);\n        for (int i = 0; i <= count; ++i) {\n            canvas->drawLine(5 + e[i] * 20, yPos, 5 + e[i] * 20, yPos + 15, p);\n        }\n        for (int i = 0; i < 2; ++i) {\n            canvas->drawLine(5 + e[0] * 20, yPos + i * 15, 5 + e[count] * 20, yPos + i * 15, p);\n        }\n    };\n    SkScalar edges[] = { 0, 8, 16, 24, 32 };\n    const char* labels[] = { \"alpha\", \"red\", \"green\", \"blue\" };\n    drawBoxText(edges, &labels[0], 4, 31, 45);\n    drawBoxText(edges, &labels[3], 1, 7, 110);\n    drawBoxText(edges, &labels[2], 1, 7, 160);\n    drawBoxText(edges, &labels[1], 1, 7, 210);\n    drawBoxText(edges, &labels[0], 1, 7, 260);\n}\n",
+    "width": 812,
+    "height": 365,
+    "hash": "6c35ca14d88b0de200ba7f897f889ad7",
+    "file": "illustrations",
+    "name": "Image_Info_Color_Type_BGRA_8888"
+},
+    "Illustrations_Image_Info_Color_Type_RGBA_1010102": {
+    "code": "#include \"SkTextUtils.h\"\n\nvoid draw(SkCanvas* canvas) {\n    canvas->scale(1.25f, 1.25f);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(10);\n    SkTextUtils::DrawString(canvas, \"32-bit word\", 5 + 20 * 16, 20, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"little endian byte order\", 5 + 20 * 4, 85, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"(low bits)\", 5 + 20 * 4, 137, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"(low bits)\", 5 + 20 * 3, 187, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"(high bits)\", 5 + 20 * 7, 187, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"(low bits)\", 5 + 20 * 2, 237, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"(high bits)\", 5 + 20 * 6, 237, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"(high bits)\", 5 + 20 * 5, 287, paint, SkTextUtils::kCenter_Align);\n    auto drawBoxText = [=](SkScalar e[], const char* s[], int count, int n, SkScalar yPos) -> void {\n        SkPaint p(paint);\n        p.setColor(SK_ColorRED);\n        SkScalar xPos = 15;\n        int width = n % 32 + 1;\n        int lastN = n > 32 ? 32 : 0;\n        for (; n >= lastN; --n) {\n            for (int i = 0; i <= count; ++i) {\n                int a = width - e[i];\n                if (a == n || a == n + 1 || a == n - 32 || a == n - 31) {\n                    char num[3] = {(char) ('0' + n / 10), (char) ('0' + n % 10), '\\0'};\n                    SkTextUtils::DrawString(canvas, n >= 10 ? num : &num[1], xPos, yPos - 5, p, SkTextUtils::kCenter_Align);\n                    break;\n                }\n            }\n            xPos += 20;\n        }\n        p.setColor(SK_ColorBLACK);\n        for (int i = 0; i < count; ++i) {\n            SkTextUtils::DrawString(canvas, s[i], 5 + (e[i] + e[i + 1]) * 10, yPos + 10, p, SkTextUtils::kCenter_Align);\n        }\n        p.setStyle(SkPaint::kStroke_Style);\n        for (int i = 0; i <= count; ++i) {\n            canvas->drawLine(5 + e[i] * 20, yPos, 5 + e[i] * 20, yPos + 15, p);\n        }\n        for (int i = 0; i < 2; ++i) {\n            canvas->drawLine(5 + e[0] * 20, yPos + i * 15, 5 + e[count] * 20, yPos + i * 15, p);\n        }\n    };\n    SkScalar edges[] = { 0, 2, 12, 22, 32,\n                         0, 8,\n                         0, 6, 8,\n                         0, 4, 8,\n                         0, 2, 8\n                        };\n    const char* labels[] = { \"alpha\", \"blue\", \"green\", \"red\" };\n    drawBoxText(&edges[0], &labels[0], 4, 31, 45);\n    drawBoxText(&edges[5], &labels[3], 1, 7, 110);\n    drawBoxText(&edges[7], &labels[2], 2, 7, 160);\n    drawBoxText(&edges[10], &labels[1], 2, 7, 210);\n    drawBoxText(&edges[13], &labels[0], 2, 7, 260);\n}\n",
+    "width": 812,
+    "height": 380,
+    "hash": "8d78daf69145f611054f289a7443a670",
+    "file": "illustrations",
+    "name": "Image_Info_Color_Type_RGBA_1010102"
+},
+    "Illustrations_Image_Info_Color_Type_RGBA_8888": {
+    "code": "#include \"SkTextUtils.h\"\n\nvoid draw(SkCanvas* canvas) {\n    canvas->scale(1.25f, 1.25f);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(10);\n    SkTextUtils::DrawString(canvas, \"32-bit word\", 5 + 20 * 16, 20, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"little endian byte order\", 5 + 20 * 4, 85, paint, SkTextUtils::kCenter_Align);\n    auto drawBoxText = [=](SkScalar e[], const char* s[], int count, int n, SkScalar yPos) -> void {\n        SkPaint p(paint);\n        p.setColor(SK_ColorRED);\n        SkScalar xPos = 15;\n        int width = n % 32 + 1;\n        int lastN = n > 32 ? 32 : 0;\n        for (; n >= lastN; --n) {\n            for (int i = 0; i <= count; ++i) {\n                int a = width - e[i];\n                if (a == n || a == n + 1 || a == n - 32 || a == n - 31) {\n                    char num[3] = {(char) ('0' + n / 10), (char) ('0' + n % 10), '\\0'};\n                    SkTextUtils::DrawString(canvas, n >= 10 ? num : &num[1], xPos, yPos - 5, p, SkTextUtils::kCenter_Align);\n                    break;\n                }\n            }\n            xPos += 20;\n        }\n        p.setColor(SK_ColorBLACK);\n        for (int i = 0; i < count; ++i) {\n            SkTextUtils::DrawString(canvas, s[i], 5 + (e[i] + e[i + 1]) * 10, yPos + 10, p, SkTextUtils::kCenter_Align);\n        }\n        p.setStyle(SkPaint::kStroke_Style);\n        for (int i = 0; i <= count; ++i) {\n            canvas->drawLine(5 + e[i] * 20, yPos, 5 + e[i] * 20, yPos + 15, p);\n        }\n        for (int i = 0; i < 2; ++i) {\n            canvas->drawLine(5 + e[0] * 20, yPos + i * 15, 5 + e[count] * 20, yPos + i * 15, p);\n        }\n    };\n    SkScalar edges[] = { 0, 8, 16, 24, 32 };\n    const char* labels[] = { \"alpha\", \"blue\", \"green\", \"red\" };\n    drawBoxText(edges, &labels[0], 4, 31, 45);\n    drawBoxText(edges, &labels[3], 1, 7, 110);\n    drawBoxText(edges, &labels[2], 1, 7, 160);\n    drawBoxText(edges, &labels[1], 1, 7, 210);\n    drawBoxText(edges, &labels[0], 1, 7, 260);\n}\n",
+    "width": 812,
+    "height": 365,
+    "hash": "9abc324f670e6468f09385551aae5a1c",
+    "file": "illustrations",
+    "name": "Image_Info_Color_Type_RGBA_8888"
+},
+    "Illustrations_Image_Info_Color_Type_RGBA_F16": {
+    "code": "#include \"SkTextUtils.h\"\n\nvoid draw(SkCanvas* canvas) {\n    canvas->scale(1.25f, 1.25f);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(10);\n    SkTextUtils::DrawString(canvas, \"64-bit word\", 5 + 20 * 16, 20, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"little endian byte order\", 5 + 20 * 4, 135, paint, SkTextUtils::kCenter_Align);\n    for (int i = 0; i < 4; ++i) {\n        SkTextUtils::DrawString(canvas, \"(low bits)\", 5 + 20 * 4, 187 + i * 100, paint, SkTextUtils::kCenter_Align);\n        SkTextUtils::DrawString(canvas, \"(high bits)\", 5 + 20 * 4, 237 + i * 100, paint, SkTextUtils::kCenter_Align);\n    }\n    auto drawBoxText = [=](SkScalar e[], const char* s[], int count, int n, SkScalar yPos) -> void {\n        SkPaint p(paint);\n        p.setColor(SK_ColorRED);\n        SkScalar xPos = 15;\n        int width = n % 32 + 1;\n        int lastN = n > 32 ? 32 : 0;\n        for (; n >= lastN; --n) {\n            for (int i = 0; i <= count; ++i) {\n                int a = width - e[i];\n                if (a == n || a == n + 1 || a == n - 32 || a == n - 31) {\n                    char num[3] = {(char) ('0' + n / 10), (char) ('0' + n % 10), '\\0'};\n                    SkTextUtils::DrawString(canvas, n >= 10 ? num : &num[1], xPos, yPos - 5, p, SkTextUtils::kCenter_Align);\n                    break;\n                }\n            }\n            xPos += 20;\n        }\n        p.setColor(SK_ColorBLACK);\n        for (int i = 0; i < count; ++i) {\n            SkTextUtils::DrawString(canvas, s[i], 5 + (e[i] + e[i + 1]) * 10, yPos + 10, p, SkTextUtils::kCenter_Align);\n        }\n        p.setStyle(SkPaint::kStroke_Style);\n        for (int i = 0; i <= count; ++i) {\n            canvas->drawLine(5 + e[i] * 20, yPos, 5 + e[i] * 20, yPos + 15, p);\n        }\n        for (int i = 0; i < 2; ++i) {\n            canvas->drawLine(5 + e[0] * 20, yPos + i * 15, 5 + e[count] * 20, yPos + i * 15, p);\n        }\n    };\n    SkScalar edges[] = { 0, 16, 32,\n                         0, 8\n                       };\n    const char* labels[] = { \"alpha\", \"blue\", \"green\", \"red\" };\n    drawBoxText(&edges[0], &labels[0], 2, 63, 45);\n    drawBoxText(&edges[0], &labels[2], 2, 31, 95);\n    drawBoxText(&edges[3], &labels[3], 1, 7, 160);\n    drawBoxText(&edges[3], &labels[3], 1, 7, 210);\n    drawBoxText(&edges[3], &labels[2], 1, 7, 260);\n    drawBoxText(&edges[3], &labels[2], 1, 7, 310);\n    drawBoxText(&edges[3], &labels[1], 1, 7, 360);\n    drawBoxText(&edges[3], &labels[1], 1, 7, 410);\n    drawBoxText(&edges[3], &labels[0], 1, 7, 460);\n    drawBoxText(&edges[3], &labels[0], 1, 7, 510);\n}\n",
+    "width": 812,
+    "height": 685,
+    "hash": "1bb35ae52173e0fef874022ca8138adc",
+    "file": "illustrations",
+    "name": "Image_Info_Color_Type_RGBA_F16"
+},
+    "Illustrations_Image_Info_Color_Type_RGBA_F32": {
+    "code": "#include \"SkTextUtils.h\"\n\nvoid draw(SkCanvas* canvas) {\n    canvas->scale(1.25f, 1.25f);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(10);\n    SkTextUtils::DrawString(canvas, \"128-bit word\", 5 + 20 * 16, 20, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"little endian byte order\", 5 + 20 * 4, 135, paint, SkTextUtils::kCenter_Align);\n    for (int i = 0; i < 4; ++i) {\n        SkTextUtils::DrawString(canvas, \"(low bits)\", 5 + 10 * 4, 187 + i * 100, paint, SkTextUtils::kCenter_Align);\n        SkTextUtils::DrawString(canvas, \"(high bits)\", 105 + 10 * 4, 237 + i * 100, paint, SkTextUtils::kCenter_Align);\n    }\n    auto drawBoxText = [=](SkScalar e[], const char* s[], const char* nums[] , \n             int count, int n, SkScalar yPos) -> void {\n        SkPaint p(paint);\n        p.setColor(SK_ColorRED);\n        SkScalar xPos = 15;\n        int stringIndex = 0;\n        for (int i = n; i >= 0; --i) {\n            if (0 == i || n == i || 32 == i || 31 == i) {\n                int x = xPos;\n                if (2 == count) {\n                    x += stringIndex * 12 + (stringIndex ? 8 : 0);\n                }\n                SkTextUtils::DrawString(canvas, nums[stringIndex], x, yPos - 5, p, SkTextUtils::kCenter_Align);\n                if (1 == count) {\n                    SkTextUtils::DrawString(canvas, nums[stringIndex], xPos + 100, yPos - 5, p, SkTextUtils::kCenter_Align);\n                }\n                ++stringIndex;\n            }\n            xPos += 9;\n        }\n        p.setColor(SK_ColorBLACK);\n        for (int i = 0; i < count; ++i) {\n            SkTextUtils::DrawString(canvas, s[i], 5 + (e[i] + e[i + 1]) * 5, yPos + 10, p, SkTextUtils::kCenter_Align);\n            if (1 == count) {\n                SkTextUtils::DrawString(canvas, s[i], 105 + (e[i] + e[i + 1]) * 5, yPos + 10, p, SkTextUtils::kCenter_Align);\n            }\n        }\n        p.setStyle(SkPaint::kStroke_Style);\n        for (int i = 0; i <= count; ++i) {\n            canvas->drawLine(5 + e[i] * 10, yPos, 5 + e[i] * 10, yPos + 15, p);\n            if (1 == count) {\n                canvas->drawLine(105 + e[i] * 10, yPos, 105 + e[i] * 10, yPos + 15, p);\n            }\n        }\n        for (int i = 0; i < 2; ++i) {\n            canvas->drawLine(5 + e[0] * 10, yPos + i * 15,\n                             5 + e[count] * 10, yPos + i * 15, p);\n            if (1 == count) {\n                canvas->drawLine(105 + e[0] * 10, yPos + i * 15,\n                                 105 + e[count] * 10, yPos + i * 15, p);\n            }\n        }\n    };\n    SkScalar edges[] = { 0, 32, 64,\n                         0, 8\n                       };\n    const char* labels[] = { \"alpha\", \"blue\", \"green\", \"red\" };\n    const char* nums128[] = { \"127\", \"96\", \"95\", \"64\"};\n    const char* nums64[] = { \"63\", \"32\", \"31\", \"0\"};\n    const char* nums8[] = { \"7\", \"0\"};\n    drawBoxText(&edges[0], &labels[0], nums128, 2, 63, 45);\n    drawBoxText(&edges[0], &labels[2], nums64, 2, 63, 95);\n    drawBoxText(&edges[3], &labels[3], nums8, 1, 7, 160);\n    drawBoxText(&edges[3], &labels[3], nums8, 1, 7, 210);\n    drawBoxText(&edges[3], &labels[2], nums8, 1, 7, 260);\n    drawBoxText(&edges[3], &labels[2], nums8, 1, 7, 310);\n    drawBoxText(&edges[3], &labels[1], nums8, 1, 7, 360);\n    drawBoxText(&edges[3], &labels[1], nums8, 1, 7, 410);\n    drawBoxText(&edges[3], &labels[0], nums8, 1, 7, 460);\n    drawBoxText(&edges[3], &labels[0], nums8, 1, 7, 510);\n}\n",
+    "width": 812,
+    "height": 685,
+    "hash": "4ba31a8f9bc94a996f34da81ef541a9c",
+    "file": "illustrations",
+    "name": "Image_Info_Color_Type_RGBA_F32"
+},
+    "Illustrations_Image_Info_Color_Type_RGB_101010": {
+    "code": "#include \"SkTextUtils.h\"\n\nvoid draw(SkCanvas* canvas) {\n    canvas->scale(1.25f, 1.25f);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(10);\n    SkTextUtils::DrawString(canvas, \"32-bit word\", 5 + 20 * 16, 20, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"little endian byte order\", 5 + 20 * 4, 85, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"(low bits)\", 5 + 20 * 4, 137, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"(low bits)\", 5 + 20 * 3, 187, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"(high bits)\", 5 + 20 * 7, 187, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"(low bits)\", 5 + 20 * 2, 237, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"(high bits)\", 5 + 20 * 6, 237, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"(high bits)\", 5 + 20 * 5, 287, paint, SkTextUtils::kCenter_Align);\n    auto drawBoxText = [=](SkScalar e[], const char* s[], int count, int n, SkScalar yPos) -> void {\n        SkPaint p(paint);\n        p.setColor(SK_ColorRED);\n        SkScalar xPos = 15;\n        int width = n % 32 + 1;\n        int lastN = n > 32 ? 32 : 0;\n        for (; n >= lastN; --n) {\n            for (int i = 0; i <= count; ++i) {\n                int a = width - e[i];\n                if (a == n || a == n + 1 || a == n - 32 || a == n - 31) {\n                    char num[3] = {(char) ('0' + n / 10), (char) ('0' + n % 10), '\\0'};\n                    SkTextUtils::DrawString(canvas, n >= 10 ? num : &num[1], xPos, yPos - 5, p, SkTextUtils::kCenter_Align);\n                    break;\n                }\n            }\n            xPos += 20;\n        }\n        p.setColor(SK_ColorBLACK);\n        for (int i = 0; i < count; ++i) {\n            SkTextUtils::DrawString(canvas, s[i], 5 + (e[i] + e[i + 1]) * 10, yPos + 10, p, SkTextUtils::kCenter_Align);\n        }\n        p.setStyle(SkPaint::kStroke_Style);\n        for (int i = 0; i <= count; ++i) {\n            canvas->drawLine(5 + e[i] * 20, yPos, 5 + e[i] * 20, yPos + 15, p);\n        }\n        for (int i = 0; i < 2; ++i) {\n            canvas->drawLine(5 + e[0] * 20, yPos + i * 15, 5 + e[count] * 20, yPos + i * 15, p);\n        }\n    };\n    SkScalar edges[] = { 0, 2, 12, 22, 32,\n                         0, 8,\n                         0, 6, 8,\n                         0, 4, 8,\n                         0, 2, 8\n                        };\n    const char* labels[] = { \"unused\", \"blue\", \"green\", \"red\" };\n    drawBoxText(&edges[0], &labels[0], 4, 31, 45);\n    drawBoxText(&edges[5], &labels[3], 1, 7, 110);\n    drawBoxText(&edges[7], &labels[2], 2, 7, 160);\n    drawBoxText(&edges[10], &labels[1], 2, 7, 210);\n    drawBoxText(&edges[13], &labels[0], 2, 7, 260);\n}\n",
+    "width": 812,
+    "height": 380,
+    "hash": "4c9f4d939e2047269d73fa3507caf01f",
+    "file": "illustrations",
+    "name": "Image_Info_Color_Type_RGB_101010"
+},
+    "Illustrations_Image_Info_Color_Type_RGB_565": {
+    "code": "#include \"SkTextUtils.h\"\n\nvoid draw(SkCanvas* canvas) {\n    canvas->scale(1.25f, 1.25f);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(10);\n    SkTextUtils::DrawString(canvas, \"16-bit word\", 5 + 20 * 8, 20, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"little endian byte order\", 5 + 20 * 4, 85, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"(low bits)\", 5 + 20 * 1.5f, 137, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"(high bits)\", 5 + 20 * 6.5f, 187, paint, SkTextUtils::kCenter_Align);\n    auto drawBoxText = [=](SkScalar e[], const char* s[], int count, int n, SkScalar yPos) -> void {\n        SkPaint p(paint);\n        p.setColor(SK_ColorRED);\n        SkScalar xPos = 15;\n        int width = n % 32 + 1;\n        int lastN = n > 32 ? 32 : 0;\n        for (; n >= lastN; --n) {\n            for (int i = 0; i <= count; ++i) {\n                int a = width - e[i];\n                if (a == n || a == n + 1 || a == n - 32 || a == n - 31) {\n                    char num[3] = {(char) ('0' + n / 10), (char) ('0' + n % 10), '\\0'};\n                    SkTextUtils::DrawString(canvas, n >= 10 ? num : &num[1], xPos, yPos - 5, p, SkTextUtils::kCenter_Align);\n                    break;\n                }\n            }\n            xPos += 20;\n        }\n        p.setColor(SK_ColorBLACK);\n        for (int i = 0; i < count; ++i) {\n            SkTextUtils::DrawString(canvas, s[i], 5 + (e[i] + e[i + 1]) * 10, yPos + 10, p, SkTextUtils::kCenter_Align);\n        }\n        p.setStyle(SkPaint::kStroke_Style);\n        for (int i = 0; i <= count; ++i) {\n            canvas->drawLine(5 + e[i] * 20, yPos, 5 + e[i] * 20, yPos + 15, p);\n        }\n        for (int i = 0; i < 2; ++i) {\n            canvas->drawLine(5 + e[0] * 20, yPos + i * 15, 5 + e[count] * 20, yPos + i * 15, p);\n        }\n    };\n    SkScalar edges[] = { 0, 5, 11, 16,\n                         0, 3, 8,\n                         0, 5, 8 };\n    const char* labels[] = { \"red\", \"green\", \"blue\" };\n    drawBoxText(&edges[0], &labels[0], 3, 15, 45);\n    drawBoxText(&edges[4], &labels[1], 2, 7, 110);\n    drawBoxText(&edges[7], &labels[0], 2, 7, 160);\n}\n",
+    "width": 415,
+    "height": 250,
+    "hash": "6dec0226490a4ac1977dc87a31564147",
+    "file": "illustrations",
+    "name": "Image_Info_Color_Type_RGB_565"
+},
+    "Illustrations_Image_Info_Color_Type_RGB_888": {
+    "code": "#include \"SkTextUtils.h\"\n\nvoid draw(SkCanvas* canvas) {\n    canvas->scale(1.25f, 1.25f);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(10);\n    SkTextUtils::DrawString(canvas, \"32-bit word\", 5 + 20 * 16, 20, paint, SkTextUtils::kCenter_Align);\n    SkTextUtils::DrawString(canvas, \"little endian byte order\", 5 + 20 * 4, 85, paint, SkTextUtils::kCenter_Align);\n    auto drawBoxText = [=](SkScalar e[], const char* s[], int count, int n, SkScalar yPos) -> void {\n        SkPaint p(paint);\n        p.setColor(SK_ColorRED);\n        SkScalar xPos = 15;\n        int width = n % 32 + 1;\n        int lastN = n > 32 ? 32 : 0;\n        for (; n >= lastN; --n) {\n            for (int i = 0; i <= count; ++i) {\n                int a = width - e[i];\n                if (a == n || a == n + 1 || a == n - 32 || a == n - 31) {\n                    char num[3] = {(char) ('0' + n / 10), (char) ('0' + n % 10), '\\0'};\n                    SkTextUtils::DrawString(canvas, n >= 10 ? num : &num[1], xPos, yPos - 5, p, SkTextUtils::kCenter_Align);\n                    break;\n                }\n            }\n            xPos += 20;\n        }\n        p.setColor(SK_ColorBLACK);\n        for (int i = 0; i < count; ++i) {\n            SkTextUtils::DrawString(canvas, s[i], 5 + (e[i] + e[i + 1]) * 10, yPos + 10, p, SkTextUtils::kCenter_Align);\n        }\n        p.setStyle(SkPaint::kStroke_Style);\n        for (int i = 0; i <= count; ++i) {\n            canvas->drawLine(5 + e[i] * 20, yPos, 5 + e[i] * 20, yPos + 15, p);\n        }\n        for (int i = 0; i < 2; ++i) {\n            canvas->drawLine(5 + e[0] * 20, yPos + i * 15, 5 + e[count] * 20, yPos + i * 15, p);\n        }\n    };\n    SkScalar edges[] = { 0, 8, 16, 24, 32 };\n    const char* labels[] = { \"(unused)\", \"blue\", \"green\", \"red\" };\n    drawBoxText(edges, &labels[0], 4, 31, 45);\n    drawBoxText(edges, &labels[3], 1, 7, 110);\n    drawBoxText(edges, &labels[2], 1, 7, 160);\n    drawBoxText(edges, &labels[1], 1, 7, 210);\n    drawBoxText(edges, &labels[0], 1, 7, 260);\n}\n",
+    "width": 812,
+    "height": 365,
+    "hash": "7527d7ade4764302818e250cd4e03962",
+    "file": "illustrations",
+    "name": "Image_Info_Color_Type_RGB_888"
+},
+    "Illustrations_Path_Arc": {
+    "code": "struct data {\n   const char* name;\n   char super;\n   int yn[10];\n};\nconst data dataSet[] = {\n{ \"arcTo sweep\",    '1', {1,  3, 1, 0, 0, 0, 0, 1, 0, 0 }},\n{ \"drawArc\",         0,  {1, -1, 1, 1, 1, 1, 1, 0, 0, 0 }},\n{ \"addArc\",          0,  {1,  1, 1, 4, 0, 1, 1, 1, 0, 0 }},\n{ \"arcTo tangents\", '4', {0,  0, 0, 0, 0, 0, 0, 1, 1, 0 }},\n{ \"arcTo radii\",    '5', {1,  0, 1, 0, 0, 0, 0, 1, 1, 0 }},\n{ \"conicTo\",         0,  {1,  1, 0, 0, 0, 0, 0, 1, 1, 1 }}\n};\n#define __degree_symbol__ \"\\xC2\" \"\\xB0\"\nconst char* headers[] = {\n    \"Oval part\",\n    \"force moveTo\",\n    \"can draw 180\" __degree_symbol__,\n    \"can draw 360\" __degree_symbol__,\n    \"can draw greater than 360\" __degree_symbol__,\n    \"ignored if radius is zero\",\n    \"ignored if sweep is zero\",\n    \"requires Path\",\n    \"describes rotation\",\n    \"describes perspective\",\n};\nconst char* yna[] = {\n     \"n/a\",\n     \"no\",\n     \"yes\"\n};\n\nvoid draw(SkCanvas* canvas) {\n    SkPaint lp;\n    lp.setAntiAlias(true);\n    SkPaint tp(lp);\n    SkPaint sp(tp);\n    SkPaint bp(tp);\n    bp.setFakeBoldText(true);\n    sp.setTextSize(10);\n    lp.setColor(SK_ColorGRAY);\n    canvas->translate(0, 32);\n    const int tl = 115;\n    for (unsigned col = 0; col <= SK_ARRAY_COUNT(headers); ++col) {\n       canvas->drawLine(tl + col * 35, 100, tl + col * 35, 250, lp);\n       if (0 == col) {\n          continue;\n       }\n       canvas->drawLine( tl +        col * 35, 100,  tl + 100  + col * 35,   0, lp);\n       SkPoint pts[] = {{tl - 10.f + col * 35, 98}, {tl + 90.f + col * 35,  -2}};\n       SkVector v = pts[1] - pts[0];\n       v.normalize();\n       SkMatrix matrix;\n       matrix.setSinCos(v.fY, v.fX, pts[0].fX, pts[0].fY);\n       canvas->save();\n       canvas->concat(matrix);\n       canvas->drawText(headers[col -1], strlen(headers[col -1]), pts[0].fX, pts[0].fY, bp);\n       canvas->restore();\n    }\n    for (unsigned row = 0; row <= SK_ARRAY_COUNT(dataSet); ++row) {\n        if (0 == row) {\n            canvas->drawLine(tl, 100, tl + 350, 100, lp);\n        } else {\n            canvas->drawLine(5, 100 + row * 25, tl + 350, 100 + row * 25, lp);\n        }\n        if (row == SK_ARRAY_COUNT(dataSet)) {\n            break;\n        }\n        canvas->drawString(dataSet[row].name, 5, 117 + row * 25, bp);\n        if (dataSet[row].super) {\n            SkScalar width = bp.measureText(dataSet[row].name, strlen(dataSet[row].name));\n            canvas->drawText(&dataSet[row].super, 1, 8 + width, 112 + row * 25, sp);\n        }\n        for (unsigned col = 0; col < SK_ARRAY_COUNT(headers); ++col) {\n            int val = dataSet[row].yn[col];\n            canvas->drawString(yna[SkTMin(2, val + 1)], tl + 5 + col * 35, 117 + row * 25, tp);\n            if (val > 1) {\n                char supe = '0' + val - 1;\n                canvas->drawText(&supe, 1, tl + 25 + col * 35, 112 + row * 25, sp);\n            }\n        }\n    }\n}\n",
+    "width": 600,
+    "height": 300,
+    "hash": "e17e48e9d2182e9afc0f5d26b72c60f0",
+    "file": "illustrations",
+    "name": "Path_Arc"
+},
+    "Image_Info_Alpha_Type_Opaque": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPMColor color = SkPreMultiplyARGB(255, 50, 100, 150);\n    SkString s;\n    s.printf(\"%u %u %u %u\", SkColorGetA(color), SkColorGetR(color),\n                            SkColorGetG(color), SkColorGetB(color));\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    canvas->drawString(s, 10, 62, paint);\n    canvas->scale(50, 50);\n    SkBitmap bitmap;\n    SkImageInfo imageInfo = SkImageInfo::Make(1, 1, kN32_SkColorType, kOpaque_SkAlphaType);\n    if (bitmap.installPixels(imageInfo, (void*) &color, imageInfo.minRowBytes())) {\n        canvas->drawBitmap(bitmap, 0, 0);\n    }\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "79146a1a41d58d22582fdc567c6ffe4e",
+    "file": "SkImageInfo_Reference",
+    "name": "Alpha_Type_Opaque"
+},
+    "Image_Info_Alpha_Type_Premul": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPMColor color = SkPreMultiplyARGB(150, 50, 100, 150);\n    SkString s;\n    s.printf(\"%u %u %u %u\", SkColorGetA(color), SkColorGetR(color),\n                            SkColorGetG(color), SkColorGetB(color));\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    canvas->drawString(s, 10, 62, paint);\n    canvas->scale(50, 50);\n    SkBitmap bitmap;\n    SkImageInfo imageInfo = SkImageInfo::Make(1, 1, kN32_SkColorType, kPremul_SkAlphaType);\n    if (bitmap.installPixels(imageInfo, (void*) &color, imageInfo.minRowBytes())) {\n        canvas->drawBitmap(bitmap, 0, 0);\n    }\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "ad696b39c915803d566e96896ec3a36c",
+    "file": "SkImageInfo_Reference",
+    "name": "Alpha_Type_Premul"
+},
+    "Image_Info_Alpha_Type_Unpremul": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor color = SkColorSetARGB(150, 50, 100, 255);\n    SkString s;\n    s.printf(\"%u %u %u %u\", SkColorGetA(color), SkColorGetR(color),\n                            SkColorGetG(color), SkColorGetB(color));\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    canvas->drawString(s, 10, 62, paint);\n    canvas->scale(50, 50);\n    SkBitmap bitmap;\n    SkImageInfo imageInfo = SkImageInfo::Make(1, 1, kN32_SkColorType, kUnpremul_SkAlphaType);\n    if (bitmap.installPixels(imageInfo, (void*) &color, imageInfo.minRowBytes())) {\n        canvas->drawBitmap(bitmap, 0, 0);\n    }\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "b8216a9e5ff5bc61a0e46eba7d36307b",
+    "file": "SkImageInfo_Reference",
+    "name": "Alpha_Type_Unpremul"
+},
+    "Image_Info_Color_Type_ARGB_4444": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(16, 16);\n    SkBitmap bitmap;\n    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kARGB_4444_SkColorType, kPremul_SkAlphaType);\n    bitmap.allocPixels(imageInfo);\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorGREEN);\n    canvas->drawBitmap(bitmap, 0, 0);\n    auto pack4444 = [](unsigned a, unsigned r, unsigned g, unsigned b) -> uint16_t {\n        return (a << 0) | (b << 4) | (g << 8) | (r << 12);\n    };\n    uint16_t red4444[] =  { pack4444(0xF, 0xF, 0x0, 0x0), pack4444(0xF, 0xb, 0x0, 0x0),\n                            pack4444(0xF, 0x7, 0x0, 0x0), pack4444(0xF, 0x3, 0x0, 0x0) };\n    uint16_t blue4444[] = { pack4444(0xF, 0x0, 0x0, 0xF), pack4444(0xF, 0x0, 0x0, 0xb),\n                            pack4444(0xF, 0x0, 0x0, 0x7), pack4444(0xF, 0x0, 0x0, 0x3) };\n    SkPixmap redPixmap(imageInfo, &red4444, imageInfo.minRowBytes());\n    if (bitmap.writePixels(redPixmap, 0, 0)) {\n        canvas->drawBitmap(bitmap, 2, 2);\n    }\n    SkPixmap bluePixmap(imageInfo, &blue4444, imageInfo.minRowBytes());\n    if (bitmap.writePixels(bluePixmap, 0, 0)) {\n        canvas->drawBitmap(bitmap, 4, 4);\n    }\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "33a360c3404ac21db801943336843d8e",
+    "file": "SkImageInfo_Reference",
+    "name": "Color_Type_ARGB_4444"
+},
+    "Image_Info_Color_Type_Alpha_8": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(16, 16);\n    SkBitmap bitmap;\n    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kAlpha_8_SkColorType, kOpaque_SkAlphaType);\n    bitmap.allocPixels(imageInfo);\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorGREEN);\n    SkPaint orangePaint;\n    orangePaint.setARGB(0xFF, 0xFF, 0xA5, 0x00);\n    canvas->drawBitmap(bitmap, 0, 0, &orangePaint);\n    uint8_t alpha8[] = { 0xFF, 0xBB, 0x77, 0x33 };\n    SkPixmap alphaPixmap(imageInfo, &alpha8, imageInfo.minRowBytes());\n    if (bitmap.writePixels(alphaPixmap, 0, 0)) {\n        canvas->drawBitmap(bitmap, 2, 2, &orangePaint);\n    }\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "21ae21e4ce53d2018e042dd457997300",
+    "file": "SkImageInfo_Reference",
+    "name": "Color_Type_Alpha_8"
+},
+    "Image_Info_Color_Type_BGRA_8888": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(16, 16);\n    SkBitmap bitmap;\n    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kBGRA_8888_SkColorType, kPremul_SkAlphaType);\n    bitmap.allocPixels(imageInfo);\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorGREEN);\n    canvas->drawBitmap(bitmap, 0, 0);\n    auto pack8888 = [](unsigned a, unsigned r, unsigned g, unsigned b) -> uint32_t {\n        return (b << 0) | (g << 8) | (r << 16) | (a << 24);\n    };\n    uint32_t red8888[] = { pack8888(0xFF, 0xFF, 0x0, 0x0), pack8888(0xFF, 0xbb, 0x0, 0x0),\n                           pack8888(0xFF, 0x99, 0x0, 0x0), pack8888(0xFF, 0x55, 0x0, 0x0) };\n    uint32_t blue8888[] = { pack8888(0xFF, 0x0, 0x0, 0x0FF), pack8888(0xFF, 0x0, 0x0, 0x0bb),\n                            pack8888(0xFF, 0x0, 0x0, 0x099), pack8888(0xFF, 0x0, 0x0, 0x055) };\n    SkPixmap redPixmap(imageInfo, &red8888, imageInfo.minRowBytes());\n    if (bitmap.writePixels(redPixmap, 0, 0)) {\n        canvas->drawBitmap(bitmap, 2, 2);\n    }\n    SkPixmap bluePixmap(imageInfo, &blue8888, imageInfo.minRowBytes());\n    if (bitmap.writePixels(bluePixmap, 0, 0)) {\n        canvas->drawBitmap(bitmap, 4, 4);\n    }\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "945ce5344fce5470f8604b2e06e9f9ae",
+    "file": "SkImageInfo_Reference",
+    "name": "Color_Type_BGRA_8888"
+},
+    "Image_Info_Color_Type_Gray_8": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(16, 16);\n    SkBitmap bitmap;\n    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kGray_8_SkColorType, kOpaque_SkAlphaType);\n    bitmap.allocPixels(imageInfo);\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorGREEN);\n    canvas->drawBitmap(bitmap, 0, 0);\n    uint8_t gray8[] = { 0xFF, 0xBB, 0x77, 0x33 };\n    SkPixmap grayPixmap(imageInfo, &gray8, imageInfo.minRowBytes());\n    if (bitmap.writePixels(grayPixmap, 0, 0)) {\n        canvas->drawBitmap(bitmap, 2, 2);\n    }\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "93da0eb0b6722a4f33dc7dae094abf0b",
+    "file": "SkImageInfo_Reference",
+    "name": "Color_Type_Gray_8"
+},
+    "Image_Info_Color_Type_RGBA_1010102": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(16, 16);\n    SkBitmap bitmap;\n    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGBA_1010102_SkColorType, kOpaque_SkAlphaType);\n    bitmap.allocPixels(imageInfo);\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorGREEN);\n    canvas->drawBitmap(bitmap, 0, 0);\n    auto pack1010102 = [](unsigned r, unsigned g, unsigned b, unsigned a) -> uint32_t {\n        return (r << 0) | (g << 10) | (b << 20) | (a << 30);\n    };\n    uint32_t redBits[] =  { pack1010102(0x3FF, 0x000, 0x000, 0x3),\n                            pack1010102(0x2ff, 0x000, 0x000, 0x3),\n                            pack1010102(0x1ff, 0x000, 0x000, 0x3),\n                            pack1010102(0x0ff, 0x000, 0x000, 0x3) };\n    uint32_t blueBits[] = { pack1010102(0x000, 0x000, 0x3FF, 0x3),\n                            pack1010102(0x000, 0x000, 0x2ff, 0x3),\n                            pack1010102(0x000, 0x000, 0x1ff, 0x3),\n                            pack1010102(0x000, 0x000, 0x0ff, 0x3) };\n    if (bitmap.installPixels(imageInfo, (void*) redBits, imageInfo.minRowBytes())) {\n        canvas->drawBitmap(bitmap, 2, 2);\n    }\n    SkPixmap bluePixmap(imageInfo, &blueBits, imageInfo.minRowBytes());\n    if (bitmap.installPixels(imageInfo, (void*) blueBits, imageInfo.minRowBytes())) {\n        canvas->drawBitmap(bitmap, 4, 4);\n    }\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "1282dc1127ce1b0061544619ae4de0f0",
+    "file": "SkImageInfo_Reference",
+    "name": "Color_Type_RGBA_1010102"
+},
+    "Image_Info_Color_Type_RGBA_8888": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(16, 16);\n    SkBitmap bitmap;\n    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGBA_8888_SkColorType, kPremul_SkAlphaType);\n    bitmap.allocPixels(imageInfo);\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorGREEN);\n    canvas->drawBitmap(bitmap, 0, 0);\n    auto pack8888 = [](unsigned a, unsigned r, unsigned g, unsigned b) -> uint32_t {\n        return (r << 0) | (g << 8) | (b << 16) | (a << 24);\n    };\n    uint32_t red8888[] = { pack8888(0xFF, 0xFF, 0x0, 0x0), pack8888(0xFF, 0xbb, 0x0, 0x0),\n                           pack8888(0xFF, 0x77, 0x0, 0x0), pack8888(0xFF, 0x33, 0x0, 0x0) };\n    uint32_t blue8888[] = { pack8888(0xFF, 0x0, 0x0, 0x0FF), pack8888(0xFF, 0x0, 0x0, 0x0bb),\n                            pack8888(0xFF, 0x0, 0x0, 0x077), pack8888(0xFF, 0x0, 0x0, 0x033) };\n    SkPixmap redPixmap(imageInfo, &red8888, imageInfo.minRowBytes());\n    if (bitmap.writePixels(redPixmap, 0, 0)) {\n        canvas->drawBitmap(bitmap, 2, 2);\n    }\n    SkPixmap bluePixmap(imageInfo, &blue8888, imageInfo.minRowBytes());\n    if (bitmap.writePixels(bluePixmap, 0, 0)) {\n        canvas->drawBitmap(bitmap, 4, 4);\n    }\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "947922a19d59893fe7f9d9ee1954379b",
+    "file": "SkImageInfo_Reference",
+    "name": "Color_Type_RGBA_8888"
+},
+    "Image_Info_Color_Type_RGBA_F16": {
+    "code": "union FloatUIntUnion {\n    uint32_t fUInt;\n    float    fFloat;\n};\nuint16_t FloatToHalf(float f) {\n    static const FloatUIntUnion magic = { 15 << 23 };\n    static const uint32_t round_mask = ~0xfffu;\n    FloatUIntUnion floatUnion;\n    floatUnion.fFloat = f;\n    uint32_t sign = floatUnion.fUInt & 0x80000000u;\n    floatUnion.fUInt ^= sign;\n    floatUnion.fUInt &= round_mask;\n    floatUnion.fFloat *= magic.fFloat;\n    floatUnion.fUInt -= round_mask;\n    return (floatUnion.fUInt >> 13) | (sign >> 16);\n}\n\nvoid draw(SkCanvas* canvas) {\n    canvas->scale(16, 16);\n    SkBitmap bitmap;\n    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGBA_F16_SkColorType, kPremul_SkAlphaType);\n    bitmap.allocPixels(imageInfo);\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorGREEN);\n    canvas->drawBitmap(bitmap, 0, 0);\n    auto H = [](float c) -> uint16_t {\n        return FloatToHalf(c);\n    };\n                             //     R        G        B        A\n    uint16_t red_f16[][4] =  { { H(1.0), H(0.0), H(0.0), H(1.0) },\n                               { H(.75), H(0.0), H(0.0), H(1.0) },\n                               { H(.50), H(0.0), H(0.0), H(1.0) },\n                               { H(.25), H(0.0), H(0.0), H(1.0) } };\n    uint16_t blue_f16[][4] = { { H(0.0), H(0.0), H(1.0), H(1.0) },\n                               { H(0.0), H(0.0), H(.75), H(1.0) },\n                               { H(0.0), H(0.0), H(.50), H(1.0) },\n                               { H(0.0), H(0.0), H(.25), H(1.0) } };\n    SkPixmap redPixmap(imageInfo, red_f16, imageInfo.minRowBytes());\n    if (bitmap.writePixels(redPixmap, 0, 0)) {\n        canvas->drawBitmap(bitmap, 2, 2);\n    }\n    SkPixmap bluePixmap(imageInfo, blue_f16, imageInfo.minRowBytes());\n    if (bitmap.writePixels(bluePixmap, 0, 0)) {\n        canvas->drawBitmap(bitmap, 4, 4);\n    }\n}\n",
+    "width": 256,
+    "height": 96,
+    "hash": "dd81527bbdf5eaae7dd21ac04ab84f9e",
+    "file": "SkImageInfo_Reference",
+    "name": "Color_Type_RGBA_F16"
+},
+    "Image_Info_Color_Type_RGB_101010": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(16, 16);\n    SkBitmap bitmap;\n    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGB_101010x_SkColorType, kOpaque_SkAlphaType);\n    bitmap.allocPixels(imageInfo);\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorGREEN);\n    canvas->drawBitmap(bitmap, 0, 0);\n    auto pack101010x = [](unsigned r, unsigned g, unsigned b) -> uint32_t {\n        return (r << 0) | (g << 10) | (b << 20);\n    };\n    uint32_t redBits[] =  { pack101010x(0x3FF, 0x000, 0x000), pack101010x(0x2ff, 0x000, 0x000),\n    pack101010x(0x1ff, 0x000, 0x000), pack101010x(0x0ff, 0x000, 0x000) };\n    uint32_t blueBits[] = { pack101010x(0x000, 0x000, 0x3FF), pack101010x(0x000, 0x000, 0x2ff),\n    pack101010x(0x000, 0x000, 0x1ff), pack101010x(0x000, 0x000, 0x0ff) };\n    if (bitmap.installPixels(imageInfo, (void*) redBits, imageInfo.minRowBytes())) {\n        canvas->drawBitmap(bitmap, 2, 2);\n    }\n    SkPixmap bluePixmap(imageInfo, &blueBits, imageInfo.minRowBytes());\n    if (bitmap.installPixels(imageInfo, (void*) blueBits, imageInfo.minRowBytes())) {\n        canvas->drawBitmap(bitmap, 4, 4);\n    }\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "92f81aa0459230459600a01e79ccff29",
+    "file": "SkImageInfo_Reference",
+    "name": "Color_Type_RGB_101010"
+},
+    "Image_Info_Color_Type_RGB_565": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(16, 16);\n    SkBitmap bitmap;\n    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGB_565_SkColorType, kOpaque_SkAlphaType);\n    bitmap.allocPixels(imageInfo);\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorGREEN);\n    canvas->drawBitmap(bitmap, 0, 0);\n    auto pack565 = [](unsigned r, unsigned g, unsigned b) -> uint16_t {\n        return (b << 0) | (g << 5) | (r << 11);\n    };\n    uint16_t red565[] =  { pack565(0x1F, 0x00, 0x00), pack565(0x17, 0x00, 0x00),\n                           pack565(0x0F, 0x00, 0x00), pack565(0x07, 0x00, 0x00) };\n    uint16_t blue565[] = { pack565(0x00, 0x00, 0x1F), pack565(0x00, 0x00, 0x17),\n                           pack565(0x00, 0x00, 0x0F), pack565(0x00, 0x00, 0x07) };\n    SkPixmap redPixmap(imageInfo, &red565, imageInfo.minRowBytes());\n    if (bitmap.writePixels(redPixmap, 0, 0)) {\n        canvas->drawBitmap(bitmap, 2, 2);\n    }\n    SkPixmap bluePixmap(imageInfo, &blue565, imageInfo.minRowBytes());\n    if (bitmap.writePixels(bluePixmap, 0, 0)) {\n        canvas->drawBitmap(bitmap, 4, 4);\n    }\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "7e7c46bb4572e21e13529ff364eb0a9c",
+    "file": "SkImageInfo_Reference",
+    "name": "Color_Type_RGB_565"
+},
+    "Image_Info_Color_Type_RGB_888": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(16, 16);\n    SkBitmap bitmap;\n    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGB_888x_SkColorType, kOpaque_SkAlphaType);\n    bitmap.allocPixels(imageInfo);\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorGREEN);\n    canvas->drawBitmap(bitmap, 0, 0);\n    auto pack888 = [](unsigned r, unsigned g, unsigned b) -> uint32_t {\n        return (r << 0) | (g << 8) | (b << 16);\n    };\n    uint32_t red888[] =  { pack888(0xFF, 0x00, 0x00), pack888(0xbb, 0x00, 0x00),\n        pack888(0x77, 0x00, 0x00), pack888(0x33, 0x00, 0x00) };\n    uint32_t blue888[] = { pack888(0x00, 0x00, 0xFF), pack888(0x00, 0x00, 0xbb),\n        pack888(0x00, 0x00, 0x77), pack888(0x00, 0x00, 0x33) };\n    if (bitmap.installPixels(imageInfo, (void*) red888, imageInfo.minRowBytes())) {\n        canvas->drawBitmap(bitmap, 2, 2);\n    }\n    if (bitmap.installPixels(imageInfo, (void*) blue888, imageInfo.minRowBytes())) {\n        canvas->drawBitmap(bitmap, 4, 4);\n    }\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "4260d6cc15db2c60c07f6fdc8d9ae425",
+    "file": "SkImageInfo_Reference",
+    "name": "Color_Type_RGB_888"
+},
+    "Matrix_MemberIndex": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint black;\n    black.setAntiAlias(true);\n    black.setTextSize(48);\n    SkPaint gray = black;\n    gray.setColor(0xFF9f9f9f);\n    SkScalar offset[] = { 1.5f, 1.5f, 20,   1.5f, 1.5f, 20,   .03f, .01f, 2 };\n    for (int i : { SkMatrix::kMScaleX, SkMatrix::kMSkewX,  SkMatrix::kMTransX,\n                   SkMatrix::kMSkewY,  SkMatrix::kMScaleY, SkMatrix::kMTransY,\n                   SkMatrix::kMPersp0, SkMatrix::kMPersp1, SkMatrix::kMPersp2 } ) {\n        SkMatrix m;\n        m.setIdentity();\n        m.set(i, offset[i]);\n        SkAutoCanvasRestore autoRestore(canvas, true);\n        canvas->translate(22 + (i % 3) * 88, 44 + (i / 3) * 88);\n        canvas->drawString(\"&\", 0, 0, gray);\n        canvas->concat(m);\n        canvas->drawString(\"&\", 0, 0, black);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "3bbf75f4748420810aa2586e3c8548d9",
+    "file": "SkMatrix_Reference",
+    "name": "MemberIndex"
+},
+    "Paint_Anti_Alias": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocN32Pixels(50, 50);\n    SkCanvas offscreen(bitmap);\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(10);\n    for (bool antialias : { false, true }) {\n        paint.setColor(antialias ? SK_ColorRED : SK_ColorBLUE);\n        paint.setAntiAlias(antialias);\n        bitmap.eraseColor(0);\n        offscreen.drawLine(5, 5, 15, 30, paint);\n        canvas->drawLine(5, 5, 15, 30, paint);\n        canvas->save();\n        canvas->scale(10, 10);\n        canvas->drawBitmap(bitmap, antialias ? 12 : 0, 0);\n        canvas->restore();\n        canvas->translate(15, 0);\n    }\n}\n",
+    "width": 512,
+    "height": 256,
+    "hash": "a6575a49467ce8d28bb01cc7638fa04d",
+    "file": "SkPaint_Reference",
+    "name": "Anti_Alias"
+},
+    "Paint_Blend_Mode_Methods": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint normal, blender;\n    normal.setColor(0xFF58a889);\n    blender.setColor(0xFF8958a8);\n    canvas->clear(0);\n    for (SkBlendMode m : { SkBlendMode::kSrcOver, SkBlendMode::kSrcIn, SkBlendMode::kSrcOut } ) {\n        normal.setBlendMode(SkBlendMode::kSrcOver);\n        canvas->drawOval(SkRect::MakeXYWH(30, 30, 30, 80), normal);\n        blender.setBlendMode(m);\n        canvas->drawOval(SkRect::MakeXYWH(10, 50, 80, 30), blender);\n        canvas->translate(70, 70);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "73092d4d06faecea3c204d852a4dd8a8",
+    "file": "SkPaint_Reference",
+    "name": "Blend_Mode_Methods"
+},
+    "Paint_Color_Filter_Methods": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColorFilter(SkColorMatrixFilter::MakeLightingFilter(0xFFFFFF, 0xFF0000));\n    for (SkColor c : { SK_ColorBLACK, SK_ColorGREEN } ) {\n        paint.setColor(c);\n        canvas->drawRect(SkRect::MakeXYWH(10, 10, 50, 50), paint);\n        paint.setAlpha(0x80);\n        canvas->drawRect(SkRect::MakeXYWH(60, 60, 50, 50), paint);\n        canvas->translate(100, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "5abde56ca2f89a18b8e231abd1b57c56",
+    "file": "SkPaint_Reference",
+    "name": "Color_Filter_Methods"
+},
+    "Paint_Color_Methods": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColor(0x8000FF00);  // transparent green\n    canvas->drawCircle(50, 50, 40, paint);\n    paint.setARGB(128, 255, 0, 0); // transparent red\n    canvas->drawCircle(80, 50, 40, paint);\n    paint.setColor(SK_ColorBLUE);\n    paint.setAlpha(0x80);\n    canvas->drawCircle(65, 65, 40, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "214b559d75c65a7bef6ef4be1f860053",
+    "file": "SkPaint_Reference",
+    "name": "Color_Methods"
+},
+    "Paint_Device_Text": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocN32Pixels(24, 33);\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorWHITE);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(20);\n    for (bool lcd : { false, true }) {\n        paint.setLCDRenderText(lcd);\n        for (bool subpixel : { false, true }) {\n            paint.setSubpixelText(subpixel);\n            offscreen.drawString(\",,,,\", 0, 4, paint);\n            offscreen.translate(0, 7);\n        }\n    }\n    canvas->drawBitmap(bitmap, 4, 12);\n    canvas->scale(9, 9);\n    canvas->drawBitmap(bitmap, 4, -1);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "4606ae1be792d6bc46d496432f050ee9",
+    "file": "SkPaint_Reference",
+    "name": "Device_Text"
+},
+    "Paint_Dither": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bm16;\n    bm16.allocPixels(SkImageInfo::Make(32, 32, kRGB_565_SkColorType, kOpaque_SkAlphaType));\n    SkCanvas c16(bm16);\n    SkPaint colorPaint;\n    for (auto dither : { false, true } ) {\n        colorPaint.setDither(dither);\n        for (auto colors : { 0xFF333333, 0xFF666666, 0xFF999999, 0xFFCCCCCC } ) {\n            for (auto mask : { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF } ) {\n                 colorPaint.setColor(colors & mask);\n                 c16.drawRect({0, 0, 8, 4}, colorPaint);\n                 c16.translate(8, 0);\n            }\n            c16.translate(-32, 4);\n        }\n    }\n    canvas->scale(8, 8);\n    canvas->drawBitmap(bm16, 0, 0);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "8b26507690b71462f44642b911890bbf",
+    "file": "SkPaint_Reference",
+    "name": "Dither"
+},
+    "Paint_Dither_a": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->clear(0);\n    SkBitmap bm32;\n    bm32.allocPixels(SkImageInfo::Make(20, 10, kN32_SkColorType, kPremul_SkAlphaType));\n    SkCanvas c32(bm32);\n    SkPoint points[] = {{0, 0}, {20, 0}};\n    SkColor colors[] = {0xFF334455, 0xFF662211 };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(\n                     points, colors, nullptr, SK_ARRAY_COUNT(colors),\n                     SkShader::kClamp_TileMode, 0, nullptr));\n    paint.setDither(true);\n    c32.drawPaint(paint);\n    canvas->scale(12, 12);\n    canvas->drawBitmap(bm32, 0, 0);\n    paint.setBlendMode(SkBlendMode::kPlus);\n    canvas->drawBitmap(bm32, 0, 11, &paint);\n    canvas->drawBitmap(bm32, 0, 11, &paint);\n    canvas->drawBitmap(bm32, 0, 11, &paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "76d4d4a7931a48495e4d5f54e073be53",
+    "file": "SkPaint_Reference",
+    "name": "Dither_2"
+},
+    "Paint_Draw_Looper_Methods": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkLayerDrawLooper::LayerInfo info;\n    info.fPaintBits = (SkLayerDrawLooper::BitFlags) SkLayerDrawLooper::kColorFilter_Bit;\n    info.fColorMode = SkBlendMode::kSrc;\n    SkLayerDrawLooper::Builder looperBuilder;\n    SkPaint* loopPaint = looperBuilder.addLayer(info);\n    loopPaint->setColor(SK_ColorRED);\n    info.fOffset.set(20, 20);\n    loopPaint = looperBuilder.addLayer(info);\n    loopPaint->setColor(SK_ColorBLUE);\n    SkPaint paint;\n    paint.setDrawLooper(looperBuilder.detach());\n    canvas->drawCircle(50, 50, 50, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "84ec12a36e50df5ac565cc7a75ffbe9f",
+    "file": "SkPaint_Reference",
+    "name": "Draw_Looper_Methods"
+},
+    "Paint_Fake_Bold": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(40);\n    canvas->drawString(\"OjYy_-\", 10, 35, paint);\n    paint.setFakeBoldText(true);\n    canvas->drawString(\"OjYy_-\", 10, 75, paint);\n    // create a custom fake bold by varying the stroke width\n    paint.setFakeBoldText(false);\n    paint.setStyle(SkPaint::kStrokeAndFill_Style);\n    paint.setStrokeWidth(40.f / 48);\n    canvas->drawString(\"OjYy_-\", 10, 115, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "e811f4829a2daaaeaad3795504a7e02a",
+    "file": "SkPaint_Reference",
+    "name": "Fake_Bold"
+},
+    "Paint_Filter_Quality_Methods": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    canvas->scale(.2f, .2f);\n    for (SkFilterQuality q : { kNone_SkFilterQuality, kLow_SkFilterQuality,\n                               kMedium_SkFilterQuality, kHigh_SkFilterQuality } ) {\n        paint.setFilterQuality(q);\n        canvas->drawImage(image.get(), 0, 0, &paint);\n        canvas->translate(550, 0);\n        if (kLow_SkFilterQuality == q) canvas->translate(-1100, 550);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "69369cff2f5b145a6f616092513266a0",
+    "file": "SkPaint_Reference",
+    "name": "Filter_Quality_Methods"
+},
+    "Paint_Image_Filter_Methods": {
+    "code": "#include \"SkBlurImageFilter.h\"\n\nvoid draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(2);\n    SkRegion region;\n    region.op( 10, 10, 50, 50, SkRegion::kUnion_Op);\n    region.op( 10, 50, 90, 90, SkRegion::kUnion_Op);\n    paint.setImageFilter(SkBlurImageFilter::Make(5.0f, 5.0f, nullptr));\n    canvas->drawRegion(region, paint);\n    paint.setImageFilter(nullptr);\n    paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 5));\n    canvas->translate(100, 100);\n    canvas->drawRegion(region, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "ece04ee3d3761e3425f37c8f06f054c1",
+    "file": "SkPaint_Reference",
+    "name": "Image_Filter_Methods"
+},
+    "Paint_Mask_Filter_Methods": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setMaskFilter(SkMaskFilter::MakeBlur(kSolid_SkBlurStyle, 3));\n    canvas->drawRect(SkRect::MakeXYWH(40, 40, 175, 175), paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "55d7b9d482ac8e17a6153f555a8adb8d",
+    "file": "SkPaint_Reference",
+    "name": "Mask_Filter_Methods"
+},
+    "Paint_Miter_Limit": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint pts[] = {{ 10, 50 }, { 110, 80 }, { 10, 110 }};\n    SkVector v[] = { pts[0] - pts[1], pts[2] - pts[1] };\n    SkScalar angle1 = SkScalarATan2(v[0].fY, v[0].fX);\n    SkScalar angle2 = SkScalarATan2(v[1].fY, v[1].fX);\n    const SkScalar strokeWidth = 20;\n    SkScalar miterLimit = 1 / SkScalarSin((angle2 - angle1) / 2);\n    SkScalar miterLength = strokeWidth * miterLimit;\n    SkPath path;\n    path.moveTo(pts[0]);\n    path.lineTo(pts[1]);\n    path.lineTo(pts[2]);\n    SkPaint paint;  // set to default kMiter_Join\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeMiter(miterLimit);\n    paint.setStrokeWidth(strokeWidth);\n    canvas->drawPath(path, paint);\n    paint.setStrokeWidth(1);\n    canvas->drawLine(pts[1].fX - miterLength / 2, pts[1].fY + 50,\n                     pts[1].fX + miterLength / 2, pts[1].fY + 50, paint);\n    canvas->translate(200, 0);\n    miterLimit *= 0.99f;\n    paint.setStrokeMiter(miterLimit);\n    paint.setStrokeWidth(strokeWidth);\n    canvas->drawPath(path, paint);\n    paint.setStrokeWidth(1);\n    canvas->drawLine(pts[1].fX - miterLength / 2, pts[1].fY + 50,\n                     pts[1].fX + miterLength / 2, pts[1].fY + 50, paint);\n}\n",
+    "width": 384,
+    "height": 170,
+    "hash": "5de2de0f00354e59074a9bb1a42d5a63",
+    "file": "SkPaint_Reference",
+    "name": "Miter_Limit"
+},
+    "Paint_Path_Effect_Methods": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(16);\n    SkScalar intervals[] = {30, 10};\n    paint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 1));\n    canvas->drawRoundRect({20, 20, 120, 120}, 20, 20, paint);\n}\n",
+    "width": 256,
+    "height": 160,
+    "hash": "8cf5684b187d60f09e11c4a48993ea39",
+    "file": "SkPaint_Reference",
+    "name": "Path_Effect_Methods"
+},
+    "Paint_Shader_Methods": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPaint paint;\n   SkPoint center = { 50, 50 };\n   SkScalar radius = 50;\n   const SkColor colors[] = { 0xFFFFFFFF, 0xFF000000 };\n   paint.setShader(SkGradientShader::MakeRadial(center, radius, colors,\n        nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));\n   for (SkScalar a : { 0.3f, 0.6f, 1.0f } ) {\n       paint.setAlpha((int) (a * 255));\n       canvas->drawCircle(center.fX, center.fY, radius, paint);\n       canvas->translate(70, 70);\n   }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "c015dc2010c15e1c00b4f7330232b0f7",
+    "file": "SkPaint_Reference",
+    "name": "Shader_Methods"
+},
+    "Paint_Shader_Methods_a": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPaint paint;\n   SkBitmap bitmap;\n   bitmap.setInfo(SkImageInfo::MakeA8(5, 1), 5);  // bitmap only contains alpha\n   uint8_t pixels[5] = { 0x22, 0x55, 0x88, 0xBB, 0xFF };\n   bitmap.setPixels(pixels);\n   paint.setShader(SkShader::MakeBitmapShader(bitmap,\n            SkShader::kMirror_TileMode, SkShader::kMirror_TileMode));\n   for (SkColor c : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {\n       paint.setColor(c);  // all components in color affect shader\n       canvas->drawCircle(50, 50, 50, paint);\n       canvas->translate(70, 70);\n   }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "fe80fd80b98a20823db7fb9a077243c7",
+    "file": "SkPaint_Reference",
+    "name": "Shader_Methods_2"
+},
+    "Paint_Stroke_Width": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    for (bool antialias : { false, true }) {\n        paint.setAntiAlias(antialias);\n        for (int width = 0; width <= 4; ++width) {\n            SkScalar offset = antialias * 100 + width * 20;\n            paint.setStrokeWidth(width * 0.25f);\n            canvas->drawLine(10 + offset,  10, 20 + offset,  60, paint);\n            canvas->drawLine(10 + offset, 110, 60 + offset, 160, paint);\n        }\n    }\n}\n",
+    "width": 256,
+    "height": 170,
+    "hash": "5112c7209a19e035c61cef33a624a652",
+    "file": "SkPaint_Reference",
+    "name": "Stroke_Width"
+},
+    "Paint_Text_Encoding": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    const char hello8[] = \"Hello\" \"\\xE2\" \"\\x98\" \"\\xBA\";\n    const uint16_t hello16[] = { 'H', 'e', 'l', 'l', 'o', 0x263A };\n    const uint32_t hello32[] = { 'H', 'e', 'l', 'l', 'o', 0x263A };\n    paint.setTextSize(24);\n    canvas->drawText(hello8, sizeof(hello8) - 1, 10, 30, paint);\n    paint.setTextEncoding(SkTextEncoding::kUTF16);\n    canvas->drawText(hello16, sizeof(hello16), 10, 60, paint);\n    paint.setTextEncoding(SkTextEncoding::kUTF32);\n    canvas->drawText(hello32, sizeof(hello32), 10, 90, paint);\n    uint16_t glyphs[SK_ARRAY_COUNT(hello32)];\n    paint.textToGlyphs(hello32, sizeof(hello32), glyphs);\n    paint.setTextEncoding(SkTextEncoding::kGlyphID);\n    canvas->drawText(glyphs, sizeof(glyphs), 10, 120, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "767fa4e7b6300e16a419f9881f0f9d3d",
+    "file": "SkPaint_Reference",
+    "name": "Text_Encoding"
+},
+    "Paint_Text_Scale_X": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(24);\n    paint.setTextScaleX(.8f);\n    canvas->drawString(\"narrow\", 10, 20, paint);\n    paint.setTextScaleX(1);\n    canvas->drawString(\"normal\", 10, 60, paint);\n    paint.setTextScaleX(1.2f);\n    canvas->drawString(\"wide\", 10, 100, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "d13d787c1e36f515319fc998411c1d91",
+    "file": "SkPaint_Reference",
+    "name": "Text_Scale_X"
+},
+    "Paint_Text_Size": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    canvas->drawString(\"12 point\", 10, 20, paint);\n    paint.setTextSize(24);\n    canvas->drawString(\"24 point\", 10, 60, paint);\n    paint.setTextSize(48);\n    canvas->drawString(\"48 point\", 10, 120, paint);\n}\n",
+    "width": 256,
+    "height": 135,
+    "hash": "91c9a3e498bb9412e4522a95d076ed5f",
+    "file": "SkPaint_Reference",
+    "name": "Text_Size"
+},
+    "Paint_Text_Skew_X": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(24);\n    paint.setTextSkewX(-.25f);\n    canvas->drawString(\"right-leaning\", 10, 100, paint);\n    paint.setTextSkewX(0);\n    canvas->drawString(\"normal\", 10, 60, paint);\n    paint.setTextSkewX(.25f);\n    canvas->drawString(\"left-leaning\", 10, 20, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "aff208b0aab265f273045b27e683c17c",
+    "file": "SkPaint_Reference",
+    "name": "Text_Skew_X"
+},
+    "Paint_Typeface_Methods": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTypeface(SkTypeface::MakeFromName(nullptr, SkFontStyle()));\n    paint.setAntiAlias(true);\n    paint.setTextSize(36);\n    canvas->drawString(\"A Big Hello!\", 10, 40, paint);\n    paint.setTypeface(nullptr);\n    paint.setFakeBoldText(true);\n    canvas->drawString(\"A Big Hello!\", 10, 80, paint);\n}\n",
+    "width": 256,
+    "height": 100,
+    "hash": "1a7a5062725139760962582f599f1b97",
+    "file": "SkPaint_Reference",
+    "name": "Typeface_Methods"
+},
+    "Path_Arc": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect oval = {8, 8, 56, 56};\n    SkPaint ovalPaint;\n    ovalPaint.setAntiAlias(true);\n    SkPaint textPaint(ovalPaint);\n    ovalPaint.setStyle(SkPaint::kStroke_Style);\n    SkPaint arcPaint(ovalPaint);\n    arcPaint.setStrokeWidth(5);\n    arcPaint.setColor(SK_ColorBLUE);\n    canvas->translate(-64, 0);\n    for (char arcStyle = '1'; arcStyle <= '6'; ++arcStyle) {\n        '4' == arcStyle ? canvas->translate(-96, 55) : canvas->translate(64, 0);\n        canvas->drawText(&arcStyle, 1, 30, 36, textPaint);\n        canvas->drawOval(oval, ovalPaint);\n        SkPath path;\n        path.moveTo({56, 32});\n        switch (arcStyle) {\n            case '1':\n                path.arcTo(oval, 0, 90, false);\n                break;\n            case '2':\n                canvas->drawArc(oval, 0, 90, false, arcPaint);\n                continue;\n            case '3':\n                path.addArc(oval, 0, 90);\n                break;\n            case '4':\n                path.arcTo({56, 56}, {32, 56}, 24);\n                break;\n            case '5':\n                path.arcTo({24, 24}, 0, SkPath::kSmall_ArcSize, SkPath::kCW_Direction, {32, 56});\n                break;\n            case '6':\n                path.conicTo({56, 56}, {32, 56}, SK_ScalarRoot2Over2);\n                break;\n         }\n         canvas->drawPath(path, arcPaint);\n     }\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "5acc77eba0cb4d00bbf3a8f4db0c0aee",
+    "file": "SkPath_Reference",
+    "name": "Arc"
+},
+    "Path_Cubic": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPoint cubicPts[] = {{20, 150}, {90, 10}, {160, 150}, {230, 10}};\n    SkColor colors[] = { 0xff88ff00, 0xff0088bb, 0xff6600cc, 0xffbb3377 };\n    for (unsigned i = 0; i < SK_ARRAY_COUNT(colors); ++i) {\n        paint.setColor(0x7fffffff & colors[i]);\n        paint.setStrokeWidth(1);\n        for (unsigned j = 0; j < 3; ++j) {\n            canvas->drawLine(cubicPts[j], cubicPts[j + 1], paint);\n        }\n        SkPath path;\n        path.moveTo(cubicPts[0]);\n        path.cubicTo(cubicPts[1], cubicPts[2], cubicPts[3]);\n        paint.setStrokeWidth(3);\n        paint.setColor(colors[i]);\n        canvas->drawPath(path, paint);\n        cubicPts[1].fY += 30;\n        cubicPts[2].fX += 30;\n   }\n}\n",
+    "width": 256,
+    "height": 160,
+    "hash": "466445ed991d86de08587066392d654a",
+    "file": "SkPath_Reference",
+    "name": "Cubic"
+},
+    "Path_Overview": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPath path;\n    path.moveTo(124, 108);\n    path.lineTo(172, 24);\n    path.addCircle(50, 50, 30);\n    path.moveTo(36, 148);\n    path.quadTo(66, 188, 120, 136);\n    canvas->drawPath(path, paint);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setColor(SK_ColorBLUE);\n    paint.setStrokeWidth(3);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 192,
+    "hash": "93887af0c1dac49521972698cf04069c",
+    "file": "SkPath_Overview",
+    "name": "Path_Overview"
+},
+    "Path_Overview_Contour": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    canvas->drawString(\"1st contour\", 150, 100, paint);\n    canvas->drawString(\"2nd contour\", 130, 160, paint);\n    canvas->drawString(\"3rd contour\", 40, 30, paint);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPath path;\n    path.moveTo(124, 108);\n    path.lineTo(172, 24);\n    path.moveTo(36, 148);\n    path.quadTo(66, 188, 120, 136);\n    path.close();\n    path.conicTo(70, 20, 110, 40, 0.6f);\n    canvas->drawPath(path, paint);\n}",
+    "width": 256,
+    "height": 192,
+    "hash": "0374f2dcd7effeb1dd435205a6c2de6f",
+    "file": "SkPath_Overview",
+    "name": "Contour"
+},
+    "Path_Overview_Contour_Zero_Length": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(8);\n    paint.setStrokeCap(SkPaint::kRound_Cap);\n    SkPath path;\n    path.moveTo(36, 48);\n    path.lineTo(36, 48);\n    canvas->drawPath(path, paint);\n    path.reset();\n    paint.setStrokeCap(SkPaint::kSquare_Cap);\n    path.moveTo(56, 48);\n    path.close();\n    canvas->drawPath(path, paint);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "62848df605af6258653d9e16b27d8f7f",
+    "file": "SkPath_Overview",
+    "name": "Contour_Zero_Length"
+},
+    "Path_Overview_Contour_a": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(8);\n    SkPath path;\n    path.moveTo(36, 48);\n    path.quadTo(66, 88, 120, 36);\n    canvas->drawPath(path, paint);\n    path.close();\n    canvas->translate(0, 50);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 160,
+    "hash": "7a1f39b12d2cd8b7f5b1190879259cb2",
+    "file": "SkPath_Overview",
+    "name": "Contour_2"
+},
+    "Path_Overview_a": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPath path;\n    path.moveTo(36, 48);\n    path.quadTo(66, 88, 120, 36);\n    canvas->drawPath(path, paint);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setColor(SK_ColorBLUE);\n    paint.setStrokeWidth(8);\n    canvas->translate(0, 50);\n    canvas->drawPath(path, paint);\n    paint.setStyle(SkPaint::kStrokeAndFill_Style);\n    paint.setColor(SK_ColorRED);\n    canvas->translate(0, 50);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 192,
+    "hash": "36a995442c081ee779ecab2962d36e69",
+    "file": "SkPath_Overview",
+    "name": "Path_Overview_2"
+},
+    "Path_Quad": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPoint quadPts[] = {{20, 90}, {120, 10}, {220, 90}};\n    canvas->drawLine(quadPts[0], quadPts[1], paint);\n    canvas->drawLine(quadPts[1], quadPts[2], paint);\n    SkPath path;\n    path.moveTo(quadPts[0]);\n    path.quadTo(quadPts[1], quadPts[2]);\n    paint.setStrokeWidth(3);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 110,
+    "hash": "78ad51fa1cd33eb84a6f99061e56e067",
+    "file": "SkPath_Reference",
+    "name": "Quad"
+},
+    "Path_Quad_a": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPoint quadPts[] = {{20, 150}, {120, 10}, {220, 150}};\n    SkColor colors[] = { 0xff88ff00, 0xff0088bb, 0xff6600cc, 0xffbb3377 };\n    for (unsigned i = 0; i < SK_ARRAY_COUNT(colors); ++i) {\n        paint.setColor(0x7fffffff & colors[i]);\n        paint.setStrokeWidth(1);\n        canvas->drawLine(quadPts[0], quadPts[1], paint);\n        canvas->drawLine(quadPts[1], quadPts[2], paint);\n        SkPath path;\n        path.moveTo(quadPts[0]);\n        path.quadTo(quadPts[1], quadPts[2]);\n        paint.setStrokeWidth(3);\n        paint.setColor(colors[i]);\n        canvas->drawPath(path, paint);\n        quadPts[1].fY += 30;\n   }\n}\n",
+    "width": 256,
+    "height": 160,
+    "hash": "4082f66a42df11bb20462b232b156bb6",
+    "file": "SkPath_Reference",
+    "name": "Quad_2"
+},
+    "SkAutoCanvasRestore_SkCanvas_star": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint p;\n    p.setAntiAlias(true);\n    p.setTextSize(64);\n    for (SkScalar sx : { -1, 1 } ) {\n        for (SkScalar sy : { -1, 1 } ) {\n            SkAutoCanvasRestore autoRestore(canvas, true);\n            SkMatrix m = SkMatrix::MakeAll(sx, 1, 96,    0, sy, 64,   0, 0, 1);\n            canvas->concat(m);\n            canvas->drawString(\"R\", 0, 0, p);\n        }\n    }\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "466ef576b88e29d7252422db7adeed1c",
+    "file": "SkAutoCanvasRestore_Reference",
+    "name": "SkAutoCanvasRestore::SkAutoCanvasRestore(SkCanvas* canvas, bool doSave)"
+},
+    "SkBitmap_allocN32Pixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRandom random;\n    SkBitmap bitmap;\n    bitmap.allocN32Pixels(64, 64);\n    bitmap.eraseColor(SK_ColorTRANSPARENT);\n    for (int y = 0; y < 256; y += 64) {\n        for (int x = 0; x < 256; x += 64) {\n            SkColor color = random.nextU();\n            uint32_t w = random.nextRangeU(4, 32);\n            uint32_t cx = random.nextRangeU(0, 64 - w);\n            uint32_t h = random.nextRangeU(4, 32);\n            uint32_t cy = random.nextRangeU(0, 64 - h);\n            bitmap.erase(color, SkIRect::MakeXYWH(cx, cy, w, h));\n            canvas->drawBitmap(bitmap, x, y);\n        }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "c717491f9251604724c9cbde7088ec20",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::allocN32Pixels"
+},
+    "SkBitmap_allocPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    SkImageInfo info = SkImageInfo::Make(256, 64, kGray_8_SkColorType, kOpaque_SkAlphaType);\n    bitmap.allocPixels(info, info.width() * info.bytesPerPixel() + 64);\n    SkCanvas offscreen(bitmap);\n    offscreen.scale(.5f, .5f);\n    for (int y : { 0, 64, 128, 192 } ) {\n        offscreen.drawBitmap(source, 0, -y);\n        canvas->drawBitmap(bitmap, 0, y);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "555c0f62f96602a9dcd459badcd005e0",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::allocPixels"
+},
+    "SkBitmap_allocPixelsFlags": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocPixelsFlags(SkImageInfo::MakeN32(44, 16, kPremul_SkAlphaType),\n                            SkBitmap::kZeroPixels_AllocFlag);\n    SkCanvas offscreen(bitmap);\n    SkPaint paint;\n    offscreen.drawString(\"!@#$%\", 0, 12, paint);\n    canvas->scale(6, 6);\n    canvas->drawBitmap(bitmap, 0, 0);\n    canvas->drawBitmap(bitmap, 8, 8);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "737e721c7d9e0f367d25521a1b823b9d",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::allocPixelsFlags"
+},
+    "SkBitmap_allocPixels_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::Make(64, 64, kGray_8_SkColorType, kOpaque_SkAlphaType));\n    SkCanvas offscreen(bitmap);\n    offscreen.scale(.5f, .5f);\n    for (int y : { 0, 64, 128, 192 } ) {\n        offscreen.drawBitmap(source, -y, -y);\n        canvas->drawBitmap(bitmap, y, y);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "91f474a11a2112cd5c88c40a9015048d",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::allocPixels_2"
+},
+    "SkBitmap_allocPixels_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t set1[5] = { 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 };\n    uint8_t set2[5] = { 0xAC, 0xA8, 0x89, 0x47, 0x87 };\n    SkBitmap bitmap;\n    bitmap.installPixels(SkImageInfo::Make(5, 1, kGray_8_SkColorType, kOpaque_SkAlphaType), set1, 5);\n    canvas->scale(10, 50);\n    canvas->drawBitmap(bitmap, 0, 0);\n    bitmap.allocPixels();\n    bitmap.eraseColor(SK_ColorBLACK);\n    canvas->drawBitmap(bitmap, 8, 0);\n    bitmap.setPixels(set2);\n    canvas->drawBitmap(bitmap, 16, 0);\n}",
+    "width": 256,
+    "height": 50,
+    "hash": "1219b38c788bf270fb20f8cd2d78cff8",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::allocPixels_3"
+},
+    "SkBitmap_allocPixels_4": {
+    "code": "class TinyAllocator : public SkBitmap::Allocator {\npublic:\n    bool allocPixelRef(SkBitmap* bitmap) override {\n        const SkImageInfo& info = bitmap->info();\n        if (info.height() * info.minRowBytes() > sizeof(storage)) {\n            return false;\n        }\n        sk_sp<SkPixelRef> pr = sk_sp<SkPixelRef>(\n                new SkPixelRef(info.width(), info.height(), storage, info.minRowBytes()));\n        bitmap->setPixelRef(std::move(pr), 0, 0);\n        return true;\n    }\n    char storage[16];\n};\n\nvoid draw(SkCanvas* canvas) {\n   TinyAllocator tinyAllocator;\n   SkBitmap bitmap;\n   bitmap.setInfo(SkImageInfo::MakeN32(2, 2, kOpaque_SkAlphaType));\n   if (bitmap.tryAllocPixels(&tinyAllocator)) {\n       bitmap.eraseColor(0xff55aa33);\n       bitmap.erase(0xffaa3355, SkIRect::MakeXYWH(1, 1, 1, 1));\n       canvas->scale(16, 16);\n       canvas->drawBitmap(bitmap, 0, 0);\n   }\n}\n",
+    "width": 256,
+    "height": 32,
+    "hash": "1b2800d23c9ea249b45c2c21a34b6d14",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::allocPixels_4"
+},
+    "SkBitmap_bounds": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(.5f, .5f);\n    SkIRect bounds = source.bounds();\n    for (int x : { 0, bounds.width() } ) {\n        for (int y : { 0, bounds.height() } ) {\n            canvas->drawBitmap(source, x, y);\n        }\n    }\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "3e9126152ff1cc592aef6facbcb5fc96",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::bounds()"
+},
+    "SkBitmap_erase": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32(2, 2, kPremul_SkAlphaType));\n    bitmap.erase(0x7fff7f3f, SkIRect::MakeWH(1, 1));\n    bitmap.erase(0x7f7f3fff, SkIRect::MakeXYWH(0, 1, 1, 1));\n    bitmap.erase(0x7f3fff7f, SkIRect::MakeXYWH(1, 0, 1, 1));\n    bitmap.erase(0x7f1fbf5f, SkIRect::MakeXYWH(1, 1, 1, 1));\n    canvas->scale(25, 25);\n    canvas->drawBitmap(bitmap, 0, 0);\n    canvas->drawBitmap(bitmap, .5f, .5f);\n}",
+    "width": 256,
+    "height": 70,
+    "hash": "2c5c4230ccd2861a5d15b7cd2764ab6e",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::erase()"
+},
+    "SkBitmap_eraseARGB": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32(1, 1, kPremul_SkAlphaType));\n    bitmap.eraseARGB(0x7f, 0xff, 0x7f, 0x3f);\n    canvas->scale(50, 50);\n    canvas->drawBitmap(bitmap, 0, 0);\n    canvas->drawBitmap(bitmap, .5f, .5f);\n}",
+    "width": 256,
+    "height": 80,
+    "hash": "67277b0a1003f340473a35982533561c",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::eraseARGB"
+},
+    "SkBitmap_eraseColor": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32(1, 1, kOpaque_SkAlphaType));\n    bitmap.eraseColor(SK_ColorRED);\n    canvas->scale(16, 16);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 20,
+    "hash": "418928dbfffa9eb00c8225530f44baf5",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::eraseColor"
+},
+    "SkBitmap_extractAlpha": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap alpha, bitmap;\n    bitmap.allocN32Pixels(100, 100);\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(0);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setColor(SK_ColorBLUE);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(20);\n    offscreen.drawCircle(50, 50, 39, paint);\n    offscreen.flush();\n    bitmap.extractAlpha(&alpha);\n    paint.setColor(SK_ColorRED);\n    canvas->drawBitmap(bitmap, 0, 0, &paint);\n    canvas->drawBitmap(alpha, 100, 0, &paint);\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "ab6577df079e6c70511cf2bfc6447b44",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::extractAlpha"
+},
+    "SkBitmap_extractAlpha_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto radiusToSigma = [](SkScalar radius) -> SkScalar {\n         static const SkScalar kBLUR_SIGMA_SCALE = 0.57735f;\n         return radius > 0 ? kBLUR_SIGMA_SCALE * radius + 0.5f : 0.0f;\n    };\n    SkBitmap alpha, bitmap;\n    bitmap.allocN32Pixels(100, 100);\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(0);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setColor(SK_ColorBLUE);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(20);\n    offscreen.drawCircle(50, 50, 39, paint);\n    offscreen.flush();\n    paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, radiusToSigma(25)));\n    SkIPoint offset;\n    bitmap.extractAlpha(&alpha, &paint, &offset);\n    paint.setColor(SK_ColorRED);\n    canvas->drawBitmap(bitmap, 0, -offset.fY, &paint);\n    canvas->drawBitmap(alpha, 100 + offset.fX, 0, &paint);\n}",
+    "width": 256,
+    "height": 160,
+    "hash": "092739b4cd5d732a27c07ced8ef45f01",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::extractAlpha_2"
+},
+    "SkBitmap_extractAlpha_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap alpha, bitmap;\n    bitmap.allocN32Pixels(100, 100);\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(0);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setColor(SK_ColorBLUE);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(20);\n    offscreen.drawCircle(50, 50, 39, paint);\n    offscreen.flush();\n    paint.setMaskFilter(SkMaskFilter::MakeBlur(kOuter_SkBlurStyle, 3));\n    SkIPoint offset;\n    bitmap.extractAlpha(&alpha, &paint, nullptr, &offset);\n    paint.setColor(SK_ColorRED);\n    canvas->drawBitmap(bitmap, 0, -offset.fY, &paint);\n    canvas->drawBitmap(alpha, 100 + offset.fX, 0, &paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "cd7543fa8c9f3cede46dc2d72eb8c4bd",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::extractAlpha_3"
+},
+    "SkBitmap_getBounds": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect bounds;\n    source.getBounds(&bounds);\n    bounds.offset(100, 100);\n    SkPaint paint;\n    paint.setColor(SK_ColorGRAY);\n    canvas->scale(.25f, .25f);\n    canvas->drawRect(bounds, paint);\n    canvas->drawBitmap(source, 40, 40);\n}",
+    "width": 256,
+    "height": 160,
+    "hash": "2431ebc7e7d1e91e6d9daafd0f7a478f",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::getBounds"
+},
+    "SkBitmap_getBounds_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect bounds;\n    source.getBounds(&bounds);\n    bounds.inset(100, 100);\n    SkBitmap bitmap;\n    source.extractSubset(&bitmap, bounds);\n    canvas->scale(.5f, .5f);\n    canvas->drawBitmap(bitmap, 10, 10);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "0c45da35172bc0a529b2faecddae62a2",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::getBounds_2"
+},
+    "SkBitmap_installPixels_2": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkRandom random;\n   SkBitmap bitmap;\n   const int width = 8;\n   const int height = 8;\n   uint32_t pixels[width * height];\n   for (unsigned x = 0; x < width * height; ++x) {\n       pixels[x] = random.nextU();\n   }\n   SkImageInfo info = SkImageInfo::MakeN32(width, height, kUnpremul_SkAlphaType);\n   if (bitmap.installPixels(info, pixels, info.minRowBytes())) {\n       canvas->scale(32, 32);\n       canvas->drawBitmap(bitmap, 0, 0);\n   }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "a7e04447b2081010c50d7920e80a6bb2",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::installPixels_2"
+},
+    "SkBitmap_installPixels_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t storage[][5] = {{ 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 },\n                            { 0xAC, 0xA8, 0x89, 0x47, 0x87 },\n                            { 0x4B, 0x25, 0x25, 0x25, 0x46 },\n                            { 0x90, 0x81, 0x25, 0x41, 0x33 },\n                            { 0x75, 0x55, 0x44, 0x20, 0x00 }};\n    SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kOpaque_SkAlphaType);\n    SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);\n    SkBitmap bitmap;\n    bitmap.installPixels(pixmap);\n    canvas->scale(10, 10);\n    canvas->drawBitmap(bitmap, 0, 0);\n    *pixmap.writable_addr8(2, 2) = 0xFF;\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 10, 0);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "6e2a8c9358b34aebd2ec586815fe9d3a",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::installPixels_3"
+},
+    "SkBitmap_notifyPixelsChanged": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.setInfo(SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType));\n    bitmap.allocPixels();\n    bitmap.eraseColor(SK_ColorRED);\n    canvas->scale(16, 16);\n    canvas->drawBitmap(bitmap, 0, 0);\n    *(SkPMColor*) bitmap.getPixels() = SkPreMultiplyColor(SK_ColorBLUE);\n    canvas->drawBitmap(bitmap, 2, 0);\n    bitmap.notifyPixelsChanged();\n    *(SkPMColor*) bitmap.getPixels() = SkPreMultiplyColor(SK_ColorGREEN);\n    canvas->drawBitmap(bitmap, 4, 0);\n}",
+    "width": 256,
+    "height": 20,
+    "hash": "8f463ed17b0ed4fb9c503a0ec71706f9",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::notifyPixelsChanged"
+},
+    "SkBitmap_readPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int width = 256;\n    const int height = 64;\n    SkImageInfo srcInfo = SkImageInfo::MakeN32Premul(width, height);\n    SkColor  gradColors[] = { 0xFFAA3300, 0x7F881122 };\n    SkPoint  gradPoints[] = { { 0, 0 }, { 256, 0 } };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr,\n                    SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode));\n    SkBitmap bitmap;\n    bitmap.allocPixels(srcInfo);\n    SkCanvas srcCanvas(bitmap);\n    srcCanvas.drawRect(SkRect::MakeWH(width, height), paint);\n    canvas->drawBitmap(bitmap, 0, 0);\n    SkImageInfo dstInfo = srcInfo.makeColorType(kARGB_4444_SkColorType);\n    std::vector<int16_t> dstPixels;\n    dstPixels.resize(height * width);\n    bitmap.readPixels(dstInfo, &dstPixels.front(), width * 2, 0, 0);\n    SkPixmap dstPixmap(dstInfo, &dstPixels.front(), width * 2);\n    bitmap.installPixels(dstPixmap);\n    canvas->drawBitmap(bitmap, 0, 64);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "b2cbbbbcffb618865d8aae3bc04b2a62",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::readPixels"
+},
+    "SkBitmap_readPixels_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<int32_t> srcPixels;\n    srcPixels.resize(source.height() * source.rowBytes());\n    for (int y = 0; y < 4; ++y) {\n        for (int x = 0; x < 4; ++x) {\n            SkPixmap pixmap(SkImageInfo::MakeN32Premul(source.width() / 4, source.height() / 4),\n                    &srcPixels.front() + x * source.height() * source.width() / 4 +\n                    y * source.width() / 4, source.rowBytes());\n            source.readPixels(pixmap, x * source.width() / 4, y * source.height() / 4);\n        }\n    }\n    canvas->scale(.5f, .5f);\n    SkBitmap bitmap;\n    bitmap.installPixels(SkImageInfo::MakeN32Premul(source.width(), source.height()),\n                             &srcPixels.front(), source.rowBytes());\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "e9f70cbc9827097449a386ec7a8a8188",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::readPixels_2"
+},
+    "SkBitmap_readPixels_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<int32_t> srcPixels;\n    srcPixels.resize(source.height() * source.width() * 8);\n    for (int i = 0;  i < 2; ++i) {\n    SkPixmap pixmap(SkImageInfo::Make(source.width() * 2, source.height(),\n                    i ? kRGBA_8888_SkColorType : kBGRA_8888_SkColorType, kPremul_SkAlphaType),\n                    &srcPixels.front() + i * source.width(), source.rowBytes() * 2);\n        source.readPixels(pixmap);\n    }\n    canvas->scale(.25f, .25f);\n    SkBitmap bitmap;\n    bitmap.installPixels(SkImageInfo::MakeN32Premul(source.width() * 2, source.height()),\n                         &srcPixels.front(), source.rowBytes() * 2);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "4590fbf052659d6e629fbfd827081ae5",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::readPixels_3"
+},
+    "SkBitmap_readyToDraw": {
+    "code": "void draw(SkCanvas* canvas) {\n    if (source.readyToDraw()) {\n        canvas->drawBitmap(source, 10, 10);\n    }\n}",
+    "width": 256,
+    "height": 160,
+    "hash": "e89c78ca992e2e789ed50944fe68f920",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::readyToDraw"
+},
+    "SkBitmap_setInfo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.setInfo(SkImageInfo::MakeN32(44, 16, kOpaque_SkAlphaType));\n    bitmap.allocPixels();\n    bitmap.eraseColor(SK_ColorGREEN);\n    SkCanvas offscreen(bitmap);\n    SkPaint paint;\n    offscreen.drawString(\"!@#$%\", 0, 12, paint);\n    canvas->scale(6, 6);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "599ab64d0aea005498176249bbfb64eb",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::setInfo"
+},
+    "SkBitmap_setIsVolatile": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.setInfo(SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType));\n    bitmap.allocPixels();\n    bitmap.eraseColor(SK_ColorRED);\n    canvas->scale(16, 16);\n    canvas->drawBitmap(bitmap, 0, 0);\n    *(SkPMColor*) bitmap.getPixels() = SkPreMultiplyColor(SK_ColorBLUE);\n    canvas->drawBitmap(bitmap, 2, 0);\n    bitmap.setIsVolatile(true);\n    *(SkPMColor*) bitmap.getPixels() = SkPreMultiplyColor(SK_ColorGREEN);\n    canvas->drawBitmap(bitmap, 4, 0);\n}",
+    "width": 256,
+    "height": 20,
+    "hash": "e8627a4df659b896402f89a91326618f",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::setIsVolatile"
+},
+    "SkBitmap_setPixelRef": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.setInfo(SkImageInfo::Make(source.width() - 5, source.height() - 5,\n                   kGray_8_SkColorType, kOpaque_SkAlphaType), source.rowBytes());\n    bitmap.setPixelRef(sk_ref_sp(source.pixelRef()), 5, 5);\n    canvas->drawBitmap(bitmap, 10, 10);\n}",
+    "width": 256,
+    "height": 140,
+    "hash": "f98cc0451c6e77a8833d261c9a484c5f",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::setPixelRef"
+},
+    "SkBitmap_setPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t set1[5] = { 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 };\n    uint8_t set2[5] = { 0xAC, 0xA8, 0x89, 0x47, 0x87 };\n    SkBitmap bitmap;\n    bitmap.installPixels(SkImageInfo::Make(5, 1, kGray_8_SkColorType, kOpaque_SkAlphaType), set1, 5);\n    canvas->scale(10, 50);\n    canvas->drawBitmap(bitmap, 0, 0);\n    bitmap.setPixels(set2);\n    canvas->drawBitmap(bitmap, 10, 0);\n}",
+    "width": 256,
+    "height": 50,
+    "hash": "f0db16e06c9a1436917c8179f8c1718f",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::setPixels"
+},
+    "SkBitmap_tryAllocN32Pixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    if (bitmap.tryAllocN32Pixels(80, 80)) {\n        bitmap.eraseColor(SK_ColorTRANSPARENT);\n        bitmap.erase(0x7f3f7fff, SkIRect::MakeWH(50, 30));\n        bitmap.erase(0x3f7fff3f, SkIRect::MakeXYWH(20, 10, 50, 30));\n        bitmap.erase(0x5fff3f7f, SkIRect::MakeXYWH(40, 20, 50, 30));\n        canvas->drawBitmap(bitmap, 0, 0);\n        for (int x : { 0, 30, 60, 90 } ) {\n            canvas->drawBitmap(bitmap, x, 70);\n        }\n    }\n}",
+    "width": 256,
+    "height": 160,
+    "hash": "a2b1e0910f37066f15ae56368775a6d8",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::tryAllocN32Pixels"
+},
+    "SkBitmap_tryAllocPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    SkImageInfo info = SkImageInfo::Make(64, 256, kGray_8_SkColorType, kOpaque_SkAlphaType);\n    if (bitmap.tryAllocPixels(info, 0)) {\n        SkCanvas offscreen(bitmap);\n        offscreen.scale(.5f, .5f);\n        for (int x : { 0, 64, 128, 192 } ) {\n            offscreen.drawBitmap(source, -x, 0);\n            canvas->drawBitmap(bitmap, x, 0);\n        }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "34479d5aa23ce9f5e334b0786c9edb22",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::tryAllocPixels"
+},
+    "SkBitmap_tryAllocPixels_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    if (bitmap.tryAllocPixels(SkImageInfo::Make(64, 64, kGray_8_SkColorType, kOpaque_SkAlphaType))) {\n        SkCanvas offscreen(bitmap);\n        offscreen.scale(.25f, .5f);\n        for (int y : { 0, 64, 128, 192 } ) {\n            offscreen.drawBitmap(source, -y, -y);\n            canvas->drawBitmap(bitmap, y, y);\n        }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "7ef3d043c4c5885649e591dd7dca92ff",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::tryAllocPixels_2"
+},
+    "SkBitmap_tryAllocPixels_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t set1[5] = { 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 };\n    SkBitmap bitmap;\n    bitmap.installPixels(SkImageInfo::Make(5, 1, kGray_8_SkColorType, kOpaque_SkAlphaType), set1, 5);\n    canvas->scale(10, 50);\n    canvas->drawBitmap(bitmap, 0, 0);\n    if (bitmap.tryAllocPixels()) {\n        bitmap.eraseColor(SK_ColorBLACK);\n        canvas->drawBitmap(bitmap, 8, 0);\n        bitmap.setPixels(set1);\n        canvas->drawBitmap(bitmap, 16, 0);\n    }\n}",
+    "width": 256,
+    "height": 50,
+    "hash": "720e4c053fae9e929ab6518b47e49370",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::tryAllocPixels_3"
+},
+    "SkBitmap_tryAllocPixels_4": {
+    "code": "class LargePixelRef : public SkPixelRef {\npublic:\n    LargePixelRef(const SkImageInfo& info, char* storage, size_t rowBytes)\n        : SkPixelRef(info.width(), info.height(), storage, rowBytes) {\n    }\n    ~LargePixelRef() override {\n        delete[] (char* ) this->pixels();\n    }\n};\nclass LargeAllocator : public SkBitmap::Allocator {\npublic:\n    bool allocPixelRef(SkBitmap* bitmap) override {\n        const SkImageInfo& info = bitmap->info();\n        uint64_t rowBytes = info.minRowBytes64();\n        uint64_t size = info.height() * rowBytes;\n        char* addr = new char[size];\n        if (nullptr == addr) {\n            return false;\n        }\n        sk_sp<SkPixelRef> pr = sk_sp<SkPixelRef>(new LargePixelRef(info, addr, rowBytes));\n        if (!pr) {\n            return false;\n        }\n        bitmap->setPixelRef(std::move(pr), 0, 0);\n        return true;\n    }\n};\n\nvoid draw(SkCanvas* canvas) {\n   LargeAllocator largeAllocator;\n   SkBitmap bitmap;\n   int width = 100; // make this 20000\n   int height = 100; // and this 100000 to allocate 8 gigs on a 64-bit platform\n   bitmap.setInfo(SkImageInfo::MakeN32(width, height, kOpaque_SkAlphaType));\n   if (bitmap.tryAllocPixels(&largeAllocator)) {\n       bitmap.eraseColor(0xff55aa33);\n       canvas->drawBitmap(bitmap, 0, 0);\n   }\n}\n",
+    "width": 256,
+    "height": 100,
+    "hash": "eb6f861ca1839146d26e40d56c2a001c",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::tryAllocPixels_4"
+},
+    "SkBitmap_writePixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<int32_t> srcPixels;\n    int width = image->width();\n    int height = image->height();\n    srcPixels.resize(height * width  * 4);\n    SkPixmap pixmap(SkImageInfo::MakeN32Premul(width, height), (const void*) &srcPixels.front(),\n                    width * 4);\n    image->readPixels(pixmap, 0, 0);\n    canvas->scale(.5f, .5f);\n    width /= 4;\n    height /= 4;\n    for (int y = 0; y < 4; ++y) {\n        for (int x = 0; x < 4; ++x) {\n            SkBitmap bitmap;\n            bitmap.allocPixels(SkImageInfo::MakeN32Premul(width, height));\n            bitmap.writePixels(pixmap, -y * width, -x * height);\n            canvas->drawBitmap(bitmap, x * width, y * height);\n        }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "9b3133a6673d2514d166398adbe1f9f4",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::writePixels"
+},
+    "SkBitmap_writePixels_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(2, 2));\n    bitmap.eraseColor(SK_ColorGREEN);\n    SkPMColor color = 0xFF5599BB;\n    SkPixmap src(SkImageInfo::MakeN32Premul(1, 1), &color, 4);\n    bitmap.writePixels(src);\n    canvas->scale(40, 40);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 80,
+    "hash": "faa5dfa466f6e16c07c124d971f32679",
+    "file": "SkBitmap_Reference",
+    "name": "SkBitmap::writePixels_2"
+},
+    "SkCanvas_PointMode": {
+    "code": "void draw(SkCanvas* canvas) {\n  SkPaint paint;\n  paint.setStyle(SkPaint::kStroke_Style);\n  paint.setStrokeWidth(10);\n  SkPoint points[] = {{64, 32}, {96, 96}, {32, 96}};\n  canvas->drawPoints(SkCanvas::kPoints_PointMode, 3, points, paint);\n  canvas->translate(128, 0);\n  canvas->drawPoints(SkCanvas::kLines_PointMode, 3, points, paint);\n  canvas->translate(0, 128);\n  canvas->drawPoints(SkCanvas::kPolygon_PointMode, 3, points, paint);\n  SkPath path;\n  path.addPoly(points, 3, false);\n  canvas->translate(-128, 0);\n  canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "292b4b2008961b6f612434d3121fc4ce",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::PointMode"
+},
+    "SkCanvas_SaveLayerFlagsSet": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint redPaint, bluePaint, scalePaint;\n    redPaint.setColor(SK_ColorRED);\n    canvas->drawCircle(21, 21, 8, redPaint);\n    bluePaint.setColor(SK_ColorBLUE);\n    canvas->drawCircle(31, 21, 8, bluePaint);\n    SkMatrix matrix;\n    matrix.setScale(4, 4);\n    scalePaint.setAlpha(0x40);\n    scalePaint.setImageFilter(\n            SkImageFilter::MakeMatrixFilter(matrix, kNone_SkFilterQuality, nullptr));\n    SkCanvas::SaveLayerRec saveLayerRec(nullptr, &scalePaint,\n            SkCanvas::kInitWithPrevious_SaveLayerFlag);\n    canvas->saveLayer(saveLayerRec);\n    canvas->restore();\n}\n",
+    "width": 256,
+    "height": 160,
+    "hash": "05db6a937225e8e31ae3481173d25dae",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::SaveLayerFlagsSet"
+},
+    "SkCanvas_SaveLayerRec": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint redPaint, bluePaint;\n    redPaint.setAntiAlias(true);\n    redPaint.setColor(SK_ColorRED);\n    canvas->drawCircle(21, 21, 8, redPaint);\n    bluePaint.setColor(SK_ColorBLUE);\n    canvas->drawCircle(31, 21, 8, bluePaint);\n    SkMatrix matrix;\n    matrix.setScale(4, 4);\n    auto scaler = SkImageFilter::MakeMatrixFilter(matrix, kNone_SkFilterQuality, nullptr);\n    SkCanvas::SaveLayerRec saveLayerRec(nullptr, nullptr, scaler.get(), 0);\n    canvas->saveLayer(saveLayerRec);\n    canvas->drawCircle(125, 85, 8, redPaint);\n    canvas->restore();\n}\n",
+    "width": 256,
+    "height": 160,
+    "hash": "ee8c0b120234e27364f8c9a786cf8f89",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::SaveLayerRec"
+},
+    "SkCanvas_SrcRectConstraint": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap redBorder;\n    redBorder.allocPixels(SkImageInfo::MakeN32Premul(4, 4));\n    SkCanvas checkRed(redBorder);\n    checkRed.clear(SK_ColorRED);\n    uint32_t checkers[][2] = { { SK_ColorBLACK, SK_ColorWHITE },\n                               { SK_ColorWHITE, SK_ColorBLACK } };\n    checkRed.writePixels(\n            SkImageInfo::MakeN32Premul(2, 2), (void*) checkers, sizeof(checkers[0]), 1, 1);\n    canvas->scale(16, 16);\n    canvas->drawBitmap(redBorder, 0, 0, nullptr);\n    canvas->resetMatrix();\n    sk_sp<SkImage> image = SkImage::MakeFromBitmap(redBorder);\n    SkPaint lowPaint;\n    lowPaint.setFilterQuality(kLow_SkFilterQuality);\n    for (auto constraint : { SkCanvas::kStrict_SrcRectConstraint,\n                             SkCanvas::kFast_SrcRectConstraint } ) {\n        canvas->translate(80, 0);\n        canvas->drawImageRect(image.get(), SkRect::MakeLTRB(1, 1, 3, 3),\n                SkRect::MakeLTRB(16, 16, 48, 48), &lowPaint, constraint);\n    }\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "5df49d1f4da37275a1f10ef7f1a749f0",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::SrcRectConstraint"
+},
+    "SkCanvas_accessTopLayerPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    if (canvas->accessTopLayerPixels(nullptr, nullptr)) {\n         canvas->clear(SK_ColorRED);\n    } else {\n         canvas->clear(SK_ColorBLUE);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "38d0d6ca9bea146d31bcbec197856359",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::accessTopLayerPixels"
+},
+    "SkCanvas_accessTopLayerPixels_a": {
+    "code": "void draw(SkCanvas* canvas) {\n  SkPaint paint;\n  paint.setTextSize(100);\n  canvas->drawString(\"ABC\", 20, 160, paint);\n  SkRect layerBounds = SkRect::MakeXYWH(32, 32, 192, 192);\n  canvas->saveLayerAlpha(&layerBounds, 128);\n  canvas->clear(SK_ColorWHITE);\n  canvas->drawString(\"DEF\", 20, 160, paint);\n  SkImageInfo imageInfo;\n  size_t rowBytes;\n  SkIPoint origin;\n  uint32_t* access = (uint32_t*) canvas->accessTopLayerPixels(&imageInfo, &rowBytes, &origin);\n  if (access) {\n    int h = imageInfo.height();\n    int v = imageInfo.width();\n    int rowWords = rowBytes / sizeof(uint32_t);\n    for (int y = 0; y < h; ++y) {\n        int newY = (y - h / 2) * 2 + h / 2;\n        if (newY < 0 || newY >= h) {\n            continue;\n        }\n        for (int x = 0; x < v; ++x) {\n            int newX = (x - v / 2) * 2 + v / 2;\n            if (newX < 0 || newX >= v) {\n                continue;\n            }\n            if (access[y * rowWords + x] == SK_ColorBLACK) {\n                access[newY * rowWords + newX] = SK_ColorGRAY;\n            }\n        }\n    }\n  }\n  canvas->restore();\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "a7ac9c21bbabcdeeca00f72a61cd0f3e",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::accessTopLayerPixels_2"
+},
+    "SkCanvas_clear": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->save();\n    canvas->clipRect(SkRect::MakeWH(256, 128));\n    canvas->clear(SkColorSetARGB(0x80, 0xFF, 0x00, 0x00));\n    canvas->restore();\n    canvas->save();\n    canvas->clipRect(SkRect::MakeWH(150, 192));\n    canvas->clear(SkColorSetARGB(0x80, 0x00, 0xFF, 0x00));\n    canvas->restore();\n    canvas->clipRect(SkRect::MakeWH(75, 256));\n    canvas->clear(SkColorSetARGB(0x80, 0x00, 0x00, 0xFF));\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "8c4499e322f10153dcd9b0b9806233b9",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::clear()"
+},
+    "SkCanvas_clipPath": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPath path;\n    path.addRect({20, 30, 100, 110});\n    path.setFillType(SkPath::kInverseWinding_FillType);\n    canvas->save();\n    canvas->clipPath(path, SkClipOp::kDifference, false);\n    canvas->drawCircle(70, 100, 60, paint);\n    canvas->restore();\n    canvas->translate(100, 100);\n    path.setFillType(SkPath::kWinding_FillType);\n    canvas->clipPath(path, SkClipOp::kIntersect, false);\n    canvas->drawCircle(70, 100, 60, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "ee47ae6b813bfaa55e1a7b7c053ed60d",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::clipPath"
+},
+    "SkCanvas_clipPath_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPath path;\n    path.addRect({20, 15, 100, 95});\n    path.addRect({50, 65, 130, 135});\n    path.setFillType(SkPath::kWinding_FillType);\n    canvas->save();\n    canvas->clipPath(path, SkClipOp::kIntersect);\n    canvas->drawCircle(70, 85, 60, paint);\n    canvas->restore();\n    canvas->translate(100, 100);\n    path.setFillType(SkPath::kEvenOdd_FillType);\n    canvas->clipPath(path, SkClipOp::kIntersect);\n    canvas->drawCircle(70, 85, 60, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "7856755c1bf8431c286c734b353345ad",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::clipPath_2"
+},
+    "SkCanvas_clipPath_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPath path;\n    SkPoint poly[] = {{20, 20}, { 80, 20}, { 80,  80}, {40,  80},\n                      {40, 40}, {100, 40}, {100, 100}, {20, 100}};\n    path.addPoly(poly, SK_ARRAY_COUNT(poly), true);\n    path.setFillType(SkPath::kWinding_FillType);\n    canvas->save();\n    canvas->clipPath(path, SkClipOp::kIntersect);\n    canvas->drawCircle(50, 50, 45, paint);\n    canvas->restore();\n    canvas->translate(100, 100);\n    path.setFillType(SkPath::kEvenOdd_FillType);\n    canvas->clipPath(path, SkClipOp::kIntersect);\n    canvas->drawCircle(50, 50, 45, paint);\n}\n",
+    "width": 256,
+    "height": 212,
+    "hash": "187a7ae77a8176e417181411988534b6",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::clipPath_3"
+},
+    "SkCanvas_clipRRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->clear(SK_ColorWHITE);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setColor(0x8055aaff);\n    SkRRect oval;\n    oval.setOval({10, 20, 90, 100});\n    canvas->clipRRect(oval, SkClipOp::kIntersect, true);\n    canvas->drawCircle(70, 100, 60, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "182ef48ab5e04ba3578496fda8d9fa36",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::clipRRect"
+},
+    "SkCanvas_clipRRect_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColor(0x8055aaff);\n    auto oval = SkRRect::MakeOval({10, 20, 90, 100});\n    canvas->clipRRect(oval, SkClipOp::kIntersect);\n    canvas->drawCircle(70, 100, 60, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "ef6ae2eaae6761130ce38065d0364abd",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::clipRRect_2"
+},
+    "SkCanvas_clipRRect_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    auto oval = SkRRect::MakeRectXY({10, 20, 90, 100}, 9, 13);\n    canvas->clipRRect(oval, true);\n    canvas->drawCircle(70, 100, 60, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "f583114580b2176fe3e75b0994476a84",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::clipRRect_3"
+},
+    "SkCanvas_clipRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->rotate(10);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    for (auto alias: { false, true } ) {\n        canvas->save();\n        canvas->clipRect(SkRect::MakeWH(90, 80), SkClipOp::kIntersect, alias);\n        canvas->drawCircle(100, 60, 60, paint);\n        canvas->restore();\n        canvas->translate(80, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "6a614faa0fbcf19958b5559c19b02d0f",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::clipRect"
+},
+    "SkCanvas_clipRect_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    for (SkClipOp op: { SkClipOp::kIntersect, SkClipOp::kDifference } ) {\n        canvas->save();\n        canvas->clipRect(SkRect::MakeWH(90, 120), op, false);\n        canvas->drawCircle(100, 100, 60, paint);\n        canvas->restore();\n        canvas->translate(80, 0);\n    }\n}\n",
+    "width": 280,
+    "height": 192,
+    "hash": "13bbc5fa5597a6cd4d704b419dbc66d9",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::clipRect_2"
+},
+    "SkCanvas_clipRect_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->clear(SK_ColorWHITE);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setColor(0x8055aaff);\n    SkRect clipRect = { 0, 0, 87.4f, 87.4f };\n    for (auto alias: { false, true } ) {\n        canvas->save();\n        canvas->clipRect(clipRect, SkClipOp::kIntersect, alias);\n        canvas->drawCircle(67, 67, 60, paint);\n        canvas->restore();\n        canvas->save();\n        canvas->clipRect(clipRect, SkClipOp::kDifference, alias);\n        canvas->drawCircle(67, 67, 60, paint);\n        canvas->restore();\n        canvas->translate(120, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 133,
+    "hash": "1d4e0632c97e42692775d834fe10aa99",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::clipRect_3"
+},
+    "SkCanvas_clipRegion": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkIRect iRect = {30, 40, 120, 130 };\n    SkRegion region(iRect);\n    canvas->rotate(10);\n    canvas->save();\n    canvas->clipRegion(region, SkClipOp::kIntersect);\n    canvas->drawCircle(50, 50, 45, paint);\n    canvas->restore();\n    canvas->translate(100, 100);\n    canvas->clipRect(SkRect::Make(iRect), SkClipOp::kIntersect);\n    canvas->drawCircle(50, 50, 45, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "7bb57c0e456c5fda2c2cca4abb68b19e",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::clipRegion"
+},
+    "SkCanvas_concat": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(80);\n    paint.setTextScaleX(.3);\n    SkMatrix matrix;\n    SkRect rect[2] = {{ 10, 20, 90, 110 }, { 40, 130, 140, 180 }};\n    matrix.setRectToRect(rect[0], rect[1], SkMatrix::kFill_ScaleToFit);\n    canvas->drawRect(rect[0], paint);\n    canvas->drawRect(rect[1], paint);\n    paint.setColor(SK_ColorWHITE);\n    canvas->drawString(\"Here\", rect[0].fLeft + 10, rect[0].fBottom - 10, paint);\n    canvas->concat(matrix);\n    canvas->drawString(\"There\", rect[0].fLeft + 10, rect[0].fBottom - 10, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "8f6818b25a92a88638ad99b2dd293f61",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::concat()"
+},
+    "SkCanvas_destructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(200, 200));\n    {\n        SkCanvas offscreen(bitmap);\n        SkPaint paint;\n        paint.setTextSize(100);\n        offscreen.drawString(\"ABC\", 20, 160, paint);\n        SkRect layerBounds = SkRect::MakeXYWH(32, 32, 192, 192);\n        offscreen.saveLayerAlpha(&layerBounds, 128);\n        offscreen.clear(SK_ColorWHITE);\n        offscreen.drawString(\"DEF\", 20, 160, paint);\n    }\n    canvas->drawBitmap(bitmap, 0, 0, nullptr);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "b7bc91ff16c9b9351b2a127f35394b82",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::~SkCanvas()"
+},
+    "SkCanvas_drawAnnotation": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char text[] = \"Click this link!\";\n    SkRect bounds;\n    SkPaint paint;\n    paint.setTextSize(40);\n    (void)paint.measureText(text, strlen(text), &bounds);\n    const char url[] = \"https://www.google.com/\";\n    sk_sp<SkData> urlData(SkData::MakeWithCString(url));\n    canvas->drawAnnotation(bounds, \"url_key\", urlData.get());\n}",
+    "width": 256,
+    "height": 1,
+    "hash": "00b430bd80d740e19c6d020a940f56d5",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawAnnotation"
+},
+    "SkCanvas_drawAnnotation_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char text[] = \"Click this link!\";\n    SkRect bounds;\n    SkPaint paint;\n    paint.setTextSize(40);\n    (void)paint.measureText(text, strlen(text), &bounds);\n    const char url[] = \"https://www.google.com/\";\n    sk_sp<SkData> urlData(SkData::MakeWithCString(url));\n    canvas->drawAnnotation(bounds, \"url_key\", urlData.get());\n}",
+    "width": 256,
+    "height": 1,
+    "hash": "00b430bd80d740e19c6d020a940f56d5",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawAnnotation_2"
+},
+    "SkCanvas_drawArc": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkRect oval = { 4, 4, 60, 60};\n    for (auto useCenter : { false, true } ) {\n        for (auto style : { SkPaint::kFill_Style, SkPaint::kStroke_Style } ) {\n            paint.setStyle(style);\n            for (auto degrees : { 45, 90, 180, 360} ) {\n                canvas->drawArc(oval, 0, degrees , useCenter, paint);\n                canvas->translate(64, 0);\n            }\n            canvas->translate(-256, 64);\n        }\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "11f0fbe7b30d776913c2e7c92c02ff57",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawArc"
+},
+    "SkCanvas_drawArc_a": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(4);\n    SkRect oval = { 4, 4, 60, 60};\n    float intervals[] = { 5, 5 };\n    paint.setPathEffect(SkDashPathEffect::Make(intervals, 2, 2.5f));\n    for (auto degrees : { 270, 360, 540, 720 } ) {\n        canvas->drawArc(oval, 0, degrees, false, paint);\n        canvas->translate(64, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "e91dbe45974489b8962c815017b7914f",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawArc_2"
+},
+    "SkCanvas_drawAtlas": {
+    "code": "void draw(SkCanvas* canvas) {\n  // SkBitmap source = mandrill;\n  SkRSXform xforms[] = { { .5f, 0, 0, 0 }, {0, .5f, 200, 100 } };\n  SkRect tex[] = { { 0, 0, 250, 250 }, { 0, 0, 250, 250 } };\n  SkColor colors[] = { 0x7f55aa00, 0x7f3333bf };\n  const SkImage* imagePtr = image.get();\n  canvas->drawAtlas(imagePtr, xforms, tex, colors, 2, SkBlendMode::kSrcOver, nullptr, nullptr);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "1df575f9b8132306ce0552a2554ed132",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawAtlas"
+},
+    "SkCanvas_drawAtlas_2": {
+    "code": "void draw(SkCanvas* canvas) {\n  // SkBitmap source = mandrill;\n  SkRSXform xforms[] = { { .5f, 0, 0, 0 }, {0, .5f, 200, 100 } };\n  SkRect tex[] = { { 0, 0, 250, 250 }, { 0, 0, 250, 250 } };\n  SkColor colors[] = { 0x7f55aa00, 0x7f3333bf };\n  SkPaint paint;\n  paint.setAlpha(127);\n  canvas->drawAtlas(image, xforms, tex, colors, 2, SkBlendMode::kPlus, nullptr, &paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "0e66a8f230a8d531bcef9f5ebdc5aac1",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawAtlas_2"
+},
+    "SkCanvas_drawAtlas_3": {
+    "code": "void draw(SkCanvas* canvas) {\n  // sk_sp<SkImage> image = mandrill;\n  SkRSXform xforms[] = { { .5f, 0, 0, 0 }, {0, .5f, 200, 100 } };\n  SkRect tex[] = { { 0, 0, 250, 250 }, { 0, 0, 250, 250 } };\n  const SkImage* imagePtr = image.get();\n  canvas->drawAtlas(imagePtr, xforms, tex, 2, nullptr, nullptr);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "8dc0d0fdeab20bbc21cac6874ddbefcd",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawAtlas_3"
+},
+    "SkCanvas_drawAtlas_4": {
+    "code": "void draw(SkCanvas* canvas) {\n  // sk_sp<SkImage> image = mandrill;\n  SkRSXform xforms[] = { { 1, 0, 0, 0 }, {0, 1, 300, 100 } };\n  SkRect tex[] = { { 0, 0, 200, 200 }, { 200, 0, 400, 200 } };\n  canvas->drawAtlas(image, xforms, tex, 2, nullptr, nullptr);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "c093c2b14bd3e6171ede7cd4049d9b57",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawAtlas_4"
+},
+    "SkCanvas_drawBitmap": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t pixels[][8] = { { 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00},\n                            { 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00},\n                            { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00},\n                            { 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF},\n                            { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},\n                            { 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00},\n                            { 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00},\n                            { 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF} };\n    SkBitmap bitmap;\n    bitmap.installPixels(SkImageInfo::MakeA8(8, 8),\n            (void*) pixels, sizeof(pixels[0]));\n    SkPaint paint;\n    canvas->scale(4, 4);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xFF007F00} ) {\n        paint.setColor(color);\n        canvas->drawBitmap(bitmap, 0, 0, &paint);\n        canvas->translate(12, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "4a521be1f850058541e136a808c65e78",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawBitmap"
+},
+    "SkCanvas_drawBitmapLattice": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect center = { 20, 10, 50, 40 };\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(60, 60));\n    SkCanvas bitCanvas(bitmap);\n    SkPaint paint;\n    SkColor gray = 0xFF000000;\n    int left = 0;\n    for (auto right: { center.fLeft, center.fRight, bitmap.width() } ) {\n        int top = 0;\n        for (auto bottom: { center.fTop, center.fBottom, bitmap.height() } ) {\n            paint.setColor(gray);\n            bitCanvas.drawIRect(SkIRect::MakeLTRB(left, top, right, bottom), paint);\n            gray += 0x001f1f1f;\n            top = bottom;\n        }\n        left = right;\n    }\n    const int xDivs[] = { center.fLeft, center.fRight };\n    const int yDivs[] = { center.fTop, center.fBottom };\n    SkCanvas::Lattice::RectType fillTypes[3][3];\n    memset(fillTypes, 0, sizeof(fillTypes));\n    fillTypes[1][1] = SkCanvas::Lattice::kTransparent;\n    SkColor dummy[9];  // temporary pending bug fix\n    SkCanvas::Lattice lattice = { xDivs, yDivs, fillTypes[0], SK_ARRAY_COUNT(xDivs),\n         SK_ARRAY_COUNT(yDivs), nullptr, dummy };\n    for (auto dest: { 20, 30, 40, 60, 90 } ) {\n        canvas->drawBitmapLattice(bitmap, lattice, SkRect::MakeWH(dest, 110 - dest), nullptr);\n        canvas->translate(dest + 4, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "c5bfa944e17ba4a4400dc799f032069c",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawBitmapLattice"
+},
+    "SkCanvas_drawBitmapNine": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect center = { 20, 10, 50, 40 };\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(60, 60));\n    SkCanvas bitCanvas(bitmap);\n    SkPaint paint;\n    SkColor gray = 0xFF000000;\n    int left = 0;\n    for (auto right: { center.fLeft, center.fRight, bitmap.width() } ) {\n        int top = 0;\n        for (auto bottom: { center.fTop, center.fBottom, bitmap.height() } ) {\n            paint.setColor(gray);\n            bitCanvas.drawIRect(SkIRect::MakeLTRB(left, top, right, bottom), paint);\n            gray += 0x001f1f1f;\n            top = bottom;\n        }\n        left = right;\n    }\n    for (auto dest: { 20, 30, 40, 60, 90 } ) {\n        canvas->drawBitmapNine(bitmap, center, SkRect::MakeWH(dest, 110 - dest), nullptr);\n        canvas->translate(dest + 4, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "e99e7be0d8f67dfacbecf85df585433d",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawBitmapNine"
+},
+    "SkCanvas_drawBitmapRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t pixels[][8] = { { 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00},\n                            { 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00},\n                            { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00},\n                            { 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF},\n                            { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},\n                            { 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00},\n                            { 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00},\n                            { 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00} };\n    SkBitmap bitmap;\n    bitmap.installPixels(SkImageInfo::MakeA8(8, 8),\n            (void*) pixels, sizeof(pixels[0]));\n    SkPaint paint;\n    paint.setMaskFilter(SkMaskFilter::MakeBlur(kSolid_SkBlurStyle, 6));\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xFF007F00} ) {\n        paint.setColor(color);\n        canvas->drawBitmapRect(bitmap, SkRect::MakeWH(8, 8), SkRect::MakeWH(32, 32), &paint);\n        canvas->translate(48, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "7d04932f2a259cc70d6e45cd25a6feb6",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawBitmapRect"
+},
+    "SkCanvas_drawBitmapRect_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t pixels[][8] = { { 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00},\n                            { 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00},\n                            { 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF},\n                            { 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF},\n                            { 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF},\n                            { 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF},\n                            { 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00},\n                            { 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00} };\n    SkBitmap bitmap;\n    bitmap.installPixels(SkImageInfo::MakeA8(8, 8),\n            (void*) pixels, sizeof(pixels[0]));\n    SkPaint paint;\n    paint.setFilterQuality(kHigh_SkFilterQuality);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xFF007F00, 0xFF7f007f} ) {\n        paint.setColor(color);\n        canvas->drawBitmapRect(bitmap, SkIRect::MakeWH(8, 8), SkRect::MakeWH(32, 32), &paint);\n        canvas->translate(48.25f, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "0a3c6d2459566e58cee7d4910655ee21",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawBitmapRect_2"
+},
+    "SkCanvas_drawBitmapRect_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint32_t pixels[][2] = { { 0x00000000, 0x55550000},\n                             { 0xAAAA0000, 0xFFFF0000} };\n    SkBitmap bitmap;\n    bitmap.installPixels(SkImageInfo::MakeN32Premul(2, 2),\n            (void*) pixels, sizeof(pixels[0]));\n    SkPaint paint;\n    canvas->scale(4, 4);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {\n        paint.setColorFilter(SkColorFilter::MakeModeFilter(color, SkBlendMode::kPlus));\n        canvas->drawBitmapRect(bitmap, SkRect::MakeWH(8, 8), &paint);\n        canvas->translate(8, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "bdbeac3c97f60a63987b1cc8e1f1e91e",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawBitmapRect_3"
+},
+    "SkCanvas_drawCircle": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    canvas->drawCircle(128, 128, 90, paint);\n    paint.setColor(SK_ColorWHITE);\n    canvas->drawCircle(86, 86, 20, paint);\n    canvas->drawCircle(160, 76, 20, paint);\n    canvas->drawCircle(140, 150, 35, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "841229e25ca9dfb68bd0dc4dfff356eb",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawCircle"
+},
+    "SkCanvas_drawCircle_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    canvas->drawCircle(128, 128, 90, paint);\n    paint.setColor(SK_ColorWHITE);\n    canvas->drawCircle({86, 86}, 20, paint);\n    canvas->drawCircle({160, 76}, 20, paint);\n    canvas->drawCircle({140, 150}, 35, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "9303ffae45ddd0b0a1f93d816a1762f4",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawCircle_2"
+},
+    "SkCanvas_drawColor": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawColor(SK_ColorRED);\n    canvas->clipRect(SkRect::MakeWH(150, 150));\n    canvas->drawColor(SkColorSetARGB(0x80, 0x00, 0xFF, 0x00), SkBlendMode::kPlus);\n    canvas->clipRect(SkRect::MakeWH(75, 75));\n    canvas->drawColor(SkColorSetARGB(0x80, 0x00, 0x00, 0xFF), SkBlendMode::kPlus);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "9cf94fead1e6b17d836c704b4eac269a",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawColor"
+},
+    "SkCanvas_drawDRRect": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkRRect outer = SkRRect::MakeRect({20, 40, 210, 200});\n   SkRRect inner = SkRRect::MakeOval({60, 70, 170, 160});\n   SkPaint paint;\n   canvas->drawDRRect(outer, inner, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "02e33141f13da2f19aef7feb7117b541",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawDRRect"
+},
+    "SkCanvas_drawDRRect_a": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkRRect outer = SkRRect::MakeRect({20, 40, 210, 200});\n   SkRRect inner = SkRRect::MakeRectXY({60, 70, 170, 160}, 10, 10);\n   SkPaint paint;\n   paint.setAntiAlias(true);\n   paint.setStyle(SkPaint::kStroke_Style);\n   paint.setStrokeWidth(20);\n   paint.setStrokeJoin(SkPaint::kRound_Join);\n   canvas->drawDRRect(outer, inner, paint);\n   paint.setStrokeWidth(1);\n   paint.setColor(SK_ColorWHITE);\n   canvas->drawDRRect(outer, inner, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "30823cb4edf884d330285ea161664931",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawDRRect_2"
+},
+    "SkCanvas_drawDrawable": {
+    "code": "struct MyDrawable : public SkDrawable {\n    SkRect onGetBounds() override { return SkRect::MakeWH(50, 100);  }\n    void onDraw(SkCanvas* canvas) override {\n       SkPath path;\n       path.conicTo(10, 90, 50, 90, 0.9f);\n       SkPaint paint;\n       paint.setColor(SK_ColorBLUE);\n       canvas->drawRect(path.getBounds(), paint);\n       paint.setAntiAlias(true);\n       paint.setColor(SK_ColorWHITE);\n       canvas->drawPath(path, paint);\n    }\n};\n\nvoid draw(SkCanvas* canvas) {\n    sk_sp<SkDrawable> drawable(new MyDrawable);\n  SkMatrix matrix;\n  matrix.setTranslate(10, 10);\n  canvas->drawDrawable(drawable.get(), &matrix);\n}\n",
+    "width": 256,
+    "height": 100,
+    "hash": "3a4dfcd08838866b5cfc0d82489195ba",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawDrawable"
+},
+    "SkCanvas_drawDrawable_2": {
+    "code": "struct MyDrawable : public SkDrawable {\n    SkRect onGetBounds() override { return SkRect::MakeWH(50, 100);  }\n    void onDraw(SkCanvas* canvas) override {\n       SkPath path;\n       path.conicTo(10, 90, 50, 90, 0.9f);\n       SkPaint paint;\n       paint.setColor(SK_ColorBLUE);\n       canvas->drawRect(path.getBounds(), paint);\n       paint.setAntiAlias(true);\n       paint.setColor(SK_ColorWHITE);\n       canvas->drawPath(path, paint);\n    }\n};\n\nvoid draw(SkCanvas* canvas) {\n    sk_sp<SkDrawable> drawable(new MyDrawable);\n  canvas->drawDrawable(drawable.get(), 10, 10);\n}\n",
+    "width": 256,
+    "height": 100,
+    "hash": "1bdc07ad3b154c89b771722c2fcaee3f",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawDrawable_2"
+},
+    "SkCanvas_drawIRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rect = { 64, 48, 192, 160 };\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(20);\n    paint.setStrokeJoin(SkPaint::kRound_Join);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorYELLOW, SK_ColorMAGENTA } ) {\n        paint.setColor(color);\n        canvas->drawIRect(rect, paint);\n        canvas->rotate(30, 128, 128);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "d3d8ca584134560750b1efa4a4c6e138",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawIRect"
+},
+    "SkCanvas_drawImage": {
+    "code": "void draw(SkCanvas* canvas) {\n   // sk_sp<SkImage> image;\n   SkImage* imagePtr = image.get();\n   canvas->drawImage(imagePtr, 0, 0);\n   SkPaint paint;\n   canvas->drawImage(imagePtr, 80, 0, &paint);\n   paint.setAlpha(0x80);\n   canvas->drawImage(imagePtr, 160, 0, &paint);\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "185746dc0faa6f1df30c4afe098646ff",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawImage"
+},
+    "SkCanvas_drawImageLattice": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect center = { 20, 10, 50, 40 };\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(60, 60));\n    SkCanvas bitCanvas(bitmap);\n    SkPaint paint;\n    SkColor gray = 0xFF000000;\n    int left = 0;\n    for (auto right: { center.fLeft, center.fRight, bitmap.width() } ) {\n        int top = 0;\n        for (auto bottom: { center.fTop, center.fBottom, bitmap.height() } ) {\n            paint.setColor(gray);\n            bitCanvas.drawIRect(SkIRect::MakeLTRB(left, top, right, bottom), paint);\n            gray += 0x001f1f1f;\n            top = bottom;\n        }\n        left = right;\n    }\n    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);\n    SkImage* imagePtr = image.get();\n    for (auto dest: { 20, 30, 40, 60, 90 } ) {\n        canvas->drawImageNine(imagePtr, center, SkRect::MakeWH(dest, dest), nullptr);\n        canvas->translate(dest + 4, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "4f153cf1d0dbe1a95acf5badeec14dae",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawImageLattice"
+},
+    "SkCanvas_drawImageNine": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect center = { 20, 10, 50, 40 };\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(60, 60));\n    SkCanvas bitCanvas(bitmap);\n    SkPaint paint;\n    SkColor gray = 0xFF000000;\n    int left = 0;\n    for (auto right: { center.fLeft, center.fRight, bitmap.width() } ) {\n        int top = 0;\n        for (auto bottom: { center.fTop, center.fBottom, bitmap.height() } ) {\n            paint.setColor(gray);\n            bitCanvas.drawIRect(SkIRect::MakeLTRB(left, top, right, bottom), paint);\n            gray += 0x001f1f1f;\n            top = bottom;\n        }\n        left = right;\n    }\n    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);\n    SkImage* imagePtr = image.get();\n    for (auto dest: { 20, 30, 40, 60, 90 } ) {\n        canvas->drawImageNine(imagePtr, center, SkRect::MakeWH(dest, dest), nullptr);\n        canvas->translate(dest + 4, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "4f153cf1d0dbe1a95acf5badeec14dae",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawImageNine"
+},
+    "SkCanvas_drawImageNine_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect center = { 20, 10, 50, 40 };\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(60, 60));\n    SkCanvas bitCanvas(bitmap);\n    SkPaint paint;\n    SkColor gray = 0xFF000000;\n    int left = 0;\n    for (auto right: { center.fLeft, center.fRight, bitmap.width() } ) {\n        int top = 0;\n        for (auto bottom: { center.fTop, center.fBottom, bitmap.height() } ) {\n            paint.setColor(gray);\n            bitCanvas.drawIRect(SkIRect::MakeLTRB(left, top, right, bottom), paint);\n            gray += 0x001f1f1f;\n            top = bottom;\n        }\n        left = right;\n    }\n    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);\n    for (auto dest: { 20, 30, 40, 60, 90 } ) {\n        canvas->drawImageNine(image, center, SkRect::MakeWH(dest, 110 - dest), nullptr);\n        canvas->translate(dest + 4, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "d597d9af8d17fd93e634dd12017058e2",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawImageNine_2"
+},
+    "SkCanvas_drawImageRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint32_t pixels[][4] = {\n            { 0xFFFF0000, 0xFFFF0000, 0xFFFF0000, 0xFFFF0000 },\n            { 0xFFFF0000, 0xFF000000, 0xFFFFFFFF, 0xFFFF0000 },\n            { 0xFFFF0000, 0xFFFFFFFF, 0xFF000000, 0xFFFF0000 },\n            { 0xFFFF0000, 0xFFFF0000, 0xFFFF0000, 0xFFFF0000 } };\n    SkBitmap redBorder;\n    redBorder.installPixels(SkImageInfo::MakeN32Premul(4, 4),\n            (void*) pixels, sizeof(pixels[0]));\n    sk_sp<SkImage> image = SkImage::MakeFromBitmap(redBorder);\n    SkPaint lowPaint;\n    for (auto constraint : {\n            SkCanvas::kFast_SrcRectConstraint,\n            SkCanvas::kStrict_SrcRectConstraint,\n            SkCanvas::kFast_SrcRectConstraint } ) {\n        canvas->drawImageRect(image.get(), SkRect::MakeLTRB(1, 1, 3, 3),\n                SkRect::MakeLTRB(16, 16, 48, 48), &lowPaint, constraint);\n        lowPaint.setFilterQuality(kLow_SkFilterQuality);\n        canvas->translate(80, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "bfd18e9cac896cdf94c9f154ccf94be8",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawImageRect"
+},
+    "SkCanvas_drawImageRect_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    // sk_sp<SkImage> image;\n    for (auto i : { 1, 2, 4, 8 } ) {\n        canvas->drawImageRect(image.get(), SkIRect::MakeLTRB(0, 0, 100, 100),\n                SkRect::MakeXYWH(i * 20, i * 20, i * 20, i * 20), nullptr);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "7f92cd5c9b9f4b1ac3cd933b08037bfe",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawImageRect_2"
+},
+    "SkCanvas_drawImageRect_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    // sk_sp<SkImage> image;\n    for (auto i : { 20, 40, 80, 160 } ) {\n        canvas->drawImageRect(image.get(), SkRect::MakeXYWH(i, i, i, i), nullptr);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "3cf8fb639fef99993cafc064d550c739",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawImageRect_3"
+},
+    "SkCanvas_drawImageRect_4": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint32_t pixels[][2] = { { SK_ColorBLACK, SK_ColorWHITE },\n                             { SK_ColorWHITE, SK_ColorBLACK } };\n    SkBitmap bitmap;\n    bitmap.installPixels(SkImageInfo::MakeN32Premul(2, 2),\n            (void*) pixels, sizeof(pixels[0]));\n    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);\n    SkPaint paint;\n    canvas->scale(4, 4);\n    for (auto alpha : { 50, 100, 150, 255 } ) {\n        paint.setAlpha(alpha);\n        canvas->drawImageRect(image, SkRect::MakeWH(2, 2), SkRect::MakeWH(8, 8), &paint);\n        canvas->translate(8, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "d4b35a9d24c32c042bd1f529b8de3c0d",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawImageRect_4"
+},
+    "SkCanvas_drawImageRect_5": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint32_t pixels[][2] = { { 0x00000000, 0x55555555},\n                             { 0xAAAAAAAA, 0xFFFFFFFF} };\n    SkBitmap bitmap;\n    bitmap.installPixels(SkImageInfo::MakeN32Premul(2, 2),\n            (void*) pixels, sizeof(pixels[0]));\n    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);\n    SkPaint paint;\n    canvas->scale(4, 4);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {\n        paint.setColorFilter(SkColorFilter::MakeModeFilter(color, SkBlendMode::kPlus));\n        canvas->drawImageRect(image, SkIRect::MakeWH(2, 2), SkRect::MakeWH(8, 8), &paint);\n        canvas->translate(8, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "d307e7e1237f39fb54d80723e5449857",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawImageRect_5"
+},
+    "SkCanvas_drawImageRect_6": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint32_t pixels[][2] = { { 0x00000000, 0x55550000},\n                             { 0xAAAA0000, 0xFFFF0000} };\n    SkBitmap bitmap;\n    bitmap.installPixels(SkImageInfo::MakeN32Premul(2, 2),\n            (void*) pixels, sizeof(pixels[0]));\n    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);\n    SkPaint paint;\n    canvas->scale(4, 4);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {\n        paint.setColorFilter(SkColorFilter::MakeModeFilter(color, SkBlendMode::kPlus));\n        canvas->drawImageRect(image, SkRect::MakeWH(8, 8), &paint);\n        canvas->translate(8, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "3a47ef94cb70144455f80333d8653e6c",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawImageRect_6"
+},
+    "SkCanvas_drawImage_2": {
+    "code": "void draw(SkCanvas* canvas) {\n   // sk_sp<SkImage> image;\n   canvas->drawImage(image, 0, 0);\n   SkPaint paint;\n   canvas->drawImage(image, 80, 0, &paint);\n   paint.setAlpha(0x80);\n   canvas->drawImage(image, 160, 0, &paint);\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "a4e877e891b1be5faa2b7fd07f673a10",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawImage_2"
+},
+    "SkCanvas_drawLine": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setColor(0xFF9a67be);\n    paint.setStrokeWidth(20);\n    canvas->skew(1, 0);\n    canvas->drawLine(32, 96, 32, 160, paint);\n    canvas->skew(-2, 0);\n    canvas->drawLine(288, 96, 288, 160, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "d10ee4a265f278d02afe11ad889b293b",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawLine"
+},
+    "SkCanvas_drawLine_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setColor(0xFF9a67be);\n    paint.setStrokeWidth(20);\n    canvas->skew(1, 0);\n    canvas->drawLine({32, 96}, {32, 160}, paint);\n    canvas->skew(-2, 0);\n    canvas->drawLine({288, 96}, {288, 160}, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "f8525816cb596dde1a3855446792c8e0",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawLine_2"
+},
+    "SkCanvas_drawOval": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->clear(0xFF3f5f9f);\n    SkColor  kColor1 = SkColorSetARGB(0xff, 0xff, 0x7f, 0);\n    SkColor  g1Colors[] = { kColor1, SkColorSetA(kColor1, 0x20) };\n    SkPoint  g1Points[] = { { 0, 0 }, { 0, 100 } };\n    SkScalar pos[] = { 0.2f, 1.0f };\n    SkRect bounds = SkRect::MakeWH(80, 70);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setShader(SkGradientShader::MakeLinear(g1Points, g1Colors, pos, SK_ARRAY_COUNT(g1Colors),\n            SkShader::kClamp_TileMode));\n    canvas->drawOval(bounds , paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "8b6b86f8a022811cd29a9c6ab771df12",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawOval"
+},
+    "SkCanvas_drawPaint": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor     colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };\n    SkScalar    pos[] = { 0, SK_Scalar1/2, SK_Scalar1 };\n    SkPaint     paint;\n    paint.setShader(SkGradientShader::MakeSweep(256, 256, colors, pos, SK_ARRAY_COUNT(colors)));\n    canvas->drawPaint(paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "1cd076b9b1a7c976cdca72b93c4f42dd",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawPaint"
+},
+    "SkCanvas_drawPatch": {
+    "code": "void draw(SkCanvas* canvas) {\n    // SkBitmap source = cmbkygk;\n    SkPaint paint;\n    paint.setFilterQuality(kLow_SkFilterQuality);\n    paint.setAntiAlias(true);\n    SkPoint cubics[] = { { 3, 1 },    { 4, 2 }, { 5, 1 },    { 7, 3 },\n                      /* { 7, 3 }, */ { 6, 4 }, { 7, 5 },    { 5, 7 },\n                      /* { 5, 7 }, */ { 4, 6 }, { 3, 7 },    { 1, 5 },\n                      /* { 1, 5 }, */ { 2, 4 }, { 1, 3 }, /* { 3, 1 } */ };\n    SkColor colors[] = { 0xbfff0000, 0xbf0000ff, 0xbfff00ff, 0xbf00ffff };\n    SkPoint texCoords[] = { { -30, -30 }, { 162, -30}, { 162, 162}, { -30, 162} };\n    paint.setShader(SkShader::MakeBitmapShader(source, SkShader::kClamp_TileMode,\n                                                       SkShader::kClamp_TileMode, nullptr));\n    canvas->scale(15, 15);\n    for (auto blend : { SkBlendMode::kSrcOver, SkBlendMode::kModulate, SkBlendMode::kXor } ) {\n        canvas->drawPatch(cubics, colors, texCoords, blend, paint);\n        canvas->translate(4, 4);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "accb545d67984ced168f5be6ab824795",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawPatch"
+},
+    "SkCanvas_drawPatch_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPoint cubics[] = { { 3, 1 },    { 4, 2 }, { 5, 1 },    { 7, 3 },\n                      /* { 7, 3 }, */ { 6, 4 }, { 7, 5 },    { 5, 7 },\n                      /* { 5, 7 }, */ { 4, 6 }, { 3, 7 },    { 1, 5 },\n                      /* { 1, 5 }, */ { 2, 4 }, { 1, 3 }, /* { 3, 1 } */ };\n    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE, SK_ColorYELLOW, SK_ColorCYAN };\n    canvas->scale(30, 30);\n    canvas->drawPatch(cubics, colors, nullptr, paint);\n    SkPoint text[] = { {3,0.9f}, {4,2.5f}, {5,0.9f}, {7.5f,3.2f}, {5.5f,4.2f},\n            {7.5f,5.2f}, {5,7.5f}, {4,5.9f}, {3,7.5f}, {0.5f,5.2f}, {2.5f,4.2f},\n            {0.5f,3.2f} };\n    paint.setTextSize(18.f / 30);\n    for (int i = 0; i< 10; ++i) {\n       char digit = '0' + i;\n       canvas->drawText(&digit, 1, text[i].fX, text[i].fY, paint);\n    }\n    canvas->drawString(\"10\", text[10].fX, text[10].fY, paint);\n    canvas->drawString(\"11\", text[11].fX, text[11].fY, paint);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, 12, cubics, paint);\n    canvas->drawLine(cubics[11].fX, cubics[11].fY, cubics[0].fX, cubics[0].fY, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "4e8b7409531c9211a2afcf632005a38c",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawPatch_2"
+},
+    "SkCanvas_drawPatch_2_a": {
+    "code": "void draw(SkCanvas* canvas) {\n    // SkBitmap source = checkerboard;\n    SkPaint paint;\n    paint.setFilterQuality(kLow_SkFilterQuality);\n    paint.setAntiAlias(true);\n    SkPoint cubics[] = { { 3, 1 },    { 4, 2 }, { 5, 1 },    { 7, 3 },\n                      /* { 7, 3 }, */ { 6, 4 }, { 7, 5 },    { 5, 7 },\n                      /* { 5, 7 }, */ { 4, 6 }, { 3, 7 },    { 1, 5 },\n                      /* { 1, 5 }, */ { 2, 4 }, { 1, 3 }, /* { 3, 1 } */ };\n    SkPoint texCoords[] = { { 0, 0 }, { 0, 62}, { 62, 62}, { 62, 0 } };\n    paint.setShader(SkShader::MakeBitmapShader(source, SkShader::kClamp_TileMode,\n                                                       SkShader::kClamp_TileMode, nullptr));\n    canvas->scale(30, 30);\n    canvas->drawPatch(cubics, nullptr, texCoords, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "3412c2a16cb529af0e04878d264451f2",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawPatch_2_2"
+},
+    "SkCanvas_drawPath": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.moveTo(20, 20);\n    path.quadTo(60, 20, 60, 60);\n    path.close();\n    path.moveTo(60, 20);\n    path.quadTo(60, 60, 20, 60);\n    SkPaint paint;\n    paint.setStrokeWidth(10);\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    for (auto join: { SkPaint::kBevel_Join, SkPaint::kRound_Join, SkPaint::kMiter_Join } ) {\n        paint.setStrokeJoin(join);\n        for (auto cap: { SkPaint::kButt_Cap, SkPaint::kSquare_Cap, SkPaint::kRound_Cap  } ) {\n            paint.setStrokeCap(cap);\n            canvas->drawPath(path, paint);\n            canvas->translate(80, 0);\n        }\n        canvas->translate(-240, 60);\n    }\n    paint.setStyle(SkPaint::kFill_Style);\n    for (auto fill : { SkPath::kWinding_FillType,\n                       SkPath::kEvenOdd_FillType,\n                       SkPath::kInverseWinding_FillType } ) {\n        path.setFillType(fill);\n        canvas->save();\n        canvas->clipRect({0, 10, 80, 70});\n        canvas->drawPath(path, paint);\n        canvas->restore();\n        canvas->translate(80, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "fe2294131f422b8d6752f6a880f98ad9",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawPath"
+},
+    "SkCanvas_drawPicture": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {\n        SkPaint paint;\n        paint.setColor(color);\n        recordingCanvas->drawRect({10, 10, 30, 40}, paint);\n        recordingCanvas->translate(10, 10);\n        recordingCanvas->scale(1.2f, 1.4f);\n    }\n    sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();\n    canvas->drawPicture(playback);\n    canvas->scale(2, 2);\n    canvas->translate(50, 0);\n    canvas->drawPicture(playback);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "83918a23fcffd47f59a1ef662c85a24c",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawPicture"
+},
+    "SkCanvas_drawPicture_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {\n        SkPaint paint;\n        paint.setColor(color);\n        recordingCanvas->drawRect({10, 10, 30, 40}, paint);\n        recordingCanvas->translate(10, 10);\n        recordingCanvas->scale(1.2f, 1.4f);\n    }\n    sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();\n    canvas->drawPicture(playback);\n    canvas->scale(2, 2);\n    canvas->translate(50, 0);\n    canvas->drawPicture(playback);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "83918a23fcffd47f59a1ef662c85a24c",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawPicture_2"
+},
+    "SkCanvas_drawPicture_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkPictureRecorder recorder;\n    SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {\n        paint.setColor(color);\n        recordingCanvas->drawRect({10, 10, 30, 40}, paint);\n        recordingCanvas->translate(10, 10);\n        recordingCanvas->scale(1.2f, 1.4f);\n    }\n    sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();\n    const SkPicture* playbackPtr = playback.get();\n    SkMatrix matrix;\n    matrix.reset();\n    for (auto alpha : { 70, 140, 210 } ) {\n    paint.setAlpha(alpha);\n    canvas->drawPicture(playbackPtr, &matrix, &paint);\n    matrix.preTranslate(70, 70);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "759e4e5bac680838added8f70884dcdc",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawPicture_3"
+},
+    "SkCanvas_drawPicture_4": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkPictureRecorder recorder;\n    SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {\n        paint.setColor(color);\n        recordingCanvas->drawRect({10, 10, 30, 40}, paint);\n        recordingCanvas->translate(10, 10);\n        recordingCanvas->scale(1.2f, 1.4f);\n    }\n    sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();\n    SkMatrix matrix;\n    matrix.reset();\n    for (auto alpha : { 70, 140, 210 } ) {\n    paint.setAlpha(alpha);\n    canvas->drawPicture(playback, &matrix, &paint);\n    matrix.preTranslate(70, 70);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "c4ff59439dd2fc871925d4eeb0c84ca1",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawPicture_4"
+},
+    "SkCanvas_drawPoint": {
+    "code": "void draw(SkCanvas* canvas) {\n  SkPaint paint;\n  paint.setAntiAlias(true);\n  paint.setColor(0x80349a45);\n  paint.setStyle(SkPaint::kStroke_Style);\n  paint.setStrokeWidth(100);\n  paint.setStrokeCap(SkPaint::kRound_Cap);\n  canvas->scale(1, 1.2f);\n  canvas->drawPoint(64, 96, paint);\n  canvas->scale(.6f, .8f);\n  paint.setColor(SK_ColorWHITE);\n  canvas->drawPoint(106, 120, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "3476b553e7b547b604a3f6969f02d933",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawPoint"
+},
+    "SkCanvas_drawPoint_2": {
+    "code": "void draw(SkCanvas* canvas) {\n  SkPaint paint;\n  paint.setAntiAlias(true);\n  paint.setColor(0x80349a45);\n  paint.setStyle(SkPaint::kStroke_Style);\n  paint.setStrokeWidth(100);\n  paint.setStrokeCap(SkPaint::kSquare_Cap);\n  canvas->scale(1, 1.2f);\n  canvas->drawPoint({64, 96}, paint);\n  canvas->scale(.6f, .8f);\n  paint.setColor(SK_ColorWHITE);\n  canvas->drawPoint(106, 120, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "1a0a839061c69d870acca2bcfbdf1a41",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawPoint_2"
+},
+    "SkCanvas_drawPoints": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(10);\n    paint.setColor(0x80349a45);\n    const SkPoint points[] = {{32, 16}, {48, 48}, {16, 32}};\n    const SkPaint::Join join[] = { SkPaint::kRound_Join,\n                                   SkPaint::kMiter_Join,\n                                   SkPaint::kBevel_Join };\n    int joinIndex = 0;\n    SkPath path;\n    path.addPoly(points, 3, false);\n    for (const auto cap : { SkPaint::kRound_Cap, SkPaint::kSquare_Cap, SkPaint::kButt_Cap } ) {\n        paint.setStrokeCap(cap);\n        paint.setStrokeJoin(join[joinIndex++]);\n        for (const auto mode : { SkCanvas::kPoints_PointMode,\n                                 SkCanvas::kLines_PointMode,\n                                 SkCanvas::kPolygon_PointMode } ) {\n            canvas->drawPoints(mode, 3, points, paint);\n            canvas->translate(64, 0);\n        }\n        canvas->drawPath(path, paint);\n        canvas->translate(-192, 64);\n    }\n}\n",
+    "width": 256,
+    "height": 200,
+    "hash": "635d54b4716e226e93dfbc21ad40e77d",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawPoints"
+},
+    "SkCanvas_drawPosText": {
+    "code": "void draw(SkCanvas* canvas) {\n  const char hello[] = \"HeLLo!\";\n  const SkPoint pos[] = { {40, 100}, {82, 95}, {115, 110}, {130, 95}, {145, 85},\n    {172, 100} };\n  SkPaint paint;\n  paint.setTextSize(60);\n  canvas->drawPosText(hello, strlen(hello), pos, paint);\n}\n",
+    "width": 256,
+    "height": 120,
+    "hash": "bf0b2402533a23b6392e0676b7a8414c",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawPosText"
+},
+    "SkCanvas_drawPosTextH": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkScalar xpos[] = { 20, 40, 80, 160 };\n    SkPaint paint;\n    canvas->drawPosTextH(\"XXXX\", 4, xpos, 20, paint);\n}\n",
+    "width": 256,
+    "height": 40,
+    "hash": "95c6a7ef82993a8d2add676080e9438a",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawPosTextH"
+},
+    "SkCanvas_drawRRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkRect outer = {30, 40, 210, 220};\n    SkRect radii = {30, 50, 70, 90 };\n    SkRRect rRect;\n    rRect.setNinePatch(outer, radii.fLeft, radii.fTop, radii.fRight, radii.fBottom);\n    canvas->drawRRect(rRect, paint);\n    paint.setColor(SK_ColorWHITE);\n    canvas->drawLine(outer.fLeft + radii.fLeft, outer.fTop,\n                     outer.fLeft + radii.fLeft, outer.fBottom, paint);\n    canvas->drawLine(outer.fRight - radii.fRight, outer.fTop,\n                     outer.fRight - radii.fRight, outer.fBottom, paint);\n    canvas->drawLine(outer.fLeft,  outer.fTop + radii.fTop,\n                     outer.fRight, outer.fTop + radii.fTop, paint);\n    canvas->drawLine(outer.fLeft,  outer.fBottom - radii.fBottom,\n                     outer.fRight, outer.fBottom - radii.fBottom, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "90fed1bb11efb43aada94113338c63d8",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawRRect"
+},
+    "SkCanvas_drawRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint rectPts[] = { {64, 48}, {192, 160} };\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(20);\n    paint.setStrokeJoin(SkPaint::kRound_Join);\n    SkMatrix rotator;\n    rotator.setRotate(30, 128, 128);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorYELLOW, SK_ColorMAGENTA } ) {\n        paint.setColor(color);\n        SkRect rect;\n        rect.set(rectPts[0], rectPts[1]);\n        canvas->drawRect(rect, paint);\n        rotator.mapPoints(rectPts, 2);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "871b0da9b4a23de11ae7a772ce14aed3",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawRect"
+},
+    "SkCanvas_drawRegion": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region;\n    region.op( 10, 10, 50, 50, SkRegion::kUnion_Op);\n    region.op( 10, 50, 90, 90, SkRegion::kUnion_Op);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(20);\n    paint.setStrokeJoin(SkPaint::kRound_Join);\n    canvas->drawRegion(region, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "80309e0deca0f8add616cec7bec634ca",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawRegion"
+},
+    "SkCanvas_drawRoundRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkVector radii[] = { {0, 20}, {10, 10}, {10, 20}, {10, 40} };\n    SkPaint paint;\n    paint.setStrokeWidth(15);\n    paint.setStrokeJoin(SkPaint::kRound_Join);\n    paint.setAntiAlias(true);\n    for (auto style : { SkPaint::kStroke_Style, SkPaint::kFill_Style  } ) {\n        paint.setStyle(style );\n        for (size_t i = 0; i < SK_ARRAY_COUNT(radii); ++i) {\n           canvas->drawRoundRect({10, 10, 60, 40}, radii[i].fX, radii[i].fY, paint);\n           canvas->translate(0, 60);\n        }\n        canvas->translate(80, -240);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "199fe818c09026c114e165bff166a39f",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawRoundRect"
+},
+    "SkCanvas_drawString": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    canvas->drawString(\"a small hello\", 20, 20, paint);\n}",
+    "width": 256,
+    "height": 48,
+    "hash": "85442cf8d0bce6b5a777853bc36a4dc4",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawString"
+},
+    "SkCanvas_drawString_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkString string(\"a small hello\");\n    canvas->drawString(string, 20, 20, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "435178c09feb3bfec5e35d983609a013",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawString_2"
+},
+    "SkCanvas_drawText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    float textSizes[] = { 12, 18, 24, 36 };\n    for (auto size: textSizes ) {\n        paint.setTextSize(size);\n        canvas->drawText(\"Aa\", 2, 10, 20, paint);\n        canvas->translate(0, size * 2);\n    }\n    paint.reset();\n    paint.setAntiAlias(true);\n    float yPos = 20;\n    for (auto size: textSizes ) {\n        float scale = size / 12.f;\n        canvas->resetMatrix();\n        canvas->translate(100, 0);\n        canvas->scale(scale, scale);\n        canvas->drawText(\"Aa\", 2, 10 / scale, yPos / scale, paint);\n        yPos += size * 2;\n    }\n}\n",
+    "width": 256,
+    "height": 200,
+    "hash": "55f5e59350622c5e2834d1c85789f732",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawText"
+},
+    "SkCanvas_drawTextBlob": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkTextBlobBuilder textBlobBuilder;\n    const char bunny[] = \"/(^x^)\\\\\";\n    const int len = sizeof(bunny) - 1;\n    uint16_t glyphs[len];\n    SkPaint paint;\n    paint.textToGlyphs(bunny, len, glyphs);\n    paint.setTextEncoding(SkTextEncoding::kGlyphID);\n    SkFont font;\n    int runs[] = { 3, 1, 3 };\n    SkPoint textPos = { 20, 100 };\n    int glyphIndex = 0;\n    for (auto runLen : runs) {\n        font.setSize(1 == runLen ? 20 : 50);\n        const SkTextBlobBuilder::RunBuffer& run =\n                textBlobBuilder.allocRun(font, runLen, textPos.fX, textPos.fY);\n        memcpy(run.glyphs, &glyphs[glyphIndex], sizeof(glyphs[0]) * runLen);\n        paint.setTextSize(1 == runLen ? 20 : 50);\n        textPos.fX += paint.measureText(&glyphs[glyphIndex], sizeof(glyphs[0]) * runLen, nullptr);\n        glyphIndex += runLen;\n    }\n    sk_sp<const SkTextBlob> blob = textBlobBuilder.make();\n    paint.reset();\n    canvas->drawTextBlob(blob.get(), 0, 0, paint);\n}\n",
+    "width": 256,
+    "height": 120,
+    "hash": "005502b502c1282cb8d306d6c8d998fb",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawTextBlob"
+},
+    "SkCanvas_drawTextBlob_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkTextBlobBuilder textBlobBuilder;\n    SkFont font;\n    font.setSize(50);\n    const SkTextBlobBuilder::RunBuffer& run =\n            textBlobBuilder.allocRun(font, 1, 20, 100);\n    run.glyphs[0] = 20;\n    sk_sp<const SkTextBlob> blob = textBlobBuilder.make();\n    SkPaint paint;\n    paint.setTextSize(10);\n    paint.setColor(SK_ColorBLUE);\n    canvas->drawTextBlob(blob.get(), 0, 0, paint);\n}\n",
+    "width": 256,
+    "height": 120,
+    "hash": "1cae21e7b63b24de3eca0bbd9be1936b",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawTextBlob_2"
+},
+    "SkCanvas_drawTextRSXform": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int iterations = 26;\n    SkRSXform transforms[iterations];\n    char alphabet[iterations];\n    SkScalar angle = 0;\n    SkScalar scale = 1;\n    for (size_t i = 0; i < SK_ARRAY_COUNT(transforms); ++i) {\n        const SkScalar s = SkScalarSin(angle) * scale;\n        const SkScalar c = SkScalarCos(angle) * scale;\n        transforms[i] = SkRSXform::Make(-c, -s, -s * 16, c * 16);\n        angle += .45;\n        scale += .2;\n        alphabet[i] = 'A' + i;\n    }\n    SkPaint paint;\n    canvas->translate(110, 138);\n    canvas->drawTextRSXform(alphabet, sizeof(alphabet), transforms, nullptr, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "935c8f8b9782d297a73d7186f6ef7945",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawTextRSXform"
+},
+    "SkCanvas_drawVertices": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkPoint points[] = { { 0, 0 }, { 250, 0 }, { 100, 100 }, { 0, 250 } };\n    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE, SK_ColorYELLOW, SK_ColorCYAN };\n    auto vertices = SkVertices::MakeCopy(SkVertices::kTriangleFan_VertexMode,\n            SK_ARRAY_COUNT(points), points, nullptr, colors);\n    canvas->drawVertices(vertices.get(), SkBlendMode::kSrc, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "f48b22eaad1bb7adcc3faaa321754af6",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawVertices"
+},
+    "SkCanvas_drawVertices_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkPoint points[] = { { 0, 0 }, { 250, 0 }, { 100, 100 }, { 0, 250 } };\n    SkPoint texs[] = { { 0, 0 }, { 0, 250 }, { 250, 250 }, { 250, 0 } };\n    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE, SK_ColorYELLOW, SK_ColorCYAN };\n    paint.setShader(SkGradientShader::MakeLinear(points, colors, nullptr, 4,\n            SkShader::kClamp_TileMode));\n    auto vertices = SkVertices::MakeCopy(SkVertices::kTriangleFan_VertexMode,\n            SK_ARRAY_COUNT(points), points, texs, colors);\n    canvas->drawVertices(vertices, SkBlendMode::kDarken, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "e8bdae9bea3227758989028424fcac3d",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::drawVertices_2"
+},
+    "SkCanvas_getGrContext": {
+    "code": "void draw(SkCanvas* canvas) {\n    if (canvas->getGrContext()) {\n         canvas->clear(SK_ColorRED);\n    } else {\n         canvas->clear(SK_ColorBLUE);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "c4ea949e5fa5a0630dcb6b0204bd498f",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::getGrContext"
+},
+    "SkCanvas_readPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->clear(SK_ColorBLUE);\n    SkPaint paint;\n    canvas->drawCircle(32, 32, 28, paint);\n    SkImageInfo info = SkImageInfo::Make(64, 64, kBGRA_8888_SkColorType, kPremul_SkAlphaType);\n    sk_sp<SkData> data(SkData::MakeUninitialized(info.minRowBytes() * info.height()));\n    sk_bzero(data->writable_data(), info.minRowBytes() * info.height());\n    for (int x : { 32, -32 } ) {\n        for (int y : { 32, -32 } ) {\n            canvas->readPixels(info, data->writable_data(), info.minRowBytes(), x, y);\n        }\n    }\n    sk_sp<SkImage> image = SkImage::MakeRasterData(info, data, info.minRowBytes());\n    canvas->drawImage(image, 0, 0);\n}",
+    "width": 64,
+    "height": 64,
+    "hash": "102d014d7f753db2a9b9ee08893aaf11",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::readPixels"
+},
+    "SkCanvas_resetMatrix": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    canvas->scale(4, 6);\n    canvas->drawString(\"truth\", 2, 10, paint);\n    canvas->resetMatrix();\n    canvas->scale(2.8f, 6);\n    canvas->drawString(\"consequences\", 2, 20, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "412afffdf4682baa503a4e2e99201967",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::resetMatrix"
+},
+    "SkCanvas_rotate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->translate(128, 128);\n    canvas->drawCircle(0, 0, 60, paint);\n    canvas->save();\n    canvas->rotate(10 * 360 / 60);   // 10 minutes of 60 scaled to 360 degrees\n    canvas->drawLine(0, 0, 0, -50, paint);\n    canvas->restore();\n    canvas->rotate((5 + 10.f/60) * 360 / 12); // 5 and 10/60 hours of 12 scaled to 360 degrees\n    canvas->drawLine(0, 0, 0, -30, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "963789ac8498d4e505748ab3b15cdaa5",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::rotate()"
+},
+    "SkCanvas_rotate_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(96);\n    canvas->drawString(\"A1\", 130, 100, paint);\n    canvas->rotate(180, 130, 100);\n    canvas->drawString(\"A1\", 130, 100, paint);\n}\n",
+    "width": 256,
+    "height": 192,
+    "hash": "bcf5baea1c66a957d5ffd7b54bbbfeff",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::rotate_2"
+},
+    "SkCanvas_save": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkRect rect = { 0, 0, 25, 25 };\n    canvas->drawRect(rect, paint);\n    canvas->save();\n    canvas->translate(50, 50);\n    canvas->drawRect(rect, paint);\n    canvas->restore();\n    paint.setColor(SK_ColorRED);\n    canvas->drawRect(rect, paint);\n}\n",
+    "width": 256,
+    "height": 100,
+    "hash": "e477dce358a9ba3b0aa1bf33b8a376de",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::save()"
+},
+    "SkCanvas_saveLayer": {
+    "code": "#include \"SkBlurImageFilter.h\"\n\nvoid draw(SkCanvas* canvas) {\n    SkPaint paint, blur;\n    blur.setImageFilter(SkBlurImageFilter::Make(3, 3, nullptr));\n    canvas->saveLayer(nullptr, &blur);\n    SkRect rect = { 25, 25, 50, 50};\n    canvas->drawRect(rect, paint);\n    canvas->translate(50, 50);\n    paint.setColor(SK_ColorRED);\n    canvas->drawRect(rect, paint);\n    canvas->restore();\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "42318b18d403e17e07a541652da91ee2",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::saveLayer"
+},
+    "SkCanvas_saveLayerAlpha": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColor(SK_ColorRED);\n    canvas->drawCircle(50, 50, 50, paint);\n    canvas->saveLayerAlpha(nullptr, 128);\n    paint.setColor(SK_ColorBLUE);\n    canvas->drawCircle(100, 50, 50, paint);\n    paint.setColor(SK_ColorGREEN);\n    paint.setAlpha(128);\n    canvas->drawCircle(75, 90, 50, paint);\n    canvas->restore();\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "8ab88d86fb438856cc48d6e2f08a6e24",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::saveLayerAlpha"
+},
+    "SkCanvas_saveLayerPreserveLCDTextRequests": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setLCDRenderText(true);\n    paint.setTextSize(20);\n    for (auto preserve : { false, true } ) {\n        preserve ? canvas->saveLayerPreserveLCDTextRequests(nullptr, nullptr)\n                 : canvas->saveLayer(nullptr, nullptr);\n        SkPaint p;\n        p.setColor(SK_ColorWHITE);\n        // Comment out the next line to draw on a non-opaque background.\n        canvas->drawRect(SkRect::MakeLTRB(25, 40, 200, 70), p);\n        canvas->drawString(\"Hamburgefons\", 30, 60, paint);\n        p.setColor(0xFFCCCCCC);\n        canvas->drawRect(SkRect::MakeLTRB(25, 70, 200, 100), p);\n        canvas->drawString(\"Hamburgefons\", 30, 90, paint);\n        canvas->restore();\n        canvas->translate(0, 80);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "8460bf8b013f46c67e0bd96e13451aff",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::saveLayerPreserveLCDTextRequests"
+},
+    "SkCanvas_saveLayer_2": {
+    "code": "#include \"SkBlurImageFilter.h\"\n\nvoid draw(SkCanvas* canvas) {\n    SkPaint paint, blur;\n    blur.setImageFilter(SkBlurImageFilter::Make(3, 3, nullptr));\n    canvas->saveLayer(SkRect::MakeWH(90, 90), &blur);\n    SkRect rect = { 25, 25, 50, 50};\n    canvas->drawRect(rect, paint);\n    canvas->translate(50, 50);\n    paint.setColor(SK_ColorRED);\n    canvas->drawRect(rect, paint);\n    canvas->restore();\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "a17aec3aa4909527be039e26a7eda694",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::saveLayer_2"
+},
+    "SkCanvas_saveLayer_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    // sk_sp<SkImage> image = GetResourceAsImage(\"images/mandrill_256.png\");\n    canvas->drawImage(image, 0, 0, nullptr);\n    SkCanvas::SaveLayerRec rec;\n    SkPaint paint;\n    paint.setBlendMode(SkBlendMode::kPlus);\n    rec.fSaveLayerFlags = SkCanvas::kInitWithPrevious_SaveLayerFlag;\n    rec.fPaint = &paint;\n    canvas->saveLayer(rec);\n    paint.setBlendMode(SkBlendMode::kClear);\n    canvas->drawCircle(128, 128, 96, paint);\n    canvas->restore();\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "7d3751e82d1b6ec328ffa3d6f48ca831",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::saveLayer_3"
+},
+    "SkCanvas_scale": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkRect rect = { 10, 20, 60, 120 };\n    canvas->translate(20, 20);\n    canvas->drawRect(rect, paint);\n    canvas->scale(2, .5f);\n    paint.setColor(SK_ColorGRAY);\n    canvas->drawRect(rect, paint);\n}\n",
+    "width": 256,
+    "height": 160,
+    "hash": "7d0d801ef13c6c6da51e840c22ac15b0",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::scale()"
+},
+    "SkCanvas_setMatrix": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    canvas->scale(4, 6);\n    canvas->drawString(\"truth\", 2, 10, paint);\n    SkMatrix matrix;\n    matrix.setScale(2.8f, 6);\n    canvas->setMatrix(matrix);\n    canvas->drawString(\"consequences\", 2, 20, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "24b9cf7e6f9a08394e1e07413bd8733a",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::setMatrix"
+},
+    "SkCanvas_skew": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    canvas->translate(30, 130);\n    canvas->save();\n    canvas->skew(-.5, 0);\n    canvas->drawString(\"A1\", 0, 0, paint);\n    canvas->restore();\n    canvas->save();\n    canvas->skew(0, .5);\n    paint.setColor(SK_ColorRED);\n    canvas->drawString(\"A1\", 0, 0, paint);\n    canvas->restore();\n    canvas->skew(-.5, .5);\n    paint.setColor(SK_ColorBLUE);\n    canvas->drawString(\"A1\", 0, 0, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "2e2acc21d7774df7e0940a30ad2ca99e",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::skew()"
+},
+    "SkCanvas_translate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint filledPaint;\n    SkPaint outlinePaint;\n    outlinePaint.setStyle(SkPaint::kStroke_Style);\n    outlinePaint.setColor(SK_ColorBLUE);\n    canvas->save();\n    canvas->translate(50, 50);\n    canvas->drawCircle(28, 28, 15, outlinePaint);  // blue center: (50+28, 50+28)\n    canvas->scale(2, 1/2.f);\n    canvas->drawCircle(28, 28, 15, filledPaint);   // black center: (50+(28*2), 50+(28/2))\n    canvas->restore();\n    filledPaint.setColor(SK_ColorGRAY);\n    outlinePaint.setColor(SK_ColorRED);\n    canvas->scale(2, 1/2.f);\n    canvas->drawCircle(28, 28, 15, outlinePaint);  // red center: (28*2, 28/2)\n    canvas->translate(50, 50);\n    canvas->drawCircle(28, 28, 15, filledPaint);   // gray center: ((50+28)*2, (50+28)/2)\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "eb93d5fa66a5f7a10f4f9210494d7222",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::translate()"
+},
+    "SkCanvas_writePixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo imageInfo = SkImageInfo::MakeN32(256, 1, kPremul_SkAlphaType);\n    for (int y = 0; y < 256; ++y) {\n        uint32_t pixels[256];\n        for (int x = 0; x < 256; ++x) {\n            pixels[x] = SkColorSetARGB(x, x + y, x, x - y);\n        }\n        canvas->writePixels(imageInfo, &pixels, sizeof(pixels), 0, y);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "29b98ebf58aa9fd1edfaabf9f4490b3a",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::writePixels"
+},
+    "SkCanvas_writePixels_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo imageInfo = SkImageInfo::MakeN32Premul(2, 2);\n    SkBitmap bitmap;\n    bitmap.setInfo(imageInfo);\n    uint32_t pixels[4];\n    bitmap.setPixels(pixels);\n    for (int y = 0; y < 256; y += 2) {\n        for (int x = 0; x < 256;  x += 2) {\n            pixels[0] = SkColorSetRGB(x, y, x | y);\n            pixels[1] = SkColorSetRGB(x ^ y, y, x);\n            pixels[2] = SkColorSetRGB(x, x & y, y);\n            pixels[3] = SkColorSetRGB(~x, ~y, x);\n            canvas->writePixels(bitmap, x, y);\n        }\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "8b128e067881f9251357653692fa28da",
+    "file": "SkCanvas_Reference",
+    "name": "SkCanvas::writePixels_2"
+},
+    "SkColorGetA": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setColor(SK_ColorRED);\n    for (int alpha = 255; alpha >= 0; alpha -= 17) {\n        paint.setAlpha(alpha);\n        canvas->drawRect({5, 5, 100, 20}, paint);\n        SkAlpha alphaInPaint = SkColorGetA(paint.getColor());\n        canvas->drawString(std::to_string(alphaInPaint).c_str(), 110, 18, paint);\n        canvas->translate(0, 15);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "896ce0316b489608a95af5439ca2aab1",
+    "file": "SkColor_Reference",
+    "name": "SkColorGetA"
+},
+    "SkColorGetB": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawBitmap(source, 0, 0);\n    SkPaint bgPaint;\n    bgPaint.setColor(0xafffffff);\n    canvas->drawRect({20, 50, 80, 70}, bgPaint);\n    uint8_t blue = SkColorGetB(source.getColor(168, 170));\n    canvas->drawString(std::to_string(blue).c_str(), 40, 65, SkPaint());\n    canvas->drawLine(80, 70, 168, 170, SkPaint());\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "9ee27675284faea375611dc88123a2c5",
+    "file": "SkColor_Reference",
+    "name": "SkColorGetB"
+},
+    "SkColorGetG": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawBitmap(source, 0, 0);\n    SkPaint bgPaint;\n    bgPaint.setColor(0xafffffff);\n    canvas->drawRect({20, 50, 80, 70}, bgPaint);\n    uint8_t green = SkColorGetG(source.getColor(57, 192));\n    canvas->drawString(std::to_string(green).c_str(), 40, 65, SkPaint());\n    canvas->drawLine(80, 70, 57, 192, SkPaint());\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "535d38b2c019299d915170f7b03d5fea",
+    "file": "SkColor_Reference",
+    "name": "SkColorGetG"
+},
+    "SkColorGetR": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawBitmap(source, 0, 0);\n    SkPaint bgPaint;\n    bgPaint.setColor(0xafffffff);\n    canvas->drawRect({20, 50, 80, 70}, bgPaint);\n    uint8_t red = SkColorGetR(source.getColor(226, 128));\n    canvas->drawString(std::to_string(red).c_str(), 40, 65, SkPaint());\n    canvas->drawLine(80, 70, 226, 128, SkPaint());\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "d6da38577f189eaa6d9df75f6c3ed252",
+    "file": "SkColor_Reference",
+    "name": "SkColorGetR"
+},
+    "SkColorSetA": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawBitmap(source, 0, 0);\n    for (int y = 0; y < 256; y += 16) {\n       for (int x = 0; x < 256; x += 16) {\n         SkColor color = source.getColor(x + 8, y + 8);\n         SkPaint paint;\n         paint.setColor(SkColorSetA(color, x + y));\n         canvas->drawRect(SkRect::MakeXYWH(x, y, 16, 16), paint);\n      }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "18f6f376f771f5ffa56d5e5b2ebd20fb",
+    "file": "SkColor_Reference",
+    "name": "SkColorSetA"
+},
+    "SkColorSetARGB": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawColor(SK_ColorRED);\n    canvas->clipRect(SkRect::MakeWH(150, 150));\n    canvas->drawColor(SkColorSetARGB(0x80, 0x00, 0xFF, 0x00));\n    canvas->clipRect(SkRect::MakeWH(75, 75));\n    canvas->drawColor(SkColorSetARGB(0x80, 0x00, 0x00, 0xFF));\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "35888f0869e01a6e03b5b93bba563734",
+    "file": "SkColor_Reference",
+    "name": "SkColorSetARGB"
+},
+    "SkColorSetRGB": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawColor(SK_ColorRED);\n    canvas->clipRect(SkRect::MakeWH(150, 150));\n    canvas->drawColor(SkColorSetRGB(0x00, 0xFF, 0x00));\n    canvas->clipRect(SkRect::MakeWH(75, 75));\n    canvas->drawColor(SkColorSetRGB(0x00, 0x00, 0xFF));\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "dad12dd912197cd5edd789ac0801bf8a",
+    "file": "SkColor_Reference",
+    "name": "SkColorSetRGB"
+},
+    "SkColorToHSV": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawBitmap(source, 0, 0);\n    for (int y = 0; y < 256; ++y) {\n       for (int x = 0; x < 256; ++x) {\n         SkScalar hsv[3];\n         SkColorToHSV(source.getColor(x, y), hsv);\n         hsv[1] = 1 - hsv[1];\n         SkPaint paint;\n         paint.setColor(SkHSVToColor(hsv));\n         canvas->drawRect(SkRect::MakeXYWH(x, y, 1, 1), paint);\n      }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "1e0370f12c8aab5b84f9e824074f1e5a",
+    "file": "SkColor_Reference",
+    "name": "SkColorToHSV"
+},
+    "SkColorTypeBytesPerPixel": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* colors[] = { \"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                             \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\" };\n    SkPaint paint;\n    paint.setTypeface(SkTypeface::MakeFromName(\"monospace\", SkFontStyle()));\n    paint.setAntiAlias(true);\n    paint.setTextSize(10);\n    int y = 15;\n    canvas->drawString(\"    colorType  bytes\", 10, y, paint);\n    for (SkColorType colorType : {\n    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,\n    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,\n    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,\n    kGray_8_SkColorType, kRGBA_F16_SkColorType\n                                 } ) {\n        int result = SkColorTypeBytesPerPixel(colorType);\n        SkString string;\n        string.printf(\"%13s %4d\", colors[(int) colorType], result);\n        canvas->drawString(string, 10, y += 14, paint);\n    }\n}",
+    "width": 256,
+    "height": 192,
+    "hash": "09ef49d07cb7005ba3e34d5ea53896f5",
+    "file": "SkImageInfo_Reference",
+    "name": "SkColorTypeBytesPerPixel"
+},
+    "SkColorTypeIsAlwaysOpaque": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* colors[] = { \"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                             \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\" };\n    SkPaint paint;\n    paint.setTypeface(SkTypeface::MakeFromName(\"monospace\", SkFontStyle()));\n    paint.setAntiAlias(true);\n    paint.setTextSize(10);\n    int y = 15;\n    canvas->drawString(\"    colorType  bytes\", 10, y, paint);\n    for (SkColorType colorType : {\n    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,\n    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,\n    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,\n    kGray_8_SkColorType, kRGBA_F16_SkColorType\n                                 } ) {\n        bool result = SkColorTypeIsAlwaysOpaque(colorType);\n        SkString string;\n        string.printf(\"%13s %6s\", colors[(int) colorType], result ? \"true\" : \"false\");\n        canvas->drawString(string, 10, y += 14, paint);\n    }\n}",
+    "width": 256,
+    "height": 192,
+    "hash": "9b3eb5aaa0dfea9feee54e7650fa5446",
+    "file": "SkImageInfo_Reference",
+    "name": "SkColorTypeIsAlwaysOpaque"
+},
+    "SkColorTypeValidateAlphaType": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* colors[] = { \"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                             \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\" };\n    const char* alphas[] = {\"Unknown \", \"Opaque  \", \"Premul  \", \"Unpremul\"};\n    SkAlphaType alphaTypes[] = { kUnknown_SkAlphaType, kOpaque_SkAlphaType, kPremul_SkAlphaType,\n    kUnpremul_SkAlphaType\n                               };\n    SkPaint paint;\n    paint.setTypeface(SkTypeface::MakeFromName(\"monospace\", SkFontStyle()));\n    paint.setAntiAlias(true);\n    paint.setTextSize(10);\n    int y = 15;\n    canvas->drawString(\"   colorType   alphaType  canonical\", 10, y, paint);\n    for (SkColorType colorType : {\n    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,\n    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,\n    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,\n    kGray_8_SkColorType, kRGBA_F16_SkColorType\n                                 } ) {\n        for (SkAlphaType alphaType : alphaTypes) {\n            SkAlphaType canonicalAlphaType  = kUnknown_SkAlphaType;\n            bool result = SkColorTypeValidateAlphaType(colorType, alphaType, &canonicalAlphaType);\n            SkString string;\n            string.printf(\"%13s %10s %10s\", colors[(int) colorType], alphas[(int) alphaType],\n                     result ? alphas[(int) canonicalAlphaType] : \"------  \");\n            canvas->drawString(string, 10, y += 14, paint);\n        }\n    }\n}",
+    "width": 256,
+    "height": 640,
+    "hash": "befac1c29ed21507d367e4d824383a04",
+    "file": "SkImageInfo_Reference",
+    "name": "SkColorTypeValidateAlphaType"
+},
+    "SkDynamicMemoryWStream_bytesWritten": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkDynamicMemoryWStream_Reference",
+    "name": "SkDynamicMemoryWStream::bytesWritten"
+},
+    "SkDynamicMemoryWStream_copyTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkDynamicMemoryWStream_Reference",
+    "name": "SkDynamicMemoryWStream::copyTo"
+},
+    "SkDynamicMemoryWStream_copyToAndReset": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkDynamicMemoryWStream_Reference",
+    "name": "SkDynamicMemoryWStream::copyToAndReset"
+},
+    "SkDynamicMemoryWStream_destructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkDynamicMemoryWStream_Reference",
+    "name": "SkDynamicMemoryWStream::~SkDynamicMemoryWStream()"
+},
+    "SkDynamicMemoryWStream_detachAsData": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkDynamicMemoryWStream_Reference",
+    "name": "SkDynamicMemoryWStream::detachAsData"
+},
+    "SkDynamicMemoryWStream_detachAsStream": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkDynamicMemoryWStream_Reference",
+    "name": "SkDynamicMemoryWStream::detachAsStream"
+},
+    "SkDynamicMemoryWStream_empty_constructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkDynamicMemoryWStream_Reference",
+    "name": "SkDynamicMemoryWStream::SkDynamicMemoryWStream()"
+},
+    "SkDynamicMemoryWStream_padToAlign4": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkDynamicMemoryWStream_Reference",
+    "name": "SkDynamicMemoryWStream::padToAlign4"
+},
+    "SkDynamicMemoryWStream_read": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkDynamicMemoryWStream_Reference",
+    "name": "SkDynamicMemoryWStream::read()"
+},
+    "SkDynamicMemoryWStream_reset": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkDynamicMemoryWStream_Reference",
+    "name": "SkDynamicMemoryWStream::reset()"
+},
+    "SkDynamicMemoryWStream_write": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkDynamicMemoryWStream_Reference",
+    "name": "SkDynamicMemoryWStream::write()"
+},
+    "SkDynamicMemoryWStream_writeToAndReset": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkDynamicMemoryWStream_Reference",
+    "name": "SkDynamicMemoryWStream::writeToAndReset"
+},
+    "SkDynamicMemoryWStream_writeToStream": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkDynamicMemoryWStream_Reference",
+    "name": "SkDynamicMemoryWStream::writeToStream"
+},
+    "SkFILEStream_Make": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::Make"
+},
+    "SkFILEStream_close": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::close()"
+},
+    "SkFILEStream_copy_const": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::SkFILEStream(const char path[] = nullptr)"
+},
+    "SkFILEStream_copy_star": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::SkFILEStream(FILE* file)"
+},
+    "SkFILEStream_destructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::~SkFILEStream()"
+},
+    "SkFILEStream_duplicate": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::duplicate()"
+},
+    "SkFILEStream_fork": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::fork()"
+},
+    "SkFILEStream_getLength": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::getLength"
+},
+    "SkFILEStream_getPosition": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::getPosition"
+},
+    "SkFILEStream_isAtEnd": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::isAtEnd"
+},
+    "SkFILEStream_isValid": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::isValid"
+},
+    "SkFILEStream_move": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::move()"
+},
+    "SkFILEStream_read": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::read()"
+},
+    "SkFILEStream_rewind": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::rewind()"
+},
+    "SkFILEStream_seek": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEStream_Reference",
+    "name": "SkFILEStream::seek()"
+},
+    "SkFILEWStream_bytesWritten": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEWStream_Reference",
+    "name": "SkFILEWStream::bytesWritten"
+},
+    "SkFILEWStream_copy_const": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEWStream_Reference",
+    "name": "SkFILEWStream::SkFILEWStream(const char path[])"
+},
+    "SkFILEWStream_destructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEWStream_Reference",
+    "name": "SkFILEWStream::~SkFILEWStream()"
+},
+    "SkFILEWStream_flush": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEWStream_Reference",
+    "name": "SkFILEWStream::flush()"
+},
+    "SkFILEWStream_fsync": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEWStream_Reference",
+    "name": "SkFILEWStream::fsync()"
+},
+    "SkFILEWStream_isValid": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEWStream_Reference",
+    "name": "SkFILEWStream::isValid"
+},
+    "SkFILEWStream_write": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFILEWStream_Reference",
+    "name": "SkFILEWStream::write()"
+},
+    "SkFont_Edging": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::Edging"
+},
+    "SkFont_SkTypeface_SkScalar": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::SkFont(sk_sp<SkTypeface> typeface, SkScalar size)"
+},
+    "SkFont_SkTypeface_SkScalar_SkScalar_SkScalar": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::SkFont(sk_sp<SkTypeface> typeface, SkScalar size, SkScalar scaleX, SkScalar skewX)"
+},
+    "SkFont_breakText": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::breakText"
+},
+    "SkFont_containsText": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::containsText"
+},
+    "SkFont_countText": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::countText"
+},
+    "SkFont_empty_constructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::SkFont()"
+},
+    "SkFont_equal1_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::operator==(const SkFont& font) const"
+},
+    "SkFont_getEdging": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::getEdging"
+},
+    "SkFont_getHinting": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::getHinting"
+},
+    "SkFont_getMetrics": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::getMetrics"
+},
+    "SkFont_getPath": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::getPath"
+},
+    "SkFont_getPaths": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::getPaths"
+},
+    "SkFont_getScaleX": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::getScaleX"
+},
+    "SkFont_getSize": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::getSize"
+},
+    "SkFont_getSkewX": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::getSkewX"
+},
+    "SkFont_getSpacing": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::getSpacing"
+},
+    "SkFont_getTypeface": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::getTypeface"
+},
+    "SkFont_isEmbeddedBitmaps": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::isEmbeddedBitmaps"
+},
+    "SkFont_isEmbolden": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::isEmbolden"
+},
+    "SkFont_isForceAutoHinting": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::isForceAutoHinting"
+},
+    "SkFont_isLinearMetrics": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::isLinearMetrics"
+},
+    "SkFont_isSubpixel": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::isSubpixel"
+},
+    "SkFont_makeWithSize": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::makeWithSize"
+},
+    "SkFont_measureText": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::measureText"
+},
+    "SkFont_refTypeface": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::refTypeface"
+},
+    "SkFont_setEdging": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::setEdging"
+},
+    "SkFont_setEmbeddedBitmaps": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::setEmbeddedBitmaps"
+},
+    "SkFont_setEmbolden": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::setEmbolden"
+},
+    "SkFont_setForceAutoHinting": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::setForceAutoHinting"
+},
+    "SkFont_setHinting": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::setHinting"
+},
+    "SkFont_setLinearMetrics": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::setLinearMetrics"
+},
+    "SkFont_setScaleX": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::setScaleX"
+},
+    "SkFont_setSize": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::setSize"
+},
+    "SkFont_setSkewX": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::setSkewX"
+},
+    "SkFont_setSubpixel": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::setSubpixel"
+},
+    "SkFont_setTypeface": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::setTypeface"
+},
+    "SkFont_textToGlyphs": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::textToGlyphs"
+},
+    "SkFont_unicharToGlyph": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkFont_Reference",
+    "name": "SkFont::unicharToGlyph"
+},
+    "SkHSVToColor": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawBitmap(source, 0, 0);\n    for (int y = 0; y < 256; ++y) {\n       for (int x = 0; x < 256; ++x) {\n         SkColor color = source.getColor(x, y);\n         SkScalar hsv[3];\n         SkColorToHSV(color, hsv);\n         hsv[0] = hsv[0] + 90 >= 360 ? hsv[0] - 270 : hsv[0] + 90;\n         SkPaint paint;\n         paint.setColor(SkHSVToColor(x + y, hsv));\n         canvas->drawRect(SkRect::MakeXYWH(x, y, 1, 1), paint);\n      }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "311a59931ac340b90f202cd6ac399a0a",
+    "file": "SkColor_Reference",
+    "name": "SkHSVToColor"
+},
+    "SkHSVToColor_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawBitmap(source, 0, 0);\n    for (int y = 0; y < 256; ++y) {\n       for (int x = 0; x < 256; ++x) {\n         SkColor color = source.getColor(x, y);\n         SkScalar hsv[3];\n         SkColorToHSV(color, hsv);\n         hsv[0] = hsv[0] + 90 >= 360 ? hsv[0] - 270 : hsv[0] + 90;\n         SkPaint paint;\n         paint.setColor(SkHSVToColor(hsv));\n         canvas->drawRect(SkRect::MakeXYWH(x, y, 1, 1), paint);\n      }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "d355a17547908cdbc2c38720974b5d11",
+    "file": "SkColor_Reference",
+    "name": "SkHSVToColor_2"
+},
+    "SkIPoint_add_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto draw_lines = [=](const SkIPoint pts[], size_t count, SkPaint& paint) -> void {\n        for (size_t i = 0; i < count - 1; ++i) {\n            SkPoint p0, p1;\n            p0.iset(pts[i]);\n            p1.iset(pts[i + 1]);\n            canvas->drawLine(p0, p1, paint);\n        }\n    };\n    SkIPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 } };\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->scale(30, 15);\n    draw_lines(points, SK_ARRAY_COUNT(points), paint);\n    SkIPoint mod = {4, 1};\n    for (auto& point : points) {\n        point = point + mod;\n        mod.fX -= 1;\n        mod.fY += 1;\n    }\n    paint.setColor(SK_ColorRED);\n    draw_lines(points, SK_ARRAY_COUNT(points), paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "63f4cba971c6d8434595906f865b5a29",
+    "file": "SkIPoint_Reference",
+    "name": "SkIPoint::operator+(const SkIPoint& a, const SkIVector& b)"
+},
+    "SkIPoint_addto_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto draw_lines = [=](const SkIPoint pts[], size_t count, SkPaint& paint) -> void {\n        for (size_t i = 0; i < count - 1; ++i) {\n            SkPoint p0, p1;\n            p0.iset(pts[i]);\n            p1.iset(pts[i + 1]);\n            canvas->drawLine(p0, p1, paint);\n        }\n    };\n    SkIPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 } };\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->scale(30, 15);\n    draw_lines(points, SK_ARRAY_COUNT(points), paint);\n    points[1] += {1, 1};\n    points[2] += {-1, -1};\n    paint.setColor(SK_ColorRED);\n    draw_lines(points, SK_ARRAY_COUNT(points), paint);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "4eb2d95c9e9a66f05296e345bb68bd51",
+    "file": "SkIPoint_Reference",
+    "name": "SkIPoint::operator+=(const SkIVector& v)"
+},
+    "SkIPoint_subtract_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto draw_lines = [=](const SkIPoint pts[], size_t count, SkPaint& paint) -> void {\n        for (size_t i = 0; i < count - 1; ++i) {\n            SkPoint p0, p1;\n            p0.iset(pts[i]);\n            p1.iset(pts[i + 1]);\n            canvas->drawLine(p0, p1, paint);\n        }\n    };\n    SkIPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 } };\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->scale(30, 15);\n    draw_lines(points, SK_ARRAY_COUNT(points), paint);\n    points[1] += points[0] - points[3];\n    points[2] -= points[1] - points[0];\n    paint.setColor(SK_ColorRED);\n    draw_lines(points, SK_ARRAY_COUNT(points), paint);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "e626e26bf557857b824aa7d03f723e0f",
+    "file": "SkIPoint_Reference",
+    "name": "SkIPoint::operator-(const SkIPoint& a, const SkIPoint& b)"
+},
+    "SkIPoint_subtractfrom_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto draw_lines = [=](const SkIPoint pts[], size_t count, SkPaint& paint) -> void {\n        for (size_t i = 0; i < count - 1; ++i) {\n            SkPoint p0, p1;\n            p0.iset(pts[i]);\n            p1.iset(pts[i + 1]);\n            canvas->drawLine(p0, p1, paint);\n        }\n    };\n    SkIPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 } };\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->scale(30, 15);\n    draw_lines(points, SK_ARRAY_COUNT(points), paint);\n    points[1] -= {1, 1};\n    points[2] -= {-1, -1};\n    paint.setColor(SK_ColorRED);\n    draw_lines(points, SK_ARRAY_COUNT(points), paint);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "a01e533dc7ab34ed728dc4e7a5f1f0ee",
+    "file": "SkIPoint_Reference",
+    "name": "SkIPoint::operator-=(const SkIVector& v)"
+},
+    "SkImageInfo_Make": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t storage[][5] = {{ 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 },\n                            { 0xAC, 0xA8, 0x89, 0xA7, 0x87 },\n                            { 0x9B, 0xB5, 0xE5, 0x95, 0x46 },\n                            { 0x90, 0x81, 0xC5, 0x71, 0x33 },\n                            { 0x75, 0x55, 0x44, 0x40, 0x30 }};\n    SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kOpaque_SkAlphaType);\n    SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);\n    SkBitmap bitmap;\n    bitmap.installPixels(pixmap);\n    canvas->scale(8, 8);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 48,
+    "hash": "9f47f9c2a99473f5b1113db48096d586",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::Make"
+},
+    "SkImageInfo_MakeA8": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t pixels[][8] = { { 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00},\n                            { 0x00, 0x7f, 0xff, 0x3f, 0x3f, 0x7f, 0x3f, 0x00},\n                            { 0x3f, 0xff, 0x7f, 0x00, 0x7f, 0xff, 0x7f, 0x00},\n                            { 0x00, 0x3f, 0x00, 0x00, 0x3f, 0x7f, 0x3f, 0x00},\n                            { 0x3f, 0x7f, 0x7f, 0x3f, 0x00, 0x00, 0x00, 0x00},\n                            { 0x7f, 0xff, 0xff, 0x7f, 0x00, 0x3f, 0x7f, 0x3f},\n                            { 0x7f, 0xff, 0xff, 0x7f, 0x00, 0x7f, 0xff, 0x7f},\n                            { 0x3f, 0x7f, 0x7f, 0x3f, 0x00, 0x3f, 0x7f, 0x3f} };\n    SkBitmap bitmap;\n    bitmap.installPixels(SkImageInfo::MakeA8(8, 8),\n            (void*) pixels, sizeof(pixels[0]));\n    SkPaint paint;\n    canvas->scale(4, 4);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xFF007F00} ) {\n        paint.setColor(color);\n        canvas->drawBitmap(bitmap, 0, 0, &paint);\n        canvas->translate(12, 0);\n    }\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "547388991687b8e10d482d8b1c82777d",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::MakeA8"
+},
+    "SkImageInfo_MakeN32": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32(16, 16, kPremul_SkAlphaType));\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorWHITE);\n    SkPaint paint;\n    offscreen.drawString(\"g\", 0, 10, paint);\n    canvas->scale(8, 8);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "78cea0c4cac205b61ad6f6c982cbd888",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::MakeN32"
+},
+    "SkImageInfo_MakeN32Premul": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(18, 18));\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorWHITE);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(15);\n    offscreen.drawString(\"\\xF0\\x9F\\x98\\xB8\", 1, 15, paint);\n    canvas->scale(6, 6);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "525650a67e19fdd8ca9f72b7eda65174",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::MakeN32Premul"
+},
+    "SkImageInfo_MakeN32Premul_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul({18, 18}));\n    SkCanvas offscreen(bitmap);\n    offscreen.clear(SK_ColorWHITE);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(15);\n    offscreen.drawString(\"\\xF0\\x9F\\x98\\xB9\", 1, 15, paint);\n    canvas->scale(6, 6);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "b9026d7f39029756bd7cab9542c64f4e",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::MakeN32Premul_2"
+},
+    "SkImageInfo_MakeS32": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int width = 256;\n    const int height = 32;\n    SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);\n    SkColor  gradColors[] = { 0xFFAA0055, 0xFF11CC88 };\n    SkPoint  gradPoints[] = { { 0, 0 }, { width, 0 } };\n    SkPaint gradPaint;\n    gradPaint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr,\n                    SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode));\n    SkBitmap bitmap;\n    bitmap.allocPixels(SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType));\n    SkCanvas offScreen(bitmap);\n    offScreen.drawRect(SkRect::MakeWH(width, height), gradPaint);\n    canvas->drawBitmap(bitmap, 0, 0);\n    bitmap.allocPixels(SkImageInfo::MakeS32(width, height, kPremul_SkAlphaType));\n    SkCanvas sRGBOffscreen(bitmap);\n    sRGBOffscreen.drawRect(SkRect::MakeWH(width, height), gradPaint);\n    canvas->drawBitmap(bitmap, 0, 48);\n    SkBitmap noColorSpaceBitmap;\n    noColorSpaceBitmap.setInfo(SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType));\n    noColorSpaceBitmap.setPixels(bitmap.getAddr(0, 0));\n    canvas->drawBitmap(noColorSpaceBitmap, 0, 96);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "de418ccb42471d1589508ef3955f8c53",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::MakeS32"
+},
+    "SkImageInfo_MakeUnknown": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info;  // default constructor\n    SkString string;\n    string.printf(\"SkImageInfo() %c= SkImageInfo::MakeUnknown(0, 0)\",\n                  info == SkImageInfo::MakeUnknown(0, 0) ? '=' : '!');\n    SkPaint paint;\n    canvas->drawString(string, 0, 12, paint);\n}",
+    "width": 384,
+    "height": 32,
+    "hash": "75f13a78b28b08c72baf32b7d868de1c",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::MakeUnknown"
+},
+    "SkImageInfo_MakeUnknown_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info;  // default constructor\n    SkString string;\n    string.printf(\"SkImageInfo() %c= SkImageInfo::MakeUnknown()\",\n                  info == SkImageInfo::MakeUnknown() ? '=' : '!');\n    SkPaint paint;\n    canvas->drawString(string, 0, 12, paint);\n}",
+    "width": 384,
+    "height": 32,
+    "hash": "a1af7696ae0cdd6f379546dd1f211b7a",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::MakeUnknown_2"
+},
+    "SkImageInfo_bounds": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(.5f, .5f);\n    SkImageInfo imageInfo = source.info();\n    SkIRect bounds = imageInfo.bounds();\n    for (int x : { 0, bounds.width() } ) {\n        for (int y : { 0, bounds.height() } ) {\n            canvas->drawBitmap(source, x, y);\n        }\n    }\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "a818be8945cd0c18f99ffe53e90afa48",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::bounds()"
+},
+    "SkImageInfo_computeByteSize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::MakeN32Premul(2, 2);\n    const size_t size = info.computeByteSize(100000);\n    SkAutoTMalloc<SkPMColor> storage(size);\n    SkPMColor* pixels = storage.get();\n    SkBitmap bitmap;\n    bitmap.setInfo(info);\n    bitmap.setPixels(pixels);\n    bitmap.eraseColor(SK_ColorRED);\n    canvas->scale(50, 50);\n    canvas->rotate(8);\n    canvas->drawBitmap(bitmap, 2, 0);\n}",
+    "width": 256,
+    "height": 130,
+    "hash": "9def507d2295f7051effd0c83bb04436",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::computeByteSize"
+},
+    "SkImageInfo_computeMinByteSize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::MakeN32Premul(2, 2);\n    const size_t size = info.computeMinByteSize();\n    SkAutoTMalloc<SkPMColor> storage(size);\n    SkPMColor* pixels = storage.get();\n    SkBitmap bitmap;\n    bitmap.setInfo(info);\n    bitmap.setPixels(pixels);\n    bitmap.eraseColor(SK_ColorRED);\n    canvas->scale(50, 50);\n    canvas->rotate(8);\n    canvas->drawBitmap(bitmap, 2, 0);\n}",
+    "width": 256,
+    "height": 130,
+    "hash": "fc18640fdde437cb35338aed7c68d399",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::computeMinByteSize"
+},
+    "SkImageInfo_computeOffset": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t pixels[][12] = { { 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00},\n                             { 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00},\n                             { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00},\n                             { 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF},\n                             { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},\n                             { 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00},\n                             { 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00},\n                             { 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00} };\n    SkImageInfo imageInfo = SkImageInfo::MakeA8(8, 8);\n    SkBitmap bitmap;\n    bitmap.installPixels(imageInfo, (void*) pixels, sizeof(pixels[0]));\n    SkPaint paint;\n    paint.setColor(SK_ColorRED);\n    canvas->drawBitmapRect(bitmap, SkRect::MakeWH(8, 8), SkRect::MakeWH(32, 32), &paint);\n    size_t offset = imageInfo.computeOffset(2, 3, sizeof(pixels[0]));\n    pixels[0][offset] = 0x7F;\n    offset = imageInfo.computeOffset(5, 3, sizeof(pixels[0]));\n    pixels[0][offset] = 0x7F;\n    bitmap.installPixels(imageInfo, (void*) pixels, sizeof(pixels[0]));\n    canvas->drawBitmapRect(bitmap, SkRect::MakeWH(8, 8), SkRect::MakeWH(128, 128), &paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "818e4e1191e39d2a642902cbf253b399",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::computeOffset"
+},
+    "SkImageInfo_empty_constructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo imageInfo;\n    size_t rowBytes;\n    SkIPoint origin;\n    (void) canvas->accessTopLayerPixels(&imageInfo, &rowBytes, &origin);\n    const char* alphaType[] = { \"Unknown\", \"Opaque\", \"Premul\", \"Unpremul\" };\n    SkString string;\n    string.printf(\"k%s_SkAlphaType\", alphaType[(int) imageInfo.alphaType()]);\n    SkPaint paint;\n    canvas->drawString(string, 20, 20, paint);\n}",
+    "width": 256,
+    "height": 32,
+    "hash": "f206f698e7a8db3d84334c26b1a702dc",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::SkImageInfo()"
+},
+    "SkImageInfo_gammaCloseToSRGB": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int width = 256;\n    const int height = 64;\n    auto drawLabel = [=](const char* what, bool closeToSRGB) -> void {\n        SkString string;\n        string.printf(\"%s gamma is %s\" \"close to sRGB\", what, closeToSRGB ? \"\" : \"not \");\n        SkPaint paint;\n        paint.setAntiAlias(true);\n        canvas->drawString(string, 20, 56, paint);\n    };\n    SkColor  gradColors[] = { 0xFFFF7F00, 0xFF00FF7F,  0xFF0000FF, 0xFF7F7FFF };\n    SkPoint  gradPoints[] = { { 0, 0 }, { width, 0 }, { width * 2, 0 }, { width * 3, 0 } };\n    SkPaint gradPaint;\n    gradPaint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr,\n                    SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode));\n    canvas->drawRect(SkRect::MakeWH(width, height), gradPaint);\n    drawLabel(\"canvas\", canvas->imageInfo().gammaCloseToSRGB());\n    SkBitmap bitmap;\n    SkImageInfo offscreenInfo = SkImageInfo::MakeS32(width, height, kPremul_SkAlphaType);\n    bitmap.allocPixels(offscreenInfo);\n    SkCanvas sRGBOffscreen(bitmap);\n    sRGBOffscreen.drawRect(SkRect::MakeWH(width, height), gradPaint);\n    canvas->translate(0, 80);\n    canvas->drawBitmap(bitmap, 0, 0);\n    drawLabel(\"offscreen\", offscreenInfo.gammaCloseToSRGB());\n}",
+    "width": 256,
+    "height": 144,
+    "hash": "22df72732e898a11773fbfe07388a546",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::gammaCloseToSRGB"
+},
+    "SkImageInfo_height": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->translate(10, 20);\n    canvas->drawBitmap(source, 0, 0);\n    SkImageInfo imageInfo = source.info();\n    SkPaint paint;\n    canvas->drawLine(imageInfo.width() + 10, 0, imageInfo.width() + 10, imageInfo.height(), paint);\n    canvas->drawString(\"height\", imageInfo.width() + 15, imageInfo.height() / 2, paint);\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "72c35baaeddca1d912edf93d19429c8e",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::height()"
+},
+    "SkImageInfo_makeAlphaType": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int width = 256;\n    const int height = 128;\n    SkColor pixels[height][width];\n    for (int y = 0; y < height; ++y) {\n        for (int x = 0; x < width; ++x) {\n            int red = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarSin((x * 4 + y) * 0.03f)));\n            int blue = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarCos((x * 3 + y) * 0.04f)));\n            int green = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarSin((x * 2 + y) * 0.05f)));\n            int alpha = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarCos((x * 1 + y) * 0.006f)));\n            pixels[y][x] =\n                SkColorSetARGB(alpha, red * alpha / 255, green * alpha / 255, blue * alpha / 255);\n        }\n    }\n    SkBitmap bitmap;\n    SkImageInfo info = SkImageInfo::Make(width, height, kBGRA_8888_SkColorType, kPremul_SkAlphaType);\n    bitmap.installPixels(info, (void*) pixels, sizeof(SkColor) * width);\n    canvas->drawBitmap(source, 0, 0);\n    canvas->drawBitmap(bitmap, 0, 0);\n    SkImageInfo unpremulInfo = info.makeAlphaType(kUnpremul_SkAlphaType);\n    bitmap.installPixels(unpremulInfo, (void*) pixels, sizeof(SkColor) * width);\n    canvas->drawBitmap(bitmap, 0, 128);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "e72db006f1bea26feceaef8727ff9818",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::makeAlphaType"
+},
+    "SkImageInfo_makeColorSpace": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int width = 256;\n    const int height = 64;\n    auto drawLabel = [=](const char* what, bool closeToSRGB) -> void {\n        SkString string;\n        string.printf(\"%s gamma is %s\" \"close to sRGB\", what, closeToSRGB ? \"\" : \"not \");\n        SkPaint paint;\n        paint.setAntiAlias(true);\n        canvas->drawString(string, 20, 56, paint);\n    };\n    SkColor  gradColors[] = { 0xFFFF7F00, 0xFF00FF7F,  0xFF0000FF, 0xFF7F7FFF };\n    SkPoint  gradPoints[] = { { 0, 0 }, { width, 0 }, { width * 2, 0 }, { width * 3, 0 } };\n    SkPaint gradPaint;\n    gradPaint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr,\n            SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode));\n    canvas->drawRect(SkRect::MakeWH(width, height), gradPaint);\n    drawLabel(\"canvas\", canvas->imageInfo().gammaCloseToSRGB());\n    SkBitmap bitmap;\n    SkImageInfo offscreenInfo = SkImageInfo::MakeS32(width, height, kPremul_SkAlphaType);\n    bitmap.allocPixels(offscreenInfo);\n    SkCanvas sRGBOffscreen(bitmap);\n    sRGBOffscreen.drawRect(SkRect::MakeWH(width, height), gradPaint);\n    canvas->translate(0, 80);\n    canvas->drawBitmap(bitmap, 0, 0);\n    drawLabel(\"offscreen\", offscreenInfo.gammaCloseToSRGB());\n    SkImageInfo linearGamma =\n            offscreenInfo.makeColorSpace(offscreenInfo.colorSpace()->makeLinearGamma());\n    bitmap.allocPixels(linearGamma);\n    SkCanvas lgOffscreen(bitmap);\n    lgOffscreen.drawRect(SkRect::MakeWH(width, height), gradPaint);\n    canvas->translate(0, 80);\n    canvas->drawBitmap(bitmap, 0, 0);\n    drawLabel(\"linear\", linearGamma.gammaCloseToSRGB());\n}",
+    "width": 256,
+    "height": 224,
+    "hash": "fe3c5a755d3dde29bba058a583f18901",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::makeColorSpace"
+},
+    "SkImageInfo_makeColorType": {
+    "code": "void draw(SkCanvas* canvas) {\n    const int width = 256;\n    const int height = 128;\n    SkColor pixels[height][width];\n    for (int y = 0; y < height; ++y) {\n        for (int x = 0; x < width; ++x) {\n            int red = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarSin((x * 4 + y) * 0.03f)));\n            int blue = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarCos((x * 3 + y) * 0.04f)));\n            int green = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarSin((x * 2 + y) * 0.05f)));\n            int alpha = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarCos((x * 1 + y) * 0.006f)));\n            pixels[y][x] =\n                SkColorSetARGB(alpha, red * alpha / 255, green * alpha / 255, blue * alpha / 255);\n        }\n    }\n    SkBitmap bitmap;\n    SkImageInfo info = SkImageInfo::Make(width, height, kBGRA_8888_SkColorType, kPremul_SkAlphaType);\n    bitmap.installPixels(info, (void*) pixels, sizeof(SkColor) * width);\n    canvas->drawBitmap(source, 0, 0);\n    canvas->drawBitmap(bitmap, 0, 0);\n    SkImageInfo rgbaInfo = info.makeColorType(kRGBA_8888_SkColorType);\n    bitmap.installPixels(rgbaInfo, (void*) pixels, sizeof(SkColor) * width);\n    canvas->drawBitmap(bitmap, 0, 128);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "3ac267b08b12dc83c95f91d8dd5d70ee",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::makeColorType"
+},
+    "SkImageInfo_makeWH": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo canvasImageInfo = canvas->imageInfo();\n    SkRect canvasBounds = SkRect::Make(canvasImageInfo.bounds());\n    canvas->drawBitmapRect(source, source.bounds(), canvasBounds, nullptr);\n    SkImageInfo insetImageInfo =\n              canvasImageInfo.makeWH(canvasBounds.width() / 2, canvasBounds.height() / 2);\n    SkBitmap inset;\n    inset.allocPixels(insetImageInfo);\n    SkCanvas offscreen(inset);\n    offscreen.drawBitmapRect(source, source.bounds(), SkRect::Make(inset.bounds()), nullptr);\n    canvas->drawBitmap(inset, canvasBounds.width() / 4, canvasBounds.height() / 4);\n}",
+    "width": 256,
+    "height": 144,
+    "hash": "cd203a3f9c5fb68272f21f302dd54fbc",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::makeWH"
+},
+    "SkImageInfo_width": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->translate(10, 10);\n    canvas->drawBitmap(source, 0, 0);\n    SkImageInfo imageInfo = source.info();\n    canvas->translate(0, imageInfo.height());\n    SkPaint paint;\n    canvas->drawLine(0, 10, imageInfo.width(), 10, paint);\n    canvas->drawString(\"width\", imageInfo.width() / 2 - 15, 25, paint);\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "e2491817695290d0218be77f091b8460",
+    "file": "SkImageInfo_Reference",
+    "name": "SkImageInfo::width()"
+},
+    "SkImage_MakeBackendTextureFromSkImage": {
+    "code": "static sk_sp<SkImage> create_gpu_image(GrContext* grContext) {\n    const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);\n    auto surface(SkSurface::MakeRenderTarget(grContext, SkBudgeted::kNo, info));\n    SkCanvas* canvas = surface->getCanvas();\n    canvas->clear(SK_ColorWHITE);\n    SkPaint paint;\n    paint.setColor(SK_ColorBLACK);\n    canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint);\n    return surface->makeImageSnapshot();\n}\n\nvoid draw(SkCanvas* canvas) {\n    GrContext* grContext = canvas->getGrContext();\n    if (!grContext) {\n        return;\n    }\n    sk_sp<SkImage> backEndImage = create_gpu_image(grContext);\n    canvas->drawImage(backEndImage, 0, 0);\n    GrBackendTexture texture;\n    SkImage::BackendTextureReleaseProc proc;\n    if (!SkImage::MakeBackendTextureFromSkImage(grContext, std::move(backEndImage),\n            &texture, &proc)) {\n        return;\n    }\n    sk_sp<SkImage> i2 = SkImage::MakeFromTexture(grContext, texture, kTopLeft_GrSurfaceOrigin,\n            kN32_SkColorType, kOpaque_SkAlphaType, nullptr);\n    canvas->drawImage(i2, 30, 30);\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "06aeb3cf63ffccf7b49fe556e5def351",
+    "file": "SkImage_Reference",
+    "name": "SkImage::MakeBackendTextureFromSkImage"
+},
+    "SkImage_MakeCrossContextFromEncoded": {
+    "code": "void draw(SkCanvas* canvas) {\n    GrContext* context = canvas->getGrContext();\n    sk_sp<SkData> encodedData = image->encodeToData(SkEncodedImageFormat::kJPEG, 100);\n    sk_sp<SkImage> image = SkImage::MakeCrossContextFromEncoded(context,\n                                                                encodedData, false, nullptr);\n    canvas->drawImage(image, 0, 0);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "069c7b116479e3ca46f953f07dcbdd36",
+    "file": "SkImage_Reference",
+    "name": "SkImage::MakeCrossContextFromEncoded"
+},
+    "SkImage_MakeCrossContextFromPixmap": {
+    "code": "void draw(SkCanvas* canvas) {\n    GrContext* context = canvas->getGrContext();\n    SkPixmap pixmap;\n    if (source.peekPixels(&pixmap)) {\n        sk_sp<SkImage> image = SkImage::MakeCrossContextFromPixmap(context, pixmap,\n                                                                   false, nullptr);\n        canvas->drawImage(image, 0, 0);\n    }\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "45bca8747b8f49b5be34b520897ef048",
+    "file": "SkImage_Reference",
+    "name": "SkImage::MakeCrossContextFromPixmap"
+},
+    "SkImage_MakeFromAdoptedTexture": {
+    "code": "void draw(SkCanvas* canvas) {\n    if (!canvas->getGrContext()) {\n        return;\n    }\n    canvas->scale(.5f, .5f);\n    canvas->clear(0x7f3f5f7f);\n    int x = 0, y = 0;\n    for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {\n        for (auto alpha : { kOpaque_SkAlphaType, kPremul_SkAlphaType, kUnpremul_SkAlphaType } ) {\n            sk_sp<SkImage> image = SkImage::MakeFromAdoptedTexture(canvas->getGrContext(),\n                                                                   backEndTexture, origin,\n                                                                   kRGBA_8888_SkColorType, alpha);\n            canvas->drawImage(image, x, y);\n            x += 160;\n        }\n        x -= 160 * 3;\n        y += 256;\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "b034517e39394b7543f06ec885e36d7d",
+    "file": "SkImage_Reference",
+    "name": "SkImage::MakeFromAdoptedTexture"
+},
+    "SkImage_MakeFromBitmap": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t storage[][5] = {{ 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 },\n                            { 0xAC, 0xA8, 0x89, 0xA7, 0x87 },\n                            { 0x9B, 0xB5, 0xE5, 0x95, 0x46 },\n                            { 0x90, 0x81, 0xC5, 0x71, 0x33 },\n                            { 0x75, 0x55, 0x44, 0x40, 0x30 }};\n    SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kOpaque_SkAlphaType);\n    SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);\n    SkBitmap bitmap;\n    bitmap.installPixels(pixmap);\n    sk_sp<SkImage> image1 = SkImage::MakeFromBitmap(bitmap);\n    bitmap.setImmutable();\n    sk_sp<SkImage> image2 = SkImage::MakeFromBitmap(bitmap);\n    *pixmap.writable_addr8(2, 2) = 0x00;\n    canvas->scale(10, 10);\n    canvas->drawImage(image1, 0, 0);\n    canvas->drawImage(image2, 10, 0);\n}",
+    "width": 256,
+    "height": 50,
+    "hash": "cf2cf53321e4e6a77c2841bfbc0ef707",
+    "file": "SkImage_Reference",
+    "name": "SkImage::MakeFromBitmap"
+},
+    "SkImage_MakeFromEncoded": {
+    "code": "void draw(SkCanvas* canvas) {\n    int x = 0;\n    for (int quality : { 100, 50, 10, 1} ) {\n        sk_sp<SkData> encodedData = image->encodeToData(SkEncodedImageFormat::kJPEG, quality);\n        sk_sp<SkImage> image = SkImage::MakeFromEncoded(encodedData);\n        canvas->drawImage(image, x, 0);\n        x += 64;\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "894f732ed6409b1f392bc5481421d0e9",
+    "file": "SkImage_Reference",
+    "name": "SkImage::MakeFromEncoded"
+},
+    "SkImage_MakeFromGenerator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    recorder.beginRecording(100, 100)->drawColor(SK_ColorRED);\n    auto picture = recorder.finishRecordingAsPicture();\n    auto gen = SkImageGenerator::MakeFromPicture({100, 100}, picture, nullptr, nullptr,\n                                                 SkImage::BitDepth::kU8, SkColorSpace::MakeSRGB());\n    sk_sp<SkImage> image = SkImage::MakeFromGenerator(std::move(gen));\n    canvas->drawImage(image, 0, 0);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "c2fec0746f88ca34d7dce59dd9bdef9e",
+    "file": "SkImage_Reference",
+    "name": "SkImage::MakeFromGenerator"
+},
+    "SkImage_MakeFromPicture": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkPictureRecorder recorder;\n    SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);\n    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {\n        paint.setColor(color);\n        recordingCanvas->drawRect({10, 10, 30, 40}, paint);\n        recordingCanvas->translate(10, 10);\n        recordingCanvas->scale(1.2f, 1.4f);\n    }\n    sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();\n    int x = 0, y = 0;\n    for (auto alpha : { 70, 140, 210 } ) {\n        paint.setAlpha(alpha);\n        auto srgbColorSpace = SkColorSpace::MakeSRGB();\n        sk_sp<SkImage> image = SkImage::MakeFromPicture(playback, {50, 50}, nullptr, &paint,\n                                                        SkImage::BitDepth::kU8, srgbColorSpace);\n        canvas->drawImage(image, x, y);\n        x += 70; y += 70;\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "4aa2879b9e44dfd6648995326d2c4dcf",
+    "file": "SkImage_Reference",
+    "name": "SkImage::MakeFromPicture"
+},
+    "SkImage_MakeFromTexture": {
+    "code": "void draw(SkCanvas* canvas) {\n    GrContext* context = canvas->getGrContext();\n    if (!context) {\n       return;\n    }\n    canvas->scale(.25f, .25f);\n    int x = 0;\n    for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {\n        sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,\n               origin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr);\n        canvas->drawImage(image, x, 0);\n    x += 512;\n    }\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "94e9296c53bad074bf2a48ff885dac13",
+    "file": "SkImage_Reference",
+    "name": "SkImage::MakeFromTexture"
+},
+    "SkImage_MakeFromTexture_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    GrContext* context = canvas->getGrContext();\n    if (!context) {\n       return;\n    }\n    auto debugster = [](SkImage::ReleaseContext releaseContext) -> void {\n     // broken\n     //   *((int *) releaseContext) += 128;\n    };\n    int x = 0;\n    for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {\n        sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,\n               origin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr, debugster, &x);\n        canvas->drawImage(image, x, 0);\n        x += 128;\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "f40e1ebba6b067714062b81877b22fa1",
+    "file": "SkImage_Reference",
+    "name": "SkImage::MakeFromTexture_2"
+},
+    "SkImage_MakeRasterCopy": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t storage[][5] = {{ 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 },\n                            { 0xAC, 0xA8, 0x89, 0xA7, 0x87 },\n                            { 0x9B, 0xB5, 0xE5, 0x95, 0x46 },\n                            { 0x90, 0x81, 0xC5, 0x71, 0x33 },\n                            { 0x75, 0x55, 0x44, 0x40, 0x30 }};\n    SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kOpaque_SkAlphaType);\n    SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);\n    SkBitmap bitmap;\n    bitmap.installPixels(pixmap);\n    sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);\n    *pixmap.writable_addr8(2, 2) = 0x00;\n    canvas->scale(10, 10);\n    canvas->drawBitmap(bitmap, 0, 0);\n    canvas->drawImage(image, 10, 0);\n}",
+    "width": 256,
+    "height": 50,
+    "hash": "513afec5795a9504ebf6af5373d16b6b",
+    "file": "SkImage_Reference",
+    "name": "SkImage::MakeRasterCopy"
+},
+    "SkImage_MakeRasterData": {
+    "code": "void draw(SkCanvas* canvas) {\n    size_t rowBytes = image->width() * SkColorTypeBytesPerPixel(kRGBA_8888_SkColorType);\n    sk_sp<SkData> data = SkData::MakeUninitialized(rowBytes * image->height());\n    SkImageInfo dstInfo = SkImageInfo::MakeN32(image->width(), image->height(),\n                                               kPremul_SkAlphaType);\n    image->readPixels(dstInfo, data->writable_data(), rowBytes, 0, 0, SkImage::kAllow_CachingHint);\n    sk_sp<SkImage> raw = SkImage::MakeRasterData(dstInfo.makeColorType(kRGBA_8888_SkColorType),\n                                                 data, rowBytes);\n    canvas->drawImage(image, 0, 0);\n    canvas->drawImage(raw.get(), 128, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "22e7ce79ab2fe94252d23319f2258127",
+    "file": "SkImage_Reference",
+    "name": "SkImage::MakeRasterData"
+},
+    "SkImage_alphaType": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* alphaTypeStr[] = { \"Unknown\", \"Opaque\", \"Premul\", \"Unpremul\" };\n    SkAlphaType alphaType = image->alphaType();\n    canvas->drawImage(image, 16, 0);\n    canvas->drawString(alphaTypeStr[(int) alphaType], 20, image->height() + 20, SkPaint());\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "1b9f1f05026ceb14ccb6926a13cdaa83",
+    "file": "SkImage_Reference",
+    "name": "SkImage::alphaType"
+},
+    "SkImage_bounds": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect bounds = image->bounds();\n    for (int x : { 0, bounds.width() } ) {\n        for (int y : { 0, bounds.height() } ) {\n            canvas->drawImage(image, x, y);\n        }\n    }\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "c204b38b3fc08914b0a634aa4eaec894",
+    "file": "SkImage_Reference",
+    "name": "SkImage::bounds()"
+},
+    "SkImage_colorSpace": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPixmap pixmap;\n    source.peekPixels(&pixmap);\n    canvas->scale(.25f, .25f);\n    int y = 0;\n    for (auto gamma : { SkColorSpace::kLinear_RenderTargetGamma,\n                        SkColorSpace::kSRGB_RenderTargetGamma } ) {\n        int x = 0;\n        sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkColorSpace::kSRGB_Gamut);\n        for (int index = 0; index < 2; ++index) {\n            pixmap.setColorSpace(colorSpace);\n            sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);\n            canvas->drawImage(image, x, y);\n            colorSpace = image->colorSpace()->makeColorSpin();\n            x += 512;\n        }\n        y += 512;\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "4468d573f42af6f5e234be10a5453bb2",
+    "file": "SkImage_Reference",
+    "name": "SkImage::colorSpace"
+},
+    "SkImage_colorType": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* colors[] = { \"Unknown\", \"Alpha_8\", \"RGB_565\", \"ARGB_4444\", \"RGBA_8888\", \"RGB_888x\",\n                             \"BGRA_8888\", \"RGBA_1010102\", \"RGB_101010x\", \"Gray_8\", \"RGBA_F16\" };\n    SkColorType colorType = image->colorType();\n    canvas->drawImage(image, 16, 0);\n    canvas->drawString(colors[(int) colorType], 20, image->height() + 20, SkPaint());\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "50396fad4a128f58e400ca00fe09711f",
+    "file": "SkImage_Reference",
+    "name": "SkImage::colorType"
+},
+    "SkImage_encodeToData": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(4, 4);\n    SkIRect subset = {0, 0, 16, 64};\n    int x = 0;\n    for (int quality : { 0, 10, 50, 100 } ) {\n        sk_sp<SkData> data(image->encodeToData(SkEncodedImageFormat::kJPEG, quality));\n        sk_sp<SkImage> filtered = SkImage::MakeFromEncoded(data, &subset);\n        canvas->drawImage(filtered, x, 0);\n        x += 16;\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "7a3bf8851bb7160e4e49c48f8c09639d",
+    "file": "SkImage_Reference",
+    "name": "SkImage::encodeToData"
+},
+    "SkImage_encodeToData_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(4, 4);\n    SkIRect subset = {136, 32, 200, 96};\n    sk_sp<SkData> data(image->encodeToData());\n    sk_sp<SkImage> eye = SkImage::MakeFromEncoded(data, &subset);\n    canvas->drawImage(eye, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "30cee813f6aa476b0a9c8a24283e53a3",
+    "file": "SkImage_Reference",
+    "name": "SkImage::encodeToData_2"
+},
+    "SkImage_getBackendTexture": {
+    "code": "void draw(SkCanvas* canvas) {\n    GrContext* grContext = canvas->getGrContext();\n    if (!grContext) {\n        canvas->drawString(\"GPU only!\", 20, 40, SkPaint());\n        return;\n    }\n    sk_sp<SkImage> imageFromBackend = SkImage::MakeFromAdoptedTexture(grContext, backEndTexture,\n            kBottomLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);\n    GrBackendTexture textureFromImage = imageFromBackend->getBackendTexture(false);\n    if (!textureFromImage.isValid()) {\n        return;\n    }\n    sk_sp<SkImage> imageFromTexture = SkImage::MakeFromAdoptedTexture(grContext, textureFromImage,\n            kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);\n    canvas->drawImage(imageFromTexture, 0, 0);\n    canvas->drawImage(imageFromBackend, 128, 128);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "d093aad721261f421c4bef4a296aab48",
+    "file": "SkImage_Reference",
+    "name": "SkImage::getBackendTexture"
+},
+    "SkImage_height": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->translate(10, 10);\n    canvas->drawImage(image, 0, 0);\n    canvas->translate(image->width(), 0);\n    SkPaint paint;\n    canvas->drawLine(10, 0, 10, image->height(), paint);\n    canvas->drawString(\"height\", 34, image->height() / 2, paint);\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "a4f53a0b6ac85e7bc3887245b728530d",
+    "file": "SkImage_Reference",
+    "name": "SkImage::height()"
+},
+    "SkImage_isLazyGenerated": {
+    "code": "class TestImageGenerator : public SkImageGenerator {\npublic:\n    TestImageGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(10, 10)) {}\n    ~TestImageGenerator() override {}\nprotected:\n    bool onGetPixels(const SkImageInfo& info, void* pixelPtr, size_t rowBytes,\n                     const Options& options) override {\n        SkPMColor* pixels = static_cast<SkPMColor*>(pixelPtr);\n        for (int y = 0; y < info.height(); ++y) {\n            for (int x = 0; x < info.width(); ++x) {\n                pixels[y * info.width() + x] = 0xff223344 + y * 0x000C0811;\n            }\n        }\n        return true;\n    }\n};\n\nvoid draw(SkCanvas* canvas) {\n    auto gen = std::unique_ptr<TestImageGenerator>(new TestImageGenerator());\n    sk_sp<SkImage> image(SkImage::MakeFromGenerator(std::move(gen)));\n    SkString lazy(image->isLazyGenerated() ? \"is lazy\" : \"not lazy\");\n    canvas->scale(8, 8);\n    canvas->drawImage(image, 0, 0, nullptr);\n    SkPaint paint;\n    paint.setTextSize(4);\n    canvas->drawString(lazy, 2, 5, paint);\n}\n",
+    "width": 256,
+    "height": 80,
+    "hash": "a8b8bd4bfe968e2c63085f867665227f",
+    "file": "SkImage_Reference",
+    "name": "SkImage::isLazyGenerated"
+},
+    "SkImage_isLazyGenerated_a": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {\n        if (nullptr == image) {\n            return;\n        }\n        SkPaint paint;\n        paint.setAntiAlias(true);\n        canvas->drawImage(image, 0, 0);\n        canvas->drawString(label, 30, image->height() / 4, paint);\n        canvas->drawString(\n                image->isLazyGenerated() ? \"is lazily generated\" : \"not lazily generated\",\n                20, image->height() * 3 / 4, paint);\n    };\n    sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));\n    sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,\n                                kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,\n                                kOpaque_SkAlphaType, nullptr));\n    drawImage(image, \"image\");\n    canvas->translate(image->width(), 0);\n    drawImage(bitmapImage, \"source\");\n    canvas->translate(-image->width(), image->height());\n    drawImage(textureImage, \"backEndTexture\");\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "f031c2a53f6a57833dc0127e674553da",
+    "file": "SkImage_Reference",
+    "name": "SkImage::isLazyGenerated_2"
+},
+    "SkImage_isTextureBacked": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {\n        if (nullptr == image) {\n            return;\n        }\n        SkPaint paint;\n        paint.setAntiAlias(true);\n        canvas->drawImage(image, 0, 0);\n        canvas->drawString(label, 30, image->height() / 4, paint);\n        canvas->drawString(image->isTextureBacked() ? \"is GPU texture\" : \"not GPU texture\",\n                           20, image->height() * 3 / 4, paint);\n    };\n    sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));\n    sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,\n                                kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,\n                                kOpaque_SkAlphaType, nullptr));\n    drawImage(image, \"image\");\n    canvas->translate(image->width(), 0);\n    drawImage(bitmapImage, \"source\");\n    canvas->translate(-image->width(), image->height());\n    drawImage(textureImage, \"backEndTexture\");\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "9cf5c62a3d2243e6577ae563f360ea9d",
+    "file": "SkImage_Reference",
+    "name": "SkImage::isTextureBacked"
+},
+    "SkImage_isValid": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {\n        if (nullptr == image) {\n            return;\n        }\n        SkPaint paint;\n        paint.setAntiAlias(true);\n        canvas->drawImage(image, 0, 0);\n        canvas->drawString(label, image->width() / 2, image->height() / 4, paint);\n        if (canvas->getGrContext()) {\n            canvas->drawString(image->isValid(canvas->getGrContext()) ? \"is valid on GPU\" :\n                    \"not valid on GPU\", 20, image->height() * 5 / 8, paint);\n        }\n        canvas->drawString(image->isValid(nullptr) ? \"is valid on CPU\" :\n                \"not valid on CPU\", 20, image->height() * 7 / 8, paint);\n    };\n    sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));\n    sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,\n                                kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,\n                                kOpaque_SkAlphaType, nullptr));\n    drawImage(image, \"image\");\n    canvas->translate(image->width(), 0);\n    drawImage(bitmapImage, \"source\");\n    canvas->translate(-image->width(), image->height());\n    drawImage(textureImage, \"backEndTexture\");\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "afc62f38aebc56af8e425297ec67dd37",
+    "file": "SkImage_Reference",
+    "name": "SkImage::isValid"
+},
+    "SkImage_makeColorSpace": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkColorSpace> normalColorSpace = SkColorSpace::MakeRGB(\n             SkColorSpace::kSRGB_RenderTargetGamma, SkColorSpace::kSRGB_Gamut);\n    sk_sp<SkColorSpace> wackyColorSpace = normalColorSpace->makeColorSpin();\n    for (auto colorSpace : { normalColorSpace, wackyColorSpace  } ) {\n        sk_sp<SkImage> colorSpaced = image->makeColorSpace(colorSpace);\n        canvas->drawImage(colorSpaced, 0, 0);\n        canvas->translate(128, 0);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "dbf5f75c1275a3013672f896767140fb",
+    "file": "SkImage_Reference",
+    "name": "SkImage::makeColorSpace"
+},
+    "SkImage_makeNonTextureImage": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {\n        if (nullptr == image) {\n            return;\n        }\n        SkPaint paint;\n        paint.setAntiAlias(true);\n        sk_sp<SkImage> nonTexture(image->makeNonTextureImage());\n        canvas->drawImage(nonTexture, 0, 0);\n        canvas->drawString(label, 20, nonTexture->height() / 4, paint);\n    };\n    sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));\n    sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,\n                                kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,\n                                kOpaque_SkAlphaType, nullptr));\n    drawImage(image, \"image\");\n    canvas->translate(image->width(), 0);\n    drawImage(bitmapImage, \"source\");\n    canvas->translate(-image->width(), image->height());\n    drawImage(textureImage, \"backEndTexture\");\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "ecdbaff44a02c310ef672b7d393c6dea",
+    "file": "SkImage_Reference",
+    "name": "SkImage::makeNonTextureImage"
+},
+    "SkImage_makeRasterImage": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {\n        if (nullptr == image) {\n            return;\n        }\n        SkPaint paint;\n        paint.setAntiAlias(true);\n        sk_sp<SkImage> raster(image->makeRasterImage());\n        canvas->drawImage(raster, 0, 0);\n        canvas->drawString(label, 20, raster->height() / 4, paint);\n    };\n    sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));\n    sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,\n                                kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,\n                                kOpaque_SkAlphaType, nullptr));\n    drawImage(image, \"image\");\n    canvas->translate(image->width(), 0);\n    drawImage(bitmapImage, \"source\");\n    canvas->translate(-image->width(), image->height());\n    drawImage(textureImage, \"backEndTexture\");\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "aed5f399915d40bb5d133ab586e5bac3",
+    "file": "SkImage_Reference",
+    "name": "SkImage::makeRasterImage"
+},
+    "SkImage_makeShader": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setRotate(45);\n    SkPaint paint;\n    paint.setShader(image->makeShader(SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode,\n                                      &matrix));\n    canvas->drawPaint(paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "1c6de6fe72b00b5be970f5f718363449",
+    "file": "SkImage_Reference",
+    "name": "SkImage::makeShader"
+},
+    "SkImage_makeShader_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setRotate(45);\n    matrix.postTranslate(125, 30);\n    SkPaint paint;\n    paint.setShader(image->makeShader(&matrix));\n    canvas->drawPaint(paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "10172fca71b9dbdcade772513ffeb27e",
+    "file": "SkImage_Reference",
+    "name": "SkImage::makeShader_2"
+},
+    "SkImage_makeSubset": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(.5f, .5f);\n    const int width = 64;\n    const int height = 64;\n    for (int y = 0; y < 512; y += height ) {\n        for (int x = 0; x < 512; x += width ) {\n            sk_sp<SkImage> subset(image->makeSubset({x, y, x + width, y + height}));\n            canvas->drawImage(subset, x * 3 / 2, y * 3 / 2);\n        }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "889e495ce3e3b3bacc96e8230932331c",
+    "file": "SkImage_Reference",
+    "name": "SkImage::makeSubset"
+},
+    "SkImage_makeTextureImage": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto drawImage = [=](sk_sp<SkImage> image, GrContext* context, const char* label) -> void {\n        if (nullptr == image || nullptr == context) {\n            return;\n        }\n        SkPaint paint;\n        paint.setAntiAlias(true);\n        sk_sp<SkImage> texture(image->makeTextureImage(context, nullptr));\n        canvas->drawImage(texture, 0, 0);\n        canvas->drawString(label, 20, texture->height() / 4, paint);\n    };\n    sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));\n    GrContext* context = canvas->getGrContext();\n    sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(context, backEndTexture,\n                                kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,\n                                kOpaque_SkAlphaType, nullptr));\n    drawImage(image, context, \"image\");\n    canvas->translate(image->width(), 0);\n    drawImage(bitmapImage, context, \"source\");\n    canvas->translate(-image->width(), image->height());\n    drawImage(textureImage, context, \"backEndTexture\");\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "eeec9e07e604b44d0208899a2fe5bef5",
+    "file": "SkImage_Reference",
+    "name": "SkImage::makeTextureImage"
+},
+    "SkImage_makeWithFilter": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkImageFilter> shadowFilter = SkDropShadowImageFilter::Make(\n                -10.0f * frame, 5.0f * frame, 3.0f, 3.0f, SK_ColorBLUE,\n                SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,\n                nullptr);\n    sk_sp<SkImageFilter> offsetFilter = SkOffsetImageFilter::Make(40, 40, shadowFilter, nullptr);\n    SkIRect subset = image->bounds();\n    SkIRect clipBounds = image->bounds();\n    clipBounds.outset(60, 60);\n    SkIRect outSubset;\n    SkIPoint offset;\n    sk_sp<SkImage> filtered(image->makeWithFilter(offsetFilter.get(), subset, clipBounds,\n                            &outSubset, &offset));\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawLine(0, 0, offset.fX, offset.fY, paint);\n    canvas->translate(offset.fX, offset.fY);\n    canvas->drawImage(filtered, 0, 0);\n    canvas->drawRect(SkRect::Make(outSubset), paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "85a76163138a2720ac003691d6363938",
+    "file": "SkImage_Reference",
+    "name": "SkImage::makeWithFilter"
+},
+    "SkImage_readPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->scale(.5f, .5f);\n    const int width = 32;\n    const int height = 32;\n    std::vector<int32_t> dstPixels;\n    dstPixels.resize(height * width * 4);\n    SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);\n    for (int y = 0; y < 512; y += height ) {\n        for (int x = 0; x < 512; x += width ) {\n            if (image->readPixels(info, &dstPixels.front(), width * 4, x, y)) {\n                SkPixmap dstPixmap(info, &dstPixels.front(), width * 4);\n                SkBitmap bitmap;\n                bitmap.installPixels(dstPixmap);\n                canvas->drawBitmap(bitmap, 0, 0);\n            }\n            canvas->translate(48, 0);\n        }\n        canvas->translate(-16 * 48, 48);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "8aa8ca63dff4641dfc6ea8a3c555d59c",
+    "file": "SkImage_Reference",
+    "name": "SkImage::readPixels"
+},
+    "SkImage_readPixels_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<int32_t> srcPixels;\n    int rowBytes = image->width() * 4;\n    int quarterWidth = image->width() / 4;\n    int quarterHeight = image->height() / 4;\n    srcPixels.resize(image->height() * rowBytes);\n    for (int y = 0; y < 4; ++y) {\n        for (int x = 0; x < 4; ++x) {\n            SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),\n                    &srcPixels.front() + x * image->height() * quarterWidth +\n                    y * quarterWidth, rowBytes);\n            image->readPixels(pixmap, x * quarterWidth, y * quarterHeight);\n        }\n    }\n    canvas->scale(.5f, .5f);\n    SkBitmap bitmap;\n    bitmap.installPixels(SkImageInfo::MakeN32Premul(image->width(), image->height()),\n                             &srcPixels.front(), rowBytes);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "b77a73c4baa63a4a8e2a4fdd96144d0b",
+    "file": "SkImage_Reference",
+    "name": "SkImage::readPixels_2"
+},
+    "SkImage_refColorSpace": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPixmap pixmap;\n    source.peekPixels(&pixmap);\n    canvas->scale(.25f, .25f);\n    int y = 0;\n    for (auto gamma : { SkColorSpace::kLinear_RenderTargetGamma,\n                        SkColorSpace::kSRGB_RenderTargetGamma } ) {\n        int x = 0;\n        sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkColorSpace::kSRGB_Gamut);\n        for (int index = 0; index < 2; ++index) {\n            pixmap.setColorSpace(colorSpace);\n            sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);\n            canvas->drawImage(image, x, y);\n            colorSpace = image->refColorSpace()->makeColorSpin();\n            x += 512;\n        }\n        y += 512;\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "59b2078ebfbda8736a57c0486ae33332",
+    "file": "SkImage_Reference",
+    "name": "SkImage::refColorSpace"
+},
+    "SkImage_refEncodedData": {
+    "code": "void draw(SkCanvas* canvas) {\n    struct {\n        const char* name;\n        sk_sp<SkImage> image;\n    } tests[] = { { \"image\", image }, { \"bitmap\", SkImage::MakeFromBitmap(source) },\n          { \"texture\", SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,\n                            kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,\n                            kOpaque_SkAlphaType, nullptr) } };\n    SkString string;\n    SkPaint paint;\n    for (const auto& test : tests ) {\n        if (!test.image) {\n            string.printf(\"no %s\", test.name);\n        } else {\n            string.printf(\"%s\" \"encoded %s\", test.image->refEncodedData() ? \"\" : \"no \", test.name);\n        }\n        canvas->drawString(string, 10, 20, paint);\n        canvas->translate(0, 20);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "80856fe921ce36f8d5a32d8672bccbfc",
+    "file": "SkImage_Reference",
+    "name": "SkImage::refEncodedData"
+},
+    "SkImage_scalePixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<int32_t> srcPixels;\n    int quarterWidth = image->width() / 16;\n    int rowBytes = quarterWidth * 4;\n    int quarterHeight = image->height() / 16;\n    srcPixels.resize(quarterHeight * rowBytes);\n    SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),\n                    &srcPixels.front(), rowBytes);\n    canvas->scale(4, 4);\n    SkFilterQuality qualities[] = { kNone_SkFilterQuality, kLow_SkFilterQuality,\n                     kMedium_SkFilterQuality, kHigh_SkFilterQuality };\n    for (unsigned index = 0; index < SK_ARRAY_COUNT(qualities); ++index) {\n        image->scalePixels(pixmap, qualities[index]);\n        sk_sp<SkImage> filtered = SkImage::MakeFromRaster(pixmap, nullptr, nullptr);\n        canvas->drawImage(filtered, 16 * index, 0);\n    }\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "5949c9a63610cae30019e5b1899ee38f",
+    "file": "SkImage_Reference",
+    "name": "SkImage::scalePixels"
+},
+    "SkImage_uniqueID": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkImage> subset = image->makeSubset({10, 20, 90, 100});\n    canvas->drawImage(image, 0, 0);\n    canvas->drawImage(subset, 128, 0);\n    SkPaint paint;\n    SkString s;\n    s.printf(\"original id: %d\", image->uniqueID());\n    canvas->drawString(s, 20, image->height() + 20, paint);\n    s.printf(\"subset id: %d\", subset->uniqueID());\n    canvas->drawString(s, 148, subset->height() + 20, paint);\n}",
+    "width": 256,
+    "height": 156,
+    "hash": "d70194c9c51e700335f95de91846d023",
+    "file": "SkImage_Reference",
+    "name": "SkImage::uniqueID"
+},
+    "SkImage_width": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->translate(10, 10);\n    canvas->drawImage(image, 0, 0);\n    canvas->translate(0, image->height());\n    SkPaint paint;\n    canvas->drawLine(0, 10, image->width(), 10, paint);\n    canvas->drawString(\"width\", image->width() / 2 - 15, 25, paint);\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "9aec65fc252ffc9982fa8867433eca18",
+    "file": "SkImage_Reference",
+    "name": "SkImage::width()"
+},
+    "SkMatrix_Concat": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix, matrix2;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix2.setPolyToPoly(perspect, bitmapBounds, 4);\n    SkMatrix concat = SkMatrix::Concat(matrix, matrix2);\n    canvas->concat(concat);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "6b4562c7052da94f3d5b2412dca41946",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::Concat"
+},
+    "SkMatrix_MakeAll": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint p;\n    p.setAntiAlias(true);\n    p.setTextSize(64);\n    for (SkScalar sx : { -1, 1 } ) {\n        for (SkScalar sy : { -1, 1 } ) {\n            SkAutoCanvasRestore autoRestore(canvas, true);\n            SkMatrix m = SkMatrix::MakeAll(sx, 1, 128,    0, sy, 128,   0, 0, 1);\n            canvas->concat(m);\n            canvas->drawString(\"K\", 0, 0, p);\n        }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "6bad83b64de9266e323c29d550e04188",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::MakeAll"
+},
+    "SkMatrix_MakeScale": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->concat(SkMatrix::MakeScale(4, 3));\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "7ff17718111df6d6f95381d8a8f1b389",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::MakeScale"
+},
+    "SkMatrix_MakeScale_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->concat(SkMatrix::MakeScale(4));\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "2956aeb50fa862cdb13995e1e56a4bc8",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::MakeScale_2"
+},
+    "SkMatrix_MakeTrans": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix = SkMatrix::MakeTrans(64, 48);\n    for (int i = 0; i < 4; ++i) {\n        canvas->drawBitmap(source, 0, 0);\n        canvas->concat(matrix);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "b2479df0d9cf296ff64ac31e36684557",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::MakeTrans"
+},
+    "SkMatrix_ScaleToFit": {
+    "code": "void draw(SkCanvas* canvas) {\n    const char* labels[] = { \"Fill\", \"Start\", \"Center\", \"End\" };\n    SkRect rects[] = {{5, 5, 59, 59}, {5, 74, 59, 108}, {10, 123, 44, 172}, {10, 187, 54, 231}};\n    SkRect bounds;\n    source.getBounds(&bounds);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    for (auto fit : { SkMatrix::kFill_ScaleToFit, SkMatrix::kStart_ScaleToFit,\n                      SkMatrix::kCenter_ScaleToFit, SkMatrix::kEnd_ScaleToFit } ) {\n        for (auto rect : rects ) {\n            canvas->drawRect(rect, paint);\n            SkMatrix matrix;\n            if (!matrix.setRectToRect(bounds, rect, fit)) {\n                continue;\n            }\n            SkAutoCanvasRestore acr(canvas, true);\n            canvas->concat(matrix);\n            canvas->drawBitmap(source, 0, 0);\n        }\n        canvas->drawString(labels[fit], 10, 255, paint);\n        canvas->translate(64, 0);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "17c3070b31b700ea8f52e48af9a66b6e",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::ScaleToFit"
+},
+    "SkMatrix_fixedStepInX": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    const SkPoint center = { 128, 128 };\n    matrix.setScale(20, 25, center.fX, center.fY);\n    matrix.postRotate(75, center.fX, center.fY);\n    {\n       SkAutoCanvasRestore acr(canvas, true);\n       canvas->concat(matrix);\n       canvas->drawBitmap(source, 0, 0);\n    }\n    if (matrix.isFixedStepInX()) {\n       SkPaint paint;\n       paint.setAntiAlias(true);\n       SkVector step = matrix.fixedStepInX(128);\n       SkVector end = center + step;\n       canvas->drawLine(center, end, paint);\n       SkVector arrow = { step.fX + step.fY, step.fY - step.fX};\n       arrow = arrow * .25f;\n       canvas->drawLine(end, end - arrow, paint);\n       canvas->drawLine(end, {end.fX + arrow.fY, end.fY - arrow.fX}, paint);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "fad6b92b21b1e1deeae61978cec2d232",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::fixedStepInX"
+},
+    "SkMatrix_getMinMaxScales": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setAll(1, 0, 0,  0, 1, 0,   0, 0, 0);\n    if (matrix.invert(&matrix)) {\n        SkScalar factor[2] = {2, 2};\n        bool result = matrix.getMinMaxScales(factor);\n        SkDebugf(\"matrix.getMinMaxScales() %s %g %g\\n\",\n                result ? \"true\" : \"false\", factor[0], factor[1]);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "13adba0ecf5f82247cf051b4fa4d8a9c",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::getMinMaxScales"
+},
+    "SkMatrix_getPerspX": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix m;\n    m.setIdentity();\n    m.set(SkMatrix::kMPersp0, -0.004f);\n    SkAutoCanvasRestore autoRestore(canvas, true);\n    canvas->translate(22, 144);\n    SkPaint black;\n    black.setAntiAlias(true);\n    black.setTextSize(24);\n    SkPaint gray = black;\n    gray.setColor(0xFF9f9f9f);\n    SkString string;\n    string.appendScalar(m.getPerspX());\n    canvas->drawString(string, 0, -72, gray);\n    canvas->concat(m);\n    canvas->drawString(string, 0, 0, black);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "a0f5bf4b55e8c33bfda29bf67e34306f",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::getPerspX"
+},
+    "SkMatrix_getPerspY": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix m;\n    m.setIdentity();\n    m.set(SkMatrix::kMPersp1, -0.004f);\n    SkAutoCanvasRestore autoRestore(canvas, true);\n    canvas->translate(22, 144);\n    SkPaint black;\n    black.setAntiAlias(true);\n    black.setTextSize(24);\n    SkPaint gray = black;\n    gray.setColor(0xFF9f9f9f);\n    SkString string;\n    string.appendScalar(m.getPerspY());\n    canvas->drawString(string, 0, -72, gray);\n    canvas->concat(m);\n    canvas->drawString(string, 0, 0, black);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "424a00a73675dbd99ad20feb0267442b",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::getPerspY"
+},
+    "SkMatrix_hasPerspective": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    canvas->concat(matrix);\n    SkString string;\n    string.printf(\"hasPerspective %s\", matrix.hasPerspective() ? \"true\" : \"false\");\n    canvas->drawBitmap(source, 0, 0);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(48);\n    canvas->drawString(string, 0, source.bounds().height() + 48, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "688123908c733169bbbfaf11f41ecff6",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::hasPerspective"
+},
+    "SkMatrix_invert": {
+    "code": "void draw(SkCanvas* canvas) {\n    const SkPoint src[] = { { 10, 120}, {120, 120}, {120, 10}, {  10, 10} };\n    const SkPoint dst[] = { {150, 120}, {200, 100}, {240, 30}, { 130, 40} };\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkMatrix matrix;\n    matrix.setPolyToPoly(src, dst, 4);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, 4, src, paint);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, 4, dst, paint);\n    paint.setColor(SK_ColorBLUE);\n    paint.setStrokeWidth(3);\n    paint.setStrokeCap(SkPaint::kRound_Cap);\n    canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, dst, paint);\n    if (matrix.invert(&matrix)) {\n        canvas->concat(matrix);\n        canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, dst, paint);\n    }\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "0e03cd9f154603ed4b21ca56d69dae44",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::invert()"
+},
+    "SkMatrix_isSimilarity": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint p;\n    p.setAntiAlias(true);\n    SkMatrix m;\n    int below = 175;\n    for (SkScalar sx : { -1, 1 } ) {\n        for (SkScalar sy : { -1, 1 } ) {\n            m.setAll(sx, 1, 128,    1, sy, 32,   0, 0, 1);\n            bool isSimilarity = m.isSimilarity();\n            SkString str;\n            str.printf(\"sx: %g sy: %g sim: %s\", sx, sy, isSimilarity ? \"true\" : \"false\");\n            {\n                SkAutoCanvasRestore autoRestore(canvas, true);\n                canvas->concat(m);\n                canvas->drawString(str, 0, 0, p);\n            }\n            if (!isSimilarity) {\n                canvas->drawString(str, 40, below, p);\n                below += 20;\n            }\n        }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "8b37f4ae7fec1756433c0f984175fb14",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::isSimilarity"
+},
+    "SkMatrix_mapHomogeneousPoints": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint3 src[] = {{3, 3, 1}, {8, 2, 2}, {5, 0, 4}, {0, 1, 3},\n                      {3, 7, 1}, {8, 6, 2}, {5, 4, 4}, {0, 5, 3}};\n    int lines[] = { 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 };\n    constexpr int count = SK_ARRAY_COUNT(src);\n    auto debugster = [=](SkPoint3 src[]) -> void {\n    for (size_t i = 0; i < SK_ARRAY_COUNT(lines); i += 2) {\n        const SkPoint3& s = src[lines[i]];\n        const SkPoint3& e = src[lines[i + 1]];\n        SkPaint paint;\n        paint.setARGB(77, 23, 99, 154);\n        canvas->drawLine(s.fX / s.fZ, s.fY / s.fZ, e.fX / e.fZ, e.fY / e.fZ, paint);\n    }\n    };\n    canvas->save();\n    canvas->translate(5, 5);\n    canvas->scale(15, 15);\n    debugster(src);\n    canvas->restore();\n    canvas->translate(128, 128);\n    SkMatrix matrix;\n    matrix.setAll(15, 0, 0, 0, 15, 0, -0.08, 0.04, 1);\n    matrix.mapHomogeneousPoints(src, src, count);\n    debugster(src);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "d56f93e4bc763c7ba4914321ed07a8b5",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapHomogeneousPoints"
+},
+    "SkMatrix_mapPoints": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.reset();\n    const int count = 4;\n    SkPoint src[count];\n    matrix.mapRectToQuad(src, {40, 70, 180, 220} );\n    SkPaint paint;\n    paint.setARGB(77, 23, 99, 154);\n    for (int i = 0; i < 5; ++i) {\n        SkPoint dst[count];\n        matrix.mapPoints(dst, src, count);\n        canvas->drawPoints(SkCanvas::kPolygon_PointMode, count, dst, paint);\n        matrix.preRotate(35, 128, 128);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "f99dcb00296d0c56b6c0e178e94b3534",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapPoints"
+},
+    "SkMatrix_mapPoints_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setRotate(35, 128, 128);\n    const int count = 4;\n    SkPoint pts[count];\n    matrix.mapRectToQuad(pts, {40, 70, 180, 220} );\n    SkPaint paint;\n    paint.setARGB(77, 23, 99, 154);\n    for (int i = 0; i < 5; ++i) {\n        canvas->drawPoints(SkCanvas::kPolygon_PointMode, count, pts, paint);\n        matrix.mapPoints(pts, count);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "428ca171ae3bd0d3f992458ac598b97b",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapPoints_2"
+},
+    "SkMatrix_mapRadius": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkMatrix matrix;\n    const SkPoint center = {108, 93};\n    matrix.setScale(2, .5f, center.fX, center.fY);\n    matrix.postRotate(45, center.fX, center.fY);\n    const SkScalar circleRadius = 50;\n    SkScalar mappedRadius = matrix.mapRadius(circleRadius);\n    SkVector minorAxis, majorAxis;\n    matrix.mapVector(0, circleRadius, &minorAxis);\n    matrix.mapVector(circleRadius, 0, &majorAxis);\n    SkString mappedArea;\n    mappedArea.printf(\"area = %g\", mappedRadius * mappedRadius);\n    canvas->drawString(mappedArea, 145, 250, paint);\n    canvas->drawString(\"mappedRadius\", center.fX + mappedRadius + 3, center.fY, paint);\n    paint.setColor(SK_ColorRED);\n    SkString axArea;\n    axArea.printf(\"area = %g\", majorAxis.length() * minorAxis.length());\n    paint.setStyle(SkPaint::kFill_Style);\n    canvas->drawString(axArea, 15, 250, paint);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawRect({10, 200, 10 + majorAxis.length(), 200 + minorAxis.length()}, paint);\n    paint.setColor(SK_ColorBLACK);\n    canvas->drawLine(center.fX, center.fY, center.fX + mappedRadius, center.fY, paint);\n    canvas->drawLine(center.fX, center.fY, center.fX, center.fY + mappedRadius, paint);\n    canvas->drawRect({140, 180, 140 + mappedRadius, 180 + mappedRadius}, paint);\n    canvas->concat(matrix);\n    canvas->drawCircle(center.fX, center.fY, circleRadius, paint);\n    paint.setColor(SK_ColorRED);\n    canvas->drawLine(center.fX, center.fY, center.fX + circleRadius, center.fY, paint);\n    canvas->drawLine(center.fX, center.fY, center.fX, center.fY + circleRadius, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "6d6f2082fcf59d9f02bfb1758b87db69",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapRadius"
+},
+    "SkMatrix_mapRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkMatrix matrix;\n    matrix.setRotate(45, 128, 128);\n    SkRect rotatedBounds, bounds = {40, 50, 190, 200};\n    matrix.mapRect(&rotatedBounds, bounds );\n    paint.setColor(SK_ColorGRAY);\n    canvas->drawRect(rotatedBounds, paint);\n    canvas->concat(matrix);\n    paint.setColor(SK_ColorRED);\n    canvas->drawRect(bounds, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "dbcf928b035a31ca69c99392e2e2cca9",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapRect"
+},
+    "SkMatrix_mapRectScaleTranslate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkMatrix matrix;\n    SkRect rect = {100, 50, 150, 180};\n    matrix.setScale(2, .5f, rect.centerX(), rect.centerY());\n    SkRect rotated;\n    matrix.mapRectScaleTranslate(&rotated, rect);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawRect(rect, paint);\n    paint.setColor(SK_ColorRED);\n    canvas->drawRect(rotated, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "62bc26989c2b4c2a54d516596a71dd97",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapRectScaleTranslate"
+},
+    "SkMatrix_mapRectToQuad": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkMatrix matrix;\n    matrix.setRotate(60, 128, 128);\n    SkRect rect = {50, 50, 150, 150};\n    SkPoint pts[4];\n    matrix.mapRectToQuad(pts, rect);\n    for (int i = 0; i < 4; ++i) {\n        canvas->drawCircle(pts[i].fX, pts[i].fY, 3, paint);\n    }\n    canvas->concat(matrix);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawRect(rect, paint);\n}",
+    "width": 256,
+    "height": 192,
+    "hash": "c69cd2a590b5733c3cbc92cb9ceed3f5",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapRectToQuad"
+},
+    "SkMatrix_mapRect_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkMatrix matrix;\n    matrix.setRotate(45, 128, 128);\n    SkRect bounds = {40, 50, 190, 200};\n    matrix.mapRect(&bounds);\n    paint.setColor(SK_ColorGRAY);\n    canvas->drawRect(bounds, paint);\n    canvas->concat(matrix);\n    paint.setColor(SK_ColorRED);\n    canvas->drawRect({40, 50, 190, 200}, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "5fafd0bd23d1ed37425b970b4a3c6cc9",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapRect_2"
+},
+    "SkMatrix_mapRect_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect{110, 50, 180, 100};\n    SkMatrix matrix;\n    matrix.setRotate(50, 28, 28);\n    SkRect mapped = matrix.mapRect(rect);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawRect(rect, paint);\n    canvas->drawRect(mapped, paint);\n    canvas->concat(matrix);\n    canvas->drawRect(rect, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "3b7b1f884437ab450f986234e4aec27f",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapRect_3"
+},
+    "SkMatrix_mapVector": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColor(SK_ColorGREEN);\n    paint.setAntiAlias(true);\n    paint.setTextSize(48);\n    SkMatrix matrix;\n    matrix.setRotate(90);\n    SkVector offset = { 7, 7 };\n    for (int i = 0; i < 4; ++i) {\n        paint.setImageFilter(SkDropShadowImageFilter::Make(offset.fX, offset.fY, 3, 3,\n              SK_ColorBLUE, SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, nullptr));\n        matrix.mapVector(offset.fX, offset.fY, &offset);\n        canvas->translate(0, 60);\n        canvas->drawString(\"Text\", 50, 0, paint);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "aed143fc6cd0bce4ed029b98d1e61f2d",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapVector"
+},
+    "SkMatrix_mapVector_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColor(SK_ColorGREEN);\n    paint.setAntiAlias(true);\n    paint.setTextSize(48);\n    SkMatrix matrix;\n    matrix.setRotate(90);\n    SkVector offset = { 7, 7 };\n    for (int i = 0; i < 4; ++i) {\n        paint.setImageFilter(SkDropShadowImageFilter::Make(offset.fX, offset.fY, 3, 3,\n              SK_ColorBLUE, SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, nullptr));\n        offset = matrix.mapVector(offset.fX, offset.fY);\n        canvas->translate(0, 60);\n        canvas->drawString(\"Text\", 50, 0, paint);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "8bf1518db3f369696cd3065b541a8bd7",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapVector_2"
+},
+    "SkMatrix_mapVectors": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkMatrix matrix;\n    matrix.reset();\n    const SkVector radii[] = {{8, 4}, {9, 1}, {6, 2}, {7, 3}};\n    for (int i = 0; i < 4; ++i) {\n        SkVector rScaled[4];\n        matrix.preScale(1.5f, 2.f);\n        matrix.mapVectors(rScaled, radii, SK_ARRAY_COUNT(radii));\n        SkRRect rrect;\n        rrect.setRectRadii({20, 20, 180, 70}, rScaled);\n        canvas->drawRRect(rrect, paint);\n        canvas->translate(0, 60);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "918a9778c3d7d5cb306692784399f6dc",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapVectors"
+},
+    "SkMatrix_mapVectors_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkMatrix matrix;\n    matrix.setScale(2, 3);\n    SkVector radii[] = {{7, 7}, {3, 3}, {2, 2}, {4, 0}};\n    for (int i = 0; i < 4; ++i) {\n        SkRRect rrect;\n        rrect.setRectRadii({20, 20, 180, 70}, radii);\n        canvas->drawRRect(rrect, paint);\n        canvas->translate(0, 60);\n        matrix.mapVectors(radii, SK_ARRAY_COUNT(radii));\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "5754501a00a1323e76353fb53153e939",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapVectors_2"
+},
+    "SkMatrix_mapXY": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkMatrix matrix;\n    matrix.setRotate(60, 128, 128);\n    SkPoint lines[] = {{50, 50}, {150, 50}, {150, 150}};\n    for (size_t i = 0; i < SK_ARRAY_COUNT(lines); ++i) {\n        SkPoint pt;\n        matrix.mapXY(lines[i].fX, lines[i].fY, &pt);\n        canvas->drawCircle(pt.fX, pt.fY, 3, paint);\n    }\n    canvas->concat(matrix);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(lines), lines, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "9e50185d502dc6903783679a84106089",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapXY"
+},
+    "SkMatrix_mapXY_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {30, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStrokeWidth(3);\n    for (int x : { 0, source.width() } ) {\n        for (int y : { 0, source.height() } ) {\n            canvas->drawPoint(matrix.mapXY(x, y), paint);\n        }\n    }\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "b1ead09c67a177ab8eace12b061610a7",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::mapXY_2"
+},
+    "SkMatrix_postConcat": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix.postConcat(matrix);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "e4226c55d9bdbc119264bd372b2b9835",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::postConcat"
+},
+    "SkMatrix_postIDiv": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix.postIDiv(1, 2);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "e6ad0bd2999613d9e4758b661d45070c",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::postIDiv"
+},
+    "SkMatrix_postRotate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix.postRotate(45, source.width() / 2, source.height() / 2);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "e09194ee48a81e7b375ade473d340f0d",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::postRotate"
+},
+    "SkMatrix_postRotate_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix.postRotate(45);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "52e4c53e26971af5576b30de60fa70c2",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::postRotate_2"
+},
+    "SkMatrix_postScale": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix.postScale(.75f, 1.5f, source.width() / 2, source.height() / 2);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "ed3aa18ba0ea95c85cc49aa3829fe384",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::postScale"
+},
+    "SkMatrix_postScale_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix.postScale(.75f, 1.5f);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "1931017698766a67d3a26423453b8095",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::postScale_2"
+},
+    "SkMatrix_postSkew": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix.postSkew(.5f, 0, source.width() / 2, source.height() / 2);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "8c34ae3a2b7e2742bb969819737365ec",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::postSkew"
+},
+    "SkMatrix_postSkew_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix.postSkew(.5f, 0);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "3aa2603225dff72ac53dd359f897f494",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::postSkew_2"
+},
+    "SkMatrix_postTranslate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkRect rect = {20, 20, 100, 100};\n    for (int i = 0; i < 2; ++i ) {\n        SkMatrix matrix;\n        i == 0 ? matrix.reset(): matrix.setRotate(25, rect.centerX(), 320);\n        {\n            SkAutoCanvasRestore acr(canvas, true);\n            canvas->concat(matrix);\n            paint.setColor(SK_ColorGRAY);\n            canvas->drawRect(rect, paint);\n        }\n        paint.setColor(SK_ColorRED);\n        for (int j = 0; j < 2; ++j ) {\n            SkAutoCanvasRestore acr(canvas, true);\n            matrix.postTranslate(40, 40);\n            canvas->concat(matrix);\n            canvas->drawCircle(0, 0, 3, paint);\n        }\n    }\n}",
+    "width": 256,
+    "height": 160,
+    "hash": "f5144ef4bd7cea294fad2f756ed335af",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::postTranslate"
+},
+    "SkMatrix_preConcat": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix, matrix2;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix2.setPolyToPoly(perspect, bitmapBounds, 4);\n    matrix.preConcat(matrix2);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "b07e62298e7b0ab5683db199faffceb2",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::preConcat"
+},
+    "SkMatrix_preRotate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix.preRotate(45, source.width() / 2, source.height() / 2);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "a70bb18d67c06a20ab514e7a47924e5a",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::preRotate"
+},
+    "SkMatrix_preRotate_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix.preRotate(45);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "5acd49bd931c79a808dd6c7cc0e92f72",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::preRotate_2"
+},
+    "SkMatrix_preScale": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix.preScale(.75f, 1.5f, source.width() / 2, source.height() / 2);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "2531f8d1e05d7b6dc22f3efcd2fb84e4",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::preScale"
+},
+    "SkMatrix_preScale_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix.preScale(.75f, 1.5f);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "3edbdea8e43d06086abf33ec4a9b415b",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::preScale_2"
+},
+    "SkMatrix_preSkew": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix.preSkew(.5f, 0, source.width() / 2, source.height() / 2);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "199a18ad61d702664ce6df1d7037aa48",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::preSkew"
+},
+    "SkMatrix_preSkew_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix.preSkew(.5f, 0);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "e100c543869fe8fd516ba69de79444ba",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::preSkew_2"
+},
+    "SkMatrix_preTranslate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkRect rect = {20, 20, 100, 100};\n    for (int i = 0; i < 2; ++i ) {\n        SkMatrix matrix;\n        i == 0 ? matrix.reset(): matrix.setRotate(25, rect.centerX(), 320);\n        {\n            SkAutoCanvasRestore acr(canvas, true);\n            canvas->concat(matrix);\n            paint.setColor(SK_ColorGRAY);\n            canvas->drawRect(rect, paint);\n        }\n        paint.setColor(SK_ColorRED);\n        for (int j = 0; j < 2; ++j ) {\n            SkAutoCanvasRestore acr(canvas, true);\n            matrix.preTranslate(40, 40);\n            canvas->concat(matrix);\n            canvas->drawCircle(0, 0, 3, paint);\n        }\n    }\n}",
+    "width": 256,
+    "height": 160,
+    "hash": "f75a9b629aa6c51ed888f8799b5ba5f7",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::preTranslate"
+},
+    "SkMatrix_preservesRightAngles": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint p;\n    p.setAntiAlias(true);\n    SkMatrix m;\n    int pos = 0;\n    for (SkScalar sx : { 1, 2 } ) {\n        for (SkScalar kx : { 0, 1 } ) {\n            m.setAll(sx, kx, 16,    0, 1, 32,   0, 0, 1);\n            bool isSimilarity = m.isSimilarity();\n            bool preservesRightAngles = m.preservesRightAngles();\n            SkString str;\n            str.printf(\"sx: %g kx: %g %s %s\", sx, kx, isSimilarity ? \"sim\" : \"\",\n                        preservesRightAngles ? \"right\" : \"\");\n            SkAutoCanvasRestore autoRestore(canvas, true);\n            canvas->concat(m);\n            canvas->drawString(str, 0, pos, p);\n            pos += 20;\n        }\n    }\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "b9becf0dc24a9f00726e24a81fb72f16",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::preservesRightAngles"
+},
+    "SkMatrix_set9": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix m;\n    SkScalar buffer[9] = {4, 0, 3,    0, 5, 4,     0, 0, 1};\n    m.set9(buffer);\n    canvas->concat(m);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "ec5de0d23e5fe28ba7628625d1402e85",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::set9"
+},
+    "SkMatrix_setAll": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint p;\n    p.setAntiAlias(true);\n    p.setTextSize(64);\n    SkMatrix m;\n    for (SkScalar sx : { -1, 1 } ) {\n        for (SkScalar sy : { -1, 1 } ) {\n            SkAutoCanvasRestore autoRestore(canvas, true);\n            m.setAll(sx, 1, 128,    0, sy, 64,   0, 0, 1);\n            canvas->concat(m);\n            canvas->drawString(\"K\", 0, 0, p);\n        }\n    }\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "95ccfc2a89ce593e6b7a9f992a844bc0",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setAll"
+},
+    "SkMatrix_setConcat": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix, matrix2;\n    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};\n    SkRect::Make(source.bounds()).toQuad(bitmapBounds);\n    matrix.setPolyToPoly(bitmapBounds, perspect, 4);\n    matrix2.setPolyToPoly(perspect, bitmapBounds, 4);\n    matrix.setConcat(matrix, matrix2);\n    canvas->concat(matrix);\n    canvas->drawBitmap(source, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "0381a10ac69bdefdf9d15b47cbb9fefe",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setConcat"
+},
+    "SkMatrix_setPerspX": {
+    "code": "void draw(SkCanvas* canvas) {\n    for (SkScalar perspX : { -.003f, 0.f, .003f, .012f } ) {\n        SkMatrix matrix;\n        matrix.setIdentity();\n        matrix.setPerspX(perspX);\n        canvas->save();\n        canvas->concat(matrix);\n        canvas->drawBitmap(source, 0, 0);\n        canvas->restore();\n        canvas->translate(64, 64);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "830a9e4e4bb93d25afd83b2fea63929e",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setPerspX"
+},
+    "SkMatrix_setPerspY": {
+    "code": "void draw(SkCanvas* canvas) {\n    for (SkScalar perspX : { -.003f, 0.f, .003f, .012f } ) {\n        SkMatrix matrix;\n        matrix.setIdentity();\n        matrix.setPerspY(perspX);\n        canvas->save();\n        canvas->concat(matrix);\n        canvas->drawBitmap(source, 0, 0);\n        canvas->restore();\n        canvas->translate(64, 64);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "aeb258b7922c1a11b698b00f562182ec",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setPerspY"
+},
+    "SkMatrix_setPolyToPoly": {
+    "code": "void draw(SkCanvas* canvas) {\n    const SkPoint src[] = { { 0, 0}, {30,   0}, {30, -30}, { 0, -30} };\n    const SkPoint dst[] = { {50, 0}, {80, -10}, {90, -30}, {60, -40} };\n    SkPaint blackPaint;\n    blackPaint.setAntiAlias(true);\n    blackPaint.setTextSize(42);\n    SkPaint redPaint = blackPaint;\n    redPaint.setColor(SK_ColorRED);\n    for (int count : { 1, 2, 3, 4 } ) {\n        canvas->translate(35, 55);\n        for (int index = 0; index < count; ++index) {\n            canvas->drawCircle(src[index], 3, blackPaint);\n            canvas->drawCircle(dst[index], 3, blackPaint);\n            if (index > 0) {\n                canvas->drawLine(src[index], src[index - 1], blackPaint);\n                canvas->drawLine(dst[index], dst[index - 1], blackPaint);\n            }\n        }\n        SkMatrix matrix;\n        matrix.setPolyToPoly(src, dst, count);\n        canvas->drawString(\"A\", src[0].fX, src[0].fY, redPaint);\n        SkAutoCanvasRestore acr(canvas, true);\n        canvas->concat(matrix);\n        canvas->drawString(\"A\", src[0].fX, src[0].fY, redPaint);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "c851d1313e8909aaea4f0591699fdb7b",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setPolyToPoly"
+},
+    "SkMatrix_setRSXform": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColor(SK_ColorGRAY);\n    paint.setAntiAlias(true);\n    SkRect rect = {20, 20, 100, 100};\n    canvas->drawRect(rect, paint);\n    paint.setColor(SK_ColorRED);\n    SkMatrix matrix;\n    matrix.setRSXform(SkRSXform::Make(.85f, .25f, rect.centerX(), rect.centerY()));\n    canvas->concat(matrix);\n    canvas->translate(-rect.centerX(), -rect.centerY());\n    canvas->drawRect(rect, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "c3f5faddca466f78278b32b88fd5f5eb",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setRSXform"
+},
+    "SkMatrix_setRotate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColor(SK_ColorGRAY);\n    paint.setAntiAlias(true);\n    SkRect rect = {20, 20, 100, 100};\n    canvas->drawRect(rect, paint);\n    paint.setColor(SK_ColorRED);\n    SkMatrix matrix;\n    matrix.setRotate(25, rect.centerX(), rect.centerY());\n    canvas->concat(matrix);\n    canvas->drawRect(rect, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "8c28db3add9cd0177225088f6df6bbb5",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setRotate"
+},
+    "SkMatrix_setRotate_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColor(SK_ColorGRAY);\n    paint.setAntiAlias(true);\n    SkRect rect = {20, 20, 100, 100};\n    canvas->drawRect(rect, paint);\n    paint.setColor(SK_ColorRED);\n    SkMatrix matrix;\n    matrix.setRotate(25);\n    canvas->translate(rect.centerX(), rect.centerY());\n    canvas->concat(matrix);\n    canvas->translate(-rect.centerX(), -rect.centerY());\n    canvas->drawRect(rect, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "93efb9d191bf1b9710c173513e014d6c",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setRotate_2"
+},
+    "SkMatrix_setScale": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint p;\n    p.setAntiAlias(true);\n    p.setTextSize(64);\n    SkMatrix m;\n    for (SkScalar sx : { -1, 1 } ) {\n        for (SkScalar sy : { -1, 1 } ) {\n            SkAutoCanvasRestore autoRestore(canvas, true);\n            m.setScale(sx, sy, 128, 64);\n            canvas->concat(m);\n            canvas->drawString(\"%\", 128, 64, p);\n        }\n    }\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "4565a0792058178c88e0a129a87272d6",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setScale"
+},
+    "SkMatrix_setScaleX": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(24);\n    canvas->drawString(\"normal\", 12, 24, paint);\n    SkMatrix matrix;\n    matrix.setIdentity();\n    matrix.setScaleX(3);\n    canvas->concat(matrix);\n    canvas->drawString(\"x scale\", 0, 48, paint);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "a39dfed98c3c3c3a56be9ad59fe4e21e",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setScaleX"
+},
+    "SkMatrix_setScaleY": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(24);\n    canvas->drawString(\"normal\", 12, 24, paint);\n    SkMatrix matrix;\n    matrix.setIdentity();\n    matrix.setScaleY(3);\n    canvas->concat(matrix);\n    canvas->drawString(\"y scale\", 12, 48, paint);\n}",
+    "width": 256,
+    "height": 192,
+    "hash": "f040c6dd85a02e94eaca00d5c2832604",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setScaleY"
+},
+    "SkMatrix_setScale_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint p;\n    p.setAntiAlias(true);\n    p.setTextSize(64);\n    SkMatrix m;\n    for (SkScalar sx : { -1, 1 } ) {\n        for (SkScalar sy : { -1, 1 } ) {\n            SkAutoCanvasRestore autoRestore(canvas, true);\n            m.setScale(sx, sy);\n            m.postTranslate(128, 64);\n            canvas->concat(m);\n            canvas->drawString(\"@\", 0, 0, p);\n        }\n    }\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "1579d0cc109c26e69f66f73abd35fb0e",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setScale_2"
+},
+    "SkMatrix_setSinCos": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColor(SK_ColorGRAY);\n    paint.setAntiAlias(true);\n    SkRect rect = {20, 20, 100, 100};\n    canvas->drawRect(rect, paint);\n    paint.setColor(SK_ColorRED);\n    SkMatrix matrix;\n    matrix.setSinCos(.25f, .85f, rect.centerX(), rect.centerY());\n    canvas->concat(matrix);\n    canvas->drawRect(rect, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "187e1d9228e2e4341ef820bd77b6fda9",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setSinCos"
+},
+    "SkMatrix_setSinCos_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColor(SK_ColorGRAY);\n    paint.setAntiAlias(true);\n    SkRect rect = {20, 20, 100, 100};\n    canvas->drawRect(rect, paint);\n    paint.setColor(SK_ColorRED);\n    SkMatrix matrix;\n    matrix.setSinCos(.25f, .85f);\n    matrix.postTranslate(rect.centerX(), rect.centerY());\n    canvas->concat(matrix);\n    canvas->translate(-rect.centerX(), -rect.centerY());\n    canvas->drawRect(rect, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "e37a94a53c959951b059fcd624639ef6",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setSinCos_2"
+},
+    "SkMatrix_setSkew": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint p;\n    p.setAntiAlias(true);\n    p.setTextSize(48);\n    SkMatrix m;\n    for (SkScalar sx : { -1, 0, 1 } ) {\n        for (SkScalar sy : { -1, 0, 1 } ) {\n            SkAutoCanvasRestore autoRestore(canvas, true);\n            m.setSkew(sx, sy, 96 + 64 * sx, 128 + 48 * sy);\n            canvas->concat(m);\n            canvas->drawString(\"K\", 96 + 64 * sx, 128 + 48 * sy, p);\n        }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "55e0431adc6c5b1987ebb8123cc10342",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setSkew"
+},
+    "SkMatrix_setSkewX": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(24);\n    canvas->drawString(\"normal\", 12, 24, paint);\n    SkMatrix matrix;\n    matrix.setIdentity();\n    matrix.setSkewX(-.7f);\n    canvas->concat(matrix);\n    canvas->drawString(\"x skew\", 36, 48, paint);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "c7177a6fbc1545be95a5ebca87e0cd0d",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setSkewX"
+},
+    "SkMatrix_setSkewY": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(24);\n    canvas->drawString(\"normal\", 12, 24, paint);\n    SkMatrix matrix;\n    matrix.setIdentity();\n    matrix.setSkewY(.3f);\n    canvas->concat(matrix);\n    canvas->drawString(\"y skew\", 12, 48, paint);\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "b418d15df9829aefcc6aca93a37428bb",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setSkewY"
+},
+    "SkMatrix_setSkew_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint p;\n    p.setAntiAlias(true);\n    p.setTextSize(48);\n    SkMatrix m;\n    for (SkScalar sx : { -1, 0, 1 } ) {\n        for (SkScalar sy : { -1, 0, 1 } ) {\n            SkAutoCanvasRestore autoRestore(canvas, true);\n            m.setSkew(sx, sy);\n            m.postTranslate(96 + 64 * sx, 128 + 48 * sy);\n            canvas->concat(m);\n            canvas->drawString(\"K\", 0, 0, p);\n        }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "05be7844e9afdd7b9bfc31c5423a70a2",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setSkew_2"
+},
+    "SkMatrix_setTranslate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(24);\n    canvas->drawString(\"normal\", 8, 24, paint);\n    SkMatrix matrix;\n    matrix.setTranslate(96, 24);\n    canvas->concat(matrix);\n    canvas->drawString(\"translate\", 8, 24, paint);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "63ca62985741b1bccb5e8b9cf734874e",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setTranslate"
+},
+    "SkMatrix_setTranslateX": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(24);\n    canvas->drawString(\"normal\", 8, 24, paint);\n    SkMatrix matrix;\n    matrix.setIdentity();\n    matrix.setTranslateX(96);\n    canvas->concat(matrix);\n    canvas->drawString(\"x translate\", 8, 24, paint);\n}",
+    "width": 256,
+    "height": 48,
+    "hash": "a18bc2e3607ac3a8e438bcb61fb13130",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setTranslateX"
+},
+    "SkMatrix_setTranslateY": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(24);\n    canvas->drawString(\"normal\", 8, 24, paint);\n    SkMatrix matrix;\n    matrix.setIdentity();\n    matrix.setTranslateY(24);\n    canvas->concat(matrix);\n    canvas->drawString(\"y translate\", 8, 24, paint);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "34e3c70a72b836abf7f4858d35eecc98",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setTranslateY"
+},
+    "SkMatrix_setTranslate_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(24);\n    canvas->drawString(\"normal\", 8, 24, paint);\n    SkMatrix matrix;\n    matrix.setTranslate({96, 24});\n    canvas->concat(matrix);\n    canvas->drawString(\"translate\", 8, 24, paint);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "ccfc734aff2ddea0b097c83f5621de5e",
+    "file": "SkMatrix_Reference",
+    "name": "SkMatrix::setTranslate_2"
+},
+    "SkMemoryStream_Make": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::Make"
+},
+    "SkMemoryStream_MakeCopy": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::MakeCopy"
+},
+    "SkMemoryStream_MakeDirect": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::MakeDirect"
+},
+    "SkMemoryStream_asData": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::asData"
+},
+    "SkMemoryStream_const_star": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::SkMemoryStream(const void* data, size_t length, bool copyData = false)"
+},
+    "SkMemoryStream_copy_": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::SkMemoryStream(size_t length)"
+},
+    "SkMemoryStream_copy_SkData": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::SkMemoryStream(sk_sp<SkData> data)"
+},
+    "SkMemoryStream_duplicate": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::duplicate()"
+},
+    "SkMemoryStream_empty_constructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::SkMemoryStream()"
+},
+    "SkMemoryStream_fork": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::fork()"
+},
+    "SkMemoryStream_getAtPos": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::getAtPos"
+},
+    "SkMemoryStream_getLength": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::getLength"
+},
+    "SkMemoryStream_getMemoryBase": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::getMemoryBase"
+},
+    "SkMemoryStream_getPosition": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::getPosition"
+},
+    "SkMemoryStream_isAtEnd": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::isAtEnd"
+},
+    "SkMemoryStream_move": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::move()"
+},
+    "SkMemoryStream_peek": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::peek()"
+},
+    "SkMemoryStream_read": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::read()"
+},
+    "SkMemoryStream_rewind": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::rewind()"
+},
+    "SkMemoryStream_seek": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::seek()"
+},
+    "SkMemoryStream_setData": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::setData"
+},
+    "SkMemoryStream_setMemory": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::setMemory"
+},
+    "SkMemoryStream_skipToAlign4": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkMemoryStream_Reference",
+    "name": "SkMemoryStream::skipToAlign4"
+},
+    "SkPaint": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(20);\n    SkPath path;\n    path.moveTo(30, 30);\n    path.lineTo(30, 30);\n    path.moveTo(70, 30);\n    path.lineTo(90, 40);\n    for (SkPaint::Cap c : { SkPaint::kButt_Cap, SkPaint::kRound_Cap, SkPaint::kSquare_Cap } ) {\n        paint.setStrokeCap(c);\n        canvas->drawPath(path, paint);\n        canvas->translate(0, 70);\n    }\n}",
+    "width": 256,
+    "height": 200,
+    "hash": "2bffb6384cc20077e632e7d01da045ca",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint"
+},
+    "SkPaint_Join": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.moveTo(10, 50);\n    path.quadTo(35, 110, 60, 210);\n    path.quadTo(105, 110, 130, 10);\n    SkPaint paint;  // set to default kMiter_Join\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(20);\n    canvas->drawPath(path, paint);\n    canvas->translate(150, 0);\n    paint.setStrokeJoin(SkPaint::kBevel_Join);\n    canvas->drawPath(path, paint);\n    canvas->translate(150, 0);\n    paint.setStrokeJoin(SkPaint::kRound_Join);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 462,
+    "height": 256,
+    "hash": "3b1aebacc21c1836a52876b9b0b3905e",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::Join"
+},
+    "SkPaint_a": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(20);\n    SkPath path;\n    path.moveTo(30, 20);\n    path.lineTo(40, 40);\n    path.conicTo(70, 20, 100, 20, .707f);\n    for (SkPaint::Join j : { SkPaint::kMiter_Join, SkPaint::kRound_Join, SkPaint::kBevel_Join } ) {\n        paint.setStrokeJoin(j);\n        canvas->drawPath(path, paint);\n        canvas->translate(0, 70);\n    }\n}",
+    "width": 256,
+    "height": 200,
+    "hash": "917c44b504d3f9308571fd3835d90a0d",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint_2"
+},
+    "SkPaint_breakText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(50);\n    const char str[] = \"Breakfast\";\n    const int count = sizeof(str) - 1;\n    canvas->drawText(str, count, 25, 50, paint);\n    SkScalar measuredWidth;\n    int partialBytes = paint.breakText(str, count, 100, &measuredWidth);\n    canvas->drawText(str, partialBytes, 25, 100, paint);\n    canvas->drawLine(25, 60, 25 + 100, 60, paint);\n    canvas->drawLine(25, 110, 25 + measuredWidth, 110, paint);\n}\n",
+    "width": 280,
+    "height": 128,
+    "hash": "fd0033470ccbd5c7059670fdbf96cffc",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::breakText"
+},
+    "SkPaint_getFillPath": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint strokePaint;\n    strokePaint.setAntiAlias(true);\n    strokePaint.setStyle(SkPaint::kStroke_Style);\n    strokePaint.setStrokeWidth(.1f);\n    SkPath strokePath;\n    strokePath.moveTo(.08f, .08f);\n    strokePath.quadTo(.09f, .08f, .17f, .17f);\n    SkPath fillPath;\n    SkPaint outlinePaint(strokePaint);\n    outlinePaint.setStrokeWidth(2);\n    SkMatrix scale = SkMatrix::MakeScale(300, 300);\n    for (SkScalar precision : { 0.01f, .1f, 1.f, 10.f, 100.f } ) {\n        strokePaint.getFillPath(strokePath, &fillPath, nullptr, precision);\n        fillPath.transform(scale);\n        canvas->drawPath(fillPath, outlinePaint);\n        canvas->translate(60, 0);\n        if (1.f == precision) canvas->translate(-180, 100);\n    }\n    strokePath.transform(scale);\n    strokePaint.setStrokeWidth(30);\n    canvas->drawPath(strokePath, strokePaint);\n}\n",
+    "width": 256,
+    "height": 192,
+    "hash": "cedd6233848198e1fca4d1e14816baaf",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getFillPath"
+},
+    "SkPaint_getFillPath_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(10);\n    SkPath strokePath;\n    strokePath.moveTo(20, 20);\n    strokePath.lineTo(100, 100);\n    canvas->drawPath(strokePath, paint);\n    SkPath fillPath;\n    paint.getFillPath(strokePath, &fillPath);\n    paint.setStrokeWidth(2);\n    canvas->translate(40, 0);\n    canvas->drawPath(fillPath, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "e6d8ca0cc17e0b475bd54dd995825468",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getFillPath_2"
+},
+    "SkPaint_getFontMetrics": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(32);\n    SkScalar lineHeight = paint.getFontMetrics(nullptr);\n    canvas->drawString(\"line 1\", 10, 40, paint);\n    canvas->drawString(\"line 2\", 10, 40 + lineHeight, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "59d9b8249afa1c2af6186711250ce240",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getFontMetrics"
+},
+    "SkPaint_getPosTextPath": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(80);\n    SkPath path, path2;\n    SkPoint pos[] = {{20, 60}, {30, 70}, {40, 80}};\n    paint.getPosTextPath(\"ABC\", 3, pos, &path);\n    Simplify(path, &path);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 85,
+    "hash": "7f27c93472aa99a7542fb3493076f072",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getPosTextPath"
+},
+    "SkPaint_getTextBlobIntercepts": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkFont font;\n    font.setSize(120);\n    SkPoint textPos = { 20, 110 };\n    int len = 3;\n    SkTextBlobBuilder textBlobBuilder;\n    const SkTextBlobBuilder::RunBuffer& run =\n            textBlobBuilder.allocRun(font, len, textPos.fX, textPos.fY);\n    run.glyphs[0] = 10;\n    run.glyphs[1] = 20;\n    run.glyphs[2] = 30;\n    sk_sp<const SkTextBlob> blob = textBlobBuilder.make();\n    SkPaint paint;\n    SkScalar bounds[] = { 116, 134 };\n    int count = paint.getTextBlobIntercepts(blob.get(), bounds, nullptr);\n    std::vector<SkScalar> intervals;\n    intervals.resize(count);\n    (void) paint.getTextBlobIntercepts(blob.get(), bounds, &intervals.front());\n    canvas->drawTextBlob(blob.get(), 0, 0, paint);\n    paint.setColor(0xFFFF7777);\n    SkScalar x = textPos.fX;\n    for (int i = 0; i < count; i+= 2) {\n        canvas->drawRect({x, bounds[0], intervals[i], bounds[1]}, paint);\n        x = intervals[i + 1];\n    }\n    canvas->drawRect({intervals[count - 1], bounds[0], 180, bounds[1]}, paint);\n}\n",
+    "width": 256,
+    "height": 143,
+    "hash": "728ea9089f233a71a1062e364b8c73fa",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getTextBlobIntercepts"
+},
+    "SkPaint_getTextPath": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(80);\n    SkPath path, path2;\n    paint.getTextPath(\"ABC\", 3, 20, 80, &path);\n    path.offset(20, 20, &path2);\n    Op(path, path2, SkPathOp::kDifference_SkPathOp, &path);\n    path.addPath(path2);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "7c9e6a399f898d68026c1f0865e6f73e",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getTextPath"
+},
+    "SkPaint_getTextWidths": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(50);\n    const char str[] = \"abc\";\n    const int bytes = sizeof(str) - 1;\n    int count = paint.getTextWidths(str, bytes, nullptr);\n    std::vector<SkScalar> widths;\n    std::vector<SkRect> bounds;\n    widths.resize(count);\n    bounds.resize(count);\n    for (int loop = 0; loop < 2; ++loop) {\n        (void) paint.getTextWidths(str, count, &widths.front(), &bounds.front());\n        SkPoint loc = { 25, 50 };\n        canvas->drawText(str, bytes, loc.fX, loc.fY, paint);\n        paint.setStyle(SkPaint::kStroke_Style);\n        paint.setStrokeWidth(0);\n        SkScalar advanceY = loc.fY + 10;\n        for (int index = 0; index < count; ++index) {\n            bounds[index].offset(loc.fX, loc.fY);\n            canvas->drawRect(bounds[index], paint);\n            canvas->drawLine(loc.fX, advanceY, loc.fX + widths[index], advanceY, paint);\n            loc.fX += widths[index];\n            advanceY += 5;\n        }\n        canvas->translate(0, 80);\n        paint.setStrokeWidth(3);\n    }\n}\n",
+    "width": 256,
+    "height": 160,
+    "hash": "6b9e101f49e9c2c28755c5bdcef64dfb",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::getTextWidths"
+},
+    "SkPaint_glyphsToUnichars": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    const char hello[] = \"Hello!\";\n    const int count = sizeof(hello) - 1;\n    SkGlyphID glyphs[count];\n    if (count != paint.textToGlyphs(hello, count, glyphs)) {\n        return;\n    }\n    SkUnichar unichars[count];\n    paint.glyphsToUnichars(glyphs, count, unichars);\n    paint.setTextEncoding(SkTextEncoding::kUTF32);\n    canvas->drawText(unichars, sizeof(unichars), 10, 30, paint);\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "79c550ec6c34054ab60fbcd1b81adc03",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::glyphsToUnichars"
+},
+    "SkPaint_isLinearText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    const char testStr[] = \"xxxx xxxx\";\n    for (auto linearText : { false, true } ) {\n        paint.setLinearText(linearText);\n        paint.setTextSize(24);\n        canvas->drawString(paint.isLinearText() ? \"linear\" : \"hinted\", 128, 30, paint);\n        for (SkScalar textSize = 8; textSize < 30; textSize *= 1.22f) {\n            paint.setTextSize(textSize);\n            canvas->translate(0, textSize);\n            canvas->drawString(testStr, 10, 0, paint);\n        }\n    }\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "2890ad644f980637837e6fcb386fb462",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::isLinearText"
+},
+    "SkPaint_measureText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(50);\n    const char str[] = \"ay^jZ\";\n    const int count = sizeof(str) - 1;\n    canvas->drawText(str, count, 25, 50, paint);\n    SkRect bounds;\n    paint.measureText(str, count, &bounds);\n    canvas->translate(25, 50);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawRect(bounds, paint);\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "06084f609184470135a9cd9ebc5af149",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::measureText"
+},
+    "SkPaint_setAutohinted": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    const char testStr[] = \"xxxx xxxx\";\n        for (auto forceAutoHinting : { false, true} ) {\n        paint.setAutohinted(forceAutoHinting);\n        paint.setTextSize(24);\n        canvas->drawString(paint.isAutohinted() ? \"auto-hinted\" : \"default\", 108, 30, paint);\n        for (SkScalar textSize = 8; textSize < 30; textSize *= 1.22f) {\n            paint.setTextSize(textSize);\n            canvas->translate(0, textSize);\n            canvas->drawString(testStr, 10, 0, paint);\n        }\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "4e185306d7de9390fe8445eed0139309",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setAutohinted"
+},
+    "SkPaint_setColorFilter": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPaint paint;\n   paint.setColorFilter(SkColorFilter::MakeModeFilter(SK_ColorLTGRAY, SkBlendMode::kSrcIn));\n   canvas->drawRect(SkRect::MakeWH(50, 50), paint);\n   paint.setColorFilter(nullptr);\n   canvas->translate(70, 0);\n   canvas->drawRect(SkRect::MakeWH(50, 50), paint);\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "c7b786dc9b3501cd0eaba47494b6fa31",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setColorFilter"
+},
+    "SkPaint_setDrawLooper": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setDrawLooper(SkBlurDrawLooper::Make(0x7FFF0000, 4, -5, -10));\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(10);\n    paint.setAntiAlias(true);\n    paint.setColor(0x7f0000ff);\n    canvas->drawCircle(70, 70, 50, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "bf10f838b330f0a3a3266d42ea68a638",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setDrawLooper"
+},
+    "SkPaint_setImageFilter": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    bitmap.allocN32Pixels(100, 100);\n    SkCanvas offscreen(bitmap);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setColor(SK_ColorWHITE);\n    paint.setTextSize(96);\n    offscreen.clear(0);\n    offscreen.drawString(\"e\", 20, 70, paint);\n    paint.setImageFilter(\n           SkLightingImageFilter::MakePointLitDiffuse(SkPoint3::Make(80, 100, 10),\n           SK_ColorWHITE, 1, 2, nullptr, nullptr));\n    canvas->drawBitmap(bitmap, 0, 0, &paint);\n}\n",
+    "width": 256,
+    "height": 160,
+    "hash": "6679d6e4ec632715ee03e68391bd7f9a",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setImageFilter"
+},
+    "SkPaint_setLinearText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    const char testStr[] = \"abcd efgh\";\n    for (int textSize : { 12, 24 } ) {\n        paint.setTextSize(textSize);\n        for (auto linearText : { false, true } ) {\n            paint.setLinearText(linearText);\n            SkString width;\n            width.appendScalar(paint.measureText(testStr, SK_ARRAY_COUNT(testStr), nullptr));\n            canvas->translate(0, textSize + 4);\n            canvas->drawString(testStr, 10, 0, paint);\n            canvas->drawString(width, 128, 0, paint);\n        }\n     }\n  }\n",
+    "width": 256,
+    "height": 128,
+    "hash": "c93bb912f3bddfb4d96d3ad70ada552b",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setLinearText"
+},
+    "SkPaint_setMaskFilter": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(10);\n    paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 10));\n    canvas->drawRect(SkRect::MakeXYWH(40, 40, 175, 175), paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "a993831c40f3e134f809134e3b74e4a6",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setMaskFilter"
+},
+    "SkPaint_setPathEffect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setPathEffect(SkDiscretePathEffect::Make(3, 5));\n    canvas->drawRect(SkRect::MakeXYWH(40, 40, 175, 175), paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "52dd55074ca0b7d520d04e750ca2a0d7",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setPathEffect"
+},
+    "SkPaint_setShader": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setColor(SK_ColorBLUE);\n    paint.setShader(SkShader::MakeColorShader(SK_ColorRED));\n    canvas->drawRect(SkRect::MakeWH(40, 40), paint);\n    paint.setShader(nullptr);\n    canvas->translate(50, 0);\n    canvas->drawRect(SkRect::MakeWH(40, 40), paint);\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "77e64d5bae9b1ba037fd99252bb4aa58",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setShader"
+},
+    "SkPaint_setStyle": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStrokeWidth(5);\n    SkRegion region;\n    region.op(140, 10, 160, 30, SkRegion::kUnion_Op);\n    region.op(170, 40, 190, 60, SkRegion::kUnion_Op);\n    SkBitmap bitmap;\n    bitmap.setInfo(SkImageInfo::MakeA8(50, 50), 50);\n    uint8_t pixels[50][50];\n    for (int x = 0; x < 50; ++x) {\n        for (int y = 0; y < 50; ++y) {\n            pixels[y][x] = (x + y) % 5 ? 0xFF : 0x00;\n        }\n    }\n    bitmap.setPixels(pixels);\n    for (auto style : { SkPaint::kFill_Style,\n                        SkPaint::kStroke_Style,\n                        SkPaint::kStrokeAndFill_Style }) {\n        paint.setStyle(style);\n        canvas->drawLine(10, 10, 60, 60, paint);\n        canvas->drawRect({80, 10, 130, 60}, paint);\n        canvas->drawRegion(region, paint);\n        canvas->drawBitmap(bitmap, 200, 10, &paint);\n        canvas->translate(0, 80);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "c7bb6248e4735b8d1a32d02fba40d344",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setStyle"
+},
+    "SkPaint_setTypeface": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTypeface(SkTypeface::MakeFromName(\"monospace\", SkFontStyle()));\n    canvas->drawString(\"hamburgerfons\", 10, 30, paint);\n    paint.setTypeface(nullptr);\n    canvas->drawString(\"hamburgerfons\", 10, 50, paint);\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "0e6fbb7773cd925b274552f4cd1abef2",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::setTypeface"
+},
+    "SkPaint_textToGlyphs": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    const uint8_t utf8[] = { 0x24, 0xC2, 0xA2, 0xE2, 0x82, 0xAC, 0xC2, 0xA5, 0xC2, 0xA3 };\n    std::vector<SkGlyphID> glyphs;\n    int count = paint.textToGlyphs(utf8, sizeof(utf8), nullptr);\n    glyphs.resize(count);\n    (void) paint.textToGlyphs(utf8, sizeof(utf8), &glyphs.front());\n    paint.setTextEncoding(SkTextEncoding::kGlyphID);\n    paint.setTextSize(32);\n    canvas->drawText(&glyphs.front(), glyphs.size() * sizeof(SkGlyphID), 10, 40, paint);\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "d11136d8a74f63009da2a7f550710823",
+    "file": "SkPaint_Reference",
+    "name": "SkPaint::textToGlyphs"
+},
+    "SkPath_AddPathMode": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path, path2;\n    path.moveTo(20, 20);\n    path.lineTo(20, 40);\n    path.lineTo(40, 20);\n    path2.moveTo(60, 60);\n    path2.lineTo(80, 60);\n    path2.lineTo(80, 40);\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    for (int i = 0; i < 2; i++) {\n        for (auto addPathMode : { SkPath::kAppend_AddPathMode, SkPath::kExtend_AddPathMode } ) {\n            SkPath test(path);\n            test.addPath(path2, addPathMode);\n            canvas->drawPath(test, paint);\n            canvas->translate(100, 0);\n        }\n        canvas->translate(-200, 100);\n        path.close();\n    }\n}",
+    "width": 256,
+    "height": 180,
+    "hash": "801b02e74c64aafdb734f2e5cf3e5ab0",
+    "file": "SkPath_Reference",
+    "name": "SkPath::AddPathMode"
+},
+    "SkPath_ArcSize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    for (auto sweep: { SkPath::kCW_Direction, SkPath::kCCW_Direction } ) {\n        for (auto arcSize : { SkPath::kSmall_ArcSize, SkPath::kLarge_ArcSize } ) {\n            SkPath path;\n            path.moveTo({120, 50});\n            path.arcTo(70, 40, 30, arcSize, sweep, 156, 100);\n            if (SkPath::kCCW_Direction == sweep && SkPath::kLarge_ArcSize == arcSize) {\n                paint.setColor(SK_ColorBLUE);\n                paint.setStrokeWidth(3);\n            }\n            canvas->drawPath(path, paint);\n         }\n    }\n}\n",
+    "width": 256,
+    "height": 160,
+    "hash": "8e40c546eecd9cc213200717240898ba",
+    "file": "SkPath_Reference",
+    "name": "SkPath::ArcSize"
+},
+    "SkPath_ConvertConicToQuads": {
+    "code": "void draw(SkCanvas* canvas) {\n      SkPaint conicPaint;\n      conicPaint.setAntiAlias(true);\n      conicPaint.setStyle(SkPaint::kStroke_Style);\n      SkPaint quadPaint(conicPaint);\n      quadPaint.setColor(SK_ColorRED);\n      SkPoint conic[] = { {20, 170}, {80, 170}, {80, 230} };\n      for (auto weight : { .25f, .5f, .707f, .85f, 1.f } ) {\n          SkPoint quads[5];\n          SkPath::ConvertConicToQuads(conic[0], conic[1], conic[2], weight, quads, 1);\n          SkPath path;\n          path.moveTo(conic[0]);\n          path.conicTo(conic[1], conic[2], weight);\n          canvas->drawPath(path, conicPaint);\n          path.rewind();\n          path.moveTo(quads[0]);\n          path.quadTo(quads[1], quads[2]);\n          path.quadTo(quads[3], quads[4]);\n          canvas->drawPath(path, quadPaint);\n          canvas->translate(50, -50);\n      }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "3ba94448a4ba48f926e643baeb5b1016",
+    "file": "SkPath_Reference",
+    "name": "SkPath::ConvertConicToQuads"
+},
+    "SkPath_Convexity": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkPoint quad[] = {{70, 70}, {20, 20}, {120, 20}, {120, 120}};\n    const char* labels[] = { \"unknown\", \"convex\", \"concave\" };\n    for (SkScalar x : { 40, 100 } ) {\n        SkPath path;\n        quad[0].fX = x;\n        path.addPoly(quad, SK_ARRAY_COUNT(quad), true);\n        canvas->drawPath(path, paint);\n        canvas->drawString(labels[(int) path.getConvexity()], 30, 100, paint);\n        canvas->translate(100, 100);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "ac49e8b810bd6ed5d84b4f5a3b40a0ec",
+    "file": "SkPath_Reference",
+    "name": "SkPath::Convexity"
+},
+    "SkPath_Direction": {
+    "code": "void draw(SkCanvas* canvas) {\n    const SkPoint arrow[] = { {40, -5}, {45, 0}, {40, 5} };\n    const SkRect rect = {10, 10, 90, 90};\n    SkPaint rectPaint;\n    rectPaint.setAntiAlias(true);\n    SkPaint textPaint(rectPaint);\n    rectPaint.setStyle(SkPaint::kStroke_Style);\n    SkPaint arrowPaint(rectPaint);\n    SkPath arrowPath;\n    arrowPath.addPoly(arrow, SK_ARRAY_COUNT(arrow), true);\n    arrowPaint.setPathEffect(SkPath1DPathEffect::Make(arrowPath, 320, 0,\n                             SkPath1DPathEffect::kRotate_Style));\n    for (auto direction : { SkPath::kCW_Direction, SkPath::kCCW_Direction } ) {\n        canvas->drawRect(rect, rectPaint);\n        for (unsigned start : { 0, 1, 2, 3 } ) {\n           SkPath path;\n           path.addRect(rect, direction, start);\n           canvas->drawPath(path, arrowPaint);\n       }\n       canvas->drawString(SkPath::kCW_Direction == direction ? \"CW\" : \"CCW\",  rect.centerX(),\n            rect.centerY(), textPaint);\n       canvas->translate(120, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 100,
+    "hash": "4bbae00b40ed2cfcd0007921ad693a7b",
+    "file": "SkPath_Reference",
+    "name": "SkPath::Direction"
+},
+    "SkPath_FillType": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPath path;\n   path.addRect({10, 10, 30, 30}, SkPath::kCW_Direction);\n   path.addRect({20, 20, 40, 40}, SkPath::kCW_Direction);\n   path.addRect({10, 60, 30, 80}, SkPath::kCW_Direction);\n   path.addRect({20, 70, 40, 90}, SkPath::kCCW_Direction);\n   SkPaint strokePaint;\n   strokePaint.setStyle(SkPaint::kStroke_Style);\n   SkRect clipRect = {0, 0, 51, 100};\n   canvas->drawPath(path, strokePaint);\n   SkPaint fillPaint;\n   for (auto fillType : { SkPath::kWinding_FillType, SkPath::kEvenOdd_FillType,\n                      SkPath::kInverseWinding_FillType, SkPath::kInverseEvenOdd_FillType } ) {\n        canvas->translate(51, 0);\n        canvas->save();\n        canvas->clipRect(clipRect);\n        path.setFillType(fillType);\n        canvas->drawPath(path, fillPaint);\n        canvas->restore();\n    }\n}\n",
+    "width": 256,
+    "height": 100,
+    "hash": "71fc6c069c377d808799f2453edabaf5",
+    "file": "SkPath_Reference",
+    "name": "SkPath::FillType"
+},
+    "SkPath_FillType_a": {
+    "code": "void draw(SkCanvas* canvas) {\n   SkPath path;\n   path.addRect({20, 10, 80, 70}, SkPath::kCW_Direction);\n   path.addRect({40, 30, 100, 90}, SkPath::kCW_Direction);\n   SkPaint strokePaint;\n   strokePaint.setStyle(SkPaint::kStroke_Style);\n   SkRect clipRect = {0, 0, 128, 128};\n   canvas->drawPath(path, strokePaint);\n   canvas->drawLine({0, 50}, {120, 50}, strokePaint);\n   SkPaint textPaint;\n   textPaint.setAntiAlias(true);\n   SkScalar textHPos[] = { 10, 30, 60, 90, 110 };\n   canvas->drawPosTextH(\"01210\", 5, textHPos, 48, textPaint);\n   textPaint.setTextSize(18);\n   canvas->translate(0, 128);\n   canvas->scale(.5f, .5f);\n   canvas->drawString(\"inverse\", 384, 150, textPaint);\n   SkPaint fillPaint;\n   for (auto fillType : { SkPath::kWinding_FillType, SkPath::kEvenOdd_FillType,\n                      SkPath::kInverseWinding_FillType, SkPath::kInverseEvenOdd_FillType } ) {\n        canvas->save();\n        canvas->clipRect(clipRect);\n        path.setFillType(fillType);\n        canvas->drawPath(path, fillPaint);\n        canvas->restore();\n        canvas->drawString(fillType & 1 ? \"even-odd\" : \"winding\", 64, 170, textPaint);\n        canvas->translate(128, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 230,
+    "hash": "d2c33dc791cd165dcc2423226ba5b095",
+    "file": "SkPath_Reference",
+    "name": "SkPath::FillType_2"
+},
+    "SkPath_Iter": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(256);\n    SkPath asterisk, path;\n    paint.getTextPath(\"*\", 1, 50, 192, &asterisk);\n    SkPath::Iter iter(asterisk, true);\n    SkPoint start[4], pts[4];\n    iter.next(start);  // skip moveTo\n    iter.next(start);  // first quadTo\n    path.moveTo((start[0] + start[1]) * 0.5f);\n    while (SkPath::kClose_Verb != iter.next(pts)) {\n        path.quadTo(pts[0], (pts[0] + pts[1]) * 0.5f);\n    }\n    path.quadTo(start[0], (start[0] + start[1]) * 0.5f);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "2f53df9201769ab7e7c0e164a1334309",
+    "file": "SkPath_Reference",
+    "name": "SkPath::Iter"
+},
+    "SkPath_addArc": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    for (auto start : { 0, 90, 135, 180, 270 } ) {\n        for (auto sweep : { -450.f, -180.f, -90.f, 90.f, 180.f, 360.1f } ) {\n            SkPath path;\n            path.addArc({10, 10, 35, 45}, start, sweep);\n            canvas->drawPath(path, paint);\n            canvas->translate(252 / 6, 0);\n        }\n        canvas->translate(-252, 255 / 5);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "9cf5122475624e4cf39f06c698f80b1a",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addArc"
+},
+    "SkPath_addCircle": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(10);\n    for (int size = 10; size < 300; size += 20) {\n        SkPath path;\n        path.addCircle(128, 128, size, SkPath::kCW_Direction);\n        canvas->drawPath(path, paint);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "bd5286cb9a5e5c32cd980f72b8f400fb",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addCircle"
+},
+    "SkPath_addOval": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkPath oval;\n    oval.addOval({20, 20, 160, 80});\n    canvas->drawPath(oval, paint);\n}",
+    "width": 256,
+    "height": 120,
+    "hash": "cac84cf68e63a453c2a8b64c91537704",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addOval"
+},
+    "SkPath_addOval_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    const SkPoint arrow[] = { {0, -5}, {10, 0}, {0, 5} };\n    const SkRect rect = {10, 10, 54, 54};\n    SkPaint ovalPaint;\n    ovalPaint.setAntiAlias(true);\n    SkPaint textPaint(ovalPaint);\n    ovalPaint.setStyle(SkPaint::kStroke_Style);\n    SkPaint arrowPaint(ovalPaint);\n    SkPath arrowPath;\n    arrowPath.addPoly(arrow, SK_ARRAY_COUNT(arrow), true);\n    arrowPaint.setPathEffect(SkPath1DPathEffect::Make(arrowPath, 176, 0,\n                             SkPath1DPathEffect::kRotate_Style));\n    for (auto direction : { SkPath::kCW_Direction, SkPath::kCCW_Direction } ) {\n        for (unsigned start : { 0, 1, 2, 3 } ) {\n           SkPath path;\n           path.addOval(rect, direction, start);\n           canvas->drawPath(path, ovalPaint);\n           canvas->drawPath(path, arrowPaint);\n           canvas->drawText(&\"0123\"[start], 1, rect.centerX(), rect.centerY() + 5, textPaint);\n           canvas->translate(64, 0);\n       }\n       canvas->translate(-256, 72);\n       canvas->drawString(SkPath::kCW_Direction == direction ? \"clockwise\" : \"counterclockwise\",\n                          128, 0, textPaint);\n    }\n}\n",
+    "width": 256,
+    "height": 160,
+    "hash": "f1122d6fffddac0167e96fab4b9a862f",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addOval_2"
+},
+    "SkPath_addPath": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    paint.setFakeBoldText(true);\n    SkPath dest, text;\n    paint.getTextPath(\"O\", 1, 50, 120, &text);\n    for (int i = 0; i < 3; i++) {\n        dest.addPath(text, i * 20, i * 20);\n    }\n    Simplify(dest, &dest);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(3);\n    canvas->drawPath(dest, paint);\n}",
+    "width": 256,
+    "height": 180,
+    "hash": "c416bddfe286628974e1c7f0fd66f3f4",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addPath"
+},
+    "SkPath_addPath_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPath dest, path;\n    path.addOval({-80, 20, 0, 60}, SkPath::kCW_Direction, 1);\n    for (int i = 0; i < 2; i++) {\n        dest.addPath(path, SkPath::kExtend_AddPathMode);\n        dest.offset(100, 0);\n    }\n    canvas->drawPath(dest, paint);\n}",
+    "width": 256,
+    "height": 80,
+    "hash": "84b2d1c0fc29f1b35e855b6fc6672f9e",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addPath_2"
+},
+    "SkPath_addPath_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPath dest, path;\n    path.addOval({20, 20, 200, 120}, SkPath::kCW_Direction, 1);\n    for (int i = 0; i < 6; i++) {\n        SkMatrix matrix;\n        matrix.reset();\n        matrix.setPerspX(i / 400.f);\n        dest.addPath(path, matrix);\n    }\n    canvas->drawPath(dest, paint);\n}",
+    "width": 256,
+    "height": 160,
+    "hash": "3a90a91030f7289d5df0671d342dbbad",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addPath_3"
+},
+    "SkPath_addPoly": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStrokeWidth(15);\n    paint.setStrokeCap(SkPaint::kRound_Cap);\n    const SkPoint points[] = {{20, 20}, {70, 20}, {40, 90}};\n    for (bool close : { false, true } ) {\n        SkPath path;\n        path.addPoly(points, SK_ARRAY_COUNT(points), close);\n        for (auto style : {SkPaint::kStroke_Style, SkPaint::kFill_Style,\n                SkPaint::kStrokeAndFill_Style} ) {\n            paint.setStyle(style);\n            canvas->drawPath(path, paint);\n            canvas->translate(85, 0);\n        }\n        canvas->translate(-255, 128);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "182b3999772f330f3b0b891b492634ae",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addPoly"
+},
+    "SkPath_addPoly_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStrokeWidth(15);\n    paint.setStrokeCap(SkPaint::kRound_Cap);\n    for (bool close : { false, true } ) {\n        SkPath path;\n        path.addPoly({{20, 20}, {70, 20}, {40, 90}}, close);\n        for (auto style : {SkPaint::kStroke_Style, SkPaint::kFill_Style,\n                SkPaint::kStrokeAndFill_Style} ) {\n            paint.setStyle(style);\n            canvas->drawPath(path, paint);\n            canvas->translate(85, 0);\n        }\n        canvas->translate(-255, 128);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "1a6b69acad5ceafede3c5984ec6634cb",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addPoly_2"
+},
+    "SkPath_addRRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkRRect rrect;\n    SkVector radii[] = {{50, 50}, {0, 0}, {0, 0}, {50, 50}};\n    rrect.setRectRadii({10, 10, 110, 110}, radii);\n    SkPath path;\n    SkMatrix rotate90;\n    rotate90.setRotate(90, 128, 128);\n    for (int i = 0; i < 4; ++i) {\n        path.addRRect(rrect);\n        path.transform(rotate90);\n    }\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "d9ecd58081b5bc77a157636fcb345dc6",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addRRect"
+},
+    "SkPath_addRRect_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkRRect rrect;\n    rrect.setRectXY({40, 40, 215, 215}, 50, 50);\n    SkPath path;\n    path.addRRect(rrect);\n    canvas->drawPath(path, paint);\n    for (int start = 0; start < 8; ++start) {\n        SkPath textPath;\n        textPath.addRRect(rrect, SkPath::kCW_Direction, start);\n        SkPathMeasure pathMeasure(textPath, false);\n        SkPoint position;\n        SkVector tangent;\n        if (!pathMeasure.getPosTan(0, &position, &tangent)) {\n            continue;\n        }\n        SkRSXform rsxForm = SkRSXform::Make(tangent.fX, tangent.fY,\n               position.fX + tangent.fY * 5, position.fY - tangent.fX * 5);\n        canvas->drawTextRSXform(&\"01234567\"[start], 1, &rsxForm, nullptr, paint);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "888edd4c4a91ca62ceb01bce8ab675b2",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addRRect_2"
+},
+    "SkPath_addRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStrokeWidth(15);\n    paint.setStrokeCap(SkPaint::kSquare_Cap);\n    float intervals[] = { 5, 21.75f };\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 0));\n    SkPath path;\n    path.addRect({20, 20, 100, 100}, SkPath::kCW_Direction);\n    canvas->drawPath(path, paint);\n    path.rewind();\n    path.addRect({140, 20, 220, 100}, SkPath::kCCW_Direction);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "0f841e4eaebb613b5069800567917c2d",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addRect"
+},
+    "SkPath_addRect_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    const SkPoint arrow[] = { {5, -5}, {15, -5}, {20, 0}, {15, 5}, {5, 5}, {10, 0} };\n    const SkRect rect = {10, 10, 54, 54};\n    SkPaint rectPaint;\n    rectPaint.setAntiAlias(true);\n    rectPaint.setStyle(SkPaint::kStroke_Style);\n    SkPaint arrowPaint(rectPaint);\n    SkPath arrowPath;\n    arrowPath.addPoly(arrow, SK_ARRAY_COUNT(arrow), true);\n    arrowPaint.setPathEffect(SkPath1DPathEffect::Make(arrowPath, 176, 0,\n                             SkPath1DPathEffect::kRotate_Style));\n    for (auto direction : { SkPath::kCW_Direction, SkPath::kCCW_Direction } ) {\n        for (unsigned start : { 0, 1, 2, 3 } ) {\n           SkPath path;\n           path.addRect(rect, direction, start);\n           canvas->drawPath(path, rectPaint);\n           canvas->drawPath(path, arrowPaint);\n           canvas->translate(64, 0);\n       }\n       canvas->translate(-256, 64);\n    }\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "9202430b3f4f5275af8eec5cc9d7baa8",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addRect_2"
+},
+    "SkPath_addRect_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStrokeWidth(15);\n    paint.setStrokeCap(SkPaint::kSquare_Cap);\n    float intervals[] = { 5, 21.75f };\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 0));\n    for (auto direction : { SkPath::kCW_Direction, SkPath::kCCW_Direction } ) {\n        SkPath path;\n        path.addRect(20, 20, 100, 100, direction);\n        canvas->drawPath(path, paint);\n        canvas->translate(128, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "3837827310e8b88b8c2e128ef9fbbd65",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addRect_3"
+},
+    "SkPath_addRoundRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    for (auto xradius : { 0, 7, 13, 20 } ) {\n        for (auto yradius : { 0, 9, 18, 40 } ) {\n            SkPath path;\n            path.addRoundRect({10, 10, 36, 46}, xradius, yradius);\n            paint.setColor(path.isRect(nullptr) ? SK_ColorRED : path.isOval(nullptr) ?\n                           SK_ColorBLUE : path.isConvex() ? SK_ColorGRAY : SK_ColorGREEN);\n            canvas->drawPath(path, paint);\n            canvas->translate(64, 0);\n        }\n        canvas->translate(-256, 64);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "24736f685f265cf533f1700c042db353",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addRoundRect"
+},
+    "SkPath_addRoundRect_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkScalar radii[] = { 80, 100, 0, 0, 40, 60, 0, 0 };\n    SkPath path;\n    SkMatrix rotate90;\n    rotate90.setRotate(90, 128, 128);\n    for (int i = 0; i < 4; ++i) {\n        path.addRoundRect({10, 10, 110, 110}, radii);\n        path.transform(rotate90);\n    }\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "c43d70606b4ee464d2befbcf448c5e73",
+    "file": "SkPath_Reference",
+    "name": "SkPath::addRoundRect_2"
+},
+    "SkPath_arcTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkPath path;\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(4);\n    path.moveTo(0, 0);\n    path.arcTo({20, 20, 120, 120}, -90, 90, false);\n    canvas->drawPath(path, paint);\n    path.rewind();\n    path.arcTo({120, 20, 220, 120}, -90, 90, false);\n    canvas->drawPath(path, paint);\n    path.rewind();\n    path.moveTo(0, 0);\n    path.arcTo({20, 120, 120, 220}, -90, 90, true);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 200,
+    "hash": "5f02890edaa10cb5e1a4243a82b6a382",
+    "file": "SkPath_Reference",
+    "name": "SkPath::arcTo"
+},
+    "SkPath_arcTo_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint tangentPaint;\n    tangentPaint.setAntiAlias(true);\n    SkPaint textPaint(tangentPaint);\n    tangentPaint.setStyle(SkPaint::kStroke_Style);\n    tangentPaint.setColor(SK_ColorGRAY);\n    SkPaint arcPaint(tangentPaint);\n    arcPaint.setStrokeWidth(5);\n    arcPaint.setColor(SK_ColorBLUE);\n    SkPath path;\n    SkPoint pts[] = { {56, 20}, {200, 20}, {90, 190} };\n    SkScalar radius = 50;\n    path.moveTo(pts[0]);\n    path.arcTo(pts[1], pts[2], radius);\n    canvas->drawLine(pts[0], pts[1], tangentPaint);\n    canvas->drawLine(pts[1], pts[2], tangentPaint);\n    SkPoint lastPt;\n    (void) path.getLastPt(&lastPt);\n    SkVector radial = pts[2] - pts[1];\n    radial.setLength(radius);\n    SkPoint center = { lastPt.fX - radial.fY, lastPt.fY + radial.fX };\n    canvas->drawCircle(center, radius, tangentPaint);\n    canvas->drawLine(lastPt, center, tangentPaint);\n    radial = pts[1] - pts[0];\n    radial.setLength(radius);\n    SkPoint arcStart = { center.fX + radial.fY, center.fY - radial.fX };\n    canvas->drawLine(center, arcStart, tangentPaint);\n    canvas->drawPath(path, arcPaint);\n    canvas->drawString(\"(x0, y0)\", pts[0].fX - 5, pts[0].fY, textPaint);\n    canvas->drawString(\"(x1, y1)\", pts[1].fX + 5, pts[1].fY, textPaint);\n    canvas->drawString(\"(x2, y2)\", pts[2].fX, pts[2].fY + 15, textPaint);\n    canvas->drawString(\"radius\", center.fX + 15, center.fY + 25, textPaint);\n    canvas->drawString(\"radius\", center.fX - 3, center.fY - 16, textPaint);\n}\n",
+    "width": 256,
+    "height": 226,
+    "hash": "386000684073fccabc224d7d6dc81cd9",
+    "file": "SkPath_Reference",
+    "name": "SkPath::arcTo_2"
+},
+    "SkPath_arcTo_2_a": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint tangentPaint;\n    tangentPaint.setAntiAlias(true);\n    SkPaint textPaint(tangentPaint);\n    tangentPaint.setStyle(SkPaint::kStroke_Style);\n    tangentPaint.setColor(SK_ColorGRAY);\n    SkPaint arcPaint(tangentPaint);\n    arcPaint.setStrokeWidth(5);\n    arcPaint.setColor(SK_ColorBLUE);\n    SkPath path;\n    SkPoint pts[] = { {156, 20}, {200, 20}, {170, 50} };\n    SkScalar radius = 50;\n    path.moveTo(pts[0]);\n    path.arcTo(pts[1], pts[2], radius);\n    canvas->drawLine(pts[0], pts[1], tangentPaint);\n    canvas->drawLine(pts[1], pts[2], tangentPaint);\n    SkPoint lastPt;\n    (void) path.getLastPt(&lastPt);\n    SkVector radial = pts[2] - pts[1];\n    radial.setLength(radius);\n    SkPoint center = { lastPt.fX - radial.fY, lastPt.fY + radial.fX };\n    canvas->drawLine(lastPt, center, tangentPaint);\n    radial = pts[1] - pts[0];\n    radial.setLength(radius);\n    SkPoint arcStart = { center.fX + radial.fY, center.fY - radial.fX };\n    canvas->drawLine(center, arcStart, tangentPaint);\n    canvas->drawPath(path, arcPaint);\n    canvas->drawString(\"(x0, y0)\", pts[0].fX, pts[0].fY - 7, textPaint);\n    canvas->drawString(\"(x1, y1)\", pts[1].fX + 5, pts[1].fY, textPaint);\n    canvas->drawString(\"(x2, y2)\", pts[2].fX, pts[2].fY + 15, textPaint);\n    canvas->drawString(\"radius\", center.fX + 15, center.fY + 25, textPaint);\n    canvas->drawString(\"radius\", center.fX - 5, center.fY - 20, textPaint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "78f3c65fa900610bb52518989b547095",
+    "file": "SkPath_Reference",
+    "name": "SkPath::arcTo_2_2"
+},
+    "SkPath_arcTo_4": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    for (auto sweep: { SkPath::kCW_Direction, SkPath::kCCW_Direction } ) {\n        for (auto arcSize : { SkPath::kSmall_ArcSize, SkPath::kLarge_ArcSize } ) {\n            SkPath path;\n            path.moveTo({120, 50});\n            path.arcTo(70, 40, 30, arcSize, sweep, 120.1, 50);\n            if (SkPath::kCCW_Direction == sweep && SkPath::kLarge_ArcSize == arcSize) {\n                paint.setColor(SK_ColorBLUE);\n                paint.setStrokeWidth(3);\n            }\n            canvas->drawPath(path, paint);\n         }\n    }\n}\n",
+    "width": 256,
+    "height": 160,
+    "hash": "6b6ea44f659b27918f3a6fa621bf6173",
+    "file": "SkPath_Reference",
+    "name": "SkPath::arcTo_4"
+},
+    "SkPath_arcTo_5": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkPath path;\n    const SkPoint starts[] = {{20, 20}, {120, 20}, {70, 60}};\n    for (auto start : starts) {\n        path.moveTo(start.fX, start.fY);\n        path.rArcTo(20, 20, 0, SkPath::kSmall_ArcSize, SkPath::kCCW_Direction, 60, 0);\n    }\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 108,
+    "hash": "3f76a1007416181a4848c1a87fc81dbd",
+    "file": "SkPath_Reference",
+    "name": "SkPath::arcTo_5"
+},
+    "SkPath_close": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStrokeWidth(15);\n    paint.setStrokeCap(SkPaint::kRound_Cap);\n    SkPath path;\n    const SkPoint points[] = {{20, 20}, {70, 20}, {40, 90}};\n    path.addPoly(points, SK_ARRAY_COUNT(points), false);\n    for (int loop = 0; loop < 2; ++loop) {\n        for (auto style : {SkPaint::kStroke_Style, SkPaint::kFill_Style,\n                SkPaint::kStrokeAndFill_Style} ) {\n            paint.setStyle(style);\n            canvas->drawPath(path, paint);\n            canvas->translate(85, 0);\n        }\n        path.close();\n        canvas->translate(-255, 128);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "9235f6309271d6420fa5c45dc28664c5",
+    "file": "SkPath_Reference",
+    "name": "SkPath::close()"
+},
+    "SkPath_conicTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPoint conicPts[] = {{20, 150}, {120, 10}, {220, 150}};\n    canvas->drawLine(conicPts[0], conicPts[1], paint);\n    canvas->drawLine(conicPts[1], conicPts[2], paint);\n    SkColor colors[] = { 0xff88ff00, 0xff0088bb, 0xff6600cc, 0xffbb3377 };\n    paint.setStrokeWidth(3);\n    SkScalar weight = 0.5f;\n    for (unsigned i = 0; i < SK_ARRAY_COUNT(colors); ++i) {\n        SkPath path;\n        path.moveTo(conicPts[0]);\n        path.conicTo(conicPts[1], conicPts[2], weight);\n        paint.setColor(colors[i]);\n        canvas->drawPath(path, paint);\n        weight += 0.25f;\n   }\n}\n",
+    "width": 256,
+    "height": 160,
+    "hash": "358d9b6060b528b0923c007420f09c13",
+    "file": "SkPath_Reference",
+    "name": "SkPath::conicTo"
+},
+    "SkPath_conicTo_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkRect oval = {0, 20, 120, 140};\n    SkPath path;\n    for (int i = 0; i < 4; ++i) {\n        path.moveTo(oval.centerX(), oval.fTop);\n        path.arcTo(oval, -90, 90 - 20 * i, false);\n        oval.inset(15, 15);\n    }\n    path.offset(100, 0);\n    SkScalar conicWeights[] = { 0.707107f, 0.819152f, 0.906308f, 0.965926f };\n    SkPoint conicPts[][3] = { { {40, 20}, {100, 20}, {100, 80} },\n                              { {40, 35}, {71.509f, 35}, {82.286f, 64.6091f} },\n                              { {40, 50}, {53.9892f, 50}, {62.981f, 60.7164f} },\n                              { {40, 65}, {44.0192f, 65}, {47.5f, 67.0096f} } };\n    for (int i = 0; i < 4; ++i) {\n         path.moveTo(conicPts[i][0]);\n         path.conicTo(conicPts[i][1], conicPts[i][2], conicWeights[i]);\n    }\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "22d25e03b19d5bae92118877e462361b",
+    "file": "SkPath_Reference",
+    "name": "SkPath::conicTo_2"
+},
+    "SkPath_conservativelyContainsRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.addRoundRect({10, 20, 54, 120}, 10, 20);\n    SkRect tests[] = {\n      { 10, 40, 54, 80 },\n      { 25, 20, 39, 120 },\n      { 15, 25, 49, 115 },\n      { 13, 27, 51, 113 },\n    };\n    for (unsigned i = 0; i < SK_ARRAY_COUNT(tests); ++i) {\n      SkPaint paint;\n      paint.setColor(SK_ColorRED);\n      canvas->drawPath(path, paint);\n      bool rectInPath = path.conservativelyContainsRect(tests[i]);\n      paint.setColor(rectInPath ? SK_ColorBLUE : SK_ColorBLACK);\n      canvas->drawRect(tests[i], paint);\n      canvas->translate(64, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 140,
+    "hash": "41638d13e40fa449ece354dde5fb1941",
+    "file": "SkPath_Reference",
+    "name": "SkPath::conservativelyContainsRect"
+},
+    "SkPath_contains": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    SkPaint paint;\n    paint.setTextSize(256);\n    paint.getTextPath(\"&\", 1, 30, 220, &path);\n    for (int y = 2; y < 256; y += 9) {\n       for (int x = 2; x < 256; x += 9) {\n           int coverage = 0;\n           for (int iy = -4; iy <= 4; iy += 2) {\n               for (int ix = -4; ix <= 4; ix += 2) {\n                   coverage += path.contains(x + ix, y + iy);\n               }\n           }\n           paint.setColor(SkColorSetARGB(0x5f, 0xff * coverage / 25, 0, 0xff * (25 - coverage) / 25));\n           canvas->drawCircle(x, y, 8, paint);\n       }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "c0216b3f7ebd80b9589ae5728f08fc80",
+    "file": "SkPath_Reference",
+    "name": "SkPath::contains()"
+},
+    "SkPath_cubicTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPath path;\n    path.moveTo(0, -10);\n    for (int i = 0; i < 128; i += 16) {\n        SkScalar c = i * 0.5f;\n        path.cubicTo( 10 + c, -10 - i,  10 + i, -10 - c,  10 + i,       0);\n        path.cubicTo( 14 + i,  14 + c,  14 + c,  14 + i,       0,  14 + i);\n        path.cubicTo(-18 - c,  18 + i, -18 - i,  18 + c, -18 - i,       0);\n        path.cubicTo(-22 - i, -22 - c, -22 - c, -22 - i,       0, -22 - i);\n    }\n    path.offset(128, 128);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "3e476378e3e0550ab134bbaf61112d98",
+    "file": "SkPath_Reference",
+    "name": "SkPath::cubicTo"
+},
+    "SkPath_cubicTo_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPoint pts[] = { {20, 20}, {300, 80}, {-140, 90}, {220, 10} };\n    SkPath path;\n    path.moveTo(pts[0]);\n    path.cubicTo(pts[1], pts[2], pts[3]);\n    canvas->drawPath(path, paint);\n}",
+    "width": 256,
+    "height": 84,
+    "hash": "d38aaf12c6ff5b8d901a2201bcee5476",
+    "file": "SkPath_Reference",
+    "name": "SkPath::cubicTo_2"
+},
+    "SkPath_incReserve": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto addPoly = [](int sides, SkScalar size, SkPath* path) -> void {\n        path->moveTo(size, 0);\n        for (int i = 1; i < sides; i++) {\n            SkScalar c, s = SkScalarSinCos(SK_ScalarPI * 2 * i / sides, &c);\n            path->lineTo(c * size, s * size);\n        }\n        path->close();\n    };\n    SkPath path;\n    path.incReserve(3 + 4 + 5 + 6 + 7 + 8 + 9);\n    for (int sides = 3; sides < 10; ++sides) {\n       addPoly(sides, sides, &path);\n    }\n    SkMatrix matrix;\n    matrix.setScale(10, 10, -10, -10);\n    path.transform(matrix);\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 192,
+    "hash": "f2260f2a170a54aef5bafe5b91c121b3",
+    "file": "SkPath_Reference",
+    "name": "SkPath::incReserve"
+},
+    "SkPath_interpolate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPath path, path2;\n    path.moveTo(20, 20);\n    path.lineTo(40, 40);\n    path.lineTo(20, 40);\n    path.lineTo(40, 20);\n    path.close();\n    path2.addRect({20, 20, 40, 40});\n    for (SkScalar i = 0; i <= 1; i += 1.f / 6) {\n      SkPath interp;\n      path.interpolate(path2, i, &interp);\n      canvas->drawPath(interp, paint);\n      canvas->translate(30, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 60,
+    "hash": "404f11c5c9c9ca8a64822d484552a473",
+    "file": "SkPath_Reference",
+    "name": "SkPath::interpolate()"
+},
+    "SkPath_isConvex": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkPoint quad[] = {{70, 70}, {20, 20}, {120, 20}, {120, 120}};\n    for (SkScalar x : { 40, 100 } ) {\n        SkPath path;\n        quad[0].fX = x;\n        path.addPoly(quad, SK_ARRAY_COUNT(quad), true);\n        path.setConvexity(SkPath::kConvex_Convexity);\n        canvas->drawPath(path, paint);\n        canvas->drawString(path.isConvex() ? \"convex\" : \"not convex\", 30, 100, paint);\n        canvas->translate(100, 100);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "d8be8b6e59de244e4cbf58ec9554557b",
+    "file": "SkPath_Reference",
+    "name": "SkPath::isConvex"
+},
+    "SkPath_isOval": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkPath path;\n    path.addOval({20, 20, 220, 220});\n    SkRect bounds;\n    if (path.isOval(&bounds)) {\n        paint.setColor(0xFF9FBFFF);\n        canvas->drawRect(bounds, paint);\n    }\n    paint.setColor(0x3f000000);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "a51256952b183ee0f7004f2c87cbbf5b",
+    "file": "SkPath_Reference",
+    "name": "SkPath::isOval"
+},
+    "SkPath_isRRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkPath path;\n    path.addRRect(SkRRect::MakeRectXY({20, 20, 220, 220}, 30, 50));\n    SkRRect rrect;\n    if (path.isRRect(&rrect)) {\n        const SkRect& bounds = rrect.rect();\n        paint.setColor(0xFF9FBFFF);\n        canvas->drawRect(bounds, paint);\n    }\n    paint.setColor(0x3f000000);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "2aa939b90d96aff436b145a96305132c",
+    "file": "SkPath_Reference",
+    "name": "SkPath::isRRect"
+},
+    "SkPath_lineTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(72);\n    canvas->drawString(\"#\", 120, 80, paint);\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setStrokeWidth(5);\n    SkPath path;\n    SkPoint hash[] = {{58, 28}, {43, 80}, {37, 45}, {85, 45}};\n    SkVector offsets[] = {{0, 0}, {17, 0}, {0, 0}, {-5, 17}};\n    unsigned o = 0;\n    for (unsigned i = 0; i < SK_ARRAY_COUNT(hash); i += 2) {\n        for (unsigned j = 0; j < 2; o++, j++) {\n            path.moveTo(hash[i].fX + offsets[o].fX, hash[i].fY + offsets[o].fY);\n            path.lineTo(hash[i + 1].fX + offsets[o].fX, hash[i + 1].fY + offsets[o].fY);\n        }\n    }\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 100,
+    "hash": "e311cdd451edacec33b50cc22a4dd5dc",
+    "file": "SkPath_Reference",
+    "name": "SkPath::lineTo"
+},
+    "SkPath_lineTo_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    SkVector oxo[] = {{25, 25}, {35, 35}, {25, 35}, {35, 25},\n                      {40, 20}, {40, 80}, {60, 20}, {60, 80},\n                      {20, 40}, {80, 40}, {20, 60}, {80, 60}};\n    for (unsigned i = 0; i < SK_ARRAY_COUNT(oxo); i += 2) {\n        path.moveTo(oxo[i]);\n        path.lineTo(oxo[i + 1]);\n    }\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPath(path, paint);\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "41001546a7f7927d08e5a818bcc304f5",
+    "file": "SkPath_Reference",
+    "name": "SkPath::lineTo_2"
+},
+    "SkPath_moveTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect rect = { 20, 20, 120, 80 };\n    SkPath path;\n    path.addRect(rect);\n    path.moveTo(rect.fLeft, rect.fTop);\n    path.lineTo(rect.fRight, rect.fBottom);\n    path.moveTo(rect.fLeft, rect.fBottom);\n    path.lineTo(rect.fRight, rect.fTop);\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 140,
+    "height": 100,
+    "hash": "84101d341e934a535a41ad6cf42218ce",
+    "file": "SkPath_Reference",
+    "name": "SkPath::moveTo"
+},
+    "SkPath_moveTo_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPoint data[][3] = {{{30,40},{60,60},{90,30}}, {{30,120},{60,100},{90,120}},\n                         {{60,100},{60,40},{70,30}}, {{60,40},{50,20},{70,30}}};\n    SkPath path;\n    for (unsigned i = 0; i < SK_ARRAY_COUNT(data); ++i) {\n        path.moveTo(data[i][0]);\n        path.lineTo(data[i][1]);\n        path.lineTo(data[i][2]);\n    }\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 128,
+    "height": 128,
+    "hash": "cb8d37990f6e7df3bcc85e7240c81274",
+    "file": "SkPath_Reference",
+    "name": "SkPath::moveTo_2"
+},
+    "SkPath_offset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath pattern;\n    pattern.moveTo(20, 20);\n    pattern.lineTo(20, 40);\n    pattern.lineTo(40, 20);\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    for (int i = 0; i < 10; i++) {\n        SkPath path;\n        pattern.offset(20 * i, 0, &path);\n        canvas->drawPath(path, paint);\n    }\n}",
+    "width": 256,
+    "height": 60,
+    "hash": "1d1892196ba5bda257df4f3351abd084",
+    "file": "SkPath_Reference",
+    "name": "SkPath::offset()"
+},
+    "SkPath_offset_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.moveTo(20, 20);\n    path.lineTo(20, 40);\n    path.lineTo(40, 20);\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    for (int i = 0; i < 10; i++) {\n        canvas->drawPath(path, paint);\n        path.offset(20, 0);\n    }\n}",
+    "width": 256,
+    "height": 60,
+    "hash": "5188d77585715db30bef228f2dfbcccd",
+    "file": "SkPath_Reference",
+    "name": "SkPath::offset_2"
+},
+    "SkPath_quadTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPath path;\n    path.moveTo(0, -10);\n    for (int i = 0; i < 128; i += 16) {\n        path.quadTo( 10 + i, -10 - i,  10 + i,       0);\n        path.quadTo( 14 + i,  14 + i,       0,  14 + i);\n        path.quadTo(-18 - i,  18 + i, -18 - i,       0);\n        path.quadTo(-22 - i, -22 - i,       0, -22 - i);\n    }\n    path.offset(128, 128);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "60ee3eb747474f5781b0f0dd3a17a866",
+    "file": "SkPath_Reference",
+    "name": "SkPath::quadTo"
+},
+    "SkPath_quadTo_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setAntiAlias(true);\n    SkPath path;\n    SkPoint pts[] = {{128, 10}, {10, 214}, {236, 214}};\n    path.moveTo(pts[1]);\n    for (int i = 0; i < 3; ++i) {\n        path.quadTo(pts[i % 3],  pts[(i + 2) % 3]);\n    }\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "82621c4df8da1e589d9e627494067826",
+    "file": "SkPath_Reference",
+    "name": "SkPath::quadTo_2"
+},
+    "SkPath_rArcTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkPath path;\n    const SkPoint starts[] = {{20, 20}, {120, 20}, {70, 60}};\n    for (auto start : starts) {\n        path.moveTo(start.fX, start.fY);\n        path.rArcTo(20, 20, 0, SkPath::kSmall_ArcSize, SkPath::kCCW_Direction, 60, 0);\n    }\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 108,
+    "hash": "3f76a1007416181a4848c1a87fc81dbd",
+    "file": "SkPath_Reference",
+    "name": "SkPath::rArcTo"
+},
+    "SkPath_rConicTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPath path;\n    path.moveTo(20, 80);\n    path.rConicTo( 60,   0,  60,  60, 0.707107f);\n    path.rConicTo(  0, -60,  60, -60, 0.707107f);\n    path.rConicTo(-60,   0, -60, -60, 0.707107f);\n    path.rConicTo(  0,  60, -60,  60, 0.707107f);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 140,
+    "hash": "3d52763e7c0e20c0b1d484a0afa622d2",
+    "file": "SkPath_Reference",
+    "name": "SkPath::rConicTo"
+},
+    "SkPath_rCubicTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPath path;\n    path.moveTo(24, 108);\n    for (int i = 0; i < 16; i++) {\n       SkScalar sx, sy;\n       sx = SkScalarSinCos(i * SK_ScalarPI / 8, &sy);\n       path.rCubicTo(40 * sx, 4 * sy, 4 * sx, 40 * sy, 40 * sx, 40 * sy);\n    }\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "19f0cfc7eeba8937fe19446ec0b5f932",
+    "file": "SkPath_Reference",
+    "name": "SkPath::rCubicTo"
+},
+    "SkPath_rLineTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPath path;\n    path.moveTo(10, 98);\n    SkScalar x = 0, y = 0;\n    for (int i = 10; i < 100; i += 5) {\n        x += i * ((i & 2) - 1);\n        y += i * (((i + 1) & 2) - 1);\n        path.rLineTo(x, y);\n    }\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "6e0be0766b8ca320da51640326e608b3",
+    "file": "SkPath_Reference",
+    "name": "SkPath::rLineTo"
+},
+    "SkPath_rMoveTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.addRect({20, 20, 80, 80}, SkPath::kCW_Direction, 2);\n    path.rMoveTo(25, 2);\n    SkVector arrow[] = {{0, -4}, {-20, 0}, {0, -3}, {-5, 5}, {5, 5}, {0, -3}, {20, 0}};\n    for (unsigned i = 0; i < SK_ARRAY_COUNT(arrow); ++i) {\n        path.rLineTo(arrow[i].fX, arrow[i].fY);\n    }\n    SkPaint paint;\n    canvas->drawPath(path, paint);\n    SkPoint lastPt;\n    path.getLastPt(&lastPt);\n    canvas->drawString(\"start\", lastPt.fX, lastPt.fY, paint);\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "63e32dec4b2d8440b427f368bf8313a4",
+    "file": "SkPath_Reference",
+    "name": "SkPath::rMoveTo"
+},
+    "SkPath_rQuadTo": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPath path;\n    path.moveTo(128, 20);\n    path.rQuadTo(-6, 10, -7, 10);\n    for (int i = 1; i < 32; i += 4) {\n       path.rQuadTo(10 + i, 10 + i, 10 + i * 4, 10);\n       path.rQuadTo(-10 - i, 10 + i, -10 - (i + 2) * 4, 10);\n    }\n    path.quadTo(92, 220, 128, 215);\n    canvas->drawPath(path, paint);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "1c1f4cdef1c572c9aa8fdf3e461191d0",
+    "file": "SkPath_Reference",
+    "name": "SkPath::rQuadTo"
+},
+    "SkPath_reverseAddPath": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.moveTo(20, 20);\n    path.lineTo(20, 40);\n    path.lineTo(40, 20);\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    for (int i = 0; i < 2; i++) {\n        SkPath path2;\n        path2.moveTo(60, 60);\n        path2.lineTo(80, 60);\n        path2.lineTo(80, 40);\n        for (int j = 0; j < 2; j++) {\n            SkPath test(path);\n            test.reverseAddPath(path2);\n            canvas->drawPath(test, paint);\n            canvas->translate(100, 0);\n            path2.close();\n        }\n        canvas->translate(-200, 100);\n        path.close();\n    }\n}",
+    "width": 256,
+    "height": 200,
+    "hash": "5e8513f073db09acde3ff616f6426e3d",
+    "file": "SkPath_Reference",
+    "name": "SkPath::reverseAddPath"
+},
+    "SkPath_setFillType": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.setFillType(SkPath::kInverseWinding_FillType);\n    SkPaint paint;\n    paint.setColor(SK_ColorBLUE);\n    canvas->drawPath(path, paint);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "b4a91cd7f50b2a0a0d1bec6d0ac823d2",
+    "file": "SkPath_Reference",
+    "name": "SkPath::setFillType"
+},
+    "SkPath_setIsVolatile": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkPath path;\n    path.setIsVolatile(true);\n    path.lineTo(40, 40);\n    canvas->drawPath(path, paint);\n    path.rewind();\n    path.moveTo(0, 40);\n    path.lineTo(40, 0);\n    canvas->drawPath(path, paint);\n}",
+    "width": 50,
+    "height": 50,
+    "hash": "2049ff5141f0c80aac497618622b28af",
+    "file": "SkPath_Reference",
+    "name": "SkPath::setIsVolatile"
+},
+    "SkPath_setLastPt": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath path;\n    paint.getTextPath(\"@\", 1, 60, 100, &path);\n    path.setLastPt(20, 120);\n    canvas->drawPath(path, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "542c5afaea5f57baa11d0561dd402e18",
+    "file": "SkPath_Reference",
+    "name": "SkPath::setLastPt"
+},
+    "SkPath_setLastPt_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath path, path2;\n    paint.getTextPath(\"A\", 1, 60, 100, &path);\n    paint.getTextPath(\"Z\", 1, 60, 100, &path2);\n    SkPoint pt, pt2;\n    path.getLastPt(&pt);\n    path2.getLastPt(&pt2);\n    path.setLastPt(pt2);\n    path2.setLastPt(pt);\n    canvas->drawPath(path, paint);\n    canvas->drawPath(path2, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "6fa5e8f9513b3225e106778592e27e94",
+    "file": "SkPath_Reference",
+    "name": "SkPath::setLastPt_2"
+},
+    "SkPath_toggleInverseFillType": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    SkPaint paint;\n    paint.setColor(SK_ColorRED);\n    paint.setTextSize(80);\n    paint.getTextPath(\"ABC\", 3, 20, 80, &path);\n    canvas->drawPath(path, paint);\n    path.toggleInverseFillType();\n    paint.setColor(SK_ColorGREEN);\n    canvas->drawPath(path, paint);\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "400facce23d417bc5043c5f58404afbd",
+    "file": "SkPath_Reference",
+    "name": "SkPath::toggleInverseFillType"
+},
+    "SkPath_transform": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath pattern;\n    pattern.moveTo(100, 100);\n    pattern.lineTo(100, 20);\n    pattern.lineTo(20, 100);\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    for (int i = 0; i < 10; i++) {\n        SkPath path;\n        SkMatrix matrix;\n        matrix.setRotate(36 * i, 100, 100);\n        pattern.transform(matrix, &path);\n        canvas->drawPath(path, paint);\n    }\n}",
+    "width": 256,
+    "height": 200,
+    "hash": "99761add116ce3b0730557224c1b0105",
+    "file": "SkPath_Reference",
+    "name": "SkPath::transform()"
+},
+    "SkPath_transform_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPath path;\n    path.moveTo(100, 100);\n    path.quadTo(100, 20, 20, 100);\n    SkPaint paint;\n    paint.setStyle(SkPaint::kStroke_Style);\n    for (int i = 0; i < 10; i++) {\n        SkMatrix matrix;\n        matrix.setRotate(36, 100, 100);\n        path.transform(matrix);\n        canvas->drawPath(path, paint);\n    }\n}",
+    "width": 256,
+    "height": 200,
+    "hash": "c40979a3b92a30cfb7bae36abcc1d805",
+    "file": "SkPath_Reference",
+    "name": "SkPath::transform_2"
+},
+    "SkPicture_AbortCallback": {
+    "code": "class JustOneDraw : public SkPicture::AbortCallback {\npublic:\n    bool abort() override { return fCalls++ > 0; }\nprivate:\n    int fCalls = 0;\n};\n\nvoid draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});\n    SkPaint paint;\n    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);\n    paint.setColor(SK_ColorWHITE);\n    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);\n    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();\n    JustOneDraw callback;\n    picture->playback(canvas, &callback);\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "56ed920dadbf2b2967ac45fb5a9bded6",
+    "file": "SkPicture_Reference",
+    "name": "SkPicture::AbortCallback"
+},
+    "SkPicture_MakeFromData": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});\n    SkPaint paint;\n    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);\n    paint.setColor(SK_ColorWHITE);\n    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);\n    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();\n    SkDynamicMemoryWStream writableStream;\n    picture->serialize(&writableStream);\n    sk_sp<SkData> readableData = writableStream.detachAsData();\n    sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData.get());\n    copy->playback(canvas);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "58b44bf47d8816782066618700afdecb",
+    "file": "SkPicture_Reference",
+    "name": "SkPicture::MakeFromData"
+},
+    "SkPicture_MakeFromData_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});\n    SkPaint paint;\n    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);\n    paint.setColor(SK_ColorWHITE);\n    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);\n    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();\n    SkDynamicMemoryWStream writableStream;\n    picture->serialize(&writableStream);\n    sk_sp<SkData> readableData = writableStream.detachAsData();\n    sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData->data(), readableData->size());\n    copy->playback(canvas);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "30b9f1b310187db6aff720a5d67591e2",
+    "file": "SkPicture_Reference",
+    "name": "SkPicture::MakeFromData_2"
+},
+    "SkPicture_MakeFromStream": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});\n    SkPaint paint;\n    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);\n    paint.setColor(SK_ColorWHITE);\n    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);\n    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();\n    SkDynamicMemoryWStream writableStream;\n    picture->serialize(&writableStream);\n    std::unique_ptr<SkStreamAsset> readableStream = writableStream.detachAsStream();\n    sk_sp<SkPicture> copy = SkPicture::MakeFromStream(readableStream.get());\n    copy->playback(canvas);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "404fb42560a289c2004cad1caf3b96de",
+    "file": "SkPicture_Reference",
+    "name": "SkPicture::MakeFromStream"
+},
+    "SkPicture_MakePlaceholder": {
+    "code": "class MyCanvas : public SkCanvas {\npublic:\n    MyCanvas(SkCanvas* c) : canvas(c) {}\n        void onDrawPicture(const SkPicture* picture, const SkMatrix* ,\n                               const SkPaint* ) override {\n        const SkRect rect = picture->cullRect();\n        SkPaint redPaint;\n        redPaint.setColor(SK_ColorRED);\n        canvas->drawRect(rect, redPaint);\n   }\n   SkCanvas* canvas;\n};\n\nvoid draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});\n    sk_sp<SkPicture> placeholder = SkPicture::MakePlaceholder({10, 40, 80, 110});\n    pictureCanvas->drawPicture(placeholder);\n    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();\n    MyCanvas myCanvas(canvas);\n    myCanvas.drawPicture(picture);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "0d2cbf82f490ffb180e0b4531afa232c",
+    "file": "SkPicture_Reference",
+    "name": "SkPicture::MakePlaceholder"
+},
+    "SkPicture_approximateBytesUsed": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});\n    SkPaint paint;\n    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);\n    paint.setColor(SK_ColorWHITE);\n    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);\n    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();\n    picture->playback(canvas);\n    std::string opCount = \"approximate bytes used: \" + std::to_string(picture->approximateBytesUsed());\n    canvas->drawString(opCount.c_str(), 20, 220, SkPaint());\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "ececbda21218bd732394a305dba393a2",
+    "file": "SkPicture_Reference",
+    "name": "SkPicture::approximateBytesUsed"
+},
+    "SkPicture_approximateOpCount": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});\n    SkPaint paint;\n    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);\n    paint.setColor(SK_ColorWHITE);\n    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);\n    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();\n    picture->playback(canvas);\n    std::string opCount = \"approximate op count: \" + std::to_string(picture->approximateOpCount());\n    canvas->drawString(opCount.c_str(), 50, 220, SkPaint());\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "4b3d879118ef770d1f11a23c6493b2c4",
+    "file": "SkPicture_Reference",
+    "name": "SkPicture::approximateOpCount"
+},
+    "SkPicture_cullRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    SkCanvas* pictureCanvas = recorder.beginRecording({64, 64, 192, 192});\n    SkPaint paint;\n    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);\n    paint.setColor(SK_ColorWHITE);\n    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);\n    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();\n    picture->playback(canvas);\n    paint.setBlendMode(SkBlendMode::kModulate);\n    paint.setColor(0x40404040);\n    canvas->drawRect(picture->cullRect(), paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "15bb9a9596b40c5e2045f76e8c1dcf8e",
+    "file": "SkPicture_Reference",
+    "name": "SkPicture::cullRect"
+},
+    "SkPicture_playback": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});\n    SkPaint paint;\n    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);\n    paint.setColor(SK_ColorWHITE);\n    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);\n    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();\n    picture->playback(canvas);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "6b0ffb03ba05f526b345dc65a1c73fe4",
+    "file": "SkPicture_Reference",
+    "name": "SkPicture::playback()"
+},
+    "SkPicture_serialize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});\n    SkPaint paint;\n    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);\n    paint.setColor(SK_ColorWHITE);\n    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);\n    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();\n    sk_sp<SkData> readableData = picture->serialize();\n    sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData->data(), readableData->size());\n    copy->playback(canvas);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "dacdebe1355c884ebd3c2ea038cc7a20",
+    "file": "SkPicture_Reference",
+    "name": "SkPicture::serialize()"
+},
+    "SkPicture_serialize_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPictureRecorder recorder;\n    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});\n    SkPaint paint;\n    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);\n    paint.setColor(SK_ColorWHITE);\n    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);\n    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();\n    SkDynamicMemoryWStream writableStream;\n    picture->serialize(&writableStream);\n    sk_sp<SkData> readableData = writableStream.detachAsData();\n    sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData->data(), readableData->size());\n    copy->playback(canvas);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "30b9f1b310187db6aff720a5d67591e2",
+    "file": "SkPicture_Reference",
+    "name": "SkPicture::serialize_2"
+},
+    "SkPixmap_erase": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint32_t storage[2];\n    SkImageInfo info = SkImageInfo::MakeN32Premul(1, 2);\n    SkPixmap pixmap(info, storage, info.minRowBytes());\n    pixmap.erase(SK_ColorBLUE, {0, 0, 1, 1});\n    pixmap.erase(SK_ColorRED, {0, 1, 1, 2});\n    SkBitmap bitmap;\n    canvas->scale(20, 20);\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 50,
+    "hash": "a0cdbafed4786788cc90681e7b294234",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::erase()"
+},
+    "SkPixmap_erase_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint32_t storage[2];\n    SkImageInfo info = SkImageInfo::MakeN32Premul(1, 2);\n    SkPixmap pixmap(info, storage, info.minRowBytes());\n    pixmap.erase(SK_ColorBLUE);\n    SkBitmap bitmap;\n    canvas->scale(20, 20);\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 50,
+    "hash": "838202e0d49cad2eb3eeb495834f6d63",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::erase_2"
+},
+    "SkPixmap_erase_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint32_t storage[2];\n    SkImageInfo info = SkImageInfo::MakeN32Premul(1, 2);\n    SkPixmap pixmap(info, storage, info.minRowBytes());\n    SkIRect topPixelBounds = {0, 0, 1, 1};\n    pixmap.erase({ 0.65f, 0.45f, 0.25f, 1 }, &topPixelBounds);\n    SkIRect bottomPixelBounds = {0, 1, 1, 2};\n    pixmap.erase({ 0.25f, 0.65f, 0.45f, 1 }, &bottomPixelBounds);\n    SkBitmap bitmap;\n    canvas->scale(20, 20);\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 50,
+    "hash": "f884f3f46a565f052a5e252ae2f36e9b",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::erase_3"
+},
+    "SkPixmap_extractSubset": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<int32_t> pixels;\n    pixels.resize(image->height() * image->width() * 4);\n    SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType,\n            image->alphaType()), (const void*) &pixels.front(), image->width() * 4);\n    image->readPixels(pixmap, 0, 0);\n    SkPixmap inset;\n    if (pixmap.extractSubset(&inset, {128, 128, 512, 512})) {\n        SkBitmap bitmap;\n        bitmap.installPixels(inset);\n        canvas->drawBitmap(bitmap, 0, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 128,
+    "hash": "febdbfac6cf4cde69837643be2e1f6dd",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::extractSubset"
+},
+    "SkPixmap_readPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<int32_t> pixels;\n    const int width = 256;\n    const int height = 64;\n    pixels.resize(height * width * 4);\n    SkImageInfo srcInfo = SkImageInfo::MakeN32Premul(width, height);\n    SkPixmap srcPixmap(srcInfo, (const void*) &pixels.front(), width * 4);\n    SkColor  gradColors[] = { 0xFFAA3300, 0x7F881122 };\n    SkPoint  gradPoints[] = { { 0, 0 }, { 256, 0 } };\n    SkPaint paint;\n    paint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr,\n                    SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode));\n    SkBitmap bitmap;\n    bitmap.installPixels(srcPixmap);\n    SkCanvas srcCanvas(bitmap);\n    srcCanvas.drawRect(SkRect::MakeWH(width, height), paint);\n    canvas->drawBitmap(bitmap, 0, 0);\n    std::vector<int32_t> dstPixels;\n    dstPixels.resize(height * width * 2);\n    SkImageInfo dstInfo = srcInfo.makeColorType(kARGB_4444_SkColorType);\n    srcPixmap.readPixels(dstInfo, &dstPixels.front(), width * 2);\n    SkPixmap dstPixmap(dstInfo, &dstPixels.front(), width * 2);\n    bitmap.installPixels(dstPixmap);\n    canvas->drawBitmap(bitmap, 0, 128);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "df4e355c4845350daede833b4fd21ec1",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::readPixels"
+},
+    "SkPixmap_readPixels_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::MakeN32Premul(image->width(), image->height());\n    std::vector<int32_t> srcPixels;\n    const int rowBytes = image->width() * 4;\n    srcPixels.resize(image->height() * rowBytes);\n    SkPixmap pixmap(info, (const void*) &srcPixels.front(), rowBytes);\n    image->readPixels(pixmap, 0, 0);\n    for (int offset : { 32, 64, 96 } ) {\n        std::vector<int32_t> dstPixels;\n        dstPixels.resize(image->height() * rowBytes);\n        pixmap.readPixels(info, &dstPixels.front(), rowBytes, offset, 0);\n        SkBitmap bitmap;\n        SkPixmap dstmap(info, &dstPixels.front(), rowBytes);\n        bitmap.installPixels(dstmap);\n        canvas->translate(32, 32);\n        canvas->drawBitmap(bitmap, 0, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "094ca0bd37588cc7be241bb387a3e17b",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::readPixels_2"
+},
+    "SkPixmap_readPixels_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::MakeN32Premul(image->width(), image->height());\n    std::vector<int32_t> srcPixels;\n    const int rowBytes = image->width() * 4;\n    srcPixels.resize(image->height() * rowBytes);\n    SkPixmap pixmap(info, (const void*) &srcPixels.front(), rowBytes);\n    image->readPixels(pixmap, 0, 0);\n    for (int offset : { 32, 64, 96 } ) {\n        std::vector<int32_t> dstPixels;\n        dstPixels.resize(image->height() * rowBytes);\n        SkPixmap dstmap(info, &dstPixels.front(), rowBytes);\n        pixmap.readPixels(dstmap, offset, 0);\n        SkBitmap bitmap;\n        bitmap.installPixels(dstmap);\n        canvas->translate(32, 32);\n        canvas->drawBitmap(bitmap, 0, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "6ec7f7b2cc163cd29f627eef6d4b061c",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::readPixels_3"
+},
+    "SkPixmap_readPixels_4": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::MakeN32Premul(image->width(), image->height());\n    std::vector<int32_t> srcPixels;\n    const int rowBytes = image->width() * 4;\n    srcPixels.resize(image->height() * rowBytes);\n    SkPixmap pixmap(info, (const void*) &srcPixels.front(), rowBytes);\n    image->readPixels(pixmap, 0, 0);\n    for (int index = 0; index < 3; ++index ) {\n        std::vector<int32_t> dstPixels;\n        dstPixels.resize(image->height() * rowBytes);\n        SkPixmap dstmap(info, &dstPixels.front(), rowBytes);\n        pixmap.readPixels(dstmap);\n        SkBitmap bitmap;\n        bitmap.installPixels(dstmap);\n        canvas->translate(32, 32);\n        canvas->drawBitmap(bitmap, 0, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "e18549b5ee1039cb61b0bb38c2104fc9",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::readPixels_4"
+},
+    "SkPixmap_reset_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<int32_t> pixels;\n    pixels.resize(image->height() * image->width() * 4);\n    SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType,\n            image->alphaType()), (const void*) &pixels.front(), image->width() * 4);\n    image->readPixels(pixmap, 0, 0);\n    int x = 0;\n    for (auto colorType : { kRGBA_8888_SkColorType, kBGRA_8888_SkColorType } ) {\n        pixmap.reset(SkImageInfo::Make(image->width(), image->height(), colorType,\n                image->alphaType()), (const void*) &pixels.front(), image->width() * 4);\n        SkBitmap bitmap;\n        bitmap.installPixels(pixmap);\n        canvas->drawBitmap(bitmap, x, 0);\n        x += 128;\n    }\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "9a392b753167cfa849cebeefd5a6e07d",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::reset_2"
+},
+    "SkPixmap_scalePixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::MakeN32Premul(image->width(), image->height());\n    std::vector<int32_t> srcPixels;\n    int rowBytes = image->width() * 4;\n    srcPixels.resize(image->height() * rowBytes);\n    SkPixmap pixmap(info, (const void*) &srcPixels.front(), rowBytes);\n    image->readPixels(pixmap, 0, 0);\n    for (int offset : { 32, 64, 96 } ) {\n        info = SkImageInfo::MakeN32Premul(image->width() + offset, image->height());\n        rowBytes = info.width() * 4;\n        std::vector<int32_t> dstPixels;\n        dstPixels.resize(image->height() * rowBytes);\n        SkPixmap dstmap(info, &dstPixels.front(), rowBytes);\n        pixmap.scalePixels(dstmap, kMedium_SkFilterQuality);\n        SkBitmap bitmap;\n        bitmap.installPixels(dstmap);\n        canvas->translate(32, 32);\n        canvas->drawBitmap(bitmap, 0, 0);\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "8e3c8a9c1d0d2e9b8bf66e24d274f792",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::scalePixels"
+},
+    "SkPixmap_writable_addr16": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint16_t storage[][5] = {{ 0xCABF, 0xDABE, 0xCA9D, 0xC96C, 0xA39B },\n                             { 0xACEE, 0xA87C, 0x893A, 0x4779, 0x8708 },\n                             { 0x4B7C, 0x255B, 0x2559, 0x2557, 0x4656 },\n                             { 0x9099, 0x8128, 0x2557, 0x4124, 0x3323 },\n                             { 0x7547, 0x5505, 0x4434, 0x2012, 0x0000 }};\n    SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kARGB_4444_SkColorType, kPremul_SkAlphaType);\n    SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);\n    SkBitmap bitmap;\n    bitmap.installPixels(pixmap);\n    canvas->scale(10, 10);\n    canvas->drawBitmap(bitmap, 0, 0);\n    *pixmap.writable_addr16(2, 2) = 0x000F;\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 10, 0);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "6da54774f6432b46b47ea9013c15f280",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::writable_addr16"
+},
+    "SkPixmap_writable_addr32": {
+    "code": "void draw(SkCanvas* canvas) {\n    std::vector<int32_t> pixels;\n    pixels.resize(image->height() * image->width() * 4);\n    SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType,\n            image->alphaType()), (const void*) &pixels.front(), image->width() * 4);\n    image->readPixels(pixmap, 0, 0);\n    for (int y = 0; y < pixmap.height() / 2; ++y) {\n        for (int x = 0; x < pixmap.width(); ++x) {\n            if ((x & 4) == (y & 4)) {\n                *pixmap.writable_addr32(x, y) =\n                        *pixmap.writable_addr32(pixmap.width() - x, pixmap.height() - y);\n            }\n        }\n    }\n    SkBitmap bitmap;\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 72,
+    "hash": "086866243bf9e4c14c3b215a2aa69ad9",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::writable_addr32"
+},
+    "SkPixmap_writable_addr64": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::Make(3, 3, kRGBA_F16_SkColorType, kPremul_SkAlphaType);\n    uint64_t storage[9];\n    SkPixmap pixmap(info, storage, 3 * sizeof(uint64_t));\n    SkColor4f c4 { 1, 0.45f, 0.25f, 0.65f };\n    pixmap.erase(c4);\n    SkBitmap bitmap;\n    canvas->scale(10, 10);\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 0, 0);\n    *pixmap.writable_addr64(1, 1) |= 0x00ff000000000000LL;\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 10, 0);\n}",
+    "width": 256,
+    "height": 40,
+    "hash": "de14d8d30e4a7b6462103d0e0dd96b0b",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::writable_addr64"
+},
+    "SkPixmap_writable_addr8": {
+    "code": "void draw(SkCanvas* canvas) {\n    uint8_t storage[][5] = {{ 0,   0,  64,   0,  0},\n                            { 0, 128, 255, 128,  0},\n                            {64, 255, 255, 255, 64},\n                            { 0, 128, 255, 128,  0},\n                            { 0,   0,  64,   0,  0}};\n    SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kPremul_SkAlphaType);\n    SkPixmap pixmap(imageInfo, storage[0], 5);\n    SkBitmap bitmap;\n    bitmap.installPixels(pixmap);\n    canvas->scale(10, 10);\n    canvas->drawBitmap(bitmap, 0, 0);\n    *pixmap.writable_addr8(2, 2) = 0;\n//  bitmap.installPixels(pixmap);      // uncomment to fix on GPU\n    canvas->drawBitmap(bitmap, 10, 0);\n}\n",
+    "width": 256,
+    "height": 64,
+    "hash": "809284db136748208b3efc31cd89de29",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::writable_addr8"
+},
+    "SkPixmap_writable_addrF16": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkImageInfo info = SkImageInfo::Make(1, 2, kRGBA_F16_SkColorType, kPremul_SkAlphaType);\n    uint16_t storage[2][4];\n    SkPixmap pixmap(info, storage[0], sizeof(uint64_t));\n    SkIRect topPixelBounds = {0, 0, 1, 1};\n    pixmap.erase({ 0.65f, 0.45f, 0.25f, 1 }, &topPixelBounds);\n    SkIRect bottomPixelBounds = {0, 1, 1, 2};\n    pixmap.erase({ 0.25f, 0.65f, 0.45f, 1 }, &bottomPixelBounds);\n    SkBitmap bitmap;\n    canvas->scale(20, 20);\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 0, 0);\n    uint16_t* pixel2 = pixmap.writable_addrF16(0, 1);\n    for (int i = 0; i < 4; ++i) {\n        pixel2[i] = storage[0][i];\n    }\n    bitmap.installPixels(pixmap);\n    canvas->drawBitmap(bitmap, 4, 0);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "7822d78f5cacf5c04267cbbc6c6d0b80",
+    "file": "SkPixmap_Reference",
+    "name": "SkPixmap::writable_addrF16"
+},
+    "SkPoint_CrossProduct": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},\n                             {{-20, -24}, {-24, -20}}};\n    SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};\n    paint.setStrokeWidth(2);\n    for (size_t i = 0; i < 4; ++i) {\n        paint.setColor(SK_ColorRED);\n        canvas->drawLine(center[i], center[i] + vectors[i][0], paint);\n        paint.setColor(SK_ColorBLUE);\n        canvas->drawLine(center[i], center[i] + vectors[i][1], paint);\n        SkString str;\n        SkScalar cross = SkPoint::CrossProduct(vectors[i][1], vectors[i][0]);\n        str.printf(\"cross = %g\", cross);\n        paint.setColor(cross >= 0 ? SK_ColorRED : SK_ColorBLUE);\n        canvas->drawString(str, center[i].fX, center[i].fY, paint);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "8b8a4cd8a29d22bb9c5e63b70357bd65",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::CrossProduct"
+},
+    "SkPoint_Distance": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    const SkPoint lines[][2] = {{{-10, -10}, {90, 30}}, {{0, 0}, {150, 30}}, {{10, 25}, {120, 150}}};\n    const SkPoint origin = {30, 160};\n    for (auto line : lines) {\n        SkPoint a = origin + line[0];\n        const SkPoint& b = line[1];\n        canvas->drawLine(a, b, paint);\n        SkAutoCanvasRestore acr(canvas, true);\n        SkScalar angle = SkScalarATan2((b.fY - a.fY), b.fX - a.fX);\n        canvas->rotate(angle * 180 / SK_ScalarPI, a.fX, a.fY);\n        SkString distance(\"distance = \");\n        distance.appendScalar(SkPoint::Distance(a, b));\n        canvas->drawString(distance, a.fX + 25, a.fY - 4, paint);\n    }\n}",
+    "width": 256,
+    "height": 192,
+    "hash": "9e0a2de2eb94dba4521d733e73f2bda5",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::Distance"
+},
+    "SkPoint_DotProduct": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},\n                             {{-20, -24}, {-24, -20}}};\n    SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};\n    paint.setStrokeWidth(2);\n    for (size_t i = 0; i < 4; ++i) {\n        canvas->drawLine(center[i], center[i] + vectors[i][0], paint);\n        canvas->drawLine(center[i], center[i] + vectors[i][1], paint);\n        SkString str;\n        str.printf(\"dot = %g\", SkPoint::DotProduct(vectors[i][0], vectors[i][1]));\n        canvas->drawString(str, center[i].fX, center[i].fY, paint);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "496db0131a003162faba7d7f98b30340",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::DotProduct"
+},
+    "SkPoint_Length": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    const SkPoint points[] = { { 90, 30 }, { 120, 150 }, { 150, 30 }, { 210, 90 } };\n    const SkPoint origin = {30, 140};\n    for (auto point : points) {\n        canvas->drawLine(origin, point, paint);\n        SkAutoCanvasRestore acr(canvas, true);\n        SkScalar angle = SkScalarATan2((point.fY - origin.fY), point.fX - origin.fX);\n        canvas->rotate(angle * 180 / SK_ScalarPI, origin.fX, origin.fY);\n        SkString length(\"length = \");\n        length.appendScalar(SkPoint::Length(point.fX, point.fY));\n        canvas->drawString(length, origin.fX + 25, origin.fY - 4, paint);\n    }\n}",
+    "width": 256,
+    "height": 192,
+    "hash": "c98773d8b4509969d78cb8121e4b77f6",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::Length"
+},
+    "SkPoint_Normalize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    const SkPoint lines[][2] = { {{  30, 110 }, { 190,  30 }},\n                                 {{  30, 220 }, { 120, 140 }}};\n    for (auto line : lines) {\n        canvas->drawLine(line[0], line[1], paint);\n        SkVector vector = line[1] - line[0];\n        SkScalar priorLength = SkPoint::Normalize(&vector);\n        SkVector rotate90 = { -vector.fY, vector.fX };\n        rotate90 *= 10.f;\n        canvas->drawLine(line[0] - rotate90, line[0] + rotate90, paint);\n        canvas->drawLine(line[1] - rotate90, line[1] + rotate90, paint);\n        SkString length(\"length = \");\n        length.appendScalar(priorLength);\n        canvas->drawString(length, line[0].fX + 25, line[0].fY - 4, paint);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "60a08f3ce75374fc815384616d114df7",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::Normalize"
+},
+    "SkPoint_Offset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },\n                         { 6, 4 }, { 7, 5 }, { 5, 7 },\n                         { 4, 6 }, { 3, 7 }, { 1, 5 },\n                         { 2, 4 }, { 1, 3 }, { 3, 1 } };\n    canvas->scale(30, 15);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n    SkPoint::Offset(points, SK_ARRAY_COUNT(points), { 1, 9 } );\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "f0f24726df78a5d797bcf311e694a0a3",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::Offset"
+},
+    "SkPoint_Offset_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },\n                         { 6, 4 }, { 7, 5 }, { 5, 7 },\n                         { 4, 6 }, { 3, 7 }, { 1, 5 },\n                         { 2, 4 }, { 1, 3 }, { 3, 1 } };\n    canvas->scale(30, 15);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n    SkPoint::Offset(points, SK_ARRAY_COUNT(points), 1, 9);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "532849faa838de885b86d3ebffae3712",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::Offset_2"
+},
+    "SkPoint_add_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },\n                         { 6, 4 }, { 7, 5 }, { 5, 7 },\n                         { 4, 6 }, { 3, 7 }, { 1, 5 },\n                         { 2, 4 }, { 1, 3 }, { 3, 1 } };\n    canvas->scale(30, 15);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n    SkVector mod = {1, 1};\n    for (auto& point : points) {\n        point = point + mod;\n        mod.fX *= 1.1f;\n        mod.fY += .2f;\n    }\n    paint.setColor(SK_ColorRED);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "911a84253dfec4dabf94dbe3c71766f0",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::operator+(const SkPoint& a, const SkVector& b)"
+},
+    "SkPoint_addto_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },\n                         { 6, 4 }, { 7, 5 }, { 5, 7 },\n                         { 4, 6 }, { 3, 7 }, { 1, 5 },\n                         { 2, 4 }, { 1, 3 }, { 3, 1 } };\n    canvas->scale(30, 15);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n    points[1] += {1, 1};\n    points[2] += {-1, -1};\n    paint.setColor(SK_ColorRED);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "8b4e79109e2381345258cb744881b20c",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::operator+=(const SkVector& v)"
+},
+    "SkPoint_cross": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},\n                             {{-20, -24}, {-24, -20}}};\n    SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};\n    paint.setStrokeWidth(2);\n    for (size_t i = 0; i < 4; ++i) {\n        paint.setColor(SK_ColorRED);\n        canvas->drawLine(center[i], center[i] + vectors[i][0], paint);\n        paint.setColor(SK_ColorBLUE);\n        canvas->drawLine(center[i], center[i] + vectors[i][1], paint);\n        SkString str;\n        SkScalar cross = vectors[i][0].cross(vectors[i][1]);\n        str.printf(\"cross = %g\", cross);\n        paint.setColor(cross >= 0 ? SK_ColorRED : SK_ColorBLUE);\n        canvas->drawString(str, center[i].fX, center[i].fY, paint);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "0bc7b3997357e499817278b78bdfbf1d",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::cross()"
+},
+    "SkPoint_distanceToOrigin": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };\n    const SkPoint origin = {0, 0};\n    canvas->translate(30, 140);\n    for (auto point : points) {\n        canvas->drawLine(origin, point, paint);\n        SkAutoCanvasRestore acr(canvas, true);\n        SkScalar angle = SkScalarATan2((point.fY - origin.fY), point.fX - origin.fX);\n        canvas->rotate(angle * 180 / SK_ScalarPI, origin.fX, origin.fY);\n        SkString distance(\"distance = \");\n        distance.appendScalar(point.distanceToOrigin());\n        canvas->drawString(distance, origin.fX + 25, origin.fY - 4, paint);\n    }\n}",
+    "width": 256,
+    "height": 192,
+    "hash": "812cf26d91b1cdcd2c6b9438a8172518",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::distanceToOrigin"
+},
+    "SkPoint_dot": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},\n                             {{-20, -24}, {-24, -20}}};\n    SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};\n    paint.setStrokeWidth(2);\n    for (size_t i = 0; i < 4; ++i) {\n        canvas->drawLine(center[i], center[i] + vectors[i][0], paint);\n        canvas->drawLine(center[i], center[i] + vectors[i][1], paint);\n        SkString str;\n        str.printf(\"dot = %g\", vectors[i][0].dot(vectors[i][1]));\n        canvas->drawString(str, center[i].fX, center[i].fY, paint);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "56d01ccfedd71d3c504b09afa2875d38",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::dot()"
+},
+    "SkPoint_length": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    const SkPoint points[] = { { 90, 30 }, { 120, 150 }, { 150, 30 }, { 210, 90 } };\n    const SkPoint origin = {30, 140};\n    for (auto point : points) {\n        canvas->drawLine(origin, point, paint);\n        SkAutoCanvasRestore acr(canvas, true);\n        SkScalar angle = SkScalarATan2((point.fY - origin.fY), point.fX - origin.fX);\n        canvas->rotate(angle * 180 / SK_ScalarPI, origin.fX, origin.fY);\n        SkString length(\"length = \");\n        length.appendScalar(point.length());\n        canvas->drawString(length, origin.fX + 25, origin.fY - 4, paint);\n    }\n}",
+    "width": 256,
+    "height": 192,
+    "hash": "8363ab179447ee4b827679e20d3d81eb",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::length()"
+},
+    "SkPoint_multiply_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },\n                         { 6, 4 }, { 7, 5 }, { 5, 7 },\n                         { 4, 6 }, { 3, 7 }, { 1, 5 },\n                         { 2, 4 }, { 1, 3 }, { 3, 1 } };\n    canvas->scale(15, 10);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n    for (auto& point : points) {\n        point = point * 1.5f;\n    }\n    paint.setColor(SK_ColorRED);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "35b3bc675779de043706ae4817ee950c",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::operator*(SkScalar scale) const"
+},
+    "SkPoint_multiplyby_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },\n                         { 6, 4 }, { 7, 5 }, { 5, 7 },\n                         { 4, 6 }, { 3, 7 }, { 1, 5 },\n                         { 2, 4 }, { 1, 3 }, { 3, 1 } };\n    canvas->scale(15, 10);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n    for (auto& point : points) {\n        point *= 2;\n    }\n    paint.setColor(SK_ColorRED);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "3ce3db36235d80dbac4d39504cf756da",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::operator*=(SkScalar scale)"
+},
+    "SkPoint_normalize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    const SkPoint lines[][2] = { {{  30, 110 }, { 190,  30 }},\n                                 {{ 120, 140 }, {  30, 220 }}};\n    for (auto line : lines) {\n        canvas->drawLine(line[0], line[1], paint);\n        SkVector vector = line[1] - line[0];\n        if (vector.normalize()) {\n            SkVector rotate90 = { -vector.fY, vector.fX };\n            rotate90 *= 10.f;\n            canvas->drawLine(line[0] - rotate90, line[0] + rotate90, paint);\n            canvas->drawLine(line[1] - rotate90, line[1] + rotate90, paint);\n        }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "d84fce292d86c7d9ef37ae2d179c03c7",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::normalize()"
+},
+    "SkPoint_offset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },\n                         { 6, 4 }, { 7, 5 }, { 5, 7 },\n                         { 4, 6 }, { 3, 7 }, { 1, 5 },\n                         { 2, 4 }, { 1, 3 }, { 3, 1 } };\n    canvas->scale(30, 15);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n    points[1].offset(1, 1);\n    paint.setColor(SK_ColorRED);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "02750ceaa874f956e6e6544ef6b858ee",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::offset()"
+},
+    "SkPoint_scale": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPoint point = {40, -15}, scaled;\n    SkPoint origin = {30, 110};\n    for (auto scale : {1, 2, 3, 5}) {\n        paint.setStrokeWidth(scale * 5);\n        paint.setARGB(0x7f, 0x9f, 0xbf, 0x33 * scale);\n        point.scale(scale, &scaled);\n        canvas->drawLine(origin, origin + scaled, paint);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "972e4e230806281adb928e068bcd8551",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::scale()"
+},
+    "SkPoint_scale_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPoint point = {40, -15};\n    SkPoint origin = {30, 110};\n    for (auto scale : {1, 2, 3, 5}) {\n        paint.setStrokeWidth(scale * 5);\n        paint.setARGB(0x7f, 0x9f, 0xbf, 0x33 * scale);\n        point.scale(scale);\n        canvas->drawLine(origin, origin + point, paint);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "1060a4f27d8ef29519e6ac006ce90f2b",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::scale_2"
+},
+    "SkPoint_setLength": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };\n    const SkPoint origin = {0, 0};\n    canvas->translate(30, 140);\n    for (auto point : points) {\n        paint.setStrokeWidth(1);\n        paint.setColor(SK_ColorBLACK);\n        canvas->drawLine(origin, point, paint);\n        SkVector normal = point;\n        normal.setLength(100);\n        paint.setStrokeWidth(10);\n        paint.setColor(0x3f45bf12);\n        canvas->drawLine(origin, normal, paint);\n    }\n}",
+    "width": 256,
+    "height": 160,
+    "hash": "cbe7db206ece825aa3b9b7c3256aeaf0",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::setLength"
+},
+    "SkPoint_setLength_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };\n    const SkPoint origin = {0, 0};\n    canvas->translate(30, 140);\n    for (auto point : points) {\n        paint.setStrokeWidth(1);\n        paint.setColor(SK_ColorBLACK);\n        canvas->drawLine(origin, point, paint);\n        SkVector normal;\n        normal.setLength(point.fX, point.fY, 100);\n        paint.setStrokeWidth(10);\n        paint.setColor(0x3fbf4512);\n        canvas->drawLine(origin, normal, paint);\n    }\n}",
+    "width": 256,
+    "height": 160,
+    "hash": "3cc0662b6fbbee1fe3442a0acfece22c",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::setLength_2"
+},
+    "SkPoint_setNormalize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };\n    const SkPoint origin = {0, 0};\n    canvas->translate(30, 140);\n    for (auto point : points) {\n        paint.setStrokeWidth(1);\n        paint.setColor(SK_ColorBLACK);\n        canvas->drawLine(origin, point, paint);\n        SkVector normal;\n        normal.setNormalize(point.fX, point.fY);\n        normal *= 100;\n        paint.setStrokeWidth(10);\n        paint.setColor(0x3f4512bf);\n        canvas->drawLine(origin, normal, paint);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "3e4f147d143a388802484bf0d26534c2",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::setNormalize"
+},
+    "SkPoint_subtract_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },\n                         { 6, 4 }, { 7, 5 }, { 5, 7 },\n                         { 4, 6 }, { 3, 7 }, { 1, 5 },\n                         { 2, 4 }, { 1, 3 }, { 3, 1 } };\n    canvas->scale(30, 15);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n    points[1] += points[0] - points[2];\n    points[2] -= points[3] - points[5];\n    paint.setColor(SK_ColorRED);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "b6c4943ecd0b2dccf9d220b8944009e0",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::operator-(const SkPoint& a, const SkPoint& b)"
+},
+    "SkPoint_subtractfrom_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },\n                         { 6, 4 }, { 7, 5 }, { 5, 7 },\n                         { 4, 6 }, { 3, 7 }, { 1, 5 },\n                         { 2, 4 }, { 1, 3 }, { 3, 1 } };\n    canvas->scale(30, 15);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n    points[1] -= {1, 1};\n    points[2] -= {-1, -1};\n    paint.setColor(SK_ColorRED);\n    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "86c0399704d8dff4091bf87b8d87d40b",
+    "file": "SkPoint_Reference",
+    "name": "SkPoint::operator-=(const SkVector& v)"
+},
+    "SkPreMultiplyARGB": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPMColor premultiplied = SkPreMultiplyARGB(160, 128, 160, 192);\n    canvas->drawString(\"Unpremultiplied:\", 20, 20, SkPaint());\n    canvas->drawString(\"alpha=160 red=128 green=160 blue=192\", 20, 40, SkPaint());\n    canvas->drawString(\"Premultiplied:\", 20, 80, SkPaint());\n    std::string str = \"alpha=\" + std::to_string(SkColorGetA(premultiplied));\n    str += \" red=\" + std::to_string(SkColorGetR(premultiplied));\n    str += \" green=\" + std::to_string(SkColorGetG(premultiplied));\n    str += \" blue=\" + std::to_string(SkColorGetB(premultiplied));\n    canvas->drawString(str.c_str(), 20, 100, SkPaint());\n}",
+    "width": 300,
+    "height": 128,
+    "hash": "756345484fd48ca0ea7b6cec350f73b8",
+    "file": "SkColor_Reference",
+    "name": "SkPreMultiplyARGB"
+},
+    "SkPreMultiplyColor": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkColor unpremultiplied = SkColorSetARGB(160, 128, 160, 192);\n    SkPMColor premultiplied = SkPreMultiplyColor(unpremultiplied);\n    canvas->drawString(\"Unpremultiplied:\", 20, 20, SkPaint());\n    std::string str = \"alpha=\" + std::to_string(SkColorGetA(unpremultiplied));\n    str += \" red=\" + std::to_string(SkColorGetR(unpremultiplied));\n    str += \" green=\" + std::to_string(SkColorGetG(unpremultiplied));\n    str += \" blue=\" + std::to_string(SkColorGetB(unpremultiplied));\n    canvas->drawString(str.c_str(), 20, 40, SkPaint());\n    canvas->drawString(\"Premultiplied:\", 20, 80, SkPaint());\n    str = \"alpha=\" + std::to_string(SkColorGetA(premultiplied));\n    str += \" red=\" + std::to_string(SkColorGetR(premultiplied));\n    str += \" green=\" + std::to_string(SkColorGetG(premultiplied));\n    str += \" blue=\" + std::to_string(SkColorGetB(premultiplied));\n    canvas->drawString(str.c_str(), 20, 100, SkPaint());\n}",
+    "width": 300,
+    "height": 128,
+    "hash": "0bcc0f86a2aefc899f3500503dce6968",
+    "file": "SkColor_Reference",
+    "name": "SkPreMultiplyColor"
+},
+    "SkRGBToHSV": {
+    "code": "void draw(SkCanvas* canvas) {\n    canvas->drawBitmap(source, 0, 0);\n    SkPaint bgPaint;\n    bgPaint.setColor(0xafffffff);\n    canvas->drawRect({20, 30, 110, 90}, bgPaint);\n    SkScalar hsv[3];\n    SkColor c = source.getColor(226, 128);\n    SkRGBToHSV(SkColorGetR(c), SkColorGetG(c), SkColorGetB(c), hsv);\n    canvas->drawString((\"h: \" + std::to_string(hsv[0]).substr(0, 6)).c_str(), 27, 45, SkPaint());\n    canvas->drawString((\"s: \" + std::to_string(hsv[1]).substr(0, 6)).c_str(), 27, 65, SkPaint());\n    canvas->drawString((\"v: \" + std::to_string(hsv[2]).substr(0, 6)).c_str(), 27, 85, SkPaint());\n    canvas->drawLine(110, 90, 226, 128, SkPaint());\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "4fb2da4a3d9b14ca4ac24eefb0f5126a",
+    "file": "SkColor_Reference",
+    "name": "SkRGBToHSV"
+},
+    "SkRRect_Corner": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkRRect rrect;\n    SkVector corners[] = {{25, 17}, {17, 19}, {19, 15}, {15, 15}};\n    rrect.setRectRadii({30, 10, 100, 60}, corners);\n    canvas->drawRRect(rrect, paint);\n    paint.setColor(SK_ColorWHITE);\n    const SkRect r = rrect.getBounds();\n    canvas->drawLine(r.fLeft, r.fTop + rrect.radii(SkRRect::kUpperLeft_Corner).fY,\n                     r.fRight, r.fTop + rrect.radii(SkRRect::kUpperRight_Corner).fY, paint);\n    canvas->drawLine(r.fLeft, r.fBottom - rrect.radii(SkRRect::kLowerLeft_Corner).fY,\n                     r.fRight, r.fBottom - rrect.radii(SkRRect::kLowerRight_Corner).fY, paint);\n    canvas->drawLine(r.fLeft + rrect.radii(SkRRect::kUpperLeft_Corner).fX, r.fTop,\n                     r.fLeft + rrect.radii(SkRRect::kLowerLeft_Corner).fX, r.fBottom, paint);\n    canvas->drawLine(r.fRight - rrect.radii(SkRRect::kUpperRight_Corner).fX, r.fTop,\n                     r.fRight - rrect.radii(SkRRect::kLowerRight_Corner).fX, r.fBottom, paint);\n}",
+    "width": 256,
+    "height": 70,
+    "hash": "9205393f30b156e1507e88aa27f1dd91",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::Corner"
+},
+    "SkRRect_MakeEmpty": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect rrect = SkRRect::MakeEmpty();\n    SkRRect rrect2(rrect);\n    rrect2.inset(-20, -20);\n    SkPaint p;\n    p.setStyle(SkPaint::kStroke_Style);\n    p.setStrokeWidth(10);\n    std::string str(\"Type \");\n    str += SkRRect::kEmpty_Type == rrect2.type() ? \"=\" : \"!\"; \n    str += \"= SkRRect::kEmpty_Type\";\n    canvas->drawString(str.c_str(), 20, 80, SkPaint());\n    canvas->drawRRect(rrect2, p);\n}",
+    "width": 256,
+    "height": 90,
+    "hash": "c6c6be3b3c137226adbb5b5af9203d27",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::MakeEmpty"
+},
+    "SkRRect_MakeOval": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkRRect rrect = SkRRect::MakeOval({30, 10, 100, 60});\n    canvas->drawRRect(rrect, paint);\n    rrect.setRect(rrect.getBounds());\n    paint.setColor(SK_ColorBLUE);\n    paint.setBlendMode(SkBlendMode::kDifference);\n    canvas->drawRRect(rrect, paint);\n}",
+    "width": 256,
+    "height": 70,
+    "hash": "0b99ee38fd154f769f6031242e02fa7a",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::MakeOval"
+},
+    "SkRRect_MakeRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60});\n    canvas->drawRRect(rrect, paint);\n    rrect.setOval(rrect.getBounds());\n    paint.setColor(SK_ColorBLUE);\n    canvas->drawRRect(rrect, paint);\n}",
+    "width": 256,
+    "height": 70,
+    "hash": "5295b07fe4d2cdcd077979a9e19854d9",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::MakeRect"
+},
+    "SkRRect_MakeRectXY": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 20, 20);\n    canvas->drawRRect(rrect, paint);\n    rrect.setRect(rrect.getBounds());\n    paint.setColor(SK_ColorBLUE);\n    paint.setBlendMode(SkBlendMode::kModulate);\n    canvas->drawRRect(rrect, paint);\n}",
+    "width": 256,
+    "height": 70,
+    "hash": "2b24a1247637cbc94f8b3c77d37ed3e2",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::MakeRectXY"
+},
+    "SkRRect_Type": {
+    "code": "void draw(SkCanvas* canvas) {\n    struct Radii { SkVector data[4]; };\n    auto drawRRectType = [=](const SkRect& rect, const Radii& radii) {\n        SkRRect rrect;\n        rrect.setRectRadii(rect, radii.data);\n        SkPaint paint;\n        paint.setAntiAlias(true);\n        const char* typeStr[] = { \"empty\", \"rect\", \"oval\", \"simple\", \"nine patch\", \"complex\" };\n        canvas->drawString(typeStr[(int) rrect.type()], rect.centerX(), rect.bottom() + 20, paint);\n        paint.setStyle(SkPaint::kStroke_Style);       \n        canvas->drawRRect(rrect, paint);\n    };\n    drawRRectType({ 45,  30,  45,  30}, {{{ 5,  5}, { 5,  5}, { 5,  5}, { 5,  5}}});\n    drawRRectType({ 90,  10, 140,  30}, {{{ 0,  0}, { 0,  0}, { 0,  0}, { 0,  0}}});\n    drawRRectType({160,  10, 210,  30}, {{{25, 10}, {25, 10}, {25, 10}, {25, 10}}});\n    drawRRectType({ 20,  80,  70, 100}, {{{ 5,  5}, { 5,  5}, { 5,  5}, { 5,  5}}});\n    drawRRectType({ 90,  80, 140, 100}, {{{ 5,  5}, {10,  5}, {10,  5}, { 5,  5}}});\n    drawRRectType({160,  80, 210, 100}, {{{ 5,  5}, {10,  5}, { 5,  5}, { 5,  5}}});\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "a4233634c75b72fc7a2815ddb69bd669",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::Type"
+},
+    "SkRRect_contains": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRect test = {10, 10, 110, 80};\n    SkRRect rrect = SkRRect::MakeRect(test);\n    SkRRect oval = SkRRect::MakeOval(test);\n    test.inset(10, 10);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    canvas->drawString(rrect.contains(test) ? \"contains\" : \"does not contain\", 55, 100, paint);\n    canvas->drawString(oval.contains(test) ? \"contains\" : \"does not contain\", 185, 100, paint);    \n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawRRect(rrect, paint);\n    canvas->drawRect(test, paint);\n    canvas->translate(120, 0);\n    canvas->drawRRect(oval, paint);\n    canvas->drawRect(test, paint);\n}",
+    "width": 256,
+    "height": 110,
+    "hash": "0bb057140e4119234bdd2e8dd2f0fa19",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::contains()"
+},
+    "SkRRect_copy_const_SkRRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect rrect = SkRRect::MakeRect({10, 10, 100, 50});\n    SkRRect rrect2(rrect);\n    rrect2.inset(20, 20);\n    SkPaint p;\n    p.setStyle(SkPaint::kStroke_Style);\n    p.setStrokeWidth(10);\n    canvas->drawRRect(rrect, p);\n    canvas->drawRRect(rrect2, p);\n}",
+    "width": 256,
+    "height": 60,
+    "hash": "ad8f5d49edfcee60eddfe2a955b6c5f5",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::SkRRect(const SkRRect& rrect)"
+},
+    "SkRRect_copy_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect rrect = SkRRect::MakeRect({40, 40, 100, 70});\n    SkRRect rrect2 = rrect;\n    rrect2.inset(-20, -20);\n    SkPaint p;\n    p.setStyle(SkPaint::kStroke_Style);\n    p.setStrokeWidth(10);\n    canvas->drawRRect(rrect, p);\n    canvas->drawRRect(rrect2, p);\n}",
+    "width": 256,
+    "height": 110,
+    "hash": "52926c98c1cca00606d3ea99f23fea3d",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::operator=(const SkRRect& rrect)"
+},
+    "SkRRect_empty_constructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect rrect;\n    SkPaint p;\n    p.setStyle(SkPaint::kStroke_Style);\n    p.setStrokeWidth(10);\n    canvas->drawRRect(rrect, p);\n    rrect.setRect({10, 10, 100, 50});\n    canvas->drawRRect(rrect, p);\n}",
+    "width": 256,
+    "height": 60,
+    "hash": "471e7aad0feaf9ec3a21757a317a64f5",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::SkRRect()"
+},
+    "SkRRect_equal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect rrect1 = SkRRect::MakeRectXY({10, 20, 60, 220}, 50, 200);\n    SkRRect rrect2 = SkRRect::MakeRectXY(rrect1.rect(), 25, 100);\n    SkRRect rrect3 = SkRRect::MakeOval(rrect1.rect());\n    canvas->drawRRect(rrect1, SkPaint());\n    std::string str = \"rrect1 \" + std::string(rrect1 == rrect2 ? \"=\" : \"!\") + \"= rrect2\";\n    canvas->drawString(str.c_str(), 10, 240, SkPaint());\n    canvas->translate(70, 0);\n    canvas->drawRRect(rrect2, SkPaint());\n    canvas->translate(70, 0);\n    canvas->drawRRect(rrect3, SkPaint());\n    str = \"rrect2 \" + std::string(rrect2 == rrect3 ? \"=\" : \"!\") + \"= rrect3\";\n    canvas->drawString(str.c_str(), -20, 240, SkPaint());\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "df181af37f1d2b06f0f45af73df7b47d",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::operator==(const SkRRect& a, const SkRRect& b)"
+},
+    "SkRRect_getBounds": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkRRect rrect = SkRRect::MakeRectXY({20, 20, 220, 100}, 15, 15);\n    canvas->drawRRect(rrect, paint);\n    paint.setColor(SK_ColorWHITE);\n    rrect = SkRRect::MakeOval(rrect.getBounds());\n    canvas->drawRRect(rrect, paint);\n}",
+    "width": 256,
+    "height": 120,
+    "hash": "4577e2dcb086b241bb43d8b89ee0b0dd",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::getBounds"
+},
+    "SkRRect_getSimpleRadii": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto drawDetails = [=](const SkRRect& rrect) {\n        SkPaint paint;\n        paint.setAntiAlias(true);\n        paint.setTextSize(12);\n        canvas->drawRRect(rrect, paint);\n        SkVector corner = rrect.getSimpleRadii();\n        std::string label = \"corner: \" + std::to_string(corner.fX).substr(0, 3) + \", \" +\n                        std::to_string(corner.fY).substr(0, 3);\n        canvas->drawString(label.c_str(), 64, 90, paint);\n        canvas->translate(128, 0);\n    };\n    SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60});\n    drawDetails(rrect);\n    rrect.setRectXY(rrect.getBounds(), 5, 8);\n    drawDetails(rrect);\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "81345f7619a072bb2b0cf59810fe86d0",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::getSimpleRadii"
+},
+    "SkRRect_getType": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect rrect = SkRRect::MakeRect({10, 10, 100, 50});\n    SkRRect rrect2(rrect);\n    rrect2.inset(20, 20);\n    SkPaint p;\n    p.setStyle(SkPaint::kStroke_Style);\n    p.setStrokeWidth(10);\n    std::string str(\"Type \");\n    str += SkRRect::kRect_Type == rrect2.getType() ? \"=\" : \"!\"; \n    str += \"= SkRRect::kRect_Type\";\n    canvas->drawString(str.c_str(), 20, 80, SkPaint());\n    canvas->drawRRect(rrect2, p);\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "ace8f4aebf90527d43e4b7291375c9ad",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::getType"
+},
+    "SkRRect_inset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100);\n    for (int index = 0; index < 25; ++index) {\n       canvas->drawRRect(rrect, paint);\n       rrect.inset(-3, 3, &rrect);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "f02f0110d5605dac6d14dcb8d1d8cb6e",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::inset()"
+},
+    "SkRRect_inset_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkRRect rrect = SkRRect::MakeRectXY({10, 20, 180, 220}, 50, 100);\n    for (int index = 0; index < 25; ++index) {\n       canvas->drawRRect(rrect, paint);\n       rrect.inset(3, 3);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "da61054322550a2d5ac15114da23bd23",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::inset_2"
+},
+    "SkRRect_isComplex": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(16);\n    SkVector radii[] = {{25, 30}, {40, 30}, {40, 30}, {20, 30}};\n    SkRRect rrect;\n    rrect.setRectRadii({30, 10, 100, 60}, radii);\n    canvas->drawRRect(rrect, paint);\n    canvas->drawString(rrect.isComplex() ? \"complex\" : \"not complex\", 64, 90, paint);\n    radii[0].fX = 20;\n    rrect.setRectRadii(rrect.getBounds(), radii);\n    canvas->translate(128, 0);\n    canvas->drawRRect(rrect, paint);\n    canvas->drawString(rrect.isComplex() ? \"complex\" : \"not complex\", 64, 90, paint);\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "b62c183dc435d1fc091111fb2f3c3f8e",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::isComplex"
+},
+    "SkRRect_isEmpty": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(16);\n    SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 10, 5);\n    canvas->drawRRect(rrect, paint);\n    canvas->drawString(rrect.isEmpty() ? \"empty\" : \"not empty\", 64, 90, paint);\n    rrect.inset(40, 0);\n    canvas->translate(128, 0);\n    canvas->drawRRect(rrect, paint);\n    canvas->drawString(rrect.isEmpty() ? \"empty\" : \"not empty\", 64, 90, paint);\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "099d79ecfbdfb0a19c10deb7201859c3",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::isEmpty"
+},
+    "SkRRect_isNinePatch": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(16);\n    SkVector radii[] = {{20, 30}, {40, 30}, {40, 30}, {20, 30}};\n    SkRRect rrect;\n    rrect.setRectRadii({30, 10, 100, 60}, radii);\n    canvas->drawRRect(rrect, paint);\n    canvas->drawString(rrect.isNinePatch() ? \"9 patch\" : \"not 9 patch\", 64, 90, paint);\n    radii[0].fX = 35;\n    rrect.setRectRadii(rrect.getBounds(), radii);\n    canvas->translate(128, 0);\n    canvas->drawRRect(rrect, paint);\n    canvas->drawString(rrect.isNinePatch() ? \"9 patch\" : \"not 9 patch\", 64, 90, paint);\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "429f6dfd4cf6287df3c3c77fa7681c99",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::isNinePatch"
+},
+    "SkRRect_isOval": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(16);\n    SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 40, 30);\n    canvas->drawRRect(rrect, paint);\n    canvas->drawString(rrect.isOval() ? \"oval\" : \"not oval\", 64, 90, paint);\n    rrect.setRectXY(rrect.getBounds(), 35, 25);\n    canvas->translate(128, 0);\n    canvas->drawRRect(rrect, paint);\n    canvas->drawString(rrect.isOval() ? \"oval\" : \"not oval\", 64, 90, paint);\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "4dfdb28d8343958425f2c1323fe8170d",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::isOval"
+},
+    "SkRRect_isRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(16);\n    SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60});\n    canvas->drawRRect(rrect, paint);\n    canvas->drawString(rrect.isRect() ? \"rect\" : \"not rect\", 64, 90, paint);\n    SkVector radii[] = {{10, 10}, {0, 0}, {0, 0}, {0, 0}};\n    rrect.setRectRadii(rrect.getBounds(), radii);\n    canvas->translate(128, 0);\n    canvas->drawRRect(rrect, paint);\n    canvas->drawString(rrect.isRect() ? \"rect\" : \"not rect\", 64, 90, paint);\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "bc931c9a6eb8ffe7ea8d3fb47e07a475",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::isRect"
+},
+    "SkRRect_isSimple": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setTextSize(16);\n    SkVector radii[] = {{40, 30}, {40, 30}, {40, 30}, {40, 30}};\n    SkRRect rrect;\n    rrect.setRectRadii({30, 10, 100, 60}, radii);\n    canvas->drawRRect(rrect, paint);\n    canvas->drawString(rrect.isSimple() ? \"simple\" : \"not simple\", 64, 90, paint);\n    radii[0].fX = 35;\n    rrect.setRectRadii(rrect.getBounds(), radii);\n    canvas->translate(128, 0);\n    canvas->drawRRect(rrect, paint);\n    canvas->drawString(rrect.isSimple() ? \"simple\" : \"not simple\", 64, 90, paint);\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "f6959ea422a7c6e98ddfad216a52c707",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::isSimple"
+},
+    "SkRRect_isValid": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect rrect = SkRRect::MakeRect({10, 10, 110, 80});\n    SkRRect corrupt = rrect;\n    *((float*) &corrupt) = 120;\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    canvas->drawString(rrect.isValid() ? \"is valid\" : \"is corrupted\", 55, 100, paint);\n    canvas->drawString(corrupt.isValid() ? \"is valid\" : \"is corrupted\", 185, 100, paint);    \n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawRRect(rrect, paint);\n    canvas->translate(120, 0);\n    canvas->drawRRect(corrupt, paint);\n}",
+    "width": 256,
+    "height": 110,
+    "hash": "8cc1f21c98c0416f7724ad218f557a00",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::isValid"
+},
+    "SkRRect_makeOffset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100);\n    for (int index = 0; index < 25; ++index) {\n       canvas->drawRRect(rrect, paint);\n       rrect = rrect.makeOffset(-3, 3);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "c433aa41eaf5e419e3349fb970a08151",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::makeOffset"
+},
+    "SkRRect_notequal_operator": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect rrect1 = SkRRect::MakeRectXY({10, 20, 60, 220}, 50, 100);\n    SkRRect rrect2 = SkRRect::MakeRectXY(rrect1.rect(), 50, 50);\n    SkRRect rrect3 = SkRRect::MakeOval(rrect1.rect());\n    canvas->drawRRect(rrect1, SkPaint());\n    std::string str = \"rrect1 \" + std::string(rrect1 == rrect2 ? \"=\" : \"!\") + \"= rrect2\";\n    canvas->drawString(str.c_str(), 10, 240, SkPaint());\n    canvas->translate(70, 0);\n    canvas->drawRRect(rrect2, SkPaint());\n    canvas->translate(70, 0);\n    canvas->drawRRect(rrect3, SkPaint());\n    str = \"rrect2 \" + std::string(rrect2 == rrect3 ? \"=\" : \"!\") + \"= rrect3\";\n    canvas->drawString(str.c_str(), -20, 240, SkPaint());\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "505e47b3e6474ebdecdc04c3c2af2c34",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::operator!=(const SkRRect& a, const SkRRect& b)"
+},
+    "SkRRect_offset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100);\n    for (int index = 0; index < 25; ++index) {\n       canvas->drawRRect(rrect, paint);\n       rrect.offset(3, 3);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "a45cdd46ef2fe0df62d84d41713e82e2",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::offset()"
+},
+    "SkRRect_outset": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100);\n    for (int index = 0; index < 25; ++index) {\n       canvas->drawRRect(rrect, paint);\n       rrect.outset(-3, 3, &rrect);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "4d69b6d9c7726c47c42827d79fc7899c",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::outset()"
+},
+    "SkRRect_outset_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    paint.setStyle(SkPaint::kStroke_Style);\n    SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100);\n    for (int index = 0; index < 25; ++index) {\n       canvas->drawRRect(rrect, paint);\n       rrect.outset(3, 3);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "4391cced86653dcd0f84439a5c0bb3f2",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::outset_2"
+},
+    "SkRRect_readFromMemory": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkVector radii[] = {{5, 5},  {10, 10}, {15, 15}, {5, 5}};\n    SkRRect rrect;\n    rrect.setRectRadii({10, 10, 110, 80}, radii);\n    char storage[SkRRect::kSizeInMemory];\n    rrect.writeToMemory(storage);\n    SkRRect copy;\n    copy.readFromMemory(storage, sizeof(storage));\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    canvas->drawString(\"rrect\", 55, 100, paint);\n    canvas->drawString(\"copy\", 185, 100, paint);    \n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawRRect(rrect, paint);\n    canvas->translate(120, 0);\n    canvas->drawRRect(copy, paint);\n}",
+    "width": 256,
+    "height": 110,
+    "hash": "50969745cf2b23544362f4cff5592b75",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::readFromMemory"
+},
+    "SkRRect_setEmpty": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60});\n    canvas->drawRRect(rrect, paint);\n    rrect.setEmpty();\n    paint.setColor(SK_ColorBLUE);\n    canvas->drawRRect(rrect, paint);\n}",
+    "width": 256,
+    "height": 80,
+    "hash": "44e9a9c2c5ef1af2a616086ff46a9037",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::setEmpty"
+},
+    "SkRRect_setNinePatch": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    SkRRect rrect;\n    rrect.setNinePatch({30, 10, 100, 60}, 10, 20, 20, 10);\n    canvas->drawRRect(rrect, paint);\n    paint.setColor(SK_ColorWHITE);\n    const SkRect r = rrect.getBounds();\n    canvas->drawLine(r.fLeft, r.fTop + rrect.radii(SkRRect::kUpperLeft_Corner).fY,\n                     r.fRight, r.fTop + rrect.radii(SkRRect::kUpperRight_Corner).fY, paint);\n    canvas->drawLine(r.fLeft, r.fBottom - rrect.radii(SkRRect::kLowerLeft_Corner).fY,\n                     r.fRight, r.fBottom - rrect.radii(SkRRect::kLowerRight_Corner).fY, paint);\n    canvas->drawLine(r.fLeft + rrect.radii(SkRRect::kUpperLeft_Corner).fX, r.fTop,\n                     r.fLeft + rrect.radii(SkRRect::kLowerLeft_Corner).fX, r.fBottom, paint);\n    canvas->drawLine(r.fRight - rrect.radii(SkRRect::kUpperRight_Corner).fX, r.fTop,\n                     r.fRight - rrect.radii(SkRRect::kLowerRight_Corner).fX, r.fBottom, paint);\n}",
+    "width": 256,
+    "height": 70,
+    "hash": "c4620df2eaba447b581688d3100053b1",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::setNinePatch"
+},
+    "SkRRect_setOval": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 20, 20);\n    canvas->drawRRect(rrect, paint);\n    rrect.setOval(rrect.getBounds());\n    paint.setColor(SK_ColorWHITE);\n    paint.setBlendMode(SkBlendMode::kExclusion);\n    canvas->drawRRect(rrect, paint);\n}",
+    "width": 256,
+    "height": 70,
+    "hash": "cf418af29cbab6243ac16aacd1217ffe",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::setOval"
+},
+    "SkRRect_setRect": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60});\n    canvas->drawRRect(rrect, paint);\n    rrect.setRect({60, 30, 120, 80});\n    paint.setColor(SK_ColorBLUE);\n    canvas->drawRRect(rrect, paint);\n}",
+    "width": 256,
+    "height": 90,
+    "hash": "3afc3ac9bebd1d7387822cc608571e82",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::setRect"
+},
+    "SkRRect_setRectRadii": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setStrokeWidth(15);\n    paint.setStrokeCap(SkPaint::kSquare_Cap);\n    paint.setAntiAlias(true);\n    float intervals[] = { 5, 21.75f };\n    paint.setStyle(SkPaint::kStroke_Style);\n    paint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 0));\n    SkPath path;\n    SkRRect rrect;\n    SkVector corners[] = {{15, 17}, {17, 19}, {19, 15}, {15, 15}};\n    rrect.setRectRadii({20, 20, 100, 100}, corners);\n    path.addRRect(rrect, SkPath::kCW_Direction);\n    canvas->drawPath(path, paint);\n    path.rewind();\n    path.addRRect(rrect, SkPath::kCCW_Direction, 1);\n    canvas->translate(120, 0);\n    canvas->drawPath(path, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "340d6c51efaa1f7f3d0dcaf8b0e90696",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::setRectRadii"
+},
+    "SkRRect_setRectXY": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 20, 20);\n    canvas->drawRRect(rrect, paint);\n    rrect.setRectXY(rrect.getBounds(), 5, 5);\n    paint.setColor(SK_ColorWHITE);\n    paint.setBlendMode(SkBlendMode::kExclusion);\n    canvas->drawRRect(rrect, paint);\n}",
+    "width": 256,
+    "height": 70,
+    "hash": "6ac569e40fb68c758319e85428b9ae95",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::setRectXY"
+},
+    "SkRRect_transform": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkVector radii[] = {{5, 5},  {10, 10}, {15, 15}, {5, 5}};\n    SkRRect rrect;\n    rrect.setRectRadii({10, 10, 110, 80}, radii);\n    SkRRect transformed;\n    SkMatrix matrix = SkMatrix::MakeRectToRect(rrect.rect(), {140, 30, 220, 80},\n                                               SkMatrix::kCenter_ScaleToFit);\n    bool success = rrect.transform(matrix, &transformed);\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    canvas->drawString(\"rrect\", 55, 100, paint);\n    canvas->drawString(success ? \"transformed\" : \"transform failed\", 185, 100, paint);    \n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawRRect(rrect, paint);\n    canvas->drawRRect(transformed, paint);\n}",
+    "width": 256,
+    "height": 110,
+    "hash": "68a5d24f22e2d798608fce8a20e47fd0",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::transform()"
+},
+    "SkRRect_type": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect rrect = SkRRect::MakeRect({10, 10, 100, 50});\n    SkRRect rrect2(rrect);\n    rrect2.inset(20, 20);\n    SkPaint p;\n    p.setStyle(SkPaint::kStroke_Style);\n    p.setStrokeWidth(10);\n    std::string str(\"Type \");\n    str += SkRRect::kEmpty_Type == rrect2.type() ? \"=\" : \"!\"; \n    str += \"= SkRRect::kEmpty_Type\";\n    canvas->drawString(str.c_str(), 20, 80, SkPaint());\n    canvas->drawRRect(rrect2, p);\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "1080805c8449406a4e26d694bc56d2dc",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::type()"
+},
+    "SkRRect_writeToMemory": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRRect rrect = SkRRect::MakeRect({10, 10, 110, 80});\n    char storage[SkRRect::kSizeInMemory];\n    rrect.writeToMemory(storage);\n    SkRRect copy;\n    copy.readFromMemory(storage, sizeof(storage));\n    SkPaint paint;\n    paint.setAntiAlias(true);\n    canvas->drawString(\"rrect\", 55, 100, paint);\n    canvas->drawString(\"copy\", 185, 100, paint);    \n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawRRect(rrect, paint);\n    canvas->translate(120, 0);\n    canvas->drawRRect(copy, paint);\n}",
+    "width": 256,
+    "height": 110,
+    "hash": "d6f5a3d21727ddc15e10ef4d5103ff91",
+    "file": "SkRRect_Reference",
+    "name": "SkRRect::writeToMemory"
+},
+    "SkRegion_Op": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion operand({35, 35, 85, 85});\n    const char* labels[] = {\"difference\", \"intersect\", \"union\", \"xor\", \"reverse diff\", \"replace\"};\n    int index = 0;\n    SkPaint paint;\n    for (auto op : { SkRegion::kDifference_Op, SkRegion::kIntersect_Op, SkRegion::kUnion_Op,\n                     SkRegion::kXOR_Op, SkRegion::kReverseDifference_Op, SkRegion::kReplace_Op } ) {\n        SkRegion target({10, 10, 60, 60});\n        target.op(operand, op);\n        canvas->drawRegion(target, paint);\n        canvas->drawString(labels[index++], 40, 100, paint);\n        canvas->translate(80, 0);\n        if (SkRegion::kUnion_Op == op) {\n            canvas->translate(-240, 120);\n        }\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "026dd8b180fe8e43f477fce43e9217b3",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::Op"
+},
+    "SkRegion_contains": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath xPath;\n    paint.getTextPath(\"X\", 1, 20, 110, &xPath);\n    SkRegion xRegion;\n    xRegion.setPath(xPath, SkRegion({0, 0, 256, 256}));\n    canvas->drawRegion(xRegion, paint);\n    for (int y = 0; y < 128; y += 8) {\n        for (int x = 0; x < 128; x += 8) {\n           paint.setColor(xRegion.contains(x, y) ? SK_ColorWHITE : SK_ColorRED);\n           canvas->drawPoint(x, y, paint);\n        }\n    }\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "e3899c2715c332bfc7648d5f2b9eefc6",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::contains()"
+},
+    "SkRegion_contains_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath xPath;\n    paint.getTextPath(\"X\", 1, 20, 110, &xPath);\n    SkRegion xRegion;\n    SkIRect drawBounds = {0, 0, 128, 128};\n    xRegion.setPath(xPath, SkRegion(drawBounds));\n    xRegion.op(drawBounds, SkRegion::kReverseDifference_Op);\n    canvas->drawRegion(xRegion, paint);\n    SkIRect test = SkIRect::MakeXYWH(frame* 128, 64, 5, 5);\n    if (xRegion.contains(test)) {\n        paint.setColor(SK_ColorYELLOW);\n        canvas->drawRect(SkRect::Make(test), paint);\n    }\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "100b4cbd5dd7406804e40035833a433c",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::contains_2"
+},
+    "SkRegion_contains_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath xPath, testPath;\n    paint.getTextPath(\"X\", 1, 20, 110, &xPath);\n    paint.getTextPath(\"`\", 1, frame * 150 - 40, 150, &testPath);\n    SkRegion xRegion, testRegion;\n    SkIRect drawBounds = {0, 0, 128, 128};\n    xRegion.setPath(xPath, SkRegion(drawBounds));\n    testRegion.setPath(testPath, SkRegion(drawBounds));\n    xRegion.op(drawBounds, SkRegion::kReverseDifference_Op);\n    canvas->drawRegion(xRegion, paint);\n    if (xRegion.contains(testRegion)) {\n        paint.setColor(SK_ColorYELLOW);\n        canvas->drawRegion(testRegion, paint);\n    }\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "46de22da2f3e08a8d7f064634fc1c7b5",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::contains_3"
+},
+    "SkRegion_getBoundaryPath": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region;\n    region.setRect({10, 20, 90, 60});\n    region.op({30, 40, 60, 80}, SkRegion::kXOR_Op);\n    canvas->drawRegion(region, SkPaint());\n    SkPath path;\n    region.getBoundaryPath(&path);\n    path.offset(100, 0);\n    canvas->drawPath(path, SkPaint());\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "6631d36406efa3b3e27960c876421a7f",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::getBoundaryPath"
+},
+    "SkRegion_intersects": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath textPath;\n    paint.getTextPath(\"W\", 1, 20, 110, &textPath);\n    SkRegion region;\n    region.setPath(textPath, SkRegion({0, 0, 256, 256}));\n    canvas->drawRegion(region, SkPaint());\n    SkIRect iRect = SkIRect::MakeXYWH(frame * 160, 55, 10, 10);\n    paint.setColor(region.intersects(iRect) ? SK_ColorBLUE : SK_ColorRED);\n    canvas->drawRect(SkRect::Make(iRect), paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "42bde0ef8c2ee372751428cd6e21c1ca",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::intersects()"
+},
+    "SkRegion_intersects_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath hPath, dotPath;\n    paint.getTextPath(\"H\", 1, 40, 110, &hPath);\n    paint.getTextPath(\",\", 1, frame * 180, 95, &dotPath);\n    SkRegion hRegion, dotRegion;\n    hRegion.setPath(hPath, SkRegion({0, 0, 256, 256}));\n    dotRegion.setPath(dotPath, SkRegion({0, 0, 256, 256}));\n    canvas->drawRegion(hRegion, paint);\n    paint.setColor(hRegion.intersects(dotRegion) ? SK_ColorBLUE : SK_ColorRED);\n    canvas->drawRegion(dotRegion, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "4263d79ac0e7df02e90948fdde9fa965",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::intersects_2"
+},
+    "SkRegion_op": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath xPath;\n    paint.getTextPath(\"X\", 1, 20, 110, &xPath);\n    SkRegion xRegion;\n    SkIRect drawBounds = {0, 0, 128, 128};\n    xRegion.setPath(xPath, SkRegion(drawBounds));\n    xRegion.op(drawBounds, SkRegion::kReverseDifference_Op);\n    canvas->drawRegion(xRegion, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "1790b2e054c536a54601138365700ac3",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::op()"
+},
+    "SkRegion_op_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath xPath;\n    paint.getTextPath(\"X\", 1, 20, 110, &xPath);\n    SkRegion xRegion;\n    SkIRect drawBounds = {0, 0, 128, 128};\n    xRegion.setPath(xPath, SkRegion(drawBounds));\n    xRegion.op(drawBounds.fLeft + frame * drawBounds.width(), drawBounds.fTop,\n               drawBounds.fRight, drawBounds.fBottom, SkRegion::kReverseDifference_Op);\n    canvas->drawRegion(xRegion, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "2e3497890d523235f96680716c321098",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::op_2"
+},
+    "SkRegion_op_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath xPath, opPath;\n    paint.getTextPath(\"X\", 1, 20, 110, &xPath);\n    opPath.addCircle(64, 64, frame * 64);\n    SkRegion xRegion, opRegion;\n    SkIRect drawBounds = {0, 0, 128, 128};\n    opRegion.setPath(opPath, SkRegion(drawBounds));\n    xRegion.setPath(xPath, SkRegion(drawBounds));\n    xRegion.op(opRegion, SkRegion::kReverseDifference_Op);\n    canvas->drawRegion(xRegion, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "65f4eccea3514ed7e37b5067e15efddb",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::op_3"
+},
+    "SkRegion_op_4": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath xPath, opPath;\n    paint.getTextPath(\"X\", 1, 20, 110, &xPath);\n    opPath.addCircle(64, 64, frame * 64);\n    SkRegion xRegion, opRegion, rectRegion;\n    SkIRect drawBounds = {0, 0, 128, 128};\n    opRegion.setPath(opPath, SkRegion(drawBounds));\n    xRegion.setPath(xPath, SkRegion(drawBounds));\n    drawBounds.inset(frame * drawBounds.width() / 2, 0);    \n    rectRegion.op(drawBounds, opRegion, SkRegion::kIntersect_Op);\n    xRegion.op(rectRegion, SkRegion::kReverseDifference_Op);\n    canvas->drawRegion(xRegion, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "3f964be1e1fd2fbb977b655d3a928f0a",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::op_4"
+},
+    "SkRegion_op_5": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath xPath, opPath;\n    paint.getTextPath(\"X\", 1, 20, 110, &xPath);\n    opPath.addCircle(64, 64, frame * 64);\n    SkRegion xRegion, opRegion, rectRegion;\n    SkIRect drawBounds = {0, 0, 128, 128};\n    opRegion.setPath(opPath, SkRegion(drawBounds));\n    xRegion.setPath(xPath, SkRegion(drawBounds));\n    drawBounds.inset(frame * drawBounds.width() / 2, 0);    \n    rectRegion.op(opRegion, drawBounds, SkRegion::kUnion_Op);\n    xRegion.op(rectRegion, SkRegion::kReverseDifference_Op);\n    canvas->drawRegion(xRegion, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "e623208dd44f0b24499ac5f1593d1b39",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::op_5"
+},
+    "SkRegion_op_6": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath xPath, opPath;\n    paint.getTextPath(\"X\", 1, 20, 110, &xPath);\n    xPath.setFillType(SkPath::kInverseWinding_FillType);\n    opPath.addCircle(64, 64, frame * 64);\n    opPath.setFillType(SkPath::kInverseWinding_FillType);\n    SkRegion xRegion, opRegion, rectRegion;\n    SkIRect drawBounds = {0, 0, 128, 128};\n    opRegion.setPath(opPath, SkRegion(drawBounds));\n    xRegion.setPath(xPath, SkRegion(drawBounds));\n    drawBounds.inset(frame * drawBounds.width() / 2, 0);\n    rectRegion.setRect(drawBounds);    \n    rectRegion.op(xRegion, SkRegion::kIntersect_Op);\n    xRegion.op(rectRegion, opRegion, SkRegion::kReverseDifference_Op);\n    canvas->drawRegion(xRegion, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "13de1a6fcb2302a2a30278cb88d3e17d",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::op_6"
+},
+    "SkRegion_readFromMemory": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion region({20, 20, 80, 80});\n    size_t size = region.writeToMemory(nullptr);\n    sk_sp<SkData> data = SkData::MakeUninitialized(size);\n    region.writeToMemory(data->writable_data());\n    SkRegion copy;\n    copy.readFromMemory(data->data(), data->size());\n    canvas->drawRegion(copy, SkPaint());\n}",
+    "width": 256,
+    "height": 100,
+    "hash": "1ede346c430ef23df0eaaf0773dd6a15",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::readFromMemory"
+},
+    "SkRegion_setPath": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath textPath;\n    paint.getTextPath(\"Q\", 1, 0, 110, &textPath);\n    SkIRect clipRect = {20, 20, 100, 120};\n    SkRegion clipRegion(clipRect);\n    SkRegion region;\n    region.setPath(textPath, clipRegion);\n    canvas->drawRegion(region, SkPaint());\n    clipRect.offset(100, 0);\n    textPath.offset(100, 0);\n    canvas->clipRect(SkRect::Make(clipRect), false);\n    canvas->drawPath(textPath, SkPaint());\n}",
+    "width": 256,
+    "height": 120,
+    "hash": "45b9ea2247b9ca7f10aa22ea29a426f4",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::setPath"
+},
+    "SkRegion_setRects": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkIRect rects[] = { {10, 10, 40, 40}, {20, 20, 50, 50}, {30, 30, 60, 60} };\n    SkRegion region;\n    region.setRects(rects, SK_ARRAY_COUNT(rects));\n    canvas->drawRegion(region, SkPaint());\n    region.setEmpty();\n    for (auto add : rects) {\n        region.op(add, SkRegion::kUnion_Op);\n    }\n    region.translate(100, 0);\n    canvas->drawRegion(region, SkPaint());\n}",
+    "width": 256,
+    "height": 70,
+    "hash": "fc793a14ed76c096a68a755c963c1ee0",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::setRects"
+},
+    "SkRegion_translate": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion test;\n    SkIRect rects[] = {{40, 20, 50, 30}, {70, 40, 80, 50}, { 60, 10, 70, 20}};\n    test.setRects(rects, SK_ARRAY_COUNT(rects));\n    SkPaint paint;\n    for (auto color :  { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN, SK_ColorMAGENTA } ) {\n        paint.setColor(color);\n        canvas->drawRegion(test, paint);\n        test.translate(10, 10);\n    }\n}",
+    "width": 256,
+    "height": 90,
+    "hash": "4e5b9e53aa1b200fed3ee6596ca01f0e",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::translate()"
+},
+    "SkRegion_translate_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkRegion test;\n    SkIRect rects[] = {{40, 20, 50, 30}, {70, 40, 80, 50}, { 60, 10, 70, 20}};\n    test.setRects(rects, SK_ARRAY_COUNT(rects));\n    SkPaint paint;\n    for (auto color :  { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN, SK_ColorMAGENTA } ) {\n        paint.setColor(color);\n        canvas->drawRegion(test, paint);\n        SkRegion second;\n        test.translate(10, test.getBounds().fBottom, &second);\n        test.op(second, SkRegion::kXOR_Op);\n        test.translate(30, 0);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "024200960eb52fee1f471514607e6001",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::translate_2"
+},
+    "SkRegion_writeToMemory": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(128);\n    SkPath xPath;\n    paint.getTextPath(\"X\", 1, 20, 110, &xPath);\n    SkIRect drawBounds = {0, 0, 128, 128};\n    SkRegion xRegion;\n    xRegion.setPath(xPath, SkRegion(drawBounds));\n    size_t size = xRegion.writeToMemory(nullptr);\n    sk_sp<SkData> data = SkData::MakeUninitialized(size);\n    xRegion.writeToMemory(data->writable_data());\n    SkRegion copy;\n    copy.readFromMemory(data->data(), data->size());\n    canvas->drawRegion(copy, paint);\n}",
+    "width": 256,
+    "height": 128,
+    "hash": "1419d2a8c22c355ab46240865d056ee5",
+    "file": "SkRegion_Reference",
+    "name": "SkRegion::writeToMemory"
+},
+    "SkStream_MakeFromFile": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::MakeFromFile"
+},
+    "SkStream_destructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::~SkStream()"
+},
+    "SkStream_duplicate": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::duplicate()"
+},
+    "SkStream_empty_constructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::SkStream()"
+},
+    "SkStream_fork": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::fork()"
+},
+    "SkStream_getLength": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::getLength"
+},
+    "SkStream_getMemoryBase": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::getMemoryBase"
+},
+    "SkStream_getPosition": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::getPosition"
+},
+    "SkStream_hasLength": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::hasLength"
+},
+    "SkStream_hasPosition": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::hasPosition"
+},
+    "SkStream_isAtEnd": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::isAtEnd"
+},
+    "SkStream_move": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::move()"
+},
+    "SkStream_peek": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::peek()"
+},
+    "SkStream_read": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::read()"
+},
+    "SkStream_readBool": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::readBool"
+},
+    "SkStream_readPackedUInt": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::readPackedUInt"
+},
+    "SkStream_readS16": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::readS16"
+},
+    "SkStream_readS32": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::readS32"
+},
+    "SkStream_readS8": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::readS8"
+},
+    "SkStream_readScalar": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::readScalar"
+},
+    "SkStream_readU16": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::readU16"
+},
+    "SkStream_readU32": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::readU32"
+},
+    "SkStream_readU8": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::readU8"
+},
+    "SkStream_rewind": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::rewind()"
+},
+    "SkStream_seek": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::seek()"
+},
+    "SkStream_skip": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkStream_Reference",
+    "name": "SkStream::skip()"
+},
+    "SkSurface_MakeFromBackendTexture": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(32);\n    GrContext* context = canvas->getGrContext();\n    if (!context) {\n         canvas->drawString(\"GPU only!\", 20, 40, paint);\n         return;\n    }\n    sk_sp<SkSurface> gpuSurface = SkSurface::MakeFromBackendTexture(context,\n            backEndTexture, kTopLeft_GrSurfaceOrigin, 0,\n            kRGBA_8888_SkColorType, nullptr, nullptr);\n    auto surfaceCanvas = gpuSurface->getCanvas();\n    surfaceCanvas->drawString(\"GPU rocks!\", 20, 40, paint);\n    sk_sp<SkImage> image(gpuSurface->makeImageSnapshot());\n    canvas->drawImage(image, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "d3aec071998f871809f515e58abb1b0e",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::MakeFromBackendTexture"
+},
+    "SkSurface_MakeFromBackendTextureAsRenderTarget": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(32);\n    GrContext* context = canvas->getGrContext();\n    if (!context) {\n         canvas->drawString(\"GPU only!\", 20, 40, paint);\n         return;\n    }\n    sk_sp<SkSurface> gpuSurface = SkSurface::MakeFromBackendTextureAsRenderTarget(\n            context, backEndTexture, kTopLeft_GrSurfaceOrigin, 0,\n            kRGBA_8888_SkColorType, nullptr, nullptr);\n    auto surfaceCanvas = gpuSurface->getCanvas();\n    surfaceCanvas->drawString(\"GPU rocks!\", 20, 40, paint);\n    sk_sp<SkImage> image(gpuSurface->makeImageSnapshot());\n    canvas->drawImage(image, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "5e87093b9cbe95124ae14cbe77091eb7",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::MakeFromBackendTextureAsRenderTarget"
+},
+    "SkSurface_MakeRenderTarget": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(32);\n    GrContext* context = canvas->getGrContext();\n    if (!context) {\n         canvas->drawString(\"GPU only!\", 20, 40, paint);\n         return;\n    }\n    SkImageInfo info = SkImageInfo::MakeN32(256, 64, kOpaque_SkAlphaType);\n    for (auto surfaceOrigin : { kTopLeft_GrSurfaceOrigin, kBottomLeft_GrSurfaceOrigin } ) {\n        auto gpuSurface(SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info, 0,\n               surfaceOrigin, nullptr));\n        auto surfaceCanvas = gpuSurface->getCanvas();\n        surfaceCanvas->clear(SK_ColorWHITE);\n        surfaceCanvas->drawString(\"GPU rocks!\", 20, 40, paint);\n        sk_sp<SkImage> image(gpuSurface->makeImageSnapshot());\n        canvas->drawImage(image, 0, 0);\n       canvas->translate(0, 128);\n    }\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "67b6609471a3f1ed0f4b1657004cdecb",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::MakeRenderTarget"
+},
+    "SkSurface_MakeRenderTarget_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    auto test_draw = [](SkCanvas* surfaceCanvas) -> void {\n        SkPaint paint;\n        paint.setAntiAlias(true);\n        paint.setLCDRenderText(true);\n        paint.setColor(0xFFBBBBBB);\n        surfaceCanvas->drawRect(SkRect::MakeWH(128, 64), paint);\n        paint.setColor(SK_ColorWHITE);\n        paint.setTextSize(32);\n        surfaceCanvas->drawString(\"Pest\", 0, 25, paint);\n    };\n    GrContext* context = canvas->getGrContext();\n    SkImageInfo info = SkImageInfo::MakeN32(128, 64, kOpaque_SkAlphaType);\n    int y = 0;\n    for (auto geometry : { kRGB_H_SkPixelGeometry, kBGR_H_SkPixelGeometry,\n                           kRGB_V_SkPixelGeometry, kBGR_V_SkPixelGeometry } ) {\n        SkSurfaceProps props(0, geometry);\n        sk_sp<SkSurface> surface = context ? SkSurface::MakeRenderTarget(\n                context, SkBudgeted::kNo, info, 0, &props) : SkSurface::MakeRaster(info, &props);\n        test_draw(surface->getCanvas());\n        surface->draw(canvas, 0, y, nullptr);\n        sk_sp<SkImage> image(surface->makeImageSnapshot());\n        SkAutoCanvasRestore acr(canvas, true);\n        canvas->scale(8, 8);\n        canvas->drawImage(image, 12, y / 8);\n        y += 64;\n    }\n}\n",
+    "width": 256,
+    "height": 256,
+    "hash": "640321e8ecfb3f9329f3bc6e1f02485f",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::MakeRenderTarget_2"
+},
+    "SkSurface_MakeRenderTarget_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(32);\n    GrContext* context = canvas->getGrContext();\n    if (!context) {\n         canvas->drawString(\"GPU only!\", 20, 40, paint);\n         return;\n    }\n    SkImageInfo info = SkImageInfo::MakeN32(256, 64, kOpaque_SkAlphaType);\n    auto gpuSurface(SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info));\n    auto surfaceCanvas = gpuSurface->getCanvas();\n    surfaceCanvas->clear(SK_ColorWHITE);\n    surfaceCanvas->drawString(\"GPU rocks!\", 20, 40, paint);\n    sk_sp<SkImage> image(gpuSurface->makeImageSnapshot());\n    canvas->drawImage(image, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "5c7629c15e9ac93f098335e72560fa2e",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::MakeRenderTarget_3"
+},
+    "SkSurface_characterize": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(32);\n    GrContext* context = canvas->getGrContext();\n    if (!context) {\n         canvas->drawString(\"GPU only!\", 20, 40, paint);\n         return;\n    }\n    sk_sp<SkSurface> gpuSurface = SkSurface::MakeRenderTarget(\n            context, SkBudgeted::kYes, SkImageInfo::MakeN32Premul(64, 64));\n    SkSurfaceCharacterization characterization;\n    if (!gpuSurface->characterize(&characterization)) {\n         canvas->drawString(\"characterization unsupported\", 20, 40, paint);\n         return;\n    }\n    // start of threadable work\n    SkDeferredDisplayListRecorder recorder(characterization);\n    SkCanvas* subCanvas = recorder.getCanvas();\n    subCanvas->clear(SK_ColorGREEN);\n    std::unique_ptr<SkDeferredDisplayList> displayList = recorder.detach();\n    // end of threadable work\n    gpuSurface->draw(displayList.get());\n    sk_sp<SkImage> img = gpuSurface->makeImageSnapshot();\n    canvas->drawImage(std::move(img), 0, 0);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "6de6f3ef699a72ff26da1b26b23a3316",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::characterize()"
+},
+    "SkSurface_draw": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkSurface> big(SkSurface::MakeRasterN32Premul(64, 64));\n    sk_sp<SkSurface> lil(big->makeSurface(SkImageInfo::MakeN32(32, 32, kPremul_SkAlphaType)));\n    big->getCanvas()->clear(SK_ColorRED);\n    lil->getCanvas()->clear(SK_ColorBLACK);\n    lil->draw(big->getCanvas(), 16, 16, nullptr);\n    SkPixmap pixmap;\n    if (big->peekPixels(&pixmap)) {\n        SkBitmap bigBits;\n        bigBits.installPixels(pixmap);\n        canvas->drawBitmap(bigBits, 0, 0);\n    }\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "0de693f4d8dd898a60be8cfba23952be",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::draw()"
+},
+    "SkSurface_draw_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    paint.setTextSize(16);\n    sk_sp<SkSurface> gpuSurface = SkSurface::MakeRasterN32Premul(64, 64);\n    SkSurfaceCharacterization characterization;\n    if (!gpuSurface->characterize(&characterization)) {\n         canvas->drawString(\"characterization unsupported\", 20, 40, paint);\n         return;\n    }\n    // start of threadable work\n    SkDeferredDisplayListRecorder recorder(characterization);\n    SkCanvas* subCanvas = recorder.getCanvas();\n    subCanvas->clear(SK_ColorGREEN);\n    std::unique_ptr<SkDeferredDisplayList> displayList = recorder.detach();\n    // end of threadable work\n    gpuSurface->draw(displayList.get());\n    sk_sp<SkImage> img = gpuSurface->makeImageSnapshot();\n    canvas->drawImage(std::move(img), 0, 0);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "46d9bacf593deaaeabd74ff42f2571a0",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::draw_2"
+},
+    "SkSurface_getCanvas": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(64, 64));\n    SkCanvas* surfaceCanvas = surface->getCanvas();\n    surfaceCanvas->clear(SK_ColorBLUE);\n    SkPaint paint;\n    paint.setTextSize(40);\n    surfaceCanvas->drawString(\"\\xF0\\x9F\\x98\\x81\", 12, 45, paint);\n    surface->draw(canvas, 0, 0, nullptr);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "33d0c5ad5a4810e533ae1010e29f8b75",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::getCanvas"
+},
+    "SkSurface_makeImageSnapshot": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkSurface> big(SkSurface::MakeRasterN32Premul(64, 64));\n    sk_sp<SkSurface> lil(big->makeSurface(SkImageInfo::MakeN32(32, 32, kPremul_SkAlphaType)));\n    big->getCanvas()->clear(SK_ColorRED);\n    lil->getCanvas()->clear(SK_ColorBLACK);\n    sk_sp<SkImage> early(big->makeImageSnapshot());\n    lil->draw(big->getCanvas(), 16, 16, nullptr);\n    sk_sp<SkImage> later(big->makeImageSnapshot());\n    canvas->drawImage(early, 0, 0);\n    canvas->drawImage(later, 128, 0);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "46f1fa0d95e590a64bed0140407ce5f7",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::makeImageSnapshot"
+},
+    "SkSurface_makeImageSnapshot_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkSurface> big(SkSurface::MakeRasterN32Premul(64, 64));\n    sk_sp<SkSurface> lil(big->makeSurface(SkImageInfo::MakeN32(32, 32, kPremul_SkAlphaType)));\n    big->getCanvas()->clear(SK_ColorRED);\n    lil->getCanvas()->clear(SK_ColorBLACK);\n    sk_sp<SkImage> early(big->makeImageSnapshot());\n    lil->draw(big->getCanvas(), 16, 16, nullptr);\n    sk_sp<SkImage> later(big->makeImageSnapshot({0, 0, 16, 16}));\n    canvas->drawImage(early, 0, 0);\n    canvas->drawImage(later, 0, 0);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "b18b8ab693b09eb70a1d22ab63790cc7",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::makeImageSnapshot_2"
+},
+    "SkSurface_makeSurface": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkSurface> big(SkSurface::MakeRasterN32Premul(64, 64));\n    sk_sp<SkSurface> lil(big->makeSurface(SkImageInfo::MakeN32(32, 32, kPremul_SkAlphaType)));\n    big->getCanvas()->clear(SK_ColorRED);\n    lil->getCanvas()->clear(SK_ColorBLACK);\n    SkPixmap pixmap;\n    if (big->peekPixels(&pixmap)) {\n        SkBitmap bigBits;\n        bigBits.installPixels(pixmap);\n        canvas->drawBitmap(bigBits, 0, 0);\n    }\n    if (lil->peekPixels(&pixmap)) {\n        SkBitmap lilBits;\n        lilBits.installPixels(pixmap);\n        canvas->drawBitmap(lilBits, 64, 64);\n    }\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "a9889b519a26896b900da0444e423c61",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::makeSurface"
+},
+    "SkSurface_peekPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkSurface> surf(SkSurface::MakeRasterN32Premul(64, 64));\n    auto surfCanvas = surf->getCanvas();\n    surfCanvas->clear(SK_ColorRED);\n    SkPaint paint;\n    paint.setTextSize(40);\n    surfCanvas->drawString(\"&\", 16, 48, paint);\n    SkPixmap pixmap;\n    if (surf->peekPixels(&pixmap)) {\n        SkBitmap surfBits;\n        surfBits.installPixels(pixmap);\n        canvas->drawBitmap(surfBits, 0, 0);\n    }\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "8c6184f22cfe068f021704cf92a147a1",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::peekPixels"
+},
+    "SkSurface_readPixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkSurface> surf(SkSurface::MakeRasterN32Premul(64, 64));\n    auto surfCanvas = surf->getCanvas();\n    surfCanvas->clear(SK_ColorRED);\n    SkPaint paint;\n    paint.setTextSize(40);\n    surfCanvas->drawString(\"&\", 0, 32, paint);\n    std::vector<SkPMColor> storage;\n    storage.resize(surf->width() * surf->height());\n    SkPixmap pixmap(SkImageInfo::MakeN32Premul(32, 32), &storage.front(),\n                    surf->width() * sizeof(storage[0]));\n    if (surf->readPixels(pixmap, 0, 0)) {\n        SkBitmap surfBits;\n        surfBits.installPixels(pixmap);\n        canvas->drawBitmap(surfBits, 0, 0);\n    }\n}",
+    "width": 256,
+    "height": 32,
+    "hash": "9f454fb93bca6482598d198b4121f0a6",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::readPixels"
+},
+    "SkSurface_readPixels_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkSurface> surf(SkSurface::MakeRasterN32Premul(64, 64));\n    auto surfCanvas = surf->getCanvas();\n    surfCanvas->clear(SK_ColorRED);\n    SkPaint paint;\n    surfCanvas->drawOval({4, 8, 58, 54}, paint);\n    SkImageInfo info = SkImageInfo::Make(64, 64, kBGRA_8888_SkColorType, kPremul_SkAlphaType);\n    sk_sp<SkData> data(SkData::MakeUninitialized(info.minRowBytes() * info.height()));\n    sk_bzero(data->writable_data(), info.minRowBytes() * info.height());\n    for (int x : { 32, -32 } ) {\n        for (int y : { 32, -32 } ) {\n            surf->readPixels(info, data->writable_data(), info.minRowBytes(), x, y);\n        }\n    }\n    sk_sp<SkImage> image = SkImage::MakeRasterData(info, data, info.minRowBytes());\n    canvas->drawImage(image, 0, 0);\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "484d60dab5d846bf28c7a4d48892324a",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::readPixels_2"
+},
+    "SkSurface_readPixels_3": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkSurface> surf(SkSurface::MakeRasterN32Premul(64, 64));\n    auto surfCanvas = surf->getCanvas();\n    surfCanvas->clear(SK_ColorGREEN);\n    SkPaint paint;\n    surfCanvas->drawOval({2, 10, 58, 54}, paint);\n    SkImageInfo info = SkImageInfo::Make(64, 64, kBGRA_8888_SkColorType, kPremul_SkAlphaType);\n    SkBitmap bitmap;\n    bitmap.setInfo(info);\n    bitmap.allocPixels();\n    for (int x : { 32, -32 } ) {\n        for (int y : { 32, -32 } ) {\n            surf->readPixels(bitmap, x, y);\n        }\n    }\n    canvas->drawBitmap(bitmap, 0, 0);\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "2d991a231e49d1de13eeb2ba9b440e01",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::readPixels_3"
+},
+    "SkSurface_writePixels": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkSurface> surf(SkSurface::MakeRasterN32Premul(64, 64));\n    auto surfCanvas = surf->getCanvas();\n    surfCanvas->clear(SK_ColorRED);\n    SkPaint paint;\n    paint.setTextSize(40);\n    surfCanvas->drawString(\"&\", 16, 40, paint);\n    SkPixmap pixmap;\n    if (surf->peekPixels(&pixmap)) {\n        surf->writePixels(pixmap, 25, 25);\n        sk_sp<SkImage> image(surf->makeImageSnapshot());\n        canvas->drawImage(image, 0, 0);\n    }\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "760793bcf0ef193fa61ea03e6e8fc825",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::writePixels"
+},
+    "SkSurface_writePixels_2": {
+    "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkSurface> surf(SkSurface::MakeRasterN32Premul(64, 64));\n    auto surfCanvas = surf->getCanvas();\n    surfCanvas->clear(SK_ColorGREEN);\n    surf->writePixels(source, 25, 25);\n    sk_sp<SkImage> image(surf->makeImageSnapshot());\n    canvas->drawImage(image, 0, 0);\n}",
+    "width": 256,
+    "height": 96,
+    "hash": "d77790dd3bc9f678fa4f582347fb8fba",
+    "file": "SkSurface_Reference",
+    "name": "SkSurface::writePixels_2"
+},
+    "SkTextBlobBuilder_allocRun": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkTextBlobBuilder builder;\n    SkFont font;\n    SkPaint paint;\n    const SkTextBlobBuilder::RunBuffer& run = builder.allocRun(font, 5, 20, 20);\n    paint.textToGlyphs(\"hello\", 5, run.glyphs);\n    canvas->drawRect({20, 20, 30, 30}, paint);\n    canvas->drawTextBlob(builder.make(), 20, 20, paint);\n}",
+    "width": 256,
+    "height": 60,
+    "hash": "f0e584aec20eaee7a5bfed62aa885eee",
+    "file": "SkTextBlobBuilder_Reference",
+    "name": "SkTextBlobBuilder::allocRun"
+},
+    "SkTextBlobBuilder_allocRunPos": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkTextBlobBuilder builder;\n    SkPaint paint;\n    SkFont font;\n    const SkTextBlobBuilder::RunBuffer& run = builder.allocRunPos(font, 5);\n    paint.textToGlyphs(\"hello\", 5, run.glyphs);\n    SkPoint positions[] = {{0, 0}, {10, 10}, {20, 20}, {40, 40}, {80, 80}};\n    memcpy(run.pos, positions, sizeof(positions));\n    canvas->drawTextBlob(builder.make(), 20, 20, paint);\n}",
+    "width": 256,
+    "height": 90,
+    "hash": "da4fcb4a972b500996be9aff6c6c40e1",
+    "file": "SkTextBlobBuilder_Reference",
+    "name": "SkTextBlobBuilder::allocRunPos"
+},
+    "SkTextBlobBuilder_allocRunPosH": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkTextBlobBuilder builder;\n    SkPaint paint;\n    SkFont font;\n    const SkTextBlobBuilder::RunBuffer& run = builder.allocRunPosH(font, 5, 20);\n    paint.textToGlyphs(\"hello\", 5, run.glyphs);\n    SkScalar positions[] = {0, 10, 20, 40, 80};\n    memcpy(run.pos, positions, sizeof(positions));\n    canvas->drawTextBlob(builder.make(), 20, 20, paint);\n}",
+    "width": 256,
+    "height": 60,
+    "hash": "c77ac50f506106fdfef94d20bc1a6934",
+    "file": "SkTextBlobBuilder_Reference",
+    "name": "SkTextBlobBuilder::allocRunPosH"
+},
+    "SkTextBlob_Deserialize": {
+    "code": "#include \"SkSerialProcs.h\"\n\nvoid draw(SkCanvas* canvas) {\n    SkFont blobFont;\n    blobFont.setSize(24);\n    sk_sp<SkTextBlob> blob = SkTextBlob::MakeFromText(\"Hello World!\", 12, blobFont);\n    sk_sp<SkData> data = blob->serialize(SkSerialProcs());\n    uint16_t glyphs[6];\n    SkPaint blobPaint;\n    blobPaint.textToGlyphs(\"Hacker\", 6, glyphs);\n    memcpy((char*)data->writable_data() + 0x54, glyphs, sizeof(glyphs));\n    sk_sp<SkTextBlob> copy = SkTextBlob::Deserialize(data->data(), data->size(), SkDeserialProcs());\n    canvas->drawTextBlob(copy, 20, 20, SkPaint());\n}",
+    "width": 256,
+    "height": 24,
+    "hash": "68b6d0208eb0b4de67fc152381af7a58",
+    "file": "SkTextBlob_Reference",
+    "name": "SkTextBlob::Deserialize"
+},
+    "SkTextBlob_MakeFromString": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkFont font;\n    font.setSize(24);\n    SkPaint canvasPaint;\n    canvasPaint.setColor(SK_ColorBLUE); // respected\n    canvasPaint.setTextSize(2); // ignored\n    sk_sp<SkTextBlob> blob = SkTextBlob::MakeFromString(\"Hello World\", font);\n    canvas->drawTextBlob(blob, 20, 20, canvasPaint);\n}",
+    "width": 256,
+    "height": 24,
+    "hash": "a5af182e793eed3f2bb3b0efc2cf4852",
+    "file": "SkTextBlob_Reference",
+    "name": "SkTextBlob::MakeFromString"
+},
+    "SkTextBlob_MakeFromText": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkFont font;\n    font.setSize(24);\n    SkPaint canvasPaint;\n    canvasPaint.setColor(SK_ColorBLUE); // respected\n    canvasPaint.setTextSize(2); // ignored\n    sk_sp<SkTextBlob> blob = SkTextBlob::MakeFromText(\"Hello World\", 11, font);\n    canvas->drawTextBlob(blob, 20, 20, canvasPaint);\n}",
+    "width": 256,
+    "height": 24,
+    "hash": "bec2252bc36dc8fd023015629d60c405",
+    "file": "SkTextBlob_Reference",
+    "name": "SkTextBlob::MakeFromText"
+},
+    "SkTextBlob_bounds": {
+    "code": "void draw(SkCanvas* canvas) {\n    SkTextBlobBuilder textBlobBuilder;\n    const char bunny[] = \"/(^x^)\\\\\";\n    const int len = sizeof(bunny) - 1;\n    uint16_t glyphs[len];\n    SkPaint paint;\n    paint.textToGlyphs(bunny, len, glyphs);\n    paint.setTextEncoding(SkTextEncoding::kGlyphID);\n    SkFont font;\n    int runs[] = { 3, 1, 3 };\n    SkPoint textPos = { 20, 50 };\n    int glyphIndex = 0;\n    for (auto runLen : runs) {\n        font.setSize(1 == runLen ? 20 : 50);\n        paint.setTextSize(1 == runLen ? 20 : 50);\n        const SkTextBlobBuilder::RunBuffer& run =\n                textBlobBuilder.allocRun(font, runLen, textPos.fX, textPos.fY);\n        memcpy(run.glyphs, &glyphs[glyphIndex], sizeof(glyphs[0]) * runLen);\n        textPos.fX += paint.measureText(&glyphs[glyphIndex], sizeof(glyphs[0]) * runLen, nullptr);\n        glyphIndex += runLen;\n    }\n    sk_sp<const SkTextBlob> blob = textBlobBuilder.make();\n    canvas->drawTextBlob(blob.get(), 0, 0, paint);\n    paint.setStyle(SkPaint::kStroke_Style);\n    canvas->drawRect(blob->bounds(), paint);\n}",
+    "width": 256,
+    "height": 70,
+    "hash": "fb8b2502bbe52d2029aecdf569dd9fdb",
+    "file": "SkTextBlob_Reference",
+    "name": "SkTextBlob::bounds()"
+},
+    "SkTextBlob_serialize": {
+    "code": "#include \"SkSerialProcs.h\"\n\nvoid draw(SkCanvas* canvas) {\n    SkFont blobFont;\n    blobFont.setSize(24);\n    sk_sp<SkTextBlob> blob = SkTextBlob::MakeFromText(\"Hello World\", 11, blobFont);\n    char storage[2048];\n    size_t used = blob->serialize(SkSerialProcs(), storage, sizeof(storage));\n    sk_sp<SkTextBlob> copy = SkTextBlob::Deserialize(storage, used, SkDeserialProcs());\n    canvas->drawTextBlob(copy, 20, 20, SkPaint());\n    std::string usage = \"size=\" + std::to_string(sizeof(storage)) + \" used=\" + std::to_string(used);\n    canvas->drawString(usage.c_str(), 20, 40, SkPaint());\n}",
+    "width": 256,
+    "height": 64,
+    "hash": "90ce8c327d407b1faac73baa2ebd0378",
+    "file": "SkTextBlob_Reference",
+    "name": "SkTextBlob::serialize()"
+},
+    "SkTextBlob_serialize_2": {
+    "code": "#include \"SkSerialProcs.h\"\n\nvoid draw(SkCanvas* canvas) {\n    SkFont blobFont;\n    blobFont.setSize(24);\n    sk_sp<SkTextBlob> blob = SkTextBlob::MakeFromText(\"Hello World\", 11, blobFont);\n    sk_sp<SkData> data = blob->serialize(SkSerialProcs());\n    sk_sp<SkTextBlob> copy = SkTextBlob::Deserialize(data->data(), data->size(), SkDeserialProcs());\n    canvas->drawTextBlob(copy, 20, 20, SkPaint());\n}",
+    "width": 256,
+    "height": 24,
+    "hash": "464201a828f7e94fc01cd57facfcd2f4",
+    "file": "SkTextBlob_Reference",
+    "name": "SkTextBlob::serialize_2"
+},
+    "SkTextBlob_uniqueID": {
+    "code": "void draw(SkCanvas* canvas) {\n    for (int index = 0; index < 2; ++index) {\n        SkTextBlobBuilder textBlobBuilder;\n        const char bunny[] = \"/(^x^)\\\\\";\n        const int len = sizeof(bunny) - 1;\n        uint16_t glyphs[len];\n        SkPaint paint;\n        paint.textToGlyphs(bunny, len, glyphs);\n        paint.setTextEncoding(SkTextEncoding::kGlyphID);\n        paint.setTextScaleX(0.5);\n        SkFont font;\n        font.setScaleX(0.5);\n        int runs[] = { 3, 1, 3 };\n        SkPoint textPos = { 20, 50 };\n        int glyphIndex = 0;\n        for (auto runLen : runs) {\n            font.setSize(1 == runLen ? 20 : 50);\n            paint.setTextSize(1 == runLen ? 20 : 50);\n            const SkTextBlobBuilder::RunBuffer& run =\n                    textBlobBuilder.allocRun(font, runLen, textPos.fX, textPos.fY);\n            memcpy(run.glyphs, &glyphs[glyphIndex], sizeof(glyphs[0]) * runLen);\n            textPos.fX += paint.measureText(&glyphs[glyphIndex], sizeof(glyphs[0]) * runLen, nullptr);\n            glyphIndex += runLen;\n        }\n        sk_sp<const SkTextBlob> blob = textBlobBuilder.make();\n        paint.reset();\n        canvas->drawTextBlob(blob.get(), 0, 0, paint);\n        std::string id = \"unique ID:\" + std::to_string(blob->uniqueID());\n        canvas->drawString(id.c_str(), 30, blob->bounds().fBottom + 15, paint);\n        canvas->translate(blob->bounds().fRight + 10, 0);\n    }\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "6e12cceca981ddabc0fc18c380543f34",
+    "file": "SkTextBlob_Reference",
+    "name": "SkTextBlob::uniqueID"
+},
+    "SkWStream_SizeOfPackedUInt": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::SizeOfPackedUInt"
+},
+    "SkWStream_bytesWritten": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::bytesWritten"
+},
+    "SkWStream_destructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::~SkWStream()"
+},
+    "SkWStream_empty_constructor": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::SkWStream()"
+},
+    "SkWStream_flush": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::flush()"
+},
+    "SkWStream_newline": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::newline()"
+},
+    "SkWStream_write": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::write()"
+},
+    "SkWStream_write16": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::write16"
+},
+    "SkWStream_write32": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::write32"
+},
+    "SkWStream_write8": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::write8"
+},
+    "SkWStream_writeBigDecAsText": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::writeBigDecAsText"
+},
+    "SkWStream_writeBool": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::writeBool"
+},
+    "SkWStream_writeDecAsText": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::writeDecAsText"
+},
+    "SkWStream_writeHexAsText": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::writeHexAsText"
+},
+    "SkWStream_writePackedUInt": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::writePackedUInt"
+},
+    "SkWStream_writeScalar": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::writeScalar"
+},
+    "SkWStream_writeScalarAsText": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::writeScalarAsText"
+},
+    "SkWStream_writeStream": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::writeStream"
+},
+    "SkWStream_writeText": {
+    "code": "void draw(SkCanvas* canvas) {\n    // incomplete\n}",
+    "width": 256,
+    "height": 256,
+    "hash": "882e8e0103048009a25cfc20400492f7",
+    "file": "SkWStream_Reference",
+    "name": "SkWStream::writeText"
+}
+    }
+    var canvas
+var context
+var getFromWeb = true
+var mouseDown = false
+var scale = .6
+var outset = 15
+var columnWidth = 256
+var maxHeight = 256
+var lastLink = null
+var lastLinkStr = null
+var labelback = {}
+var loadedImages = 0
+var images = {}
+var imagesLength = 0;
+
+function recContains(rec, value) {
+    if (!value.length)
+        return 0
+    var lc = value.toLowerCase()
+    if (rec.name.toLowerCase().indexOf(lc) >= 0)
+        return 1
+    if (rec.code.toLowerCase().indexOf(lc) >= 0)
+        return 2
+    return 3
+}
+
+function setLink(recstr) {
+    var under
+    var link = recstr
+    if (!link.startsWith("Sk")) {
+        under = link.indexOf('_')
+        link = link.substring(under + 1)
+    }
+    under = link.lastIndexOf('_')
+    var len = link.length
+    if (under == len - 2) {
+        var letter = link[len - 1]
+        if ('a' <= letter && letter <= 'z') {
+            link = link.substr(0, len - 2)
+        } else if ('0' <= letter && letter <= '9') {
+            link = link.substr(0, len - 2)
+        }
+    }
+    lastLinkStr = link
+}
+
+function showLink() {
+    var link = lastLink.file + '#' + lastLinkStr
+    context.save()
+    context.font = "normal 16px Arial";
+    labelback.w = Math.max(labelback.w, context.measureText(link).width + 8)
+    context.beginPath()
+    context.rect(labelback.x, labelback.y, labelback.w, labelback.h)
+    context.fillStyle = "rgba(232,180,220, 1)"
+    context.fill()
+    context.fillStyle = "rgba(64,32,48, 1)"
+    context.fillText(link, labelback.x + 4, labelback.y + 16)
+    context.restore()
+}
+
+function imageIterator(callout, state) {
+    var row = outset + 30
+    var column = outset
+    for (var recstr in pngs) {
+        var rec = pngs[recstr]
+        var contains = recContains(rec, input.value)
+        if (3 == contains)
+            continue;
+        var height = rec.height < maxHeight ? rec.height : maxHeight
+        if (callout(state, column, row, height, contains, recstr))
+            break;
+        row += height + outset
+        if (row >= canvas.height / scale) {
+            row = 0
+            column += columnWidth + outset
+            if (column >= canvas.width / scale) {
+                break
+            }
+        }
+    }
+}
+
+function handleMouseOver(event) {
+    var callout = function(state, column, row, height, contains, recstr) {
+        if (state.x >= column && state.x <= column + columnWidth &&
+                state.y >= row && state.y <= row + height) {
+            document.body.style.cursor = "pointer"
+            lastLink = pngs[recstr]
+            setLink(recstr)
+            showLink()
+            return true
+        }
+        return false
+    }
+    var state = {
+        x: (event.clientX - 5) / scale,
+        y: (event.clientY - 7) / scale
+    }
+    document.body.style.cursor = ""
+    lastLink = null
+    imageIterator(callout, state)
+}
+
+function handleMouseClick() {
+    if (null != lastLink) {
+        var link = 'https://skia.org/user/api/' + lastLink.file + '#' + lastLinkStr
+        window.location = link
+    }
+}
+
+function doKeyPress(evt) {
+    idiv.style.height = 20
+    input.focus()
+}
+
+function drawImage(hash, x, y, w, h, contains) {
+    context.save()
+    context.transform(scale, 0, 0, scale, 0, 0)
+    context.save()
+    context.beginPath()
+    context.rect(x, y, w, h)
+    context.clip()
+    context.drawImage(images[hash], x, y)
+    context.restore()
+    context.beginPath()
+    context.rect(x, y, w, h)
+    context.strokeStyle = 1 == contains ? "red" : "black"
+    context.stroke()
+    context.restore()
+}
+
+function draw() {
+    var callout = function(state, column, row, height, contains, recstr) {
+        drawImage(pngs[recstr].hash, column, row, columnWidth, height, contains)
+        return false
+    }
+    imageIterator(callout, null)
+}
+
+function sleep(ms) {
+    return new Promise(resolve => setTimeout(resolve, ms));
+}
+
+async function redraw() {
+    context.strokeStyle = "white"
+    context.beginPath()
+    context.fillStyle = "white"
+    context.rect(0, 30, canvas.width, canvas.height)
+    context.fill()
+    context.rect((256 + outset) * scale, 0, canvas.width, 30)
+    context.fill()
+    for (var image in images) {
+        image.drawn = false
+    }
+    do {
+        draw();
+        if (loadedImages >= imagesLength)
+            break;
+        console.debug(" loadedImages:" + loadedImages + " imagesLength:" + imagesLength)
+        await sleep(1000);
+    } while (true)
+}
+
+function resize() {
+    setSize()
+    redraw()
+}
+
+function setSize() {
+    canvas.width = window.innerWidth - 20
+    canvas.height = window.innerHeight - 20
+    labelback.x = 0
+    labelback.y = canvas.height - 20
+    labelback.w = 0
+    labelback.h = 20
+}
+
+function loadImages() {
+    for (var recstr in pngs) {
+        var rec = pngs[recstr]
+        var image = new Image()
+        images[rec.hash] = image
+        if (getFromWeb)
+            image.src = 'https://fiddle.skia.org/i/'
+        image.src += rec.hash + '_raster.png'
+        image.onload = function () {
+            loadedImages += 1
+        }
+        imagesLength += 1;
+    }
+}
+
+function start() {
+    loadImages()
+    window.addEventListener('keypress', doKeyPress, true);
+    window.addEventListener('keydown', doKeyPress, true);
+    canvas = document.getElementById('canvas')
+    context = canvas.getContext('2d')
+    resize()
+}
+
+</script>
+</head>
+
+<body onLoad="start()" onresize="resize()">
+<div style="height:0" id="idiv">
+<input type="text" id="input" onkeypress="redraw()" onkeydown="redraw()"/>
+</div>
+<canvas id="canvas" width="750" height="500"
+onmousedown="mouseDown = true"
+onmouseup="mouseDown = false"
+onmousemove="handleMouseOver(event)"
+onclick="handleMouseClick()"
+></canvas >
+</body>
+</html>
+
diff --git a/src/third_party/skia/site/user/api/index.md b/src/third_party/skia/site/user/api/index.md
index 3d02edd..0e973cf 100644
--- a/src/third_party/skia/site/user/api/index.md
+++ b/src/third_party/skia/site/user/api/index.md
@@ -1,5 +1,41 @@
-API Overview & Doxygen Docs
-===========================
+API Reference and Overview
+==========================
+
+Skia documentation is actively under development.
+
+Full references with examples are available for:
+
+*   [SkAutoCanvasRestore](/user/api/SkAutoCanvasRestore_Reference) - Canvas save stack manager
+*   [SkBitmap](/user/api/SkBitmap_Reference) - two-dimensional raster pixel array
+*   [SkBlendMode](/user/api/SkBlendMode_Reference) - pixel color arithmetic
+*   [SkCanvas](/user/api/SkCanvas_Reference) - drawing context
+*   [SkColor](/user/api/SkColor_Reference) - color encoding using integer numbers
+*   [SkColor4f](/user/api/SkColor4f_Reference) - color encoding using floating point numbers
+*   [SkFont](/user/api/SkFont_Reference) - text style and typeface
+*   [SkImage](/user/api/SkImage_Reference) - two dimensional array of pixels to draw
+*   [SkImageInfo](/user/api/SkImageInfo_Reference) - pixel dimensions and characteristics
+*   [SkIPoint](/user/api/SkIPoint_Reference) - two integer coordinates
+*   [SkIRect](/user/api/SkIRect_Reference) - integer rectangle
+*   [SkMatrix](/user/api/SkMatrix_Reference) - 3x3 transformation matrix
+*   [SkPaint](/user/api/SkPaint_Reference) - color, stroke, font, effects
+*   [SkPath](/user/api/SkPath_Reference) - sequence of connected lines and curves
+*   [SkPicture](/user/api/SkPicture_Reference) - sequence of drawing commands
+*   [SkPixmap](/user/api/SkPixmap_Reference) - pixel map: image info and pixel address
+*   [SkPoint](/user/api/SkPoint_Reference) - two floating point coordinates
+*   [SkRRect](/user/api/SkRRect_Reference) - floating point rounded rectangle
+*   [SkRect](/user/api/SkRect_Reference) - floating point rectangle
+*   [SkRegion](/user/api/SkRegion_Reference) - compressed clipping mask
+*   [SkSurface](/user/api/SkSurface_Reference) - drawing destination
+*   [SkTextBlob](/user/api/SkTextBlob_Reference) - runs of glyphs
+*   [SkTextBlobBuilder](/user/api/SkTextBlobBuilder_Reference) - constructor for runs of glyphs
+
+Check out [a graphical overview of examples](api/catalog.htm)
+
+All public APIs are indexed by Doxygen.
+
+*   [Skia Doxygen](https://api.skia.org)
+
+## Overview
 
 Skia is organized around the `SkCanvas` object. It is the host for the
 "draw" calls: `drawRect`, `drawPath`, `drawText`, etc. Each of these
@@ -24,66 +60,7 @@
 
 Using the SkCanvas API:
 
-1.  **[SkCanvas](/user/api/skcanvas)** - the drawing context.
-2.  **[SkPaint](/user/api/skpaint)** - color, stroke, font, effects
-3.  **[SkRect](/user/api/skrect)** - rectangles
-4.  **[SkRegion](/user/api/skregion)** - set operations with rectangles and paths
+1.  [SkCanvas Overview](/user/api/skcanvas_overview) - the drawing context
+2.  [SkPaint Overview](/user/api/skpaint_overview) - color, stroke, font, effects
+3.  [SkCanvas Creation](/user/api/skcanvas_creation)
 
-Appendix:
-
-1.  **[Creating SkCanvas Objects](/user/api/canvas)**
-
-Autogenerated Doxygen Documentaion
-----------------------------------
-
-*   [Skia Doxygen](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/index.html)
-
-Here's a partial list of the more important Skia classes:
-
-*   [SkCanvas](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkCanvas.html)
-*   [SkImage](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkImage.html)
-*   [SkSurface](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkSurface.html)
-*   [SkPaint](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkPaint.html)
-*   [SkShader](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkShader.html)
-    -   [SkComposeShader](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkComposeShader.html)
-    -   [SkPerlinNoiseShader](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkPerlinNoiseShader.html)
-    -   [SkGradientShader](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkGradientShader.html)
-    -   [SkTransparentShader](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkTransparentShader.html)
-*   [SkColorFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkColorFilter.html)
-    -   [SkColorMatrixFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkColorMatrixFilter.html)
-    -   [SkLumaColorFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkLumaColorFilter.html)
-    -   [SkModeColorFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkModeColorFilter.html)
-*   [SkPathEffect](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkPathEffect.html)
-    -   [SkPath2DPathEffect](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkPath2DPathEffect.html)
-    -   [SkLine2DPathEffect](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkLine2DPathEffect.html)
-    -   [SkPath1DPathEffect](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkPath1DPathEffect.html)
-    -   [SkArcToPathEffect](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkArcToPathEffect.html)
-    -   [SkCornerPathEffect](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkCornerPathEffect.html)
-    -   [SkDashPathEffect](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkDashPathEffect.html)
-    -   [SkDiscretePathEffect](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkDiscretePathEffect.html)
-    -   [SkComposePathEffect](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkComposePathEffect.html)
-    -   [SkSumPathEffect](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkSumPathEffect.html)
-*   [SkImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkImageFilter.html)
-    -   [SkAlphaThresholdFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkAlphaThresholdFilter.html)
-    -   [SkBlurImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkBlurImageFilter.html)
-    -   [SkBitmapSource](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkBitmapSource.html)
-    -   [SkColorFilterImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkColorFilterImageFilter.html)
-    -   [SkComposeImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkComposeImageFilter.html)
-    -   [SkDisplacementMapEffect](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkDisplacementMapEffect.html)
-    -   [SkDownSampleImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkDownSampleImageFilter.html)
-    -   [SkDropShadowImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkDropShadowImageFilter.html)
-    -   [SkLightingImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkLightingImageFilter.html)
-    -   [SkMagnifierImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkMagnifierImageFilter.html)
-    -   [SkMatrixConvolutionImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkMatrixConvolutionImageFilter.html)
-    -   [SkMergeImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkMergeImageFilter.html)
-    -   [SkDilateImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkDilateImageFilter.html)
-    -   [SkErodeImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkErodeImageFilter.html)
-    -   [SkOffsetImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkOffsetImageFilter.html)
-    -   [SkPictureImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkPictureImageFilter.html)
-    -   [SkRectShaderImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkRectShaderImageFilter.html)
-    -   [SkTileImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkTileImageFilter.html)
-    -   [SkXfermodeImageFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkXfermodeImageFilter.html)
-*   [SkMaskFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkMaskFilter.html)
-    -   [SkTableMaskFilter](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkTableMaskFilter.html)
-*   [SkDrawLooper](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkDrawLooper.html)
-    -   [SkBlurDrawLooper](http://skia-doc.commondatastorage.googleapis.com/doxygen/doxygen/html/classSkBlurDrawLooper.html)
diff --git a/src/third_party/skia/site/user/api/canvas.md b/src/third_party/skia/site/user/api/skcanvas_creation.md
similarity index 95%
rename from src/third_party/skia/site/user/api/canvas.md
rename to src/third_party/skia/site/user/api/skcanvas_creation.md
index d9e1559..8a6cdfc 100644
--- a/src/third_party/skia/site/user/api/canvas.md
+++ b/src/third_party/skia/site/user/api/skcanvas_creation.md
@@ -1,7 +1,7 @@
-Creating SkCanvas Objects
+SkCanvas Creation
 =========================
 
-First, read about [the SkCanvas API](skcanvas).
+First, read about [the SkCanvas API](skcanvas_overview).
 
 Skia has multiple backends which receive SkCanvas drawing commands,
 including:
@@ -12,7 +12,7 @@
 -   [SkPicture](#skpicture) - Skia's display list format.
 -   [NullCanvas](#nullcanvas)  - Useful for testing only.
 -   [SkXPS](#skxps) - Experimental XPS backend.
--   [SkSVG](#sksvg) - Experimental XPS backend.
+-   [SkSVG](#sksvg) - Experimental SVG backend.
 
 Each backend has a unique way of creating a SkCanvas.  This page gives
 an example for each:
@@ -98,7 +98,7 @@
         // context in a platform-specific way. Alternatively, you may create your own GrGLInterface and
         // initialize it however you like to attach to an alternate OpenGL implementation or intercept
         // Skia's OpenGL calls.
-        GrContext* context = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext) interface);
+        sk_sp<GrContext> context = GrContext::MakeGL(interface);
         SkImageInfo info = SkImageInfo:: MakeN32Premul(width, height);
         sk_sp<SkSurface> gpuSurface(
                 SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info));
@@ -125,13 +125,13 @@
 
 <!--?prettify lang=cc?-->
 
-    #include "SkDocument.h"
+    #include "SkPDFDocument.h"
     #include "SkStream.h"
     void skpdf(int width, int height,
                void (*draw)(SkCanvas*),
                const char* path) {
         SkFILEWStream pdfStream(path);
-        sk_sp<SkDocument> pdfDoc = SkDocument::MakePDF(&pdfStream);
+        auto pdfDoc = SkPDF::MakeDocument(&pdfStream);
         SkCanvas* pdfCanvas = pdfDoc->beginPage(SkIntToScalar(width),
                                                 SkIntToScalar(height));
         draw(pdfCanvas);
@@ -158,7 +158,7 @@
         draw(recordingCanvas);
         sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
         SkFILEWStream skpStream(path);
-        // Open SKP files with `SampleApp --picture SKP_FILE`
+        // Open SKP files with `viewer --skps PATH_TO_SKP --slide SKP_FILE`
         picture->serialize(&skpStream);
     }
 
diff --git a/src/third_party/skia/site/user/api/skcanvas.md b/src/third_party/skia/site/user/api/skcanvas_overview.md
similarity index 96%
rename from src/third_party/skia/site/user/api/skcanvas.md
rename to src/third_party/skia/site/user/api/skcanvas_overview.md
index a1e3428..8b555ea 100644
--- a/src/third_party/skia/site/user/api/skcanvas.md
+++ b/src/third_party/skia/site/user/api/skcanvas_overview.md
@@ -1,4 +1,4 @@
-SkCanvas
+SkCanvas Overview
 ========
 
 *The drawing context*
@@ -67,4 +67,4 @@
 the paint. In those instances, the paint parameter may be null. In all
 other cases the paint parameter is required.
 
-Next: [SkPaint](/user/api/skpaint)
+Next: [SkPaint](/user/api/skpaint_overview)
diff --git a/src/third_party/skia/site/user/api/skmatrix.md b/src/third_party/skia/site/user/api/skmatrix.md
deleted file mode 100644
index 3048cdc..0000000
--- a/src/third_party/skia/site/user/api/skmatrix.md
+++ /dev/null
@@ -1,12 +0,0 @@
-SkMatrix
-========
-
-*3x3 transforms*
-
-<!-- Updated Mar 4, 2011 -->
-
-Skia is a 2D graphics engine, but it supports a full 3x3
-transformation matrix. This allow it to draw anything (bitmaps, text,
-rectangles, paths) in perspective. SkCamera is a helper class that
-models a camera in 3D, and can be used to generate the proper matrix
-for a given 3D view of the plane.
diff --git a/src/third_party/skia/site/user/api/skpaint.md b/src/third_party/skia/site/user/api/skpaint_overview.md
similarity index 97%
rename from src/third_party/skia/site/user/api/skpaint.md
rename to src/third_party/skia/site/user/api/skpaint_overview.md
index 0d404ca..b85e20c 100644
--- a/src/third_party/skia/site/user/api/skpaint.md
+++ b/src/third_party/skia/site/user/api/skpaint_overview.md
@@ -1,4 +1,4 @@
-SkPaint
+SkPaint Overview
 =======
 <span id="top"></span>
 
@@ -174,12 +174,6 @@
 
     <fiddle-embed name='@skpaint_path_1d_path_effect'></fiddle-embed>
 
-*   SkArcToPathEffect
-
-	The following few examples use this function:
-
-    <fiddle-embed name='@skpaint_arc_to_path_effect'></fiddle-embed>
-
 *   SkCornerPathEffect: a path effect that can turn sharp corners into
     various treatments (e.g. rounded corners).
 
diff --git a/src/third_party/skia/site/user/api/skrect.md b/src/third_party/skia/site/user/api/skrect.md
deleted file mode 100644
index c2ebef1..0000000
--- a/src/third_party/skia/site/user/api/skrect.md
+++ /dev/null
@@ -1,73 +0,0 @@
-SkRect
-======
-
-*Rectangles*
-
-<!--Updated Mar 4, 2011-->
-
-SkRect is basic to many drawing and measuring operations. It can be
-drawn using canvas.drawRect(), but it is also used to return the
-bounds of objects like paths and text characters. It is specified
-using SkScalar values.
-
-SkIRect is the integer counter part to SkRect, but is specified using
-32bit integers.
-
-<!--?prettify lang=cc?-->
-
-    struct SkRect {
-       SkScalar fLeft;
-       SkScalar fTop;
-       SkScalar fRight;
-       SkScalar fBottom;
-       // methods
-    };
-
-    SkRect rect = SkRect::MakeLTRB(left, top, right, bottom);
-
-SkRect has the usual getters, to return width(), height(), centerX(),
-etc. It also has methods to compute unions and intersections between
-rectangles.
-
-Converting between SkRect and SkIRect is asymetric. Short of overflow
-issues when SkScalar is an int, converting from SkIRect to SkRect is
-straight forward:
-
-<!--?prettify lang=cc?-->
-
-    SkRect::set(const SkIRect&);
-
-However, convert from SkRect to SkIRect needs to know how to go from
-fractional values to integers.
-
-<!--?prettify lang=cc?-->
-
-    SkRect::round(SkIRect*) const;     // Round each coordinate.
-    SkRect::roundOut(SkIRect*) const;  // Apply floor to left/top,
-                                       // and ceil to right/bottom.
-
-In Skia, rectangle coordinates describe the boundary of what is drawn,
-such that an empty rectangle encloses zero pixels:
-
-bool SkRect::isEmpty() const { return fLeft >= fRight || fTop >= fBottom; }
-
-<!--?prettify lang=cc?-->
-
-    SkScalar SkRect::width() const { return fRight - fLeft; }
-
-    SkScalar SkRect::height() const { return fBottom - fTop; }
-
-    bool SkRect::contains(SkScalar x, SkScalar y) const {
-        return fLeft <= x && x < fRight && fTop <= y && y < fBottom;
-    }
-
-Thus, to draw a single pixel (assuming no matrix on the canvas), the
-rectangle should be initialized as follows:
-
-<!--?prettify lang=cc?-->
-
-    SkRect r = SkRect::MakeXYWH(x, y, SkIntToScalar(1), SkIntToScalar(1));
-
-The same conventions hold for the integer counterpart: SkIRect. This
-also dovetails with SkRegion, which has the same model for set
-membership, and which uses SkIRect.
diff --git a/src/third_party/skia/site/user/api/skregion.md b/src/third_party/skia/site/user/api/skregion.md
deleted file mode 100644
index f4f46c9..0000000
--- a/src/third_party/skia/site/user/api/skregion.md
+++ /dev/null
@@ -1,111 +0,0 @@
-SkRegion
-========
-
-*Regions - set operations with rectangles*
-
-<!-- Updated Mar 4, 2011 -->
-
-Regions are a highly compressed way to represent (integer) areas. Skia
-uses them to represent (internally) the current clip on the
-canvas. Regions take their inspiration from the data type with the
-same name on the original Macintosh (thank you Bill).
-
-Regions are opaque structures, but they can be queried via
-iterators. Best of all, they can be combined with other regions and
-with rectangles (which can be thought of as "simple" regions. If you
-remember Set operations from math class (intersection, union,
-difference, etc.), then you're all ready to use regions.
-
-<!--?prettify lang=cc?-->
-
-    bool SkRegion::isEmpty();
-    bool SkRegion::isRect();
-    bool SkRegion::isComplex();
-
-Regions can be classified into one of three types: empty, rectangular,
-or complex.
-
-Empty regions are just that, empty. All empty regions are equal (using
-operator==). Compare this to rectangles (SkRect or SkIRect). Any
-rectangle with fLeft >= fRight or fTop >= fBottom is consider empty,
-but clearly there are different empty rectangles that are not equal.
-
-<!--?prettify lang=cc?-->
-
-    SkRect a = { 0, 0, 0, 0 };
-    SkRect b = { 1, 1, 1, 1 };
-
-Both a and b are empty, but they are definitely not equal to each
-other. However, with regions, all empty regions are equal. If you
-query its bounds, you will always get { 0, 0, 0, 0 }. Even if you
-translate it, it will still be all zeros.
-
-<!--?prettify lang=cc?-->
-
-<!--?prettify lang=cc?-->
-
-    SkRegion a, b;   // regions default to empty
-    assert(a == b);
-    a.offset(10, 20);
-    assert(a == b);
-    assert(a.getBounds() == { 0, 0, 0, 0 });   // not legal C++, but you get the point
-    assert(b.getBounds() == { 0, 0, 0, 0 });
-
-To initialize a region to something more interesting, use one of the
-set() methods
-
-<!--?prettify lang=cc?-->
-
-    SkRegion a, b;
-    a.setRect(10, 10, 50, 50);
-    b.setRect(rect);    // see SkIRect
-    c.setPath(path);   // see SkPath
-
-This is the first step that SkCanvas performs when one of its
-clip...() methods are called. The clip data is first transformed into
-device coordinates (see SkMatrix), and then a region is build from the
-data (either a rect or a path). The final step is to combine this new
-region with the existing clip using the specified operator.
-
-<!--?prettify lang=cc?-->
-
-    enum Op {
-        kUnion_Op,
-        kIntersect_Op,
-        kDifference_Op,
-        kXor_Op,
-        kReverseDifference_Op,
-        kReplace_Op
-    };
-
-By default, intersect op is used when a clip call is made, but the
-other operators are equally valid.
-
-<!--?prettify lang=cc?-->
-
-    // returns true if the resulting clip is non-empty (i.e. drawing can
-    // still occur)
-    bool SkCanvas::clipRect(const SkRect& rect, SkRegion::Op op) {
-        SkRegion rgn;
-    
-        // peek at the CTM (current transformation matrix on the canvas)
-        const SkMatrix& m = this->getTotalMatrix();
-    
-        if (m.rectStaysRect()) {    // check if a transformed rect can be
-                                    // represented as another rect
-
-            SkRect deviceRect;
-            m.mapRect(&deviceRect, rect);
-            SkIRect intRect;
-            deviceRect.round(&intRect);
-            rgn.setRect(intRect);
-        } else {  // matrix rotates or skew (or is perspective)
-            SkPath path;
-            path.addRect(rect);
-            path.transform(m);
-            rgn.setPath(path);
-        }
-    
-        // now combine the new region with the current one, using the specified *op*
-        return fCurrentClip.op(rgn, op);
-    }
diff --git a/src/third_party/skia/site/user/api/undocumented.md b/src/third_party/skia/site/user/api/undocumented.md
new file mode 100644
index 0000000..813840d
--- /dev/null
+++ b/src/third_party/skia/site/user/api/undocumented.md
@@ -0,0 +1,949 @@
+undocumented
+===
+
+
+<a name='SkBBHFactory'></a>
+
+---
+
+<a name='GrBackendSemaphore'></a>
+
+---
+
+<a name='SkClipOp'></a>
+
+---
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkClipOp_kDifference'><code>SkClipOp::kDifference</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkClipOp_kIntersect'><code>SkClipOp::kIntersect</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+</table>
+
+<a name='SkColorFilter'></a>
+
+---
+
+<a name='SkColorSpace'></a>
+
+---
+
+<a name='SkColorSpace_MakeSRGBLinear'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='#sk_sp'>sk sp</a>&lt;<a href='#SkColorSpace'>SkColorSpace</a>&gt; <a href='#SkColorSpace_MakeSRGBLinear'>MakeSRGBLinear</a>()
+</pre>
+
+<a name='SkColorSpace_gammaCloseToSRGB'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkColorSpace_gammaCloseToSRGB'>gammaCloseToSRGB</a>() const
+</pre>
+
+<a name='SkColorSpace_Equals'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static bool <a href='#SkColorSpace_Equals'>Equals</a>(const <a href='#SkColorSpace'>SkColorSpace</a>* src, const <a href='#SkColorSpace'>SkColorSpace</a>* dst)
+</pre>
+
+<a name='SkCreateColorSpaceXformCanvas'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+std::unique_ptr&lt;<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>&gt; SK_API <a href='#SkCreateColorSpaceXformCanvas'>SkCreateColorSpaceXformCanvas</a>(<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>* target,
+                                                     <a href='#sk_sp'>sk sp</a>&lt;<a href='#SkColorSpace'>SkColorSpace</a>&gt; targetCS)
+</pre>
+
+<a name='SkData'></a>
+
+---
+
+<a name='DebugCanvas'></a>
+
+---
+
+<a name='SkDebugf'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+SK_API void <a href='#SkDebugf'>SkDebugf</a>(const char format[], ...)
+</pre>
+
+<a name='SkDeferredDisplayList'></a>
+
+---
+
+<a name='Recorder'></a>
+
+<a name='SkDeferredDisplayListRecorder'></a>
+
+---
+
+<a name='SkDeserialProcs'></a>
+
+---<table style='border-collapse: collapse; width: 62.5em'>
+
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Type</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Member</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkDeserialPictureProc</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkDeserialProcs_fPictureProc'><code>fPictureProc</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>void*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkDeserialProcs_fPictureCtx'><code>fPictureCtx</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkDeserialTypefaceProc</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkDeserialProcs_fTypefaceProc'><code>fTypefaceProc</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>void*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkDeserialProcs_fTypefaceCtx'><code>fTypefaceCtx</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+</table>
+
+<a name='SkBaseDevice'></a>
+
+---
+
+<a name='SkDocument'></a>
+
+---
+
+<a name='SkDocument_beginPage'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>* <a href='#SkDocument_beginPage'>beginPage</a>(<a href='#SkScalar'>SkScalar</a> width, <a href='#SkScalar'>SkScalar</a> height, const <a href='SkRect_Reference#SkRect'>SkRect</a>* content = NULL)
+</pre>
+
+<a name='PDF'></a>
+
+<a name='SkDrawLooper'></a>
+
+---
+
+<a name='SkDrawable'></a>
+
+---
+
+<a name='SkDrawable_draw'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkDrawable_draw'>draw</a>(<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>*, const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* = NULL)
+</pre>
+
+<a name='SkFilterQuality'></a>
+
+---
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kNone_SkFilterQuality'><code>kNone_SkFilterQuality</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kLow_SkFilterQuality'><code>kLow_SkFilterQuality</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kMedium_SkFilterQuality'><code>kMedium_SkFilterQuality</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='kHigh_SkFilterQuality'><code>kHigh_SkFilterQuality</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+</table>
+
+<a name='Nearest_Neighbor'></a>
+
+<a name='Bilerp'></a>
+
+<a name='MipMap'></a>
+
+<a name='BiCubic'></a>
+
+<a name='Advance'></a>
+
+<a name='Engine'></a>
+
+<a name='SkTextEncoding'></a>
+
+---
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkTextEncoding::kUTF8'><code>SkTextEncoding::kUTF8</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkTextEncoding::kUTF16'><code>SkTextEncoding::kUTF16</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkTextEncoding::kUTF32'><code>SkTextEncoding::kUTF32</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkTextEncoding::kGlyphID'><code>SkTextEncoding::kGlyphID</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+</table>
+
+<a name='SkFont'></a>
+
+---
+
+<a name='SkFontHinting'></a>
+
+---
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontHinting::kNone'><code>SkFontHinting::kNone</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontHinting::kSlight'><code>SkFontHinting::kSlight</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontHinting::kNormal'><code>SkFontHinting::kNormal</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontHinting::kFull'><code>SkFontHinting::kFull</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+</table>
+
+<a name='SkFontMetrics'></a>
+
+---
+
+<a href='#SkFontMetrics'>SkFontMetrics</a> is filled out by <a href='SkPaint_Reference#SkPaint_getFontMetrics'>SkPaint::getFontMetrics</a>. <a href='#SkFontMetrics'>SkFontMetrics</a> contents
+reflect the values
+computed by <a href='#Font_Manager'>Font Manager</a> using <a href='#Typeface'>Typeface</a>. Values are set to zero if they are
+not available.
+
+All vertical values are relative to the baseline, on a y-axis pointing down.
+Zero is on the baseline, negative values are above the baseline, and positive
+values are below the baseline.
+
+<a href='#SkFontMetrics_fUnderlineThickness'>fUnderlineThickness</a> and <a href='#SkFontMetrics_fUnderlinePosition'>fUnderlinePosition</a> have a bit set in <a href='#SkFontMetrics_fFlags'>fFlags</a> if their values
+are valid, since their value may be zero.
+
+<a href='#SkFontMetrics_fStrikeoutThickness'>fStrikeoutThickness</a> and <a href='#SkFontMetrics_fStrikeoutPosition'>fStrikeoutPosition</a> have a bit set in <a href='#SkFontMetrics_fFlags'>fFlags</a> if their values
+are valid, since their value may be zero.
+
+<a name='SkFontMetrics_FontMetricsFlags'></a>
+
+---
+
+<a href='#SkFontMetrics_FontMetricsFlags'>FontMetricsFlags</a> are set in <a href='#SkFontMetrics_fFlags'>fFlags</a> when underline and strikeout metrics are valid;
+the underline or strikeout metric may be valid and zero.
+Fonts with embedded bitmaps may not have valid underline or strikeout metrics.
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_kUnderlineThicknessIsValid_Flag'><code>SkFontMetrics::kUnderlineThicknessIsValid_Flag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0x0001</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+set if fUnderlineThickness is valid</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_kUnderlinePositionIsValid_Flag'><code>SkFontMetrics::kUnderlinePositionIsValid_Flag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0x0002</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+set if fUnderlinePosition is valid</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_kStrikeoutThicknessIsValid_Flag'><code>SkFontMetrics::kStrikeoutThicknessIsValid_Flag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0x0004</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+set if fStrikeoutThickness is valid</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_kStrikeoutPositionIsValid_Flag'><code>SkFontMetrics::kStrikeoutPositionIsValid_Flag</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0x0008</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+set if fStrikeoutPosition is valid</td>
+  </tr>
+</table><table style='border-collapse: collapse; width: 62.5em'>
+
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Type</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Member</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>uint32_t</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fFlags'><code>fFlags</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+is set to FontMetricsFlags when metrics are valid</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fTop'><code>fTop</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Greatest extent above the baseline for any glyph.
+Typically less than zero.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fAscent'><code>fAscent</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Recommended distance above the baseline to reserve for a line of text.
+Typically less than zero.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fDescent'><code>fDescent</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Recommended distance below the baseline to reserve for a line of text.
+Typically greater than zero.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fBottom'><code>fBottom</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Greatest extent below the baseline for any glyph.
+Typically greater than zero.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fLeading'><code>fLeading</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Recommended distance to add between lines of text.
+Typically greater than or equal to zero.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fAvgCharWidth'><code>fAvgCharWidth</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Average character width, if it is available.
+Zero if no average width is stored in the font.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fMaxCharWidth'><code>fMaxCharWidth</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+maximum character width</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fXMin'><code>fXMin</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Minimum bounding box x-axis value for all <a href='#Glyph'>Glyphs</a>.
+Typically less than zero.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fXMax'><code>fXMax</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Maximum bounding box x-axis value for all <a href='#Glyph'>Glyphs</a>.
+Typically greater than zero.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fXHeight'><code>fXHeight</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+May be zero if no lower-case height is stored in the font.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fCapHeight'><code>fCapHeight</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+May be zero if no upper-case height is stored in the font.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fUnderlineThickness'><code>fUnderlineThickness</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+If the metric is valid, the <a href='#SkFontMetrics_kUnderlineThicknessIsValid_Flag'>kUnderlineThicknessIsValid Flag</a> is set in <a href='#SkFontMetrics_fFlags'>fFlags</a>.
+If <a href='#SkFontMetrics_kUnderlineThicknessIsValid_Flag'>kUnderlineThicknessIsValid Flag</a> is clear, <a href='#SkFontMetrics_fUnderlineThickness'>fUnderlineThickness</a> is zero.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fUnderlinePosition'><code>fUnderlinePosition</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Position of the top of the underline stroke relative to the baseline.
+Typically positive when valid.
+
+If the metric is valid, the <a href='#SkFontMetrics_kUnderlinePositionIsValid_Flag'>kUnderlinePositionIsValid Flag</a> is set in <a href='#SkFontMetrics_fFlags'>fFlags</a>.
+If <a href='#SkFontMetrics_kUnderlinePositionIsValid_Flag'>kUnderlinePositionIsValid Flag</a> is clear, <a href='#SkFontMetrics_fUnderlinePosition'>fUnderlinePosition</a> is zero.
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fStrikeoutThickness'><code>fStrikeoutThickness</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+If the metric is valid, the <a href='#SkFontMetrics_kStrikeoutThicknessIsValid_Flag'>kStrikeoutThicknessIsValid Flag</a> is set in <a href='#SkFontMetrics_fFlags'>fFlags</a>.
+If <a href='#SkFontMetrics_kStrikeoutThicknessIsValid_Flag'>kStrikeoutThicknessIsValid Flag</a> is clear, <a href='#SkFontMetrics_fStrikeoutThickness'>fStrikeoutThickness</a> is zero.
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkFontMetrics_fStrikeoutPosition'><code>fStrikeoutPosition</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+Position of the bottom of the strikeout stroke relative to the baseline.
+Typically negative when valid.
+
+If the metric is valid, the <a href='#SkFontMetrics_kStrikeoutPositionIsValid_Flag'>kStrikeoutPositionIsValid Flag</a> is set in <a href='#SkFontMetrics_fFlags'>fFlags</a>.
+If <a href='#SkFontMetrics_kStrikeoutPositionIsValid_Flag'>kStrikeoutPositionIsValid Flag</a> is clear, <a href='#SkFontMetrics_fStrikeoutPosition'>fStrikeoutPosition</a> is zero.
+</td>
+  </tr>
+</table>
+
+<a name='SkFontMetrics_hasUnderlineThickness'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkFontMetrics_hasUnderlineThickness'>hasUnderlineThickness</a>(<a href='#SkScalar'>SkScalar</a>* thickness) const
+</pre>
+
+<a name='SkFontMetrics_hasUnderlinePosition'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkFontMetrics_hasUnderlinePosition'>hasUnderlinePosition</a>(<a href='#SkScalar'>SkScalar</a>* position) const
+</pre>
+
+<a name='SkFontMetrics_hasStrikeoutThickness'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkFontMetrics_hasStrikeoutThickness'>hasStrikeoutThickness</a>(<a href='#SkScalar'>SkScalar</a>* thickness) const
+</pre>
+
+<a name='SkFontMetrics_hasStrikeoutPosition'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkFontMetrics_hasStrikeoutPosition'>hasStrikeoutPosition</a>(<a href='#SkScalar'>SkScalar</a>* position) const
+</pre>
+
+<a name='GrContext'></a>
+
+---
+
+<a name='GrContext_flush'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#GrContext_flush'>flush</a>()
+</pre>
+
+<a name='ID'></a>
+
+<a name='ArcTo'></a>
+
+<a name='SkISize'></a>
+
+---
+
+<a name='SkISize_width'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int32_t <a href='#SkISize_width'>width</a>() const
+</pre>
+
+<a name='SkISize_height'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int32_t <a href='#SkISize_height'>height</a>() const
+</pre>
+
+<a name='SkImageFilter'></a>
+
+---
+
+<a name='SkMaskFilter'></a>
+
+---
+
+<a name='SkMetaData'></a>
+
+---
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaintDefaults_Hinting'><code>SkPaintDefaults_Hinting</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaintDefaults_TextSize'><code>SkPaintDefaults_TextSize</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>12</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaintDefaults_MiterLimit'><code>SkPaintDefaults_MiterLimit</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>4</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+
+
+<a name='SkPathOp'></a>
+
+---
+
+</table>
+
+<a name='Op'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool SK_API <a href='#Op'>Op</a>(const <a href='SkPath_Reference#SkPath'>SkPath</a>& one, const <a href='SkPath_Reference#SkPath'>SkPath</a>& two, <a href='#SkPathOp'>SkPathOp</a> op, <a href='SkPath_Reference#SkPath'>SkPath</a>* result)
+</pre>
+
+<a name='SkPathEffect'></a>
+
+---
+
+<a name='SkPictureRecorder'></a>
+
+---
+
+<a name='SkPictureRecorder_beginRecording'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>* <a href='#SkPictureRecorder_beginRecording'>beginRecording</a>(const <a href='SkRect_Reference#SkRect'>SkRect</a>& bounds, <a href='#SkBBHFactory'>SkBBHFactory</a>* bbhFactory = NULL,
+                         uint32_t recordFlags = 0)
+</pre>
+
+<a name='Storage'></a>
+
+<a name='SkPixelRef'></a>
+
+---
+
+<a name='SkPixelRef_width'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkPixelRef_width'>width</a>() const
+</pre>
+
+<a name='SkPixelRef_height'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int <a href='#SkPixelRef_height'>height</a>() const
+</pre>
+
+<a name='SkPixelRef_isImmutable'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#SkPixelRef_isImmutable'>isImmutable</a>() const
+</pre>
+
+<a name='SkPixelRef_setImmutable'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+void <a href='#SkPixelRef_setImmutable'>setImmutable</a>()
+</pre>
+
+<a name='SkPoint3'></a>
+
+---
+
+<a name='Arct'></a>
+
+<a name='SkRSXform'></a>
+
+---<table style='border-collapse: collapse; width: 62.5em'>
+
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Type</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Member</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRSXform_fSCos'><code>fSCos</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRSXform_fSSin'><code>fSSin</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRSXform_fTx'><code>fTx</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkScalar</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkRSXform_fTy'><code>fTy</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+</table>
+
+<a name='SkRasterHandleAllocator'></a>
+
+---
+
+<a name='SkRasterHandleAllocator_Handle'></a>
+
+---
+
+<a name='SkRasterHandleAllocator_Rec'></a>
+
+---
+
+<a name='SkRasterHandleAllocator_MakeCanvas'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static std::unique_ptr&lt;<a href='SkCanvas_Reference#SkCanvas'>SkCanvas</a>&gt; <a href='#SkRasterHandleAllocator_MakeCanvas'>MakeCanvas</a>(std::unique_ptr&lt;<a href='#SkRasterHandleAllocator'>SkRasterHandleAllocator</a>&gt;,
+                                            const <a href='SkImageInfo_Reference#SkImageInfo'>SkImageInfo</a>&, const <a href='#SkRasterHandleAllocator_Rec'>Rec</a>* rec = nullptr)
+</pre>
+
+<a name='SkRefCnt'></a>
+
+---
+
+<a name='GrBackendRenderTarget'></a>
+
+---
+
+<a name='GrBackendRenderTarget_isValid'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#GrBackendRenderTarget_isValid'>isValid</a>() const
+</pre>
+
+<a name='GrRenderTarget'></a>
+
+---
+
+<a name='Canvas'></a>
+
+<a name='Arc'></a>
+
+<a name='Sweep_Flag'></a>
+
+<a name='SkScalar'></a>
+
+---
+
+<a name='SkSerialProcs'></a>
+
+---<table style='border-collapse: collapse; width: 62.5em'>
+
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Type</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Member</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkSerialPictureProc</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkSerialProcs_fPictureProc'><code>fPictureProc</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>void*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkSerialProcs_fPictureCtx'><code>fPictureCtx</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>SkSerialTypefaceProc</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkSerialProcs_fTypefaceProc'><code>fTypefaceProc</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>void*</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkSerialProcs_fTypefaceCtx'><code>fTypefaceCtx</code></a></td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+</table>
+
+<a name='SkShader'></a>
+
+---
+
+<a name='SkShader_TileMode'></a>
+
+---
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkShader_kClamp_TileMode'><code>SkShader::kClamp_TileMode</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkShader_kRepeat_TileMode'><code>SkShader::kRepeat_TileMode</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>1</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkShader_kMirror_TileMode'><code>SkShader::kMirror_TileMode</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>2</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+</table>
+
+<a name='SkShader_MakeBitmapShader'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='#sk_sp'>sk sp</a>&lt;<a href='#SkShader'>SkShader</a>&gt; <a href='#SkShader_MakeBitmapShader'>MakeBitmapShader</a>(const <a href='SkBitmap_Reference#SkBitmap'>SkBitmap</a>& src, <a href='#SkShader_TileMode'>TileMode</a> tmx, <a href='#SkShader_TileMode'>TileMode</a> tmy,
+                                        const <a href='SkMatrix_Reference#SkMatrix'>SkMatrix</a>* localMatrix = nullptr)
+</pre>
+
+<a name='SkShader_MakeCompose'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+static <a href='#sk_sp'>sk sp</a>&lt;<a href='#SkShader'>SkShader</a>&gt; <a href='#SkShader_MakeCompose'>MakeCompose</a>(<a href='#sk_sp'>sk sp</a>&lt;<a href='#SkShader'>SkShader</a>&gt; dst, <a href='#sk_sp'>sk sp</a>&lt;<a href='#SkShader'>SkShader</a>&gt; src, <a href='SkBlendMode_Reference#SkBlendMode'>SkBlendMode</a> mode,
+                                   float lerp = 1)
+</pre>
+
+<a name='SkSize'></a>
+
+---
+
+<a name='SkSize_width'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int32_t <a href='#SkSize_width'>width</a>() const
+</pre>
+
+<a name='SkSize_height'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+int32_t <a href='#SkSize_height'>height</a>() const
+</pre>
+
+<a name='sk_sp'></a>
+
+---
+
+<a name='SkStreamAsset'></a>
+
+---
+
+<a name='SkString'></a>
+
+---
+
+<a name='SkSurfaceCharacterization'></a>
+
+---
+
+<a name='SkSurfaceProps'></a>
+
+---
+
+<a name='Legacy_Font_Host'></a>
+
+<a name='SkSurfaceProps_InitType'></a>
+
+---
+
+### Constants
+
+<table style='border-collapse: collapse; width: 62.5em'>
+  <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Const</th>
+<th style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>Value</th>
+<th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr>
+  <tr style='background-color: #f0f0f0; '>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkSurfaceProps_kLegacyFontHost_InitType'><code>SkSurfaceProps::kLegacyFontHost_InitType</code></a></td>
+    <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>0</td>
+    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>
+</td>
+  </tr>
+</table>
+
+#
+Topic
+
+<a name='GrBackendTexture'></a>
+
+---
+
+<a name='GrBackendTexture_isValid'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+bool <a href='#GrBackendTexture_isValid'>isValid</a>() const
+</pre>
+
+<a name='ID'></a>
+
+<a name='SkFontID'></a>
+
+---
+
+<a name='SkTypeface'></a>
+
+---
+
+<a name='SkTypeface_uniqueID'></a>
+
+---
+
+<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
+<a href='#SkFontID'>SkFontID</a> <a href='#SkTypeface_uniqueID'>uniqueID</a>() const
+</pre>
+
+<a name='SkVertices'></a>
+
+---
+
+<a name='SkVertices_Bone'></a>
+
+---
+
+<a name='Colors'></a>
+
+<a name='Texs'></a>
+
+<a name='SkXfermodeImageFilter'></a>
+
+---
+
+<a name='SkYUVAIndex'></a>
+
+---
+
diff --git a/src/third_party/skia/site/user/build.md b/src/third_party/skia/site/user/build.md
index bfcb18a..ece15da 100644
--- a/src/third_party/skia/site/user/build.md
+++ b/src/third_party/skia/site/user/build.md
@@ -7,8 +7,19 @@
 Skia uses [GN](https://chromium.googlesource.com/chromium/src/tools/gn/) to
 configure its builds.
 
-`is_official_build` and Third-party Dependencies
-------------------------------------------------
+  - [`is_official_build` and Third-party Dependencies](#third-party)
+  - [A note on software backend performance](#performance)
+  - [Quickstart](#quick)
+  - [Android](#android)
+  - [ChromeOS](#cros)
+  - [Mac](#macos)
+  - [iOS](#ios)
+  - [Windows](#windows)
+  - [Windows ARM64](#win-arm64)
+  - [CMake](#cmake)
+
+<span id="third-party">`is_official_build` and Third-party Dependencies</span>
+------------------------------------------------------------------------------
 
 Most users of Skia should set `is_official_build=true`, and most developers
 should leave it to its `false` default.
@@ -19,7 +30,7 @@
 
 In contrast, the developer-oriented default is an unoptimized build with full
 debug symbols and all third-party dependencies built from source and embedded
-into libskia.  This is how do all our manual and automated testing.
+into libskia.  This is how we do all our manual and automated testing.
 
 Skia offers several features that make use of third-party libraries, like
 libpng, libwebp, or libjpeg-turbo to decode images, or ICU and sftnly to subset
@@ -33,8 +44,20 @@
 use `extra_cflags` and `extra_ldflags` to add include or library paths if
 needed.
 
-Quickstart
-----------
+<span id="performance">A note on software backend performance</span>
+--------------------------------------------------------------------
+
+A number of routines in Skia's software backend have been written to run
+fastest when compiled by Clang.  If you depend on software rasterization, image
+decoding, or color space conversion and compile Skia with GCC, MSVC or another
+compiler, you will see dramatically worse performance than if you use Clang.
+
+This choice was only a matter of prioritization; there is nothing fundamentally
+wrong with non-Clang compilers.  So if this is a serious issue for you, please
+let us know on the mailing list.
+
+<span id="quick">Quickstart</span>
+----------------------------------
 
 Run GN to generate your build files.
 
@@ -43,7 +66,7 @@
 
 If you find you don't have `bin/gn`, make sure you've run
 
-    python tools/git-sync-deps
+    python2 tools/git-sync-deps
 
 GN allows fine-grained settings for developers and special situations.
 
@@ -67,8 +90,12 @@
     ninja -C out/Cached
     ninja -C out/RTTI
 
-Android
--------
+If some header files are missing, install the corresponding dependencies
+
+    tools/install_dependencies.sh
+
+<span id="android">Android</span>
+---------------------------------
 
 To build Skia for Android you need an [Android
 NDK](https://developer.android.com/ndk/index.html).
@@ -76,19 +103,17 @@
 If you do not have an NDK and have access to CIPD, you
 can use one of these commands to fetch the NDK our bots use:
 
-    python infra/bots/assets/android_ndk_linux/download.py  -t /tmp/ndk
-    python infra/bots/assets/android_ndk_darwin/download.py -t /tmp/ndk
-    python infra/bots/assets/android_ndk_windows/download.py -t C:/ndk
+    python2 infra/bots/assets/android_ndk_linux/download.py  -t /tmp/ndk
+    python2 infra/bots/assets/android_ndk_darwin/download.py -t /tmp/ndk
+    python2 infra/bots/assets/android_ndk_windows/download.py -t C:/ndk
 
 When generating your GN build files, pass the path to your `ndk` and your
 desired `target_cpu`:
 
-    bin/gn gen out/arm      --args='ndk="/tmp/ndk" target_cpu="arm"'
-    bin/gn gen out/arm64    --args='ndk="/tmp/ndk" target_cpu="arm64"'
-    bin/gn gen out/mips64el --args='ndk="/tmp/ndk" target_cpu="mips64el"'
-    bin/gn gen out/mipsel   --args='ndk="/tmp/ndk" target_cpu="mipsel"'
-    bin/gn gen out/x64      --args='ndk="/tmp/ndk" target_cpu="x64"'
-    bin/gn gen out/x86      --args='ndk="/tmp/ndk" target_cpu="x86"'
+    bin/gn gen out/arm   --args='ndk="/tmp/ndk" target_cpu="arm"'
+    bin/gn gen out/arm64 --args='ndk="/tmp/ndk" target_cpu="arm64"'
+    bin/gn gen out/x64   --args='ndk="/tmp/ndk" target_cpu="x64"'
+    bin/gn gen out/x86   --args='ndk="/tmp/ndk" target_cpu="x86"'
 
 Other arguments like `is_debug` and `is_component_build` continue to work.
 Tweaking `ndk_api` gives you access to newer Android features like Vulkan.
@@ -101,13 +126,105 @@
     adb push resources /data/local/tmp
     adb shell "cd /data/local/tmp; ./dm --src gm --config gl"
 
-Mac
----
+
+<span id="cros">ChromeOS</span>
+-------------------------------
+
+To cross-compile Skia for arm ChromeOS devices the following is needed:
+
+  - Clang 4 or newer
+  - An armhf sysroot
+  - The (E)GL lib files on the arm chromebook to link against.
+
+To compile Skia for an x86 ChromeOS device, one only needs Clang and the lib files.
+
+If you have access to CIPD, you can fetch all of these as follows:
+
+    python2 infra/bots/assets/clang_linux/download.py  -t /opt/clang
+    python2 infra/bots/assets/armhf_sysroot/download.py -t /opt/armhf_sysroot
+    python2 infra/bots/assets/chromebook_arm_gles/download.py -t /opt/chromebook_arm_gles
+    python2 infra/bots/assets/chromebook_x86_64_gles/download.py -t /opt/chromebook_x86_64_gles
+
+If you don't have authorization to use those assets, then see the README.md files for
+[armhf_sysroot](https://skia.googlesource.com/skia/+/master/infra/bots/assets/armhf_sysroot/README.md),
+[chromebook_arm_gles](https://skia.googlesource.com/skia/+/master/infra/bots/assets/chromebook_arm_gles/README.md), and
+[chromebook_x86_64_gles](https://skia.googlesource.com/skia/+/master/infra/bots/assets/chromebook_x86_64_gles/README.md)
+for instructions on creating those assets.
+
+Once those files are in place, generate the GN args that resemble the following:
+
+    #ARM
+    cc= "/opt/clang/bin/clang"
+    cxx = "/opt/clang/bin/clang++"
+
+    extra_asmflags = [
+        "--target=armv7a-linux-gnueabihf",
+        "--sysroot=/opt/armhf_sysroot/",
+        "-march=armv7-a",
+        "-mfpu=neon",
+        "-mthumb",
+    ]
+    extra_cflags=[
+        "--target=armv7a-linux-gnueabihf",
+        "--sysroot=/opt/armhf_sysroot",
+        "-I/opt/chromebook_arm_gles/include",
+        "-I/opt/armhf_sysroot/include/",
+        "-I/opt/armhf_sysroot/include/c++/4.8.4/",
+        "-I/opt/armhf_sysroot/include/c++/4.8.4/arm-linux-gnueabihf/",
+        "-DMESA_EGL_NO_X11_HEADERS",
+        "-funwind-tables",
+    ]
+    extra_ldflags=[
+        "--sysroot=/opt/armhf_sysroot",
+        "-B/opt/armhf_sysroot/bin",
+        "-B/opt/armhf_sysroot/gcc-cross",
+        "-L/opt/armhf_sysroot/gcc-cross",
+        "-L/opt/armhf_sysroot/lib",
+        "-L/opt/chromebook_arm_gles/lib",
+        "--target=armv7a-linux-gnueabihf",
+    ]
+    target_cpu="arm"
+    skia_use_fontconfig = false
+    skia_use_system_freetype2 = false
+    skia_use_egl = true
+
+
+    # x86_64
+    cc= "/opt/clang/bin/clang"
+    cxx = "/opt/clang/bin/clang++"
+    extra_cflags=[
+        "-I/opt/clang/include/c++/v1/",
+        "-I/opt/chromebook_x86_64_gles/include",
+        "-DMESA_EGL_NO_X11_HEADERS",
+        "-DEGL_NO_IMAGE_EXTERNAL",
+    ]
+    extra_ldflags=[
+        "-stdlib=libc++",
+        "-fuse-ld=lld",
+        "-L/opt/chromebook_x86_64_gles/lib",
+    ]
+    target_cpu="x64"
+    skia_use_fontconfig = false
+    skia_use_system_freetype2 = false
+    skia_use_egl = true
+
+Compile dm (or another executable of your choice) with ninja, as per usual.
+
+Push the binary to a chromebook via ssh and [run dm as normal](https://skia.org/dev/testing/tests)
+using the gles GPU config.
+
+Most chromebooks by default have their home directory partition marked as noexec.
+To avoid "permission denied" errors, remember to run something like:
+
+    sudo mount -i -o remount,exec /home/chronos
+
+<span id="macos">Mac</span>
+---------------------------
 
 Mac users may want to pass `--ide=xcode` to `bin/gn gen` to generate an Xcode project.
 
-iOS
----
+<span id="ios">iOS</span>
+-------------------------
 
 Run GN to generate your build files.  Set `target_os="ios"` to build for iOS.
 This defaults to `target_cpu="arm64"`.  Choosing `x64` targets the iOS simulator.
@@ -116,34 +233,64 @@
     bin/gn gen out/ios32  --args='target_os="ios" target_cpu="arm"'
     bin/gn gen out/iossim --args='target_os="ios" target_cpu="x64"'
 
-Googlers who want to sign and run iOS test binaries can do so by running something like
+This will also package (and for devices, sign) iOS test binaries. This defaults to a
+Google signing identity and provisioning profile. To use a different one set `skia_ios_identity`
+to match your code signing identity and `skia_ios_profile` to the name of your provisioning
+profile, e.g. `skia_ios_identity=".*Jane Doe.*" skia_ios_profile="iPad Profile"`. A list of
+identities can be found by typing `security find-identity` on the command line. The name of the
+provisioning profile should be available on the Apple Developer site. Alternatively,
+`skia_ios_profile` can be the absolute path to the mobileprovision file.
 
-    python gn/package_ios.py out/Debug/dm
-    python gn/package_ios.py out/Release/nanobench
-
-These commands will create and sign `dm.app` or `nanobench.app` packages you
-can push to iOS devices registered for Google development.  `ios-deploy` makes
-installing and running these packages easy:
+For signed packages `ios-deploy` makes installing and running them on a device easy:
 
     ios-deploy -b out/Debug/dm.app -d --args "--match foo"
 
+Alternatively you can generate an Xcode project by passing `--ide=xcode` to `bin/gn gen`.
+
 If you find yourself missing a Google signing identity or provisioning profile,
 you'll want to have a read through go/appledev.
 
-Windows
--------
+Deploying to a device with an OS older than the current SDK doesn't currently work through Xcode,
+but can be done on the command line by setting the environment variable IPHONEOS_DEPLOYMENT_TARGET
+to the desired OS version.
 
-Skia can build on Windows with Visual Studio 2015 Update 3, or Visual Studio
-2017 by setting `msvc = 2017` in GN.  No older versions are supported. The bots
-use a packaged 2015 toolchain, which Googlers can download like this:
+<span id="windows">Windows</span>
+---------------------------------
 
-    python infra/bots/assets/win_toolchain/download.py -t C:/toolchain
+Skia can build on Windows with Visual Studio 2017 or 2019.
+If GN is unable to locate either of those, it will print an error message. In that
+case, you can pass your `VC` path to GN via `win_vc`.
 
-If you pass that downloaded path to GN via `windk`, you can build using that
-toolchain instead of your own from Visual Studio.  This toolchain is the only
-way we support 32-bit builds with 2015, by also setting `target_cpu="x86"`.
-32-bit builds should work with the default 2017 install if you follow the
-directions GN prints to set up your environment.
+Skia can be compiled with the free [Build Tools for Visual Studio 2017 or
+2019](https://www.visualstudio.com/downloads/#build-tools-for-visual-studio-2019).
+
+The bots use a packaged 2017 toolchain, which Googlers can download like this:
+
+    python2 infra/bots/assets/win_toolchain/download.py -t C:/toolchain
+
+You can then pass the VC and SDK paths to GN by setting your GN args:
+
+    win_vc = "C:\toolchain\VC"
+    win_sdk = "C:\toolchain\win_sdk"
+
+This toolchain is the only way we support 32-bit builds, by also setting `target_cpu="x86"`.
+
+The Skia build assumes that the PATHEXT environment variable contains ".EXE".
+
+### **Highly Recommended**: Build with clang-cl
+
+Skia uses generated code that is only optimized when Skia is built with clang. Other compilers get generic
+unoptimized code.
+
+Setting the `cc` and `cxx` gn args is _not_ sufficient to build with clang-cl. These variables
+are ignored on Windows. Instead set the variable `clang_win` to your LLVM installation directory.
+If you installed the prebuilt LLVM downloaded from [here](https://releases.llvm.org/download.html
+"LLVM Download") in the default location that would be:
+
+    clang_win = "C:\Program Files\LLVM"
+
+Follow the standard Windows path specification and not MinGW convention (e.g.
+`C:\Program Files\LLVM` not ~~`/c/Program Files/LLVM`~~).
 
 ### Visual Studio Solutions
 
@@ -156,7 +303,7 @@
 the `out` directory. First, create all of your GN configurations as usual.
 Pass `--ide=vs` when running `bin/gn gen` for each one. Then:
 
-    python gn/gn_meta_sln.py
+    python2 gn/gn_meta_sln.py
 
 This creates a new dedicated output directory and solution file
 `out/sln/skia.sln`. It has one solution configuration for each GN configuration,
@@ -164,8 +311,25 @@
 of inactive code blocks based on preprocessor definitions from the selected
 solution configuration.
 
-CMake
------
+<span id="win-arm64">Windows ARM64</span>
+-----------------------------------------
+
+There is early, experimental support for [Windows 10 on ARM](https://docs.microsoft.com/en-us/windows/arm/).
+This currently requires (a recent version of) MSVC, and the `Visual C++ compilers and libraries for ARM64`
+individual component in the Visual Studio Installer. For Googlers, the win_toolchain asset includes the
+ARM64 compiler.
+
+To use that toolchain, set the `target_cpu` GN argument to `"arm64"`. Note that OpenGL is not supported
+by Windows 10 on ARM, so Skia's GL backends are stubbed out, and will not work. ANGLE is supported:
+
+    bin/gn gen out/win-arm64 --args='target_cpu="arm64" skia_use_angle=true'
+
+This will produce a build of Skia that can use the software or ANGLE backends, in DM. Viewer only works
+when launched with `--backend angle`, because the software backend tries to use OpenGL to display the
+window contents.
+
+<span id="cmake">CMake</span>
+-----------------------------
 
 We have added a GN-to-CMake translator mainly for use with IDEs that like CMake
 project descriptions.  This is not meant for any purpose beyond development.
diff --git a/src/third_party/skia/site/user/download.md b/src/third_party/skia/site/user/download.md
index 75a53da..32c9fc3 100644
--- a/src/third_party/skia/site/user/download.md
+++ b/src/third_party/skia/site/user/download.md
@@ -1,34 +1,40 @@
 How to download Skia
 ====================
 
-Install depot_tools and Git
+Install `depot_tools` and Git
 ---------------------------
 
 Follow the instructions on [Installing Chromium's
 depot_tools](http://www.chromium.org/developers/how-tos/install-depot-tools)
-to download depot_tools (which includes gclient, git-cl, and Ninja).
+to download `depot_tools` (which includes gclient, git-cl, and Ninja). 
+Below is a summary of the necessary steps.
 
 <!--?prettify lang=sh?-->
 
     git clone 'https://chromium.googlesource.com/chromium/tools/depot_tools.git'
     export PATH="${PWD}/depot_tools:${PATH}"
 
-depot_tools will also install Git on your system, if it wasn't installed
+`depot_tools` will also install Git on your system, if it wasn't installed
 already.
 
 Clone the Skia repository
 -------------------------
 
+Skia can either be cloned using `git` or the `fetch` tool that is
+installed with `depot_tools`.
+
 <!--?prettify lang=sh?-->
 
     git clone https://skia.googlesource.com/skia.git
+    # or
+    # fetch skia
     cd skia
-    python tools/git-sync-deps
+    python2 tools/git-sync-deps
 
 Getting started with Skia
 -------------------------
 
-You probably now want to [build](./build) Skia.
+You will probably now want to [build](./build) Skia.
 
 Changing and contributing to Skia
 ---------------------------------
diff --git a/src/third_party/skia/site/user/index.md b/src/third_party/skia/site/user/index.md
index 5fb51e8..c27bd61 100644
--- a/src/third_party/skia/site/user/index.md
+++ b/src/third_party/skia/site/user/index.md
@@ -16,5 +16,6 @@
   * OpenGL
   * PDF
   * XPS
+  * SVG
   * Picture (for recording and then playing back into another Canvas)
 
diff --git a/src/third_party/skia/site/user/modules/METADATA b/src/third_party/skia/site/user/modules/METADATA
new file mode 100644
index 0000000..862837f
--- /dev/null
+++ b/src/third_party/skia/site/user/modules/METADATA
@@ -0,0 +1,3 @@
+{
+  "fileOrder": ["skottie", "canvaskit", "pathkit", "particles"]
+}
diff --git a/src/third_party/skia/site/user/modules/PathKit_effects.png b/src/third_party/skia/site/user/modules/PathKit_effects.png
new file mode 100644
index 0000000..1dbbb72
--- /dev/null
+++ b/src/third_party/skia/site/user/modules/PathKit_effects.png
Binary files differ
diff --git a/src/third_party/skia/site/user/modules/canvaskit.md b/src/third_party/skia/site/user/modules/canvaskit.md
new file mode 100644
index 0000000..d8398a4
--- /dev/null
+++ b/src/third_party/skia/site/user/modules/canvaskit.md
@@ -0,0 +1,429 @@
+CanvasKit - Skia + WebAssembly
+==============================
+
+Skia now offers a WebAssembly build for easy deployment of our graphics APIs on
+the web.
+
+CanvasKit provides a playground for testing new Canvas and SVG platform APIs,
+enabling fast-paced development on the web platform.
+It can also be used as a deployment mechanism for custom web apps requiring
+cutting-edge features, like Skia's [Lottie
+animation](https://skia.org/user/modules/skottie) support.
+
+
+Features
+--------
+
+  - WebGL context encapsulated as an SkSurface, allowing for direct drawing to
+    an HTML canvas
+  - Core set of Skia canvas/paint/path/text APIs available, see bindings
+  - Draws to a hardware-accelerated backend
+  - Security tested with Skia's fuzzers
+
+Samples
+-------
+
+<style>
+  #demo canvas {
+    border: 1px dashed #AAA;
+    margin: 2px;
+  }
+
+  #patheffect, #ink {
+    width: 400px;
+    height: 400px;
+  }
+
+  #sk_legos, #sk_drinks, #sk_party, #sk_onboarding {
+    width: 300px;
+    height: 300px;
+  }
+
+  figure {
+    display: inline-block;
+    margin: 0;
+  }
+
+  figcaption > a {
+    margin: 2px 10px;
+  }
+
+</style>
+
+<div id=demo>
+  <h3>Go beyond the HTML Canvas2D</h3>
+  <figure>
+    <canvas id=patheffect width=400 height=400></canvas>
+    <figcaption>
+      <a href="https://jsfiddle.skia.org/canvaskit/ea89749ae8c90bce807ea2e7e34fb7b09b950cee70d9db0a9cdfd2d67bd48ef0"
+          target=_blank rel=noopener>
+        Star JSFiddle</a>
+    </figcaption>
+  </figure>
+  <figure>
+    <canvas id=ink width=400 height=400></canvas>
+    <figcaption>
+      <a href="https://jsfiddle.skia.org/canvaskit/43475699d6d7d3d7dad1004c29f84015752a6a6dee2bb90f2e891b53e31d45cc"
+          target=_blank rel=noopener>
+        Ink JSFiddle</a>
+    </figcaption>
+  </figure>
+
+  <h3>Skottie (click for fiddles)</h3>
+  <a href="https://jsfiddle.skia.org/canvaskit/092690b273b41076d2f00f0d43d004893d6bb9992c387c0385efa8e6f6bc83d7"
+     target=_blank rel=noopener>
+    <canvas id=sk_legos width=300 height=300></canvas>
+  </a>
+  <a href="https://jsfiddle.skia.org/canvaskit/e7ac983d9859f89aff1b6d385190919202c2eb53d028a79992892cacceffd209"
+     target=_blank rel=noopener>
+    <canvas id=sk_drinks width=500 height=500></canvas>
+  </a>
+  <a href="https://jsfiddle.skia.org/canvaskit/0e06547181759731e7369d3e3613222a0826692f48c41b16504ed68d671583e1"
+     target=_blank rel=noopener>
+    <canvas id=sk_party width=500 height=500></canvas>
+  </a>
+  <a href="https://jsfiddle.skia.org/canvaskit/be3fc1c5c351e7f43cc2840033f80b44feb3475925264808f321bb9e2a21174a"
+     target=_blank rel=noopener>
+    <canvas id=sk_onboarding width=500 height=500></canvas>
+  </a>
+
+  <h3>Text Shaping using ICU and Harfbuzz</h3>
+  <figure>
+    <canvas id=shaping width=400 height=400></canvas>
+    <figcaption>
+      <a href="https://jsfiddle.skia.org/canvaskit/d5c61a106d57ff4ada119a46ddc3bfa479d343330d0c9e50da21f4ef113d0dee"
+          target=_blank rel=noopener>
+        Text Shaping JSFiddle</a>
+    </figcaption>
+  </figure>
+
+</div>
+
+<script type="text/javascript" charset="utf-8">
+(function() {
+  // Tries to load the WASM version if supported, shows error otherwise
+  let s = document.createElement('script');
+  var locate_file = '';
+  if (window.WebAssembly && typeof window.WebAssembly.compile === 'function') {
+    console.log('WebAssembly is supported!');
+    locate_file = 'https://unpkg.com/canvaskit-wasm@0.4.0/bin/';
+  } else {
+    console.log('WebAssembly is not supported (yet) on this browser.');
+    document.getElementById('demo').innerHTML = "<div>WASM not supported by your browser. Try a recent version of Chrome, Firefox, Edge, or Safari.</div>";
+    return;
+  }
+  s.src = locate_file + 'canvaskit.js';
+  s.onload = () => {
+  var CanvasKit = null;
+  var legoJSON = null;
+  var drinksJSON = null;
+  var confettiJSON = null;
+  var onboardingJSON = null;
+  var fullBounds = {fLeft: 0, fTop: 0, fRight: 500, fBottom: 500};
+  CanvasKitInit({
+    locateFile: (file) => locate_file + file,
+  }).ready().then((CK) => {
+    CanvasKit = CK;
+    DrawingExample(CanvasKit);
+    InkExample(CanvasKit);
+    ShapingExample(CanvasKit);
+     // Set bounds to fix the 4:3 resolution of the legos
+    SkottieExample(CanvasKit, 'sk_legos', legoJSON, {fLeft: -50, fTop: 0, fRight: 350, fBottom: 300});
+    // Re-size to fit
+    SkottieExample(CanvasKit, 'sk_drinks', drinksJSON, fullBounds);
+    SkottieExample(CanvasKit, 'sk_party', confettiJSON, fullBounds);
+    SkottieExample(CanvasKit, 'sk_onboarding', onboardingJSON, fullBounds);
+  });
+
+  fetch('https://storage.googleapis.com/skia-cdn/misc/lego_loader.json').then((resp) => {
+    resp.text().then((str) => {
+      legoJSON = str;
+      SkottieExample(CanvasKit, 'sk_legos', legoJSON, {fLeft: -50, fTop: 0, fRight: 350, fBottom: 300});
+    });
+  });
+
+  fetch('https://storage.googleapis.com/skia-cdn/misc/drinks.json').then((resp) => {
+    resp.text().then((str) => {
+      drinksJSON = str;
+      SkottieExample(CanvasKit, 'sk_drinks', drinksJSON, fullBounds);
+    });
+  });
+
+  fetch('https://storage.googleapis.com/skia-cdn/misc/confetti.json').then((resp) => {
+    resp.text().then((str) => {
+      confettiJSON = str;
+      SkottieExample(CanvasKit, 'sk_party', confettiJSON, fullBounds);
+    });
+  });
+
+  fetch('https://storage.googleapis.com/skia-cdn/misc/onboarding.json').then((resp) => {
+    resp.text().then((str) => {
+      onboardingJSON = str;
+      SkottieExample(CanvasKit, 'sk_onboarding', onboardingJSON, fullBounds);
+    });
+  });
+
+  function preventScrolling(canvas) {
+    canvas.addEventListener('touchmove', (e) => {
+      // Prevents touch events in the canvas from scrolling the canvas.
+      e.preventDefault();
+      e.stopPropagation();
+    });
+  }
+
+  function DrawingExample(CanvasKit) {
+    const surface = CanvasKit.MakeCanvasSurface('patheffect');
+    if (!surface) {
+      console.log('Could not make surface');
+    }
+    const context = CanvasKit.currentContext();
+
+    const canvas = surface.getCanvas();
+
+    const paint = new CanvasKit.SkPaint();
+
+    const textPaint = new CanvasKit.SkPaint();
+    textPaint.setColor(CanvasKit.Color(40, 0, 0, 1.0));
+    textPaint.setAntiAlias(true);
+
+    const textFont = new CanvasKit.SkFont(null, 30);
+
+    let i = 0;
+
+    let X = 200;
+    let Y = 200;
+
+    function drawFrame() {
+      const path = starPath(CanvasKit, X, Y);
+      CanvasKit.setCurrentContext(context);
+      const dpe = CanvasKit.MakeSkDashPathEffect([15, 5, 5, 10], i/5);
+      i++;
+
+      paint.setPathEffect(dpe);
+      paint.setStyle(CanvasKit.PaintStyle.Stroke);
+      paint.setStrokeWidth(5.0 + -3 * Math.cos(i/30));
+      paint.setAntiAlias(true);
+      paint.setColor(CanvasKit.Color(66, 129, 164, 1.0));
+
+      canvas.clear(CanvasKit.Color(255, 255, 255, 1.0));
+
+      canvas.drawPath(path, paint);
+      canvas.drawText('Try Clicking!', 10, 380, textPaint, textFont);
+      canvas.flush();
+      dpe.delete();
+      path.delete();
+      window.requestAnimationFrame(drawFrame);
+    }
+    window.requestAnimationFrame(drawFrame);
+
+    // Make animation interactive
+    let interact = (e) => {
+      if (!e.buttons) {
+        return;
+      }
+      X = e.offsetX;
+      Y = e.offsetY;
+    };
+    document.getElementById('patheffect').addEventListener('pointermove', interact);
+    document.getElementById('patheffect').addEventListener('pointerdown', interact);
+    preventScrolling(document.getElementById('patheffect'));
+
+    // A client would need to delete this if it didn't go on forever.
+    // font.delete();
+    // paint.delete();
+  }
+
+  function InkExample(CanvasKit) {
+    const surface = CanvasKit.MakeCanvasSurface('ink');
+    if (!surface) {
+      console.log('Could not make surface');
+    }
+    const context = CanvasKit.currentContext();
+
+    const canvas = surface.getCanvas();
+
+    let paint = new CanvasKit.SkPaint();
+    paint.setAntiAlias(true);
+    paint.setColor(CanvasKit.Color(0, 0, 0, 1.0));
+    paint.setStyle(CanvasKit.PaintStyle.Stroke);
+    paint.setStrokeWidth(4.0);
+    // This effect smooths out the drawn lines a bit.
+    paint.setPathEffect(CanvasKit.MakeSkCornerPathEffect(50));
+
+    // Draw I N K
+    let path = new CanvasKit.SkPath();
+    path.moveTo(80, 30);
+    path.lineTo(80, 80);
+
+    path.moveTo(100, 80);
+    path.lineTo(100, 15);
+    path.lineTo(130, 95);
+    path.lineTo(130, 30);
+
+    path.moveTo(150, 30);
+    path.lineTo(150, 80);
+    path.moveTo(170, 30);
+    path.lineTo(150, 55);
+    path.lineTo(170, 80);
+
+    let paths = [path];
+    let paints = [paint];
+
+    function drawFrame() {
+      CanvasKit.setCurrentContext(context);
+
+      for (let i = 0; i < paints.length && i < paths.length; i++) {
+        canvas.drawPath(paths[i], paints[i]);
+      }
+      canvas.flush();
+
+      window.requestAnimationFrame(drawFrame);
+    }
+
+    let hold = false;
+    let interact = (e) => {
+      let type = e.type;
+      if (type === 'lostpointercapture' || type === 'pointerup' || !e.pressure ) {
+        hold = false;
+        return;
+      }
+      if (hold) {
+        path.lineTo(e.offsetX, e.offsetY);
+      } else {
+        paint = paint.copy();
+        paint.setColor(CanvasKit.Color(Math.random() * 255, Math.random() * 255, Math.random() * 255, Math.random() + .2));
+        paints.push(paint);
+        path = new CanvasKit.SkPath();
+        paths.push(path);
+        path.moveTo(e.offsetX, e.offsetY);
+      }
+      hold = true;
+    };
+    document.getElementById('ink').addEventListener('pointermove', interact);
+    document.getElementById('ink').addEventListener('pointerdown', interact);
+    document.getElementById('ink').addEventListener('lostpointercapture', interact);
+    document.getElementById('ink').addEventListener('pointerup', interact);
+    preventScrolling(document.getElementById('ink'));
+    window.requestAnimationFrame(drawFrame);
+  }
+
+  function ShapingExample(CanvasKit) {
+    const surface = CanvasKit.MakeCanvasSurface('shaping');
+    if (!surface) {
+      console.log('Could not make surface');
+      return;
+    }
+    const context = CanvasKit.currentContext();
+    const skcanvas = surface.getCanvas();
+    const paint = new CanvasKit.SkPaint();
+    paint.setColor(CanvasKit.BLUE);
+    paint.setStyle(CanvasKit.PaintStyle.Stroke);
+
+    const textPaint = new CanvasKit.SkPaint();
+    const bigFont = new CanvasKit.SkFont(null, 30);
+    const smallFont = new CanvasKit.SkFont(null, 14);
+
+    const TEXT = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris ac leo vitae ipsum hendrerit euismod quis rutrum nibh. Quisque non suscipit urna. Donec enim urna, facilisis vitae volutpat in, mattis at elit. Sed quis augue et dolor dignissim fringilla. Sed non massa eu neque tristique malesuada. ';
+
+    let X = 280;
+    let Y = 190;
+
+    function drawFrame() {
+      CanvasKit.setCurrentContext(context);
+      skcanvas.clear(CanvasKit.TRANSPARENT);
+
+      const shapedText = new CanvasKit.ShapedText({
+        font: smallFont,
+        leftToRight: true,
+        text: TEXT,
+        width: X - 10,
+      });
+
+      skcanvas.drawRect(CanvasKit.LTRBRect(10, 10, X, Y), paint);
+      skcanvas.drawText(shapedText, 10, 10, textPaint, smallFont);
+      skcanvas.drawText('Try dragging the box!', 10, 380, textPaint, bigFont);
+
+      surface.flush();
+
+      shapedText.delete();
+
+      window.requestAnimationFrame(drawFrame);
+    }
+    window.requestAnimationFrame(drawFrame);
+
+    // Make animation interactive
+    let interact = (e) => {
+      if (!e.pressure) {
+        return;
+      }
+      X = e.offsetX;
+      Y = e.offsetY;
+    };
+    document.getElementById('shaping').addEventListener('pointermove', interact);
+    document.getElementById('shaping').addEventListener('pointerdown', interact);
+    document.getElementById('shaping').addEventListener('lostpointercapture', interact);
+    document.getElementById('shaping').addEventListener('pointerup', interact);
+    preventScrolling(document.getElementById('shaping'));
+    window.requestAnimationFrame(drawFrame);
+  }
+
+  function starPath(CanvasKit, X=128, Y=128, R=116) {
+    let p = new CanvasKit.SkPath();
+    p.moveTo(X + R, Y);
+    for (let i = 1; i < 8; i++) {
+      let a = 2.6927937 * i;
+      p.lineTo(X + R * Math.cos(a), Y + R * Math.sin(a));
+    }
+    return p;
+  }
+
+  function SkottieExample(CanvasKit, id, jsonStr, bounds) {
+    if (!CanvasKit || !jsonStr) {
+      return;
+    }
+    const animation = CanvasKit.MakeAnimation(jsonStr);
+    const duration = animation.duration() * 1000;
+    const size = animation.size();
+    let c = document.getElementById(id);
+    bounds = bounds || {fLeft: 0, fTop: 0, fRight: size.w, fBottom: size.h};
+
+    const surface = CanvasKit.MakeCanvasSurface(id);
+    if (!surface) {
+      console.log('Could not make surface');
+    }
+    const context = CanvasKit.currentContext();
+    const canvas = surface.getCanvas();
+
+    let firstFrame = new Date().getTime();
+
+    function drawFrame() {
+      let now = new Date().getTime();
+      let seek = ((now - firstFrame) / duration) % 1.0;
+      CanvasKit.setCurrentContext(context);
+      animation.seek(seek);
+
+      animation.render(canvas, bounds);
+      canvas.flush();
+      window.requestAnimationFrame(drawFrame);
+    }
+    window.requestAnimationFrame(drawFrame);
+    //animation.delete();
+  }
+  }
+  document.head.appendChild(s);
+})();
+</script>
+
+Lottie files courtesy of the lottiefiles.com community:
+[Lego Loader](https://www.lottiefiles.com/410-lego-loader),
+[I'm thirsty](https://www.lottiefiles.com/77-im-thirsty),
+[Confetti](https://www.lottiefiles.com/1370-confetti),
+[Onboarding](https://www.lottiefiles.com/1134-onboarding-1)
+
+Test server
+-----------
+Test your code on our [CanvasKit Fiddle](https://jsfiddle.skia.org/canvaskit)
+
+Download
+--------
+Get [CanvasKit on NPM](https://www.npmjs.com/package/canvaskit-wasm)
diff --git a/src/third_party/skia/site/user/modules/index.md b/src/third_party/skia/site/user/modules/index.md
new file mode 100644
index 0000000..8e9c5eb
--- /dev/null
+++ b/src/third_party/skia/site/user/modules/index.md
@@ -0,0 +1,2 @@
+Library Modules
+===============
diff --git a/src/third_party/skia/site/user/modules/particles.md b/src/third_party/skia/site/user/modules/particles.md
new file mode 100644
index 0000000..fd1d839
--- /dev/null
+++ b/src/third_party/skia/site/user/modules/particles.md
@@ -0,0 +1,504 @@
+Particles
+=========
+
+Skia’s particle module provides a way to quickly generate large numbers of
+drawing primitives with dynamic, animated behavior. Particles can be used to
+create effects like fireworks, spark trails, ambient “weather”, and much more.
+Nearly all properties and behavior are controlled by scripts written in Skia’s
+custom language, SkSL.
+
+
+Samples
+-------
+
+<style>
+  #demo canvas {
+    border: 1px dashed #AAA;
+    margin: 2px;
+  }
+
+  figure {
+    display: inline-block;
+    margin: 0;
+  }
+
+  figcaption > a {
+    margin: 2px 10px;
+  }
+</style>
+
+<div id=demo>
+  <figure>
+    <canvas id=trail width=400 height=400></canvas>
+    <figcaption>
+      <a href="https://particles.skia.org/84a757d92c424b3d378b55481a4b2394"
+         target=_blank rel=noopener>Trail (Click and Drag!)</a>
+    </figcaption>
+  </figure>
+  <figure>
+    <canvas id=confetti width=400 height=400></canvas>
+    <figcaption>
+      <a href="https://particles.skia.org/84a757d92c424b3d378b55481a4b2394"
+         target=_blank rel=noopener>Confetti</a>
+    </figcaption>
+  </figure>
+  <figure>
+    <canvas id=curves width=400 height=400></canvas>
+    <figcaption>
+      <a href="https://particles.skia.org/63b1970cc212740e5a44870691c49307"
+         target=_blank rel=noopener>Curves</a>
+    </figcaption>
+  </figure>
+  <figure>
+    <canvas id=fireworks width=400 height=400></canvas>
+    <figcaption>
+      <a href="https://particles.skia.org/b986ed92759cd66a36a3d589e6130931"
+         target=_blank rel=noopener>Fireworks</a>
+    </figcaption>
+  </figure>
+  <figure>
+    <canvas id=raincloud width=400 height=400></canvas>
+    <figcaption>
+      <a href="https://particles.skia.org/030d1403bbe69f7c4506d6f688e53487"
+         target=_blank rel=noopener>Raincloud</a>
+    </figcaption>
+  </figure>
+  <figure>
+    <canvas id=text width=400 height=400></canvas>
+    <figcaption>
+      <a href="https://particles.skia.org/7c13116e4b61c18b828bfc281903efe8"
+         target=_blank rel=noopener>Text</a>
+    </figcaption>
+  </figure>
+
+</div>
+
+<script type="text/javascript" charset="utf-8">
+(function() {
+  // Tries to load the WASM version if supported, shows error otherwise
+  let s = document.createElement('script');
+  var locate_file = '';
+  if (window.WebAssembly && typeof window.WebAssembly.compile === 'function') {
+    console.log('WebAssembly is supported!');
+    locate_file = 'https://particles.skia.org/static/';
+  } else {
+    console.log('WebAssembly is not supported (yet) on this browser.');
+    document.getElementById('demo').innerHTML = "<div>WASM not supported by your browser. Try a recent version of Chrome, Firefox, Edge, or Safari.</div>";
+    return;
+  }
+  s.src = locate_file + 'canvaskit.js';
+  s.onload = () => {
+  var CanvasKit = null;
+  CanvasKitInit({
+    locateFile: (file) => locate_file + file,
+  }).ready().then((CK) => {
+    CanvasKit = CK;
+    TrailExample(CanvasKit, 'trail', trail);
+    ParticleExample(CanvasKit, 'confetti', confetti, 200, 200);
+    ParticleExample(CanvasKit, 'curves', curves, 200, 300);
+    ParticleExample(CanvasKit, 'fireworks', fireworks, 200, 300);
+    ParticleExample(CanvasKit, 'raincloud', raincloud, 200, 100);
+    ParticleExample(CanvasKit, 'text', text, 75, 250);
+  });
+
+  function ParticleExample(CanvasKit, id, jsonData, cx, cy) {
+    if (!CanvasKit || !jsonData) {
+      return;
+    }
+    const surface = CanvasKit.MakeCanvasSurface(id);
+    if (!surface) {
+      console.error('Could not make surface');
+      return;
+    }
+    const context = CanvasKit.currentContext();
+    const canvas = surface.getCanvas();
+    canvas.translate(cx, cy);
+
+    const particles = CanvasKit.MakeParticles(JSON.stringify(jsonData));
+    particles.start(Date.now() / 1000.0, true);
+
+    function drawFrame(canvas) {
+      particles.update(Date.now() / 1000.0);
+
+      canvas.clear(CanvasKit.WHITE);
+      particles.draw(canvas);
+      surface.requestAnimationFrame(drawFrame);
+    }
+    surface.requestAnimationFrame(drawFrame);
+  }
+
+const confetti ={
+   "MaxCount": 200,
+   "Drawable": {
+      "Type": "SkCircleDrawable",
+      "Radius": 8
+   },
+   "EffectCode": [
+      "void effectSpawn(inout Effect effect) {",
+      "  effect.lifetime = 2;",
+      "}",
+      "",
+      "void effectUpdate(inout Effect effect) {",
+      "  if (effect.age < 0.25 || effect.age > 0.75) { effect.rate = 0; }",
+      "  else { effect.rate = 200; }",
+      "}",
+      ""
+   ],
+   "Code": [
+      "void spawn(inout Particle p) {",
+      "  float3 colors[4];",
+      "  colors[0] = float3(0.87, 0.24, 0.11);",
+      "  colors[1] = float3(1, 0.9, 0.2);",
+      "  colors[2] = float3(0.44, 0.73, 0.24);",
+      "  colors[3] = float3(0.38, 0.54, 0.95);",
+      "  int idx = int(rand * 4);",
+      "  p.color.rgb = colors[idx];",
+      "",
+      "  p.lifetime = (1 - effect.age) * effect.lifetime;",
+      "  p.scale = mix(0.6, 1, rand);",
+      "}",
+      "",
+      "void update(inout Particle p) {",
+      "  p.color.a = 1 - p.age;",
+      "",
+      "  float a = radians(rand * 360);",
+      "  float invAge = 1 - p.age;",
+      "  p.vel = float2(cos(a), sin(a)) * mix(250, 550, rand) * invAge * invAge;",
+      "}",
+      ""
+   ],
+   "Bindings": []
+};
+
+const curves = {
+   "MaxCount": 1000,
+   "Drawable": {
+      "Type": "SkCircleDrawable",
+      "Radius": 2
+   },
+   "EffectCode": [
+      "void effectSpawn(inout Effect effect) {",
+      "  effect.rate = 200;",
+      "  effect.color = float4(1, 0, 0, 1);",
+      "}",
+      ""
+   ],
+   "Code": [
+      "void spawn(inout Particle p) {",
+      "  p.lifetime = 3 + rand;",
+      "  p.vel.y = -50;",
+      "}",
+      "",
+      "void update(inout Particle p) {",
+      "  float w = mix(15, 3, p.age);",
+      "  p.pos.x = sin(radians(p.age * 320)) * mix(25, 10, p.age) + mix(-w, w, rand);",
+      "  if (rand < 0.5) { p.pos.x = -p.pos.x; }",
+      "",
+      "  p.color.g = (mix(75, 220, p.age) + mix(-30, 30, rand)) / 255;",
+      "}",
+      ""
+   ],
+   "Bindings": []
+};
+
+const fireworks = {
+   "MaxCount": 1000,
+   "Drawable": {
+      "Type": "SkCircleDrawable",
+      "Radius": 1
+   },
+   "EffectCode": [
+      "void effectSpawn(inout Effect effect) {",
+      "  effect.lifetime = 2;",
+      "  effect.rate = 120;",
+      "  float a = radians(mix(-20, 20, rand) - 90);",
+      "  float s = mix(200, 220, rand);",
+      "  effect.vel.x = cos(a) * s;",
+      "  effect.vel.y = sin(a) * s;",
+      "  effect.color.rgb = float3(rand, rand, rand);",
+      "  effect.pos.x = 0;",
+      "  effect.pos.y = 0;",
+      "}",
+      "",
+      "void effectUpdate(inout Effect effect) {",
+      "  effect.vel.y += dt * 90;",
+      "}",
+      "",
+      "void effectDeath(inout Effect effect) {",
+      "  explode(false);",
+      "}",
+      ""
+   ],
+   "Code": [
+      "void spawn(inout Particle p) {",
+      "  p.lifetime = 0.5;",
+      "  float a = radians(rand * 360);",
+      "  float s = mix(5, 10, rand);",
+      "  p.vel.x = cos(a) * s;",
+      "  p.vel.y = sin(a) * s;",
+      "}",
+      "",
+      "void update(inout Particle p) {",
+      "  p.color.a = 1 - p.age;",
+      "}",
+      ""
+   ],
+   "Bindings": [
+      {
+         "Type": "SkEffectBinding",
+         "Name": "explode",
+         "MaxCount": 50,
+         "Drawable": {
+            "Type": "SkCircleDrawable",
+            "Radius": 3
+         },
+         "EffectCode": [
+            "void effectSpawn(inout Effect effect) {",
+            "  effect.burst = 50;",
+            "  effect.lifetime = 2.5;",
+            "}",
+            ""
+         ],
+         "Code": [
+            "void spawn(inout Particle p) {",
+            "  p.lifetime = 2 + rand * 0.5;",
+            "  float a = radians(rand * 360);",
+            "  float s = mix(90, 100, rand);",
+            "  p.vel.x = cos(a) * s;",
+            "  p.vel.y = sin(a) * s;",
+            "}",
+            "",
+            "void update(inout Particle p) {",
+            "  p.color.a = 1 - p.age;",
+            "  p.vel.y += dt * 50;",
+            "}",
+            ""
+         ],
+         "Bindings": []
+      }
+   ]
+};
+
+const raincloud = {
+   "MaxCount": 128,
+   "Drawable": {
+      "Type": "SkCircleDrawable",
+      "Radius": 2
+   },
+   "EffectCode": [
+      "void effectSpawn(inout Effect effect) {",
+      "  if (effect.loop == 0) {",
+      "    cloud(true);",
+      "  }",
+      "  effect.color = float4(0.1, 0.1, 1.0, 1.0);",
+      "  effect.rate = 10;",
+      "}",
+      ""
+   ],
+   "Code": [
+      "void spawn(inout Particle p) {",
+      "  p.lifetime = 4;",
+      "  p.pos.x = mix(-50, 50, rand);",
+      "  p.vel.y = 50;",
+      "}",
+      "",
+      "bool once(bool cond, inout uint flags, uint flag) {",
+      "  bool result = false;",
+      "  if (cond && (flags & flag) == 0) {",
+      "    flags |= flag;",
+      "    result = true;",
+      "  }",
+      "  return result;",
+      "}",
+      "",
+      "void update(inout Particle p) {",
+      "  p.vel.y += 20 * dt;",
+      "  if (once(p.pos.y > 150, p.flags, 0x1)) {",
+      "    p.scale = 0;",
+      "    splash(false);",
+      "  }",
+      "}",
+      ""
+   ],
+   "Bindings": [
+      {
+         "Type": "SkEffectBinding",
+         "Name": "cloud",
+         "MaxCount": 60,
+         "Drawable": {
+            "Type": "SkCircleDrawable",
+            "Radius": 16
+         },
+         "EffectCode": [
+            "void effectSpawn(inout Effect effect) {",
+            "  effect.color = float4(0.8, 0.8, 0.8, 1);",
+            "  effect.rate = 30;",
+            "}",
+            ""
+         ],
+         "Code": [
+            "float2 circle() {",
+            "  float2 xy;",
+            "  do {",
+            "    xy.x = 2 * rand - 1;",
+            "    xy.y = 2 * rand - 1;",
+            "  } while (dot(xy, xy) > 1);",
+            "  return xy;",
+            "}",
+            "",
+            "void spawn(inout Particle p) {",
+            "  p.lifetime = 2.5;",
+            "  p.pos = circle() * float2(50, 10);",
+            "  p.vel.x = mix(-10, 10, rand);",
+            "  p.vel.y = mix(-10, 10, rand);",
+            "}",
+            "",
+            "void update(inout Particle p) {",
+            "  p.color.a = 1 - (length(p.pos) / 150);",
+            "}",
+            ""
+         ],
+         "Bindings": []
+      },
+      {
+         "Type": "SkEffectBinding",
+         "Name": "splash",
+         "MaxCount": 8,
+         "Drawable": {
+            "Type": "SkCircleDrawable",
+            "Radius": 1
+         },
+         "EffectCode": [
+            "void effectSpawn(inout Effect effect) {",
+            "  effect.burst = 8;",
+            "  effect.scale = 1;",
+            "}",
+            ""
+         ],
+         "Code": [
+            "void spawn(inout Particle p) {",
+            "  p.lifetime = rand;",
+            "  float a = radians(mix(-80, 80, rand) - 90);",
+            "  p.vel.x = cos(a) * 20;",
+            "  p.vel.y = sin(a) * 20;",
+            "}",
+            "",
+            "void update(inout Particle p) {",
+            "  p.vel.y += dt * 20;",
+            "}",
+            ""
+         ],
+         "Bindings": []
+      }
+   ]
+};
+
+const text = {
+   "MaxCount": 2000,
+   "Drawable": {
+      "Type": "SkCircleDrawable",
+      "Radius": 1
+   },
+   "EffectCode": [
+      "void effectSpawn(inout Effect effect) {",
+      "  effect.rate = 1000;",
+      "}",
+      ""
+   ],
+   "Code": [
+      "void spawn(inout Particle p) {",
+      "  p.lifetime = mix(1, 3, rand);",
+      "  float a = radians(mix(250, 290, rand));",
+      "  float s = mix(10, 30, rand);",
+      "  p.vel.x = cos(a) * s;",
+      "  p.vel.y = sin(a) * s;",
+      "  p.pos = text(rand).xy;",
+      "}",
+      "",
+      "void update(inout Particle p) {",
+      "  float4 startColor = float4(1, 0.196, 0.078, 1);",
+      "  float4 endColor   = float4(1, 0.784, 0.078, 1);",
+      "  p.color = mix(startColor, endColor, p.age);",
+      "}",
+      ""
+   ],
+   "Bindings": [
+      {
+         "Type": "SkTextBinding",
+         "Name": "text",
+         "Text": "SKIA",
+         "FontSize": 96
+      }
+   ]
+};
+
+  function preventScrolling(canvas) {
+    canvas.addEventListener('touchmove', (e) => {
+      // Prevents touch events in the canvas from scrolling the canvas.
+      e.preventDefault();
+      e.stopPropagation();
+    });
+  }
+
+  function TrailExample(CanvasKit, id, jsonData) {
+    if (!CanvasKit || !jsonData) {
+      return;
+    }
+    const surface = CanvasKit.MakeCanvasSurface(id);
+    if (!surface) {
+      console.error('Could not make surface');
+      return;
+    }
+    const context = CanvasKit.currentContext();
+    const canvas = surface.getCanvas();
+
+    const particles = CanvasKit.MakeParticles(JSON.stringify(jsonData));
+    particles.start(Date.now() / 1000.0, true);
+
+    function drawFrame(canvas) {
+      particles.update(Date.now() / 1000.0);
+
+      canvas.clear(CanvasKit.WHITE);
+      particles.draw(canvas);
+      surface.requestAnimationFrame(drawFrame);
+    }
+    surface.requestAnimationFrame(drawFrame);
+
+    let interact = (e) => {
+      particles.setPosition([e.offsetX, e.offsetY]);
+      particles.setRate(e.pressure * 1000);
+    };
+    document.getElementById('trail').addEventListener('pointermove', interact);
+    document.getElementById('trail').addEventListener('pointerdown', interact);
+    document.getElementById('trail').addEventListener('pointerup', interact);
+    preventScrolling(document.getElementById('trail'));
+  }
+
+const trail = {
+   "MaxCount": 2000,
+   "Drawable": {
+      "Type": "SkCircleDrawable",
+      "Radius": 4
+   },
+   "EffectCode": "",
+   "Code": [
+      "void spawn(inout Particle p) {",
+      "  p.lifetime = 2 + rand;",
+      "  float a = radians(rand * 360);",
+      "  p.vel = float2(cos(a), sin(a)) * mix(5, 15, rand);",
+      "  p.scale = mix(0.25, 0.75, rand);",
+      "}",
+      "",
+      "void update(inout Particle p) {",
+      "  p.color.r = p.age;",
+      "  p.color.g = 1 - p.age;",
+      "}",
+      ""
+   ],
+   "Bindings": []
+};
+
+  }
+  document.head.appendChild(s);
+})();
+</script>
diff --git a/src/third_party/skia/site/user/modules/pathkit.md b/src/third_party/skia/site/user/modules/pathkit.md
new file mode 100644
index 0000000..5e597b9
--- /dev/null
+++ b/src/third_party/skia/site/user/modules/pathkit.md
@@ -0,0 +1,826 @@
+PathKit - Geometry in the Browser
+=============================
+
+Skia has made its [SkPath](../api/SkPath_Reference) object and many related methods
+available to JS clients (e.g. Web Browsers) using WebAssembly and asm.js.
+
+Features
+--------
+
+PathKit is still under rapid development, so the exact API is subject to change.
+
+The primary features are:
+
+  - API compatibility (e.g. drop-in replacement) with [Path2D](https://developer.mozilla.org/en-US/docs/Web/API/Path2D)
+  - Can output to SVG / Canvas / Path2D
+  - Exposes a variety of path effects:
+
+<style>
+  canvas.patheffect {
+    border: 1px dashed #AAA;
+    width: 200px;
+    height: 200px;
+  }
+</style>
+
+<div id=effects>
+  <canvas class=patheffect id=canvas1 title="Plain: A drawn star with overlapping solid lines"></canvas>
+  <canvas class=patheffect id=canvas2 title="Dash: A drawn star with overlapping dashed lines"></canvas>
+  <canvas class=patheffect id=canvas3 title="Trim: A portion of a drawn star with overlapping solid lines"></canvas>
+  <canvas class=patheffect id=canvas4 title="Simplify: A drawn star with non-overlapping solid lines."></canvas>
+  <canvas class=patheffect id=canvas5 title="Stroke: A drawn star with non-overlapping solid lines stroked at various thicknesses and with square edges"></canvas>
+  <canvas class=patheffect id=canvas6 title="Grow: A drawn star's expanding outline"></canvas>
+  <canvas class=patheffect id=canvas7 title="Shrink: A solid drawn star shrunk down"></canvas>
+  <canvas class=patheffect id=canvasTransform title="Transform: A drawn star moved and rotated by an Affine Matrix"></canvas>
+</div>
+
+<script type="text/javascript">
+(function() {
+  // Tries to load the WASM version if supported, then falls back to asmjs
+  let s = document.createElement('script');
+  if (window.WebAssembly && typeof window.WebAssembly.compile === 'function') {
+    console.log('WebAssembly is supported! Using the wasm version of PathKit');
+    window.__pathkit_locate_file = 'https://unpkg.com/pathkit-wasm@0.6.0/bin/';
+  } else {
+    console.log('WebAssembly is not supported (yet) on this browser. Using the asmjs version of PathKit');
+    window.__pathkit_locate_file = 'https://unpkg.com/pathkit-asmjs@0.6.0/bin/';
+  }
+  s.src = window.__pathkit_locate_file+'pathkit.js';
+  s.onload = () => {
+    try {
+      PathKitInit({
+        locateFile: (file) => window.__pathkit_locate_file+file,
+      }).ready().then((PathKit) => {
+        // Code goes here using PathKit
+        PathEffectsExample(PathKit);
+        MatrixTransformExample(PathKit);
+      });
+    }
+    catch(error) {
+      console.warn(error, 'falling back to image');
+      document.getElementById('effects').innerHTML = '<img width=800 src="./PathKit_effects.png"/>'
+    }
+  }
+
+  document.head.appendChild(s);
+
+  function setCanvasSize(ctx, width, height) {
+    ctx.canvas.width = width;
+    ctx.canvas.height = height;
+  }
+
+  function drawStar(path) {
+    let R = 115.2, C = 128.0;
+    path.moveTo(C + R + 22, C);
+    for (let i = 1; i < 8; i++) {
+      let a = 2.6927937 * i;
+      path.lineTo(C + R * Math.cos(a) + 22, C + R * Math.sin(a));
+    }
+    path.closePath();
+    return path;
+  }
+
+  function PathEffectsExample(PathKit) {
+    let effects = [
+      // no-op
+      (path) => path,
+      // dash
+      (path, counter) => path.dash(10, 3, counter/5),
+      // trim (takes optional 3rd param for returning the trimmed part
+      // or the complement)
+      (path, counter) => path.trim((counter/100) % 1, 0.8, false),
+      // simplify
+      (path) => path.simplify(),
+      // stroke
+      (path, counter) => path.stroke({
+        width: 10 * (Math.sin(counter/30) + 1),
+        join: PathKit.StrokeJoin.BEVEL,
+        cap: PathKit.StrokeCap.BUTT,
+        miter_limit: 1,
+      }),
+      // "offset effect", that is, making a border around the shape.
+      (path, counter) => {
+        let orig = path.copy();
+        path.stroke({
+          width: 10 + (counter / 4) % 50,
+          join: PathKit.StrokeJoin.ROUND,
+          cap: PathKit.StrokeCap.SQUARE,
+        })
+          .op(orig, PathKit.PathOp.DIFFERENCE);
+        orig.delete();
+      },
+      (path, counter) => {
+        let simplified = path.simplify().copy();
+        path.stroke({
+          width: 2 + (counter / 2) % 100,
+          join: PathKit.StrokeJoin.BEVEL,
+          cap: PathKit.StrokeCap.BUTT,
+        })
+          .op(simplified, PathKit.PathOp.REVERSE_DIFFERENCE);
+        simplified.delete();
+      }
+    ];
+
+    let names = ["(plain)", "Dash", "Trim", "Simplify", "Stroke", "Grow", "Shrink"];
+
+    let counter = 0;
+    function frame() {
+      counter++;
+      for (let i = 0; i < effects.length; i++) {
+        let path = PathKit.NewPath();
+        drawStar(path);
+
+        // The transforms apply directly to the path.
+        effects[i](path, counter);
+
+        let ctx = document.getElementById(`canvas${i+1}`);
+        if (!ctx) {
+          return;
+        } else {
+          ctx = ctx.getContext('2d');
+        }
+        setCanvasSize(ctx, 300, 300);
+        ctx.strokeStyle = '#3c597a';
+        ctx.fillStyle = '#3c597a';
+        if (i >=4 ) {
+          ctx.fill(path.toPath2D(), path.getFillTypeString());
+        } else {
+          ctx.stroke(path.toPath2D());
+        }
+
+        ctx.font = '42px monospace';
+
+        let x = 150-ctx.measureText(names[i]).width/2;
+        ctx.strokeText(names[i], x, 290);
+
+        path.delete();
+      }
+      window.requestAnimationFrame(frame);
+    }
+    window.requestAnimationFrame(frame);
+  }
+
+  function MatrixTransformExample(PathKit) {
+    // Creates an animated star that twists and moves.
+    let ctx = document.getElementById('canvasTransform').getContext('2d');
+    setCanvasSize(ctx, 300, 300);
+    ctx.strokeStyle = '#3c597a';
+
+    let path = drawStar(PathKit.NewPath());
+    // TODO(kjlubick): Perhaps expose some matrix helper functions to allow
+    // clients to build their own matrices like this?
+    // These matrices represent a 2 degree rotation and a 1% scale factor.
+    let scaleUp = [1.0094, -0.0352,  3.1041,
+                   0.0352,  1.0094, -6.4885,
+                   0     ,  0      , 1];
+
+    let scaleDown = [ 0.9895, 0.0346, -2.8473,
+                     -0.0346, 0.9895,  6.5276,
+                      0     , 0     ,  1];
+
+    let i = 0;
+    function frame(){
+      i++;
+      if (Math.round(i/100) % 2) {
+        path.transform(scaleDown);
+      } else {
+        path.transform(scaleUp);
+      }
+
+      ctx.clearRect(0, 0, 300, 300);
+      ctx.stroke(path.toPath2D());
+
+      ctx.font = '42px monospace';
+      let x = 150-ctx.measureText('Transform').width/2;
+      ctx.strokeText('Transform', x, 290);
+
+      window.requestAnimationFrame(frame);
+    }
+    window.requestAnimationFrame(frame);
+  }
+})();
+</script>
+
+
+Example Code
+------------
+The best place to look for examples on how to use PathKit would be in the
+[example.html](https://github.com/google/skia/blob/master/modules/pathkit/npm-wasm/example.html#L45),
+which comes in the npm package.
+
+
+Download the library
+--------------------
+
+See the the npm page for either the [WebAssembly](https://www.npmjs.com/package/pathkit-wasm) version
+or the [asm.js](https://www.npmjs.com/package/pathkit-asmjs) version
+for details on downloading and getting started.
+
+WebAssembly has faster load times and better overall performance but is
+currently supported by Chrome, Firefox, Edge, and Safari.
+The asm.js version should run anywhere JavaScript does.
+
+API
+----
+
+The primary feature of the library is the `SkPath` object. It can be created:
+
+ - From the SVG string of a path `PathKit.FromSVGString(str)`
+ - From a 2D array of verbs and arguments `PathKit.FromCmds(cmds)`
+ - From `PathKit.NewPath()` (It will be blank)
+ - As a copy of an existing `SkPath` with `path.copy()` or `PathKit.NewPath(path)`
+
+It can be exported as:
+
+ - An SVG string `path.toSVGString()`
+ - A [Path2D](https://developer.mozilla.org/en-US/docs/Web/API/Path2D) object `path.toPath2D()`
+ - Directly to a canvas 2D context `path.toCanvas(ctx)`
+ - A 2D array of verbs and arguments `path.toCmds()`
+
+Once an SkPath object has been made, it can be interacted with in the following ways:
+
+ - expanded by any of the Path2D operations (`moveTo`, `lineTo`, `rect`, `arc`, etc)
+ - combined with other paths using `op` or `PathKit.MakeFromOp(p1, p2, op)`.  For example, `path1.op(path2, PathKit.PathOp.INTERSECT)` will set path1 to be the area represented by where path1 and path2 overlap (intersect). `PathKit.MakeFromOp(path1, path2, PathKit.PathOp.INTERSECT)` will do the same but returned as a new `SkPath` object.
+ - adjusted with some of the effects (`trim`, `dash`, `stroke`, etc)
+
+
+**Important**: Any objects (`SkPath`, `SkOpBuilder`, etc) that are created must be cleaned up with `path.delete()` when they
+leave the scope to avoid leaking the memory in the WASM heap. This includes any of the constructors, `copy()`,
+or any function prefixed with "make".
+
+
+### PathKit ###
+
+#### `FromSVGString(str)` ####
+**str** - `String` representing an [SVGPath](https://www.w3schools.com/graphics/svg_path.asp)
+
+Returns an `SkPath` with the same verbs and arguments as the SVG string, or `null` on a failure.
+
+Example:
+
+    let path = PathKit.FromSVGString('M150 0 L75 200 L225 200 Z');
+    // path represents a triangle
+    // don't forget to do path.delete() when it goes out of scope.
+
+#### `FromCmds(cmds)` ####
+**cmds** - `Array<Array<Number>>`, a 2D array of commands, where a command is a verb
+           followed by its arguments.
+
+Returns an `SkPath` with the verbs and arguments from the list or `null` on a failure.
+
+This can be faster than calling `.moveTo()`, `.lineTo()`, etc many times.
+
+Example:
+
+    let cmds = [
+        [PathKit.MOVE_VERB, 0, 10],
+        [PathKit.LINE_VERB, 30, 40],
+        [PathKit.QUAD_VERB, 20, 50, 45, 60],
+    ];
+    let path = PathKit.FromCmds(cmds);
+    // path is the same as if a user had done
+    // let path = PathKit.NewPath().moveTo(0, 10).lineTo(30, 40).quadTo(20, 50, 45, 60);
+    // don't forget to do path.delete() when it goes out of scope.
+
+#### `NewPath()` ####
+
+Returns an empty `SkPath` object.
+
+Example:
+
+    let path = PathKit.NewPath();
+    path.moveTo(0, 10)
+        .lineTo(30, 40)
+        .quadTo(20, 50, 45, 60);
+    // don't forget to do path.delete() when it goes out of scope.
+    // Users can also do let path = new PathKit.SkPath();
+
+#### `NewPath(pathToCopy)` ####
+**pathToCopy** - SkPath, a path to make a copy of.
+
+Returns a `SkPath` that is a copy of the passed in `SkPath`.
+
+Example:
+
+    let otherPath = ...;
+    let clone = PathKit.NewPath(otherPath);
+    clone.simplify();
+    // don't forget to do clone.delete() when it goes out of scope.
+    // Users can also do let clone = new PathKit.SkPath(otherPath);
+    // or let clone = otherPath.copy();
+
+#### `MakeFromOp(pathOne, pathTwo, op)` ####
+**pathOne** - `SkPath`, a path. <br>
+**pathTwo** - `SkPath`, a path. <br>
+**op** - `PathOp`, an op to apply
+
+Returns a new `SkPath` that is the result of applying the given PathOp to the first and second
+path (order matters).
+
+Example:
+
+    let pathOne = PathKit.NewPath().moveTo(0, 20).lineTo(10, 10).lineTo(20, 20).close();
+    let pathTwo = PathKit.NewPath().moveTo(10, 20).lineTo(20, 10).lineTo(30, 20).close();
+    let mountains = PathKit.MakeFromOp(pathOne, pathTwo, PathKit.PathOp.UNION);
+    // don't forget to do mountains.delete() when it goes out of scope.
+    // Users can also do pathOne.op(pathTwo, PathKit.PathOp.UNION);
+    // to have the resulting path be stored to pathOne and avoid allocating another object.
+
+#### `cubicYFromX(cpx1, cpy1, cpx2, cpy2, X)` ####
+**cpx1, cpy1, cpx2, cpy2** - `Number`, coordinates for control points. <br>
+**X** - `Number`, The X coordinate for which to find the corresponding Y coordinate.
+
+Fast evaluation of a cubic ease-in / ease-out curve. This is defined as a parametric cubic
+curve inside the unit square. Makes the following assumptions:
+
+  - pt[0] is implicitly { 0, 0 }
+  - pt[3] is implicitly { 1, 1 }
+  - pts[1, 2] are inside the unit square
+
+This returns the Y coordinate for the given X coordinate.
+
+#### `cubicPtFromT(cpx1, cpy1, cpx2, cpy2, T)` ####
+**cpx1, cpy1, cpx2, cpy2** - `Number`, coordinates for control points. <br>
+**T** - `Number`, The T param for which to find the corresponding (X, Y) coordinates.
+
+Fast evaluation of a cubic ease-in / ease-out curve. This is defined as a parametric cubic
+curve inside the unit square. Makes the following assumptions:
+
+  - pt[0] is implicitly { 0, 0 }
+  - pt[3] is implicitly { 1, 1 }
+  - pts[1, 2] are inside the unit square
+
+This returns the (X, Y) coordinate for the given T value as a length 2 array.
+
+
+### SkPath (object) ###
+
+#### `addPath(otherPath)` ####
+**otherPath** - `SkPath`, a path to append to this path
+
+Adds the given path to `this` and then returns `this` for chaining purposes.
+
+#### `addPath(otherPath, transform)` ####
+**otherPath** - `SkPath`, a path to append to this path. <br>
+**transform** - [SVGMatrix](https://developer.mozilla.org/en-US/docs/Web/API/SVGMatrix),
+                a transform to apply to otherPath before appending it.
+
+Adds the given path to `this` after applying the transform and then returns `this` for
+chaining purposes. See [Path2D.addPath()](https://developer.mozilla.org/en-US/docs/Web/API/Path2D/addPath)
+for more details.
+
+#### `addPath(otherPath, a, b, c, d, e, f)` ####
+**otherPath** - `SkPath`, a path to append to this path. <br>
+**a, b, c, d, e, f** - `Number`, the six components of an
+                       [SVGMatrix](https://developer.mozilla.org/en-US/docs/Web/API/SVGMatrix),
+                       which define the transform to apply to otherPath before appending it.
+
+Adds the given path to `this` after applying the transform and then returns `this` for
+chaining purposes. See [Path2D.addPath()](https://developer.mozilla.org/en-US/docs/Web/API/Path2D/addPath)
+for more details.
+
+Example:
+
+    let box = PathKit.NewPath().rect(0, 0, 100, 100);
+    let moreBoxes = PathKit.NewPath();
+    // add box un-transformed (i.e. at 0, 0)
+    moreBoxes.addPath(box)
+    // the params fill out a 2d matrix like:
+    //     a c e
+    //     b d f
+    //     0 0 1
+    // add box 300 points to the right
+             .addPath(box, 1, 0, 0, 1, 300, 0)
+    // add a box shrunk by 50% in both directions
+             .addPath(box, 0.5, 0, 0, 0.5, 0, 0);
+    // moreBoxes now has 3 paths appended to it
+
+#### `addPath(otherPath, scaleX, skewX, transX, skewY, scaleY, transY, pers0, pers1, pers2)` ####
+**otherPath** - `SkPath`, a path to append to this path. <br>
+**scaleX, skewX, transX, skewY, scaleY, transY, pers0, pers1, pers2** -
+                       `Number`, the nine components of an
+                       [Affine Matrix](https://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations),
+                       which define the transform to apply to otherPath before appending it.
+
+Adds the given path to `this` after applying the transform and then returns `this` for
+chaining purposes.
+
+Example:
+
+    let box = PathKit.NewPath().rect(0, 0, 100, 100);
+    let moreBoxes = PathKit.NewPath();
+    // add box un-transformed (i.e. at 0, 0)
+    moreBoxes.addPath(box)
+    // add box 300 points to the right
+             .addPath(box, 1, 0, 0,
+                           0, 1, 300,
+                           0, 0 ,1)
+    // add a box shrunk by 50% in both directions
+             .addPath(box, 0.5, 0,   0,
+                           0,   0.5, 0,
+                           0,   0,   1)
+    // moreBoxes now has 3 paths appended to it
+
+#### `arc(x, y, radius, startAngle, endAngle, ccw=false)` ####
+**x, y** - `Number`, The coordinates of the arc's center. <br>
+**radius** - `Number`, The radius of the arc. <br>
+**startAngle, endAngle** - `Number`, the start and end of the angle, measured
+                           clockwise from the positive x axis and in radians. <br>
+**ccw** - `Boolean`, optional argument specifying if the arc should be drawn
+          counter-clockwise between **startAngle** and **endAngle** instead of
+          clockwise, the default.
+
+Adds the described arc to `this` then returns `this` for
+chaining purposes.  See [Path2D.arc()](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/arc)
+for more details.
+
+Example:
+
+    let path = PathKit.NewPath();
+    path.moveTo(20, 120);
+        .arc(20, 120, 18, 0, 1.75 * Math.PI);
+        .lineTo(20, 120);
+    // path looks like a pie with a 1/8th slice removed.
+
+#### `arcTo(x1, y1, x2, y2, radius)` ####
+**x1, y1, x2, y2** - `Number`, The coordinates defining the control points. <br>
+**radius** - `Number`, The radius of the arc.
+
+Adds the described arc to `this` (appending a line, if needed) then returns `this` for
+chaining purposes.  See [Path2D.arcTo()](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/arcTo)
+for more details.
+
+#### `close()` or `closePath()` ####
+Returns the pen to the start of the current sub-path, then returns `this` for
+chaining purposes.  See [Path2D.closePath()](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/closePath)
+for more details.
+
+#### `computeTightBounds()` ####
+
+Returns an `SkRect` that represents the minimum and maximum area of
+`this` path. See [SkPath reference](https://skia.org/user/api/SkPath_Reference#SkPath_computeTightBounds)
+for more details.
+
+#### `conicTo(x1, y1, x2, y2, w)` ####
+**x1, y1, x2, y2** - `Number`, The coordinates defining the control point and the end point. <br>
+**w** - `Number`, The weight of the conic.
+
+Adds the described conic line to `this` (appending a line, if needed) then returns `this` for
+chaining purposes. See [SkPath reference](https://skia.org/user/api/SkPath_Reference#SkPath_conicTo)
+for more details.
+
+#### `copy()` ####
+
+Return a copy of `this` path.
+
+#### `cubicTo(cp1x, cp1y, cp2x, cp2y, x, y)` or `bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)` ####
+**cp1x, cp1y, cp2x, cp2y** - `Number`, The coordinates defining the control points. <br>
+**x,y** - `Number`, The coordinates defining the end point
+
+Adds the described cubic line to `this` (appending a line, if needed) then returns `this` for
+chaining purposes. See [Path2D.bezierCurveTo](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/bezierCurveTo)
+for more details.
+
+#### `dash(on, off, phase)` ####
+**on, off** - `Number`, The number of pixels the dash should be on (drawn) and off (blank). <br>
+**phase** - `Number`, The number of pixels the on/off should be offset (mod **on** + **off**)
+
+Applies a dashed path effect to `this` then returns `this` for chaining purposes.
+See the "Dash" effect above for a visual example.
+
+Example:
+
+    let box = PathKit.NewPath().rect(0, 0, 100, 100);
+    box.dash(20, 10, 3);
+    // box is now a dashed rectangle that will draw for 20 pixels, then
+    // stop for 10 pixels.  Since phase is 3, the first line won't start
+    // at (0, 0), but 3 pixels around the path (3, 0)
+
+#### `ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, ccw=false)` ####
+**x, y** - `Number`, The coordinates of the center of the ellipse. <br>
+**radiusX, radiusY** - `Number`, The radii in the X and Y directions. <br>
+**rotation** - `Number`, The rotation in radians of this ellipse. <br>
+**startAngle, endAngle** - `Number`, the starting and ending angles of which to draw,
+                            measured in radians from the positive x axis. <br>
+**ccw** - `Boolean`, optional argument specifying if the ellipse should be drawn
+          counter-clockwise between **startAngle** and **endAngle** instead of
+          clockwise, the default.
+
+Adds the described ellipse to `this` then returns `this` for chaining purposes.
+See [Path2D.ellipse](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/ellipse)
+for more details.
+
+#### `equals(otherPath)` ####
+**otherPath** - `SkPath`, the path to compare to.
+
+Returns a `Boolean` value based on if `this` path is equal
+to **otherPath**.
+
+#### `getBounds()` ####
+
+Returns an `SkRect` that represents the minimum and maximum area of
+`this` path. See [SkPath reference](https://skia.org/user/api/SkPath_Reference#SkPath_getBounds)
+for more details.
+
+#### `getFillType()` ####
+
+Returns a `FillType` based on what this path is. This defaults to
+`PathKit.FillType.WINDING`, but may change with `op()` or `simplify()`.
+
+Clients will typically want `getFillTypeString()` because that value
+can be passed directly to an SVG or Canvas.
+
+#### `getFillTypeString()` ####
+
+Returns a `String` representing the fillType of `this` path.
+The values are either "nonzero" or "evenodd".
+
+Example:
+
+    let path = ...;
+    let ctx = document.getElementById('canvas1').getContext('2d');
+    ctx.strokeStyle = 'green';
+    ctx.fill(path.toPath2D(), path.getFillTypeString());
+
+#### `moveTo(x, y)` ####
+**x, y** - `Number`, The coordinates of where the pen should be moved to.
+
+Moves the pen (without drawing) to the given coordinates then returns `this` for chaining purposes.
+See [Path2D.moveTo](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/moveTo)
+for more details.
+
+#### `lineTo(x, y)` ####
+**x, y** - `Number`, The coordinates of where the pen should be moved to.
+
+Draws a straight line to the given coordinates then returns `this` for chaining purposes.
+See [Path2D.lineTo](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineTo)
+for more details.
+
+#### `op(otherPath, operation)` ####
+**otherPath** - `SkPath`, The other path to be combined with `this`. <br>
+**operation** - `PathOp`, The operation to apply to the two paths.
+
+Combines otherPath into `this` path with the given operation and returns `this`
+for chaining purposes.
+
+Example:
+
+    let pathOne = PathKit.NewPath().moveTo(0, 20).lineTo(10, 10).lineTo(20, 20).close();
+    let pathTwo = PathKit.NewPath().moveTo(10, 20).lineTo(20, 10).lineTo(30, 20).close();
+    // Combine the two triangles to look like two mountains
+    let mountains = pathOne.copy().op(pathOne, pathTwo, PathKit.PathOp.UNION);
+    // set pathOne to be the small triangle where pathOne and pathTwo overlap
+    pathOne.op(pathOne, pathTwo, PathKit.PathOp.INTERSECT);
+    // since copy() was called, don't forget to call delete() on mountains.
+
+#### `quadTo(cpx, cpy, x, y)` or `quadraticCurveTo(cpx, cpy, x, y)` ####
+**cpx, cpy** - `Number`, The coordinates for the control point. <br>
+**x, y** - `Number`, The coordinates for the end point.
+
+Draws a quadratic Bézier curve with the given coordinates then returns `this` for chaining purposes.
+See [Path2D.quadraticCurveTo](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/quadraticCurveTo)
+for more details.
+
+#### `rect(x, y, w, h)` ####
+**x, y** - `Number`, The coordinates of the upper-left corner of the rectangle. <br>
+**w, h** - `Number`, The width and height of the rectangle
+
+Draws a rectangle on `this`, then returns `this` for chaining purposes.
+See [Path2D.rect](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/rect)
+for more details.
+
+#### `setFillType(fillType)` ####
+**fillType** - `FillType`, the new fillType.
+
+Set the fillType of the path. See [SkPath reference](https://skia.org/user/api/SkPath_Reference#SkPath_FillType)
+for more details.
+
+#### `simplify()` ####
+Set `this` path to a set of *non-overlapping* contours that describe the same area
+as the original path. See the "Simplify" effect above for a visual example.
+
+#### `stroke(opts)` ####
+**opts** - `StrokeOpts`, contains the options for stroking.
+
+
+Strokes `this` path out with the given options. This can be used for a variety of
+effects.  See the "Stroke", "Grow", and "Shrink" effects above for visual examples.
+
+Example:
+
+    let box = PathKit.NewPath().rect(0, 0, 100, 100);
+    // Stroke the path with width 10 and rounded corners
+    let rounded = box.copy().stroke({width: 10, join: PathKit.StrokeJoin.ROUND});
+    // Grow effect, that is, a 20 pixel expansion around the box.
+    let grow = box.copy().stroke({width: 20}).op(box, PathKit.PathOp.DIFFERENCE);
+    // Shrink effect, in which we subtract away from the original
+    let simplified = box.copy().simplify(); // sometimes required for complicated paths
+    let shrink = box.copy().stroke({width: 15, cap: PathKit.StrokeCap.BUTT})
+                           .op(simplified, PathKit.PathOp.REVERSE_DIFFERENCE);
+    // Don't forget to call delete() on each of the copies!
+
+#### `toCanvas(ctx)` ####
+**ctx** - `Canvas2DContext`, Canvas on which to draw the path.
+
+Draws `this` path on the passed in
+[Canvas Context](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D).
+
+Example:
+
+    let box = PathKit.NewPath().rect(0, 0, 100, 100);
+    let ctx = document.getElementById('canvas1').getContext('2d');
+    ctx.strokeStyle = 'green';
+    ctx.beginPath();
+    box.toCanvas(ctx);
+    ctx.stroke();  // could also ctx.fill()
+
+#### `toCmds()` ####
+
+Returns a 2D Array of verbs and args. See `PathKit.FromCmds()` for
+more details.
+
+#### `toPath2D()` ####
+
+Returns a [Path2D](https://developer.mozilla.org/en-US/docs/Web/API/Path2D) object
+that has the same operations as `this` path.
+
+Example:
+
+    let box = PathKit.NewPath().rect(0, 0, 100, 100);
+    let ctx = document.getElementById('canvas1').getContext('2d');
+    ctx.strokeStyle = 'green';
+    ctx.stroke(box.toPath2D());
+
+#### `toSVGString()` ####
+
+Returns a `String` representing an [SVGPath](https://www.w3schools.com/graphics/svg_path.asp) based on `this` path.
+
+Example:
+
+    let box = PathKit.NewPath().rect(0, 0, 100, 100);
+    let svg = document.getElementById('svg1');
+    let newPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');
+    newPath.setAttribute('stroke', 'green');
+    newPath.setAttribute('fill', 'white');
+    newPath.setAttribute('d', box.toSVGString());
+    svg.appendChild(newPath);
+
+#### `transform(matr)` ####
+**matr** - `SkMatrix`, i.e. an `Array<Number>` of the nine numbers of an Affine Transform Matrix.
+
+Applies the specified [transform](https://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations)
+to `this` and then returns `this` for chaining purposes.
+
+#### `transform(scaleX, skewX, transX, skewY, scaleY, transY, pers0, pers1, pers2)` ####
+**scaleX, skewX, transX, skewY, scaleY, transY, pers0, pers1, pers2** -
+        `Number`, the nine numbers of an Affine Transform Matrix.
+
+Applies the specified [transform](https://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations)
+to `this` and then returns `this` for chaining purposes.
+
+Example:
+
+    let path = PathKit.NewPath().rect(0, 0, 100, 100);
+    // scale up the path by 5x
+    path.transform([5, 0, 0,
+                    0, 5, 0,
+                    0, 0, 1]);
+    // move the path 75 px to the right.
+    path.transform(1, 0, 75,
+                   0, 1, 0,
+                   0, 0, 1);
+
+#### `trim(startT, stopT, isComplement=false)` ####
+**startT, stopT** - `Number`, values in [0, 1] that indicate the start and stop
+                    "percentages" of the path to draw <br>
+**isComplement** - `Boolean`, If the complement of the trimmed section should
+                    be drawn instead of the areas between **startT** and **stopT**.
+
+Sets `this` path to be a subset of the original path, then returns `this` for chaining purposes.
+See the "Trim" effect above for a visual example.
+
+Example:
+
+    let box = PathKit.NewPath().rect(0, 0, 100, 100);
+    box.trim(0.25, 1.0);
+    // box is now the 3 segments that look like a U
+    // (the top segment has been removed).
+
+
+### SkOpBuilder (object)  ###
+This object enables chaining multiple PathOps together.
+Create one with `let builder = new PathKit.SkOpBuilder();`
+When created, the internal state is "empty path".
+Don't forget to call `delete()` on both the builder and the result
+of `resolve()`
+
+#### `add(path, operation)` ####
+**path** - `SkPath`, The path to be combined with the given rule. <br>
+**operation** - `PathOp`, The operation to apply to the two paths.
+
+Adds a path and the operand to the builder.
+
+#### `make()` or `resolve()` ####
+
+Creates and returns a new `SkPath` based on all the given paths
+and operands.
+
+Don't forget to call `.delete()` on the returned path when it goes out of scope.
+
+
+### SkMatrix (struct) ###
+`SkMatrix` translates between a C++ struct and a JS Array.
+It basically takes a nine element 1D Array and turns it into a
+3x3 2D Affine Matrix.
+
+### SkRect (struct) ###
+
+`SkRect` translates between a C++ struct and a JS Object with
+the following keys (all values are `Number`:
+
+  - **fLeft**: x coordinate of top-left corner
+  - **fTop**: y coordinate of top-left corner
+  - **fRight**: x coordinate of bottom-right corner
+  - **fBottom**: y coordinate of bottom-rightcorner
+
+### StrokeOpts (struct) ###
+`StrokeOpts` translates between a C++ struct and a JS Object with
+the following keys:
+
+  - **width**, `Number` the width of the lines of the path. Default 1.
+  - **miter_limit**, `Number`, the miter limit. Defautl 4. See [SkPaint reference](https://skia.org/user/api/SkPaint_Reference#Miter_Limit) for more details.
+  - **join**, `StrokeJoin`, the join to use. Default `PathKit.StrokeJoin.MITER`.
+See [SkPaint reference](https://skia.org/user/api/SkPaint_Reference#SkPaint_Join) for more details.
+  - **cap**, `StrokeCap`, the cap to use. Default `PathKit.StrokeCap.BUTT`.
+See [SkPaint reference](https://skia.org/user/api/SkPaint_Reference#Stroke_Cap) for more details.
+
+### PathOp (enum) ###
+The following enum values are exposed. They are essentially constant
+objects, differentiated by thier `.value` property.
+
+  - `PathKit.PathOp.DIFFERENCE`
+  - `PathKit.PathOp.INTERSECT`
+  - `PathKit.PathOp.REVERSE_DIFFERENCE`
+  - `PathKit.PathOp.UNION`
+  - `PathKit.PathOp.XOR`
+
+These are used in `PathKit.MakeFromOp()` and `SkPath.op()`.
+
+### FillType (enum) ###
+The following enum values are exposed. They are essentially constant
+objects, differentiated by thier `.value` property.
+
+  - `PathKit.FillType.WINDING` (also known as nonzero)
+  - `PathKit.FillType.EVENODD`
+  - `PathKit.FillType.INVERSE_WINDING`
+  - `PathKit.FillType.INVERSE_EVENODD`
+
+These are used by `SkPath.getFillType()` and `SkPath.setFillType()`, but
+generally clients will want `SkPath.getFillTypeString()`.
+
+### StrokeJoin (enum) ###
+The following enum values are exposed. They are essentially constant
+objects, differentiated by thier `.value` property.
+
+  - `PathKit.StrokeJoin.MITER`
+  - `PathKit.StrokeJoin.ROUND`
+  - `PathKit.StrokeJoin.BEVEL`
+
+See [SkPaint reference](https://skia.org/user/api/SkPaint_Reference#SkPaint_Join) for more details.
+
+### StrokeCap (enum) ###
+The following enum values are exposed. They are essentially constant
+objects, differentiated by thier `.value` property.
+
+  - `PathKit.StrokeCap.BUTT`
+  - `PathKit.StrokeCap.ROUND`
+  - `PathKit.StrokeCap.SQUARE`
+
+See [SkPaint reference](https://skia.org/user/api/SkPaint_Reference#Stroke_Cap) for more details.
+
+### Constants ###
+The following constants are exposed:
+
+  - `PathKit.MOVE_VERB` = 0
+  - `PathKit.LINE_VERB` = 1
+  - `PathKit.QUAD_VERB` = 2
+  - `PathKit.CONIC_VERB` = 3
+  - `PathKit.CUBIC_VERB` = 4
+  - `PathKit.CLOSE_VERB` = 5
+
+These are only needed for `PathKit.FromCmds()`.
+
+### Functions for testing only ###
+
+#### `PathKit.LTRBRect(left, top, right, bottom)` ####
+**left** - `Number`, x coordinate of top-left corner of the `SkRect`. <br>
+**top** - `Number`, y coordinate of top-left corner of the `SkRect`. <br>
+**right** - `Number`, x coordinate of bottom-right corner of the `SkRect`. <br>
+**bottom** - `Number`, y coordinate of bottom-right corner of the `SkRect`.
+
+Returns an `SkRect` object with the given params.
+
+#### `SkPath.dump()` ####
+
+Prints all the verbs and arguments to the console.
+Only available on Debug and Test builds.
diff --git a/src/third_party/skia/site/user/modules/skottie.md b/src/third_party/skia/site/user/modules/skottie.md
new file mode 100644
index 0000000..a46578b
--- /dev/null
+++ b/src/third_party/skia/site/user/modules/skottie.md
@@ -0,0 +1,78 @@
+Animation Player
+================
+
+Skia now offers a performant, secure native player for JSON animations derived
+from the Bodymovin plugin for After Effects. It can be used on any platform
+where you are using Skia, including Android & iOS.
+
+The player aims to build upon the Lottie player widely used for animations
+today, improving on the performance, feature set, and platform cohesiveness for
+our clients. We are big fans of the Bodymovin format and where possible,
+contributing advancements back to Bodymovin/Lottie.
+
+<br>
+
+Sample JSON animations
+----------------------
+
+Here are some test samples rendering with Skia's animation player:
+
+<a href="https://skottie.skia.org/e6741dda67629da1f80c254dad3df865">
+  <skottie-inline-sk src="https://skottie.skia.org/_/j/e6741dda67629da1f80c254dad3df865" width=200 height=200></skottie-inline-sk>
+</a>
+<a href="https://skottie.skia.org/ffea72cf6be48fa061671c124ed7789c">
+  <skottie-inline-sk src="https://skottie.skia.org/_/j/ffea72cf6be48fa061671c124ed7789c" width=200 height=200></skottie-inline-sk>
+</a>
+<a href="https://skottie.skia.org/00e850cdbed7304985eaefe98a4e8a9c">
+  <skottie-inline-sk src="https://skottie.skia.org/_/j/00e850cdbed7304985eaefe98a4e8a9c" width=200 height=200></skottie-inline-sk>
+</a>
+<a href="https://skottie.skia.org/e1aca009d5ebec9bd122b87b018bb673">
+  <skottie-inline-sk src="https://skottie.skia.org/_/j/e1aca009d5ebec9bd122b87b018bb673" width=200 height=200></skottie-inline-sk>
+</a>
+<a href="https://skottie.skia.org/821fd79dd7437b97ba891e7a00970a06">
+  <skottie-inline-sk src="https://skottie.skia.org/_/j/821fd79dd7437b97ba891e7a00970a06" width=200 height=200></skottie-inline-sk>
+</a>
+<a href="https://skottie.skia.org/ad63f250084685c96edd9b52ae2f436b">
+  <skottie-inline-sk src="https://skottie.skia.org/_/j/ad63f250084685c96edd9b52ae2f436b" width=200 height=200></skottie-inline-sk>
+</a>
+<a href="https://skottie.skia.org/40f78ddc751c16348a08e1d61d3e78b1">
+  <skottie-inline-sk src="https://skottie.skia.org/_/j/40f78ddc751c16348a08e1d61d3e78b1" width=200 height=200></skottie-inline-sk>
+</a>
+<a href="https://skottie.skia.org/fc42db7c75741437b5cb0e90b3febc65">
+  <skottie-inline-sk src="https://skottie.skia.org/_/j/fc42db7c75741437b5cb0e90b3febc65" width=200 height=200></skottie-inline-sk>
+</a>
+
+*Sample animations courtesy of the lottiefiles.com community
+
+<br>
+
+Test server
+-----------
+
+Test your Lottie files in our player at https://skottie.skia.org
+
+<br>
+
+The code
+--------
+Skia's animation code entry point can be found here on
+[Googlesource](https://skia.googlesource.com/skia/+/master/modules/skottie/include/Skottie.h)
+and [GitHub](https://github.com/google/skia/blob/master/modules/skottie/include/Skottie.h).
+The code is part of Skia's library but can also be made available as a separate
+package.
+
+<br>
+
+Embedding examples
+------------------
+Sample C code for using the Skottie native player can be found
+[here](https://github.com/google/skia/blob/master/modules/skottie/src/SkottieTool.cpp).
+
+Android app code for inspiration can be found 
+[here](https://github.com/google/skia/tree/master/platform_tools/android/apps/skottie).
+
+Example code embedding Skottie into our Viewer app is
+[here](https://github.com/google/skia/blob/master/tools/viewer/SkottieSlide.cpp).
+
+The Viewer or Skottie Android apps can be built following [these](https://skia.org/user/sample/viewer)
+instructions.
diff --git a/src/third_party/skia/site/user/privacy.md b/src/third_party/skia/site/user/privacy.md
new file mode 100644
index 0000000..4d5a15b
--- /dev/null
+++ b/src/third_party/skia/site/user/privacy.md
@@ -0,0 +1,5 @@
+Privacy
+=======
+
+When interacting with any of the web applications provided on
+skia.org we follow this [privacy policy](https://policies.google.com/privacy).
diff --git a/src/third_party/skia/site/user/quick/METADATA b/src/third_party/skia/site/user/quick/METADATA
deleted file mode 100644
index 0c2cb34..0000000
--- a/src/third_party/skia/site/user/quick/METADATA
+++ /dev/null
@@ -1,2 +0,0 @@
-{ "fileOrder": ["ios"] }
-
diff --git a/src/third_party/skia/site/user/quick/index.md b/src/third_party/skia/site/user/quick/index.md
deleted file mode 100644
index 35c9e5a..0000000
--- a/src/third_party/skia/site/user/quick/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Quick Start Guides (Deprecated)
-===============================
-
-This section is obsolete and will be removed soon.
-See [How to build Skia](/user/build) for the best way to build Skia.
diff --git a/src/third_party/skia/site/user/release/index.md b/src/third_party/skia/site/user/release/index.md
new file mode 100644
index 0000000..75c79a8
--- /dev/null
+++ b/src/third_party/skia/site/user/release/index.md
@@ -0,0 +1,9 @@
+Release Information
+===================
+
+We recommend most clients track our tip-of-tree, as we work hard to keep it
+green, and doing so gives us timely feedback and users the best chance of
+getting fixes.
+
+If you require less frequent updates, we cut a stable milestone every 6 weeks
+along with Chrome.
diff --git a/src/third_party/skia/site/user/release/release_notes.md b/src/third_party/skia/site/user/release/release_notes.md
new file mode 100644
index 0000000..0e1194b
--- /dev/null
+++ b/src/third_party/skia/site/user/release/release_notes.md
@@ -0,0 +1,67 @@
+Milestone Release Notes
+=======================
+
+This page includes a list of high level updates for each milestone release.
+
+Milestone 78
+------------
+  * Added RELEASE_NOTES.txt file
+    https://review.skia.org/229760
+  * 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
+
diff --git a/src/third_party/skia/site/schedule.md b/src/third_party/skia/site/user/release/schedule.md
similarity index 78%
rename from src/third_party/skia/site/schedule.md
rename to src/third_party/skia/site/user/release/schedule.md
index 2182be4..8702bf5 100644
--- a/src/third_party/skia/site/schedule.md
+++ b/src/third_party/skia/site/user/release/schedule.md
@@ -10,18 +10,18 @@
 After the six week period, when another branch is cut, only critical (typically
 security) fixes will be committed to any previous branch.
 
-Skia 2017 schedule:
+Skia 2019 schedule:
 
   Milestone | Branch Date (beginning of day)
   ----------|-------------------------------
-  57        | 01/19/17
-  58        | 03/02/17
-  59        | 04/13/17
-  60        | 05/25/17
-  61        | 07/20/17
-  62        | 08/31/17
-  63        | 10/12/17
-  64        | 11/30/17
+  73        | 01/24/19
+  74        | 03/07/19
+  75        | 04/18/19
+  76        | 05/30/19
+  77        | 07/25/19
+  78        | 09/05/19
+  79        | 10/17/19
+  80        | 12/05/19
 
 The current milestone is included in the headers in
 [SkMilestone.h](https://skia.googlesource.com/skia/+/master/include/core/SkMilestone.h).
diff --git a/src/third_party/skia/site/user/sample/architecture.png b/src/third_party/skia/site/user/sample/architecture.png
deleted file mode 100644
index a2b74cf..0000000
--- a/src/third_party/skia/site/user/sample/architecture.png
+++ /dev/null
Binary files differ
diff --git a/src/third_party/skia/site/user/sample/color.md b/src/third_party/skia/site/user/sample/color.md
deleted file mode 100644
index 28d86d3..0000000
--- a/src/third_party/skia/site/user/sample/color.md
+++ /dev/null
@@ -1,193 +0,0 @@
-Color Correct Skia
-==================
-
-Why is Skia Color Correct?
---------------------------
-
-A color space is a **gamut** and a **transfer function**.
-
-Gamut refers to the **available range of colors** of a particular in an image or on a display
-device.  Being gamut correct means that we will display colors as the designer intended and
-consistently across display devices.  A common problem with new “wide gamut” devices and
-uncorrected colors is illustrated below.
-
-Device Dependent Color (Wrong)
-
-<img src='gamut_wrong.png'>
-
-Gamut Corrected Color
-
-<img src='gamut_correct.png'>
-
-Transfer function refers to **a non-linear encoding of pixel values**.  A common transfer function
-is shown below.
-
-<img src='transfer_fn.png'>
-
-If we ignore the transfer function and treat non-linear values as if they are linear (when
-filtering, blending, anti-aliasing, multiplying), everything gets “too dark”.
-
-For example, we should see yellow (not brown) as the average of red and green light.
-
-Ignore Transfer Function
-
-<img src='gradient_wrong.png'>
-
-Apply Transfer Function
-
-<img src='gradient_correct.png'>
-
-Also, we should maintain fine detail when anti-aliasing (or downscaling).
-
-Ignore Transfer Function
-
-<img src='detail_wrong.png'>
-
-Apply Transfer Function
-
-<img src='detail_correct.png'>
-
-Skia Architecture for Color Correctness
----------------------------------------
-
-<img src='architecture.png'>
-
-The major stages of the Skia drawing pipeline (premultiplication, filtering, blending) all assume
-linear inputs and linear outputs.  Also, because they are linear operations, they are
-interchangeable.
-
-The gamut transform is a new operation (3x3 matrix) in the pipeline, but with similar properties:
-it is a linear operation with linear inputs and linear outputs.
-
-The important shift in logic from the legacy pipeline is that we actually apply the transfer
-function to transform the pixels to linear values before performing the linear operations.
-
-The most common transfer function, sRGB, is actually free on GPU!  GPU hardware can transform sRGB
-to linear on reads and linear to sRGB on writes.
-
-Best Practices for Color Correct Skia
--------------------------------------
-
-In order to perform color correct rendering, Skia needs to know the **SkColorSpace** of the content
-that you draw and the **SkColorSpace** of the surface that you draw to.  There are useful factories
-to make color spaces.
-
-<!--?prettify lang=cc?-->
-
-	// Really common color spaces
-	sk_sp<SkColorSpace> MakeSRGB();
-	sk_sp<SkColorSpace> MakeSRGBLinear();
-	
-	// Choose a common gamut and a common transfer function
-	sk_sp<SkColorSpace> MakeRGB(RenderTargetGamma, Gamut);
-	
-	// Create a color space from an ICC profile
-	sk_sp<SkColorSpace> MakeICC();
-
-Starting with **sources** (the things that draw you draw), there are a number of ways to make sure
-that they are tagged with a color space.
-
-**SkColor** (stored on **SkPaint**) is assumed to be in the sRGB color space - meaning that it
-is in the sRGB gamut and encoded with the sRGB transfer function.
-
-**SkShaders** (also stored on **SkPaint**) can be used to create more complex colors.  Color and
-gradient shaders typically accept **SkColor4f** (float colors).  These high precision colors
-can be in any gamut, but must have a linear transfer function.
-
-<!--?prettify lang=cc?-->
-
-	// Create a high precision color in a particular color space
-	sk_sp<SkShader> MakeColorShader(const SkColor4f&, sk_sp<SkColorSpace>);
-	
-	// Create a gradient shader in a particular color space
-	sk_sp<SkShader> MakeLinear(const SkPoint pts[2], const SkColor4f colors[2],
-	                           sk_sp<SkColorSpace>, ...);
-	
-	// Many more variations of shaders...
-	// Remember that SkColor is always assumed to be sRGB as a convenience
-
-**SkImage** is the preferred representation for image sources.  It is easy to create **SkImages**
- that are tagged with color spaces.
-
-<!--?prettify lang=cc?-->
-	
-	// Create an image from encoded data (jpeg, png, etc.)
-	// Will be tagged with the color space of the encoded data
-	sk_sp<SkImage> MakeFromEncoded(sk_sp<SkData> encoded);
-	
-	// Create an image from a texture in a particular color space
-	// Caution: There are versions of this constructor that do not take an
-	//          SkColorSpace.  But without an SkColorSpace, Skia does not have
-	//          enough information to draw correctly.
-	sk_sp<SkImage> MakeFromTexture(GrContext*, const GrBackendTextureDesc&,
-	                               SkAlphaType, sk_sp<SkColorSpace>, ...);
-
-**SkBitmap** is another (not preferred) representation for image sources.  Be careful to not forget
-the color space.
-
-<!--?prettify lang=cc?-->
-
-	SkBitmap bitmap;
-	bitmap.allocN32Pixels(); // Bad: What is the color space?
-	
-	SkBitmap bitmap;
-	SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
-	bitmap.allocPixels(info); // Bad: N32 is shorthand for 8888, no color space
-	
-	SkBitmap bitmap;
-	SkImageInfo info = SkImageInfo::MakeS32(width, height, kPremul_SkAlphaType);
-	bitmap.allocPixels(info); // Good: S32 is shorthand for 8888, sRGB
-
-**SkImageInfo** is a useful struct for providing information about pixel buffers.  Remember to use
-the color correct variants.
-
-<!--?prettify lang=cc?-->
-
-	// sRGB, 8888
-	SkImageInfo MakeS32(int width, int height, SkAlphaType);
-	
-	// Create an SkImageInfo in a particular color space
-	SkImageInfo Make(int width, int height, SkColorType, SkAlphaType,
-	                 sk_sp<SkColorSpace>);
-
-Moving to **destinations** (the surfaces that you draw to), there are also constructors that allow
-them to be tagged with color spaces.
-
-<!--?prettify lang=cc?-->
-
-	// Raster backed: Make sure |info| has a non-null color space
-	sk_sp<SkSurface> MakeRaster(const SkImageInfo& info);
-	
-	// Gpu backed: Make sure |info| has a non-null color space
-	sk_sp<SkSurface> SkSurface::MakeRenderTarget(GrContext, SkBudgeted,
-	                                             const SkImageInfo& info);
-
-Opting In To Color Correct Skia
--------------------------------
-
-By itself, **adding a color space tag to a source will not change draw behavior**.  In fact,
-tagging sources with color spaces is always a best practice, regardless of whether we want Skia’s
-color correct behavior.
-
-Adding a color space tag to the **destination is the trigger that turns on Skia color correct
-behavior**.
-
-Drawing a source without a color space to a destination with a color space is undefined.  Skia
-cannot know how to draw without knowing the color space of the source.
-
-<style scoped><!--
-#colortable {border-collapse:collapse;}
-#colortable tr th, #colortable tr td {border:#888888 2px solid;padding: 5px;}
---></style>
-<table id="colortable">
-<tr><th>Source SkColorSpace</th> <th>Destination SkColorSpace</th>  <th>Behavior</th></tr>
-<tr><td>Non-null</td>            <td>Non-null</td>                  <td>Color Correct Skia</td></tr>
-<tr><td>Null</td>                <td>Non-null</td>                  <td>Undefined</td></tr>
-<tr><td>Non-null</td>            <td>Null</td>                      <td>Legacy Skia</td></tr>
-<tr><td>Null</td>                <td>Null</td>                      <td>Legacy Skia</td></tr>
-</table>
-
-It is possible to create **an object that is both a source and destination**, if Skia will both
-draw into it and then draw it somewhere else.  The same rules from above still apply, but it is
-subtle that the color space tag could have an effect (or no effect) depending on how the object is
-used.
\ No newline at end of file
diff --git a/src/third_party/skia/site/user/sample/detail_correct.png b/src/third_party/skia/site/user/sample/detail_correct.png
deleted file mode 100644
index 3f14885..0000000
--- a/src/third_party/skia/site/user/sample/detail_correct.png
+++ /dev/null
Binary files differ
diff --git a/src/third_party/skia/site/user/sample/detail_wrong.png b/src/third_party/skia/site/user/sample/detail_wrong.png
deleted file mode 100644
index bd3c836..0000000
--- a/src/third_party/skia/site/user/sample/detail_wrong.png
+++ /dev/null
Binary files differ
diff --git a/src/third_party/skia/site/user/sample/gamut_correct.png b/src/third_party/skia/site/user/sample/gamut_correct.png
deleted file mode 100644
index bb94caf..0000000
--- a/src/third_party/skia/site/user/sample/gamut_correct.png
+++ /dev/null
Binary files differ
diff --git a/src/third_party/skia/site/user/sample/gamut_wrong.png b/src/third_party/skia/site/user/sample/gamut_wrong.png
deleted file mode 100644
index a5e584d..0000000
--- a/src/third_party/skia/site/user/sample/gamut_wrong.png
+++ /dev/null
Binary files differ
diff --git a/src/third_party/skia/site/user/sample/gradient_correct.png b/src/third_party/skia/site/user/sample/gradient_correct.png
deleted file mode 100644
index 5649995..0000000
--- a/src/third_party/skia/site/user/sample/gradient_correct.png
+++ /dev/null
Binary files differ
diff --git a/src/third_party/skia/site/user/sample/gradient_wrong.png b/src/third_party/skia/site/user/sample/gradient_wrong.png
deleted file mode 100644
index 8b70450..0000000
--- a/src/third_party/skia/site/user/sample/gradient_wrong.png
+++ /dev/null
Binary files differ
diff --git a/src/third_party/skia/site/user/sample/pdf.md b/src/third_party/skia/site/user/sample/pdf.md
index 7bd7b74..8847a96 100644
--- a/src/third_party/skia/site/user/sample/pdf.md
+++ b/src/third_party/skia/site/user/sample/pdf.md
@@ -4,38 +4,8 @@
 Here is an example of using Skia's PDF backend (SkPDF) via the
 SkDocument and SkCanvas APIs.
 
-<!--?prettify lang=cc?-->
-
-    #include "SkDocument.h"
-
-    void WritePDF(SkWStream* outputStream,
-                  const char* documentTitle,
-                  void (*writePage)(SkCanvas*, int page),
-                  int numberOfPages,
-                  SkSize pageSize) {
-        SkDocument::PDFMetadata metadata;
-        metadata.fTitle = documentTitle;
-        metadata.fCreator = "Example WritePDF() Function";
-        SkTime::DateTime now;
-        SkTime::GetDateTime(&now);
-        metadata.fCreation.fEnabled  = true;
-        metadata.fCreation.fDateTime = now;
-        metadata.fModified.fEnabled  = true;
-        metadata.fModified.fDateTime = now;
-        sk_sp<SkDocument> pdfDocument = SkDocument::MakePDF(
-                outputStream, SK_ScalarDefaultRasterDPI, metadata,
-                nullptr, true);
-        assert(pdfDocument);
-
-        for (int page = 0; page < numberOfPages; ++page) {
-            SkCanvas* pageCanvas =
-                    pdfDocument->beginPage(pageSize.width(),
-                                           pageSize.height());
-            writePage(pageCanvas, page);
-            pdfDocument->endPage();
-        }
-        pdfDocument->close();
-    }
+<fiddle-embed name='@PDF'></fiddle-embed>
+<!-- https://fiddle.skia.org/c/@PDF docs/examples/PDF.cpp -->
 
 * * *
 
@@ -50,7 +20,7 @@
 
   + **drop** means to draw nothing.
 
-  + **ignore** mean to draw without the effect
+  + **ignore** means to draw without the effect
 
   + **expand** means to implement something in a non-PDF-ish way.
     This may mean to rasterize vector graphics, to expand paths with
diff --git a/src/third_party/skia/site/user/sample/sampleapp.md b/src/third_party/skia/site/user/sample/sampleapp.md
deleted file mode 100644
index 9738bd3..0000000
--- a/src/third_party/skia/site/user/sample/sampleapp.md
+++ /dev/null
@@ -1,23 +0,0 @@
-About SampleApp
-==========================
-The SampleApp displays a series of slides that exhibit specific features of the Skia system. It is mainly controlled using the keyboard: left (&#x2190;) and (&#x2192;) right arrows to move from slide to slide. Some slides require use resources stored outside the program. These resources are stored in the `<skia-path>/resources` directory.
-
-`<skia-path>/out/Release/SampleApp --resourcePath <skia-path>/resources`
-
-
-In addition to displaying various aspects of Skia, SampleApp is used to debug and understand different parts of the Skia system.
-
-* Observe rendering performance - pressing the 'f' key places the SampleApp in frame rate mode. It continuously draws the slide while desplaying the draw time in the title of the window.
-* Try different rendering methods - pressing the 'd' key cycles among the three rendering methods raster, picture and opengl. You can use this with the 'f' key to see the effect that the different rendering methods have on drawing performance.
-* Look at different angles - pressing the 'r' slowley rotates the slide.
-* Display and manipulate your own pictures - use the `--picture <skp-file-path>.skp` to use the `.skp` file as the slide desplayed by SampleApp. A `.skp` file can be generated by...
-
-Key                              | Action
------------------------------|-------------
-&#x2190; &#x2192; | Move between the slides
-r                                    | Rotate the current slide
-&#x2191; &#x2193; | Zoom in / out
-d                                   | Change render methods among raster, picture and opengl
-f                                     | Display the rendering time in the menu bar
-G                                    | Show bounding box
-
diff --git a/src/third_party/skia/site/user/sample/transfer_fn.png b/src/third_party/skia/site/user/sample/transfer_fn.png
deleted file mode 100644
index 14d38bd..0000000
--- a/src/third_party/skia/site/user/sample/transfer_fn.png
+++ /dev/null
Binary files differ
diff --git a/src/third_party/skia/site/user/sample/viewer.md b/src/third_party/skia/site/user/sample/viewer.md
index 0f47b98..3317512 100644
--- a/src/third_party/skia/site/user/sample/viewer.md
+++ b/src/third_party/skia/site/user/sample/viewer.md
@@ -1,16 +1,12 @@
 Skia Viewer
 ==========================
-The Skia Viewer is another windowed app similar to SampleApp. Its main advantages over SampleApp are that it supports Vulkan on Linux, Windows and Android, and it uses a cleaner cross-platform windowing system (currently located in tools/viewer/sk_app). However, it is a work in progress, so it doesn't yet support all the features of SampleApp.
+The Skia Viewer displays a series of slides that exhibit specific features of Skia, including the Skia golden master images (or GMs) and programmed samples that allow interaction. In addition, the Viewer is used to debug and understand different parts of the Skia system:
 
-Like SampleApp, it displays a series of slides that exhibit specific features of the Skia system. It is mainly controlled using the keyboard: left (&#x2190;) and (&#x2192;) right arrows to move from slide to slide. Some slides require use resources stored outside the program. These resources are stored in the `<skia-path>/resources` directory.
+* Observe rendering performance - placing the Viewer in stats mode displays average frame times.
+* Try different rendering methods - it's possible to cycle among the three rendering methods: raster, OpenGL and Vulkan (on supported platforms). You can use this with stats mode to see the effect that the different rendering methods have on drawing performance.
+* Display and manipulate your own pictures.
 
-`<skia-path>/out/Release/viewer --resourcePath <skia-path>/resources`
-
-In addition to displaying various aspects of Skia, the Viewer is used to debug and understand different parts of the Skia system:
-
-* Observe rendering performance - pressing the 'f' key places the Viewer in frame rate mode. It continuously draws the slide while desplaying the draw time in the title of the window.
-* Try different rendering methods - pressing the 'd' key cycles among the three rendering methods: raster, OpenGL and Vulkan (on supported platforms). You can use this with the 'f' key to see the effect that the different rendering methods have on drawing performance. You can start up with a particular rendering method by using one of the command line options `--backend sw`, `--backend gl`, or `--backend vk` respectively.
-* Display and manipulate your own pictures - use `--skps <skp-file-path>` to load any `.skp` files to be displayed by the Viewer. Using `--match <slide-name>` will load only SKPs or slides matching that name.
+Some slides require resources stored outside the program. These resources are stored in the `<skia-path>/resources` directory.
 
 Linux, Macintosh and Windows
 ----------------------------
@@ -20,28 +16,55 @@
     bin/gn gen out/Release --args='is_debug=false'
     ninja -C out/Release viewer
 
-Android
--------
-The Viewer APK must be built by gradle which can be invoked on the command line with the following script...
+To load resources in the desktop Viewers, use the `--resourcePath` option:
 
-    ./platform_tools/android/bin/android_build_app -C <out_dir> viewer
+    <skia-path>/out/Release/viewer --resourcePath <skia-path>/resources
 
-*   **out_dir** is the ninja out directory for android (e.g., `out/arm64`) that you want to use to
-build the app
+Similarly, `--skps <skp-file-path>` will load any `.skp` files in that directory for display within the Viewer.
 
-Upon completion of the script the APK can be found at <out_dir>/viewer.apk
+Other useful command-line options: using `--match <pattern>` will load only SKPs or slides matching that name; using `--slide <name>` will launch at that slide; and you can start up with a particular rendering method by using `--backend`, i.e., `--backend sw`, `--backend gl`, or `--backend vk`.
 
-To load SKPs in the Android viewer place them in /data/local/tmp/skps.
-
-iOS
----
-The viewer is currently not supported on iOS.
+The desktop Viewers are controlled using the keyboard and mouse: left (&#x2190;) and right (&#x2192;) arrows to move from slide to slide; up (&#x2191;) and down (&#x2193;) arrows to zoom in and out; clicking and dragging will translate. Other display options and a slide picker can be found in the Tools UI, which can be toggled by hitting the spacebar.
 
 Key                              | Action
 -----------------------------|-------------
 &#x2190; &#x2192; | Move between the slides
 &#x2191; &#x2193; | Zoom in / out
-d                                   | Change render methods among raster, OpenGL and Vulkan
-f                                     | Display the rendering time in the menu bar
+d                 | Change render methods among raster, OpenGL and Vulkan
+s                 | Display rendering times and graph
+Space             | Toggle display of Tools UI
 
+Android
+-------
 
+To build Viewer as an Android App, you will need the
+[Android SDK](https://developer.android.com/studio/#command-tools) installed and your `ANDROID_HOME` environment variable set.
+
+    mkdir ~/android-sdk
+    ( cd ~/android-sdk; unzip ~/Downloads/sdk-tools-*.zip )
+    yes | ~/android-sdk/tools/bin/sdkmanager --licenses
+    export ANDROID_HOME=~/android-sdk  # Or wherever you installed the Android SDK.
+
+The Viewer APK must be built by gradle which can be invoked on the command line
+with the following script:
+
+    platform_tools/android/bin/android_build_app -C <out_dir> viewer
+
+where `<out_dir>` is the ninja out directory for android (e.g., `out/arm64`)
+that you want to use to build the app. Upon completion of the script the APK
+can be found at `<out_dir>/viewer.apk`
+
+To load resources in the Android Viewer place them in
+`/data/local/tmp/resources`; to load SKPs place them in `/data/local/tmp/skps`.
+
+Swiping left and right will switch slides, pinch-zoom will zoom in and out, and
+display options are available in the UI.
+
+iOS
+---
+
+The viewer is not yet fully supported on iOS, but can be used to display
+individual slides on a device by launching via `ios-deploy` with the `--match`
+or `--slide` command-line options. The viewer will automatically bundle the
+`resources` directory in the top-level Skia directory, and will bundle an
+`skps` directory if also placed in the Skia directory.
diff --git a/src/third_party/skia/site/user/special/lua.md b/src/third_party/skia/site/user/special/lua.md
index b8a9cd5..9798273 100644
--- a/src/third_party/skia/site/user/special/lua.md
+++ b/src/third_party/skia/site/user/special/lua.md
@@ -21,7 +21,7 @@
 ----------
 
 The tools `lua_app` and `lua_pictures` should now be available when you compile,
-and `SampleApp` should now have a `Lua` sample.
+and `Viewer` should now have a `Lua` sample.
 
 
 To-Do
diff --git a/src/third_party/skia/site/user/special/vulkan.md b/src/third_party/skia/site/user/special/vulkan.md
index 8dfd26a..54a084f 100644
--- a/src/third_party/skia/site/user/special/vulkan.md
+++ b/src/third_party/skia/site/user/special/vulkan.md
@@ -1,7 +1,7 @@
 Vulkan
 ======
 
-Skis has a Vulkan implementation of its GPU backend. The Vulkan backend can be
+Skia has a Vulkan implementation of its GPU backend. The Vulkan backend can be
 built alongside the OpenGL backend. The client can select between the OpenGL
 and Vulkan implementation at runtime. The Vulkan backend has reached feature
 parity with the OpenGL backend. At this time we find that many Vulkan drivers
@@ -10,8 +10,7 @@
 
 Windows and Linux
 -----------------
-To build the Vulkan backend, set `skia_vulkan_sdk` to the path to your Vulkan SDK in `args.gn`.
-This defaults to the environment variable `VULKAN_SDK`.
+To build the Vulkan backend, set `skia_use_vulkan=true` in `args.gn`.
 
 Android
 -------
@@ -21,7 +20,7 @@
 Using the Vulkan Backend
 ------------------------
 
-To create a GrContext that is backed by Vulkan the client creates a Vulkan device and queue, initializes a GrVkBackendContext to describe the context, and then calls GrContext::Create:
+To create a GrContext that is backed by Vulkan the client creates a Vulkan device and queue, initializes a GrVkBackendContext to describe the context, and then calls GrContext::MakeVulkan:
 
 <!--?prettify lang=c++?-->
     sk_sp<GrVkBackendContext> vkContext = new GrVkBackendContext;
@@ -31,16 +30,18 @@
     vkBackendContext.fInterface.reset(GrVkCreateInterface(instance, vkPhysDevice, extensionFlags);
     ...
 
-    sk_sp<GrContext> context = GrContext::Create(kVulkan_GrBackend, (GrBackendContext) vkBackendContext);
+    sk_sp<GrContext> context = GrContext::MakeVulkan(vkBackendContext);
 
-When using the Vulkan backend the GrBackendObject field in
-GrBackendRenderTargetDesc and GrBackendTextureDesc is interpeted as a pointer
-to a GrVkImageInfo object. GrVkImageInfo specifies a VkImage and associated
-state (tiling, layout, format, etc). This allows the client to import
-externally created Vulkan images as destinations for Skia rendering via
-SkSurface factory functions or for to composite Skia rendered content using
-SkImage::getTextureHandle().
+When using the Vulkan backend, GrVkImageInfo is used to construct GrBackendTexture
+and GrBackendRenderTarget objects that in turn are used to create SkSurface and SkImage
+objects that refer to VkImages created by the Skia client.
 
+The GrBackendObject returned by SkImage::getTextureHandle(),
+SkSurface::getTextureHandle(), and SkSurface::getRenderTargetHandle() should be
+interpreted as a GrVkImageInfo*. This allows a client to get the backing VkImage
+of a SkImage or SkSurface.
+
+GrVkImageInfo specifies a VkImage and associated state (tiling, layout, format, etc).
 After getting a GrVkImageInfo* via getTextureHandle() or
 getRenderTargetHandle(), the client should check the fImageLayout field to know
 what layout Skia left the VkImage in before using the VkImage. If the client
diff --git a/src/third_party/skia/site/user/tips.md b/src/third_party/skia/site/user/tips.md
index c477138..0e417d5 100644
--- a/src/third_party/skia/site/user/tips.md
+++ b/src/third_party/skia/site/user/tips.md
@@ -32,13 +32,15 @@
 <span id="skp-capture">Capture a `.skp` file on a web page in Chromium</span>
 -----------------------------------------------------------------------------
 
+Use the script `experimental/tools/web_to_skp` , *or* do the following:
+
 1.  Launch Chrome or Chromium with `--no-sandbox --enable-gpu-benchmarking`
-2.  Open the JS console (ctrl-shift-J)
+2.  Open the JS console (Ctrl+Shift+J (Windows / Linux) or Cmd+Opt+J (MacOS))
 3.  Execute: `chrome.gpuBenchmarking.printToSkPicture('/tmp')`
     This returns "undefined" on success.
 
 Open the resulting file in the [Skia Debugger](/dev/tools/debugger), rasterize it with `dm`,
-or use Skia's `SampleApp` to view it:
+or use Skia's `viewer` to view it:
 
 <!--?prettify lang=sh?-->
 
@@ -46,7 +48,7 @@
         --config 8888 gpu pdf --verbose
     ls -l /tmp/*/skp/layer_0.skp.*
 
-    out/Release/SampleApp --picture /tmp/layer_0.skp
+    out/Release/viewer --skps /tmp --slide layer_0.skp
 
 * * *
 
@@ -56,8 +58,10 @@
 Multipage Skia Picture files capture the commands sent to produce PDFs
 and printed documents.
 
+Use the script `experimental/tools/web_to_mskp` , *or* do the following:
+
 1.  Launch Chrome or Chromium with `--no-sandbox --enable-gpu-benchmarking`
-2.  Open the JS console (ctrl-shift-J)
+2.  Open the JS console (Ctrl+Shift+J (Windows / Linux) or Cmd+Opt+J (MacOS))
 3.  Execute: `chrome.gpuBenchmarking.printPagesToSkPictures('/tmp/filename.mskp')`
     This returns "undefined" on success.
 
@@ -81,29 +85,23 @@
 
 There are two ways Skia takes advantage of specific hardware.
 
-1.  Subclass SkCanvas
-
-    Since all drawing calls go through SkCanvas, those calls can be
-    redirected to a different graphics API. SkGLCanvas has been
-    written to direct its drawing calls to OpenGL. See src/gl/
-
-2.  Custom bottleneck routines
+1.  Custom bottleneck routines
 
     There are sets of bottleneck routines inside the blits of Skia
     that can be replace on a platform in order to take advantage of
     specific CPU features. One such example is the NEON SIMD
-    instructions on ARM v7 devices. See src/opts/
+    instructions on ARM v7 devices. See [src/opts/](https://skia.googlesource.com/skia/+/master/src/opts/)
 
 * * *
 
 <span id="font-hinting">Does Skia support Font hinting?</span>
 --------------------------------------------------------------
 
-Skia has a built-in font cache, but it does not know how to actual render font
+Skia has a built-in font cache, but it does not know how to actually render font
 files like TrueType into its cache. For that it relies on the platform to
-supply an instance of SkScalerContext. This is Skia's abstract interface for
+supply an instance of `SkScalerContext`. This is Skia's abstract interface for
 communicating with a font scaler engine. In src/ports you can see support
-files for FreeType, Mac OS X, and Windows GDI font engines. Other font
+files for FreeType, macOS, and Windows GDI font engines. Other font
 engines can easily be supported in a like manner.
 
 
@@ -112,8 +110,11 @@
 <span id="kerning">Does Skia shape text (kerning)?</span>
 ---------------------------------------------------------
 
-No.  Skia provides interfaces to draw glyphs, but does not implement a
-text shaper. Skia's client's often use
+Shaping is the process that translates a span of Unicode text into a span of
+positioned glyphs with the apropriate typefaces.
+
+Skia does not shape text.  Skia provides interfaces to draw glyphs, but does
+not implement a text shaper. Skia's client's often use
 [HarfBuzz](http://www.freedesktop.org/wiki/Software/HarfBuzz/) to
 generate the glyphs and their positions, including kerning.
 
@@ -121,7 +122,7 @@
 together](https://github.com/aam/skiaex).  In the example, a
 `SkTypeface` and a `hb_face_t` are created using the same `mmap()`ed
 `.ttf` font file. The HarfBuzz face is used to shape unicode text into
-a sequence of glyphs and positions, and the SkTypeface can then be
+a sequence of glyphs and positions, and the `SkTypeface` can then be
 used to draw those glyphs.
 
 * * *
@@ -132,25 +133,22 @@
 <!--?prettify lang=cc?-->
 
     void draw(SkCanvas* canvas) {
-        const char text[] = "Skia";
-        const SkScalar radius = 2.0f;
+        const SkScalar sigma = 1.65f;
         const SkScalar xDrop = 2.0f;
         const SkScalar yDrop = 2.0f;
         const SkScalar x = 8.0f;
         const SkScalar y = 52.0f;
         const SkScalar textSize = 48.0f;
         const uint8_t blurAlpha = 127;
-        canvas->drawColor(SK_ColorWHITE);
+        auto blob = SkTextBlob::MakeFromString("Skia", SkFont(nullptr, textSize));
         SkPaint paint;
         paint.setAntiAlias(true);
-        paint.setTextSize(textSize);
         SkPaint blur(paint);
         blur.setAlpha(blurAlpha);
-        blur.setMaskFilter(SkBlurMaskFilter::Make(
-            kNormal_SkBlurStyle,
-            SkBlurMaskFilter::ConvertRadiusToSigma(radius), 0));
-        canvas->drawText(text, strlen(text), x + xDrop, y + yDrop, blur);
-        canvas->drawText(text, strlen(text), x, y, paint);
+        blur.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, sigma, 0));
+        canvas->drawColor(SK_ColorWHITE);
+        canvas->drawTextBlob(blob.get(), x + xDrop, y + yDrop, blur);
+        canvas->drawTextBlob(blob.get(), x,         y,         paint);
     }
 
 <a href='https://fiddle.skia.org/c/@text_shadow'><img src='https://fiddle.skia.org/i/@text_shadow_raster.png'></a>