<ahref='#Canvas'>Canvas</a> provides an interface for drawing, and how the drawing is clipped and transformed.
<ahref='#Canvas'>Canvas</a> contains a stack of <ahref='#Matrix'>Matrix</a> and <ahref='#Clip'>Clip</a> values.
<ahref='#Canvas'>Canvas</a> and <ahref='SkPaint_Reference#Paint'>Paint</a> together provide the state to draw into <ahref='SkSurface_Reference#Surface'>Surface</a> or <ahref='undocumented#Device'>Device</a>.
Each <ahref='#Canvas'>Canvas</a> draw call transforms the geometry of the object by the concatenation of all
<ahref='#Matrix'>Matrix</a> values in the stack. The transformed geometry is clipped by the intersection
of all of <ahref='#Clip'>Clip</a> values in the stack. The <ahref='#Canvas'>Canvas</a> draw calls use <ahref='SkPaint_Reference#Paint'>Paint</a> to supply drawing
state such as <ahref='SkColor_Reference#Color'>Color</a>, <ahref='undocumented#Typeface'>Typeface</a>, text size, stroke width, <ahref='undocumented#Shader'>Shader</a> and so on.
To draw to a pixel-based destination, create <ahref='undocumented#Raster_Surface'>Raster Surface</a> or <ahref='undocumented#GPU_Surface'>GPU Surface</a>.
Request <ahref='#Canvas'>Canvas</a> from <ahref='SkSurface_Reference#Surface'>Surface</a> to obtain the interface to draw.
<ahref='#Canvas'>Canvas</a> generated by <ahref='undocumented#Raster_Surface'>Raster Surface</a> draws to memory visible to the CPU.
<ahref='#Canvas'>Canvas</a> generated by <ahref='undocumented#GPU_Surface'>GPU Surface</a> uses Vulkan or OpenGL to draw to the GPU.
To draw to a document, obtain <ahref='#Canvas'>Canvas</a> from <ahref='undocumented#Canvas'>SVG Canvas</a>, <ahref='undocumented#PDF'>Document PDF</a>, or <ahref='undocumented#Recorder'>Picture Recorder</a>.
<ahref='undocumented#Document'>Document</a> based <ahref='#Canvas'>Canvas</a> and other <ahref='#Canvas'>Canvas</a> Subclasses reference <ahref='undocumented#Device'>Device</a> describing the
<ahref='#Canvas'>Canvas</a> can be constructed to draw to <ahref='SkBitmap_Reference#Bitmap'>Bitmap</a> without first creating <ahref='undocumented#Raster_Surface'>Raster Surface</a>.
SkCanvas related constants are defined by <code>enum</code>, <code>enum class</code>, <code>#define</code>, <code>const</code>, and <code>constexpr</code>.
Create the desired type of <ahref='SkSurface_Reference#Surface'>Surface</a> to obtain its <ahref='#Canvas'>Canvas</a> when possible. Useful
when no <ahref='SkSurface_Reference#Surface'>Surface</a> is required, and some helpers implicitly create <ahref='undocumented#Raster_Surface'>Raster Surface</a>.
SkCanvas can be constructed or initialized by these functions, including C++ class constructors.
<tdstyle='text-align: left; border: 2px solid #dddddd; padding: 8px; '>creates from image data and <ahref='undocumented#Storage'>Pixel Storage</a></td>
<tdstyle='text-align: left; border: 2px solid #dddddd; padding: 8px; '>creates with no <ahref='SkSurface_Reference#Surface'>Surface</a>, no dimensions</td>
<tdstyle='text-align: left; border: 2px solid #dddddd; padding: 8px; '>creates from image data and <ahref='undocumented#Storage'>Pixel Storage</a></td>
<tdstyle='text-align: left; border: 2px solid #dddddd; padding: 8px; '>draws text with arrays of positions and <ahref='SkPaint_Reference#Paint'>Paint</a></td>
<tdstyle='text-align: left; border: 2px solid #dddddd; padding: 8px; '>returns if <ahref='#Clip'>Clip</a> is <ahref='SkRect_Reference#Rect'>Rect</a> and not empty</td>
<tdstyle='text-align: left; border: 2px solid #dddddd; padding: 8px; '>restores changes to <ahref='#Clip'>Clip</a> and <ahref='#Matrix'>Matrix</a> to given depth</td>
<ahref='#SkCanvas_MakeRasterDirect_info'>info</a> dimensions are zero or positive;
<ahref='#SkCanvas_MakeRasterDirect_info'>info</a> contains <ahref='SkImageInfo_Reference#Color_Type'>Color Type</a> and <ahref='SkImageInfo_Reference#Alpha_Type'>Alpha Type</a> supported by <ahref='undocumented#Raster_Surface'>Raster Surface</a>;
<ahref='#SkCanvas_MakeRasterDirect_pixels'>pixels</a> is not nullptr;
<ahref='#SkCanvas_MakeRasterDirect_rowBytes'>rowBytes</a> is zero or large enough to contain <ahref='#SkCanvas_MakeRasterDirect_info'>info</a> width <ahref='#SkCanvas_MakeRasterDirect_pixels'>pixels</a> of <ahref='SkImageInfo_Reference#Color_Type'>Color Type</a>.
Pass zero for <ahref='#SkCanvas_MakeRasterDirect_rowBytes'>rowBytes</a> to compute <ahref='#SkCanvas_MakeRasterDirect_rowBytes'>rowBytes</a> from <ahref='#SkCanvas_MakeRasterDirect_info'>info</a> width and size of pixel.
If <ahref='#SkCanvas_MakeRasterDirect_rowBytes'>rowBytes</a> is greater than zero, it must be equal to or greater than
<ahref='#SkCanvas_MakeRasterDirect_info'>info</a> width times bytes required for <ahref='SkImageInfo_Reference#Color_Type'>Color Type</a>.
<ahref='undocumented#Pixel'>Pixel</a> buffer size should be <ahref='#SkCanvas_MakeRasterDirect_info'>info</a> height times computed <ahref='#SkCanvas_MakeRasterDirect_rowBytes'>rowBytes</a>.
<ahref='#Pixels'>Pixels</a> are not initialized.
To access <ahref='#SkCanvas_MakeRasterDirect_pixels'>pixels</a> after drawing, call <ahref='#SkCanvas_flush'>flush</a> or <ahref='#SkCanvas_peekPixels'>peekPixels</a>.
Allocates raster <ahref='#Canvas'>Canvas</a> specified by inline image specification. Subsequent <ahref='#Canvas'>Canvas</a>
calls draw into <ahref='#SkCanvas_MakeRasterDirectN32_pixels'>pixels</a>.
<ahref='SkImageInfo_Reference#Color_Type'>Color Type</a> is set to <ahref='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a>.
<ahref='SkImageInfo_Reference#Alpha_Type'>Alpha Type</a> is set to <ahref='SkImageInfo_Reference#kPremul_SkAlphaType'>kPremul_SkAlphaType</a>.
To access <ahref='#SkCanvas_MakeRasterDirectN32_pixels'>pixels</a> after drawing, call <ahref='#SkCanvas_flush'>flush</a> or <ahref='#SkCanvas_peekPixels'>peekPixels</a>.
<ahref='#SkCanvas_MakeRasterDirectN32_width'>width</a> and <ahref='#SkCanvas_MakeRasterDirectN32_height'>height</a> are zero or positive;
<ahref='#SkCanvas_MakeRasterDirectN32_pixels'>pixels</a> is not nullptr;
<ahref='#SkCanvas_MakeRasterDirectN32_rowBytes'>rowBytes</a> is zero or large enough to contain <ahref='#SkCanvas_MakeRasterDirectN32_width'>width</a><ahref='#SkCanvas_MakeRasterDirectN32_pixels'>pixels</a> of <ahref='SkImageInfo_Reference#kN32_SkColorType'>kN32_SkColorType</a>.
Pass zero for <ahref='#SkCanvas_MakeRasterDirectN32_rowBytes'>rowBytes</a> to compute <ahref='#SkCanvas_MakeRasterDirectN32_rowBytes'>rowBytes</a> from <ahref='#SkCanvas_MakeRasterDirectN32_width'>width</a> and size of pixel.
If <ahref='#SkCanvas_MakeRasterDirectN32_rowBytes'>rowBytes</a> is greater than zero, it must be equal to or greater than
<ahref='#SkCanvas_MakeRasterDirectN32_width'>width</a> times bytes required for <ahref='SkImageInfo_Reference#Color_Type'>Color Type</a>.
<ahref='undocumented#Pixel'>Pixel</a> buffer size should be <ahref='#SkCanvas_MakeRasterDirectN32_height'>height</a> times <ahref='#SkCanvas_MakeRasterDirectN32_rowBytes'>rowBytes</a>.
<td>pointer to destination <ahref='#SkCanvas_MakeRasterDirectN32_pixels'>pixels</a> buffer; buffer size should be <ahref='#SkCanvas_MakeRasterDirectN32_height'>height</a>
times <ahref='#SkCanvas_MakeRasterDirectN32_rowBytes'>rowBytes</a></td>
If <ahref='#SkCanvas_int_int_const_SkSurfaceProps_star_props'>props</a> equals nullptr, <ahref='undocumented#Surface_Properties'>Surface Properties</a> are created with
<ahref='undocumented#Legacy_Font_Host'>Surface Properties Legacy Font Host</a> settings, which choose the pixel striping
<ahref='SkBitmap_Reference#Bitmap'>Bitmap</a> is copied so that subsequently editing <ahref='#SkCanvas_copy_const_SkBitmap_bitmap'>bitmap</a> will not affect
<ahref='#SkCanvas_const_SkBitmap_const_SkSurfaceProps_bitmap'>bitmap</a> is copied so that subsequently editing <ahref='#SkCanvas_const_SkBitmap_const_SkSurfaceProps_bitmap'>bitmap</a> will not affect
<div><fiddle-embedname="b7bc91ff16c9b9351b2a127f35394b82"><div><ahref='#Canvas'>Canvas</a><ahref='#Layer'>Layer</a> draws into bitmap. <ahref='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a> sets up an additional
drawing surface that blends with the bitmap. When <ahref='#Layer'>Layer</a> goes out of
scope, <ahref='#Layer'>Layer</a> Destructor is called. The saved <ahref='#Layer'>Layer</a> is restored, drawing
<tdstyle='text-align: left; border: 2px solid #dddddd; padding: 8px; '>returns if <ahref='#Clip'>Clip</a> is <ahref='SkRect_Reference#Rect'>Rect</a> and not empty</td>
Returns <ahref='SkImageInfo_Reference#Image_Info'>Image Info</a> for <ahref='#Canvas'>Canvas</a>. If <ahref='#Canvas'>Canvas</a> is not associated with <ahref='undocumented#Raster_Surface'>Raster Surface</a> or
<ahref='undocumented#GPU_Surface'>GPU Surface</a>, returned <ahref='SkImageInfo_Reference#Color_Type'>Color Type</a> is set to <ahref='SkImageInfo_Reference#kUnknown_SkColorType'>kUnknown_SkColorType</a>.
Creates <ahref='SkSurface_Reference#Surface'>Surface</a> matching <ahref='#SkCanvas_makeSurface_info'>info</a> and <ahref='#SkCanvas_makeSurface_props'>props</a>, and associates it with <ahref='#Canvas'>Canvas</a>.
If <ahref='#SkCanvas_makeSurface_props'>props</a> is nullptr, matches <ahref='undocumented#Surface_Properties'>Surface Properties</a> in <ahref='#Canvas'>Canvas</a>. If <ahref='#SkCanvas_makeSurface_props'>props</a> is nullptr and <ahref='#Canvas'>Canvas</a>
does not have <ahref='undocumented#Surface_Properties'>Surface Properties</a>, creates <ahref='SkSurface_Reference#Surface'>Surface</a> with default <ahref='undocumented#Surface_Properties'>Surface Properties</a>.
<ahref='SkSurface_Reference#Surface'>Surface</a> matching <ahref='#SkCanvas_makeSurface_info'>info</a> and <ahref='#SkCanvas_makeSurface_props'>props</a>, or nullptr if no match is available
Returns <ahref='undocumented#GPU_Context'>GPU Context</a> of the <ahref='undocumented#GPU_Surface'>GPU Surface</a> associated with <ahref='#Canvas'>Canvas</a>.
Returns the pixel base address, <ahref='SkImageInfo_Reference#Image_Info'>Image Info</a>, <ahref='#SkCanvas_accessTopLayerPixels_rowBytes'>rowBytes</a>, and <ahref='#SkCanvas_accessTopLayerPixels_origin'>origin</a> if the pixels
while <ahref='#Canvas'>Canvas</a> is in scope and unchanged. Any <ahref='#Canvas'>Canvas</a> call or <ahref='SkSurface_Reference#Surface'>Surface</a> call
If pixels are inaccessible, <ahref='#SkCanvas_accessTopLayerPixels_info'>info</a>, <ahref='#SkCanvas_accessTopLayerPixels_rowBytes'>rowBytes</a>, and <ahref='#SkCanvas_accessTopLayerPixels_origin'>origin</a> are unchanged.
<td>storage for <ahref='#Canvas'>Canvas</a> top <ahref='#Layer'>Layer</a><ahref='#SkCanvas_accessTopLayerPixels_origin'>origin</a>, its top-left corner;
<ahref='undocumented#SkRasterHandleAllocator_MakeCanvas'>SkRasterHandleAllocator::MakeCanvas</a>, which creates a custom canvas with raster storage for
<ahref='#Pixels'>Pixels</a> are readable when <ahref='undocumented#Device'>Device</a> is raster. <ahref='#Pixels'>Pixels</a> are not readable when <ahref='#Canvas'>Canvas</a>
is returned from <ahref='undocumented#GPU_Surface'>GPU Surface</a>, returned by <ahref='undocumented#SkDocument_beginPage'>SkDocument::beginPage</a>, returned by
<ahref='undocumented#SkPictureRecorder_beginRecording'>SkPictureRecorder::beginRecording</a>, or <ahref='#Canvas'>Canvas</a> is the base of a utility class
like <ahref='undocumented#SkDebugCanvas'>SkDebugCanvas</a>.
<ahref='#SkCanvas_peekPixels_pixmap'>pixmap</a> is valid only while <ahref='#Canvas'>Canvas</a> is in scope and unchanged. Any
<ahref='#Canvas'>Canvas</a> or <ahref='SkSurface_Reference#Surface'>Surface</a> call may invalidate the <ahref='#SkCanvas_peekPixels_pixmap'>pixmap</a> values.
Copies <ahref='SkRect_Reference#Rect'>Rect</a> of pixels from <ahref='#Canvas'>Canvas</a> into <ahref='#SkCanvas_readPixels_dstPixels'>dstPixels</a>. <ahref='#Matrix'>Matrix</a> and <ahref='#Clip'>Clip</a> are
Source <ahref='SkRect_Reference#Rect'>Rect</a> corners are (<ahref='#SkCanvas_readPixels_srcX'>srcX</a>, <ahref='#SkCanvas_readPixels_srcY'>srcY</a>) and (<ahref='#SkCanvas_imageInfo'>imageInfo</a>.width(), <ahref='#SkCanvas_imageInfo'>imageInfo</a>.height()).
Destination <ahref='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<ahref='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.width(), <ahref='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.height()).
converting to <ahref='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.colorType() and <ahref='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.alphaType() if required.
<ahref='#Pixels'>Pixels</a> are readable when <ahref='undocumented#Device'>Device</a> is raster, or backed by a GPU.
<ahref='#Pixels'>Pixels</a> are not readable when <ahref='#SkCanvas'>SkCanvas</a> is returned by <ahref='undocumented#SkDocument_beginPage'>SkDocument::beginPage</a>,
returned by <ahref='undocumented#SkPictureRecorder_beginRecording'>SkPictureRecorder::beginRecording</a>, or <ahref='#Canvas'>Canvas</a> is the base of a utility
class like <ahref='undocumented#SkDebugCanvas'>SkDebugCanvas</a>.
<ahref='undocumented#Pixel'>Pixel</a> values are converted only if <ahref='SkImageInfo_Reference#Color_Type'>Color Type</a> and <ahref='SkImageInfo_Reference#Alpha_Type'>Alpha Type</a>
Pass negative values for <ahref='#SkCanvas_readPixels_srcX'>srcX</a> or <ahref='#SkCanvas_readPixels_srcY'>srcY</a> to offset pixels across or down destination.
<td>Source and destination rectangles do not intersect.</td>
</tr><tr>
<td><ahref='#Canvas'>Canvas</a> pixels could not be converted to <ahref='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.colorType() or <ahref='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.alphaType().</td>
</tr><tr>
<td><ahref='#Canvas'>Canvas</a> pixels are not readable; for instance, <ahref='#Canvas'>Canvas</a> is document-based.</td>
</tr><tr>
<td><ahref='#SkCanvas_readPixels_dstRowBytes'>dstRowBytes</a> is too small to contain one row of pixels.</td>
<td>width, height, <ahref='SkImageInfo_Reference#Color_Type'>Color Type</a>, and <ahref='SkImageInfo_Reference#Alpha_Type'>Alpha Type</a> of <ahref='#SkCanvas_readPixels_dstPixels'>dstPixels</a></td>
<td>storage for pixels; <ahref='#SkCanvas_readPixels_dstInfo'>dstInfo</a>.height() times <ahref='#SkCanvas_readPixels_dstRowBytes'>dstRowBytes</a>, or larger</td>
<div><fiddle-embedname="481e990e923a0ed34654f4361b94f096"><div><ahref='#Canvas'>Canvas</a> returned by <ahref='undocumented#Raster_Surface'>Raster Surface</a> has <ahref='undocumented#Premultiply'>Premultiplied</a> pixel values.
<ahref='#SkCanvas_clear'>clear</a> takes <ahref='undocumented#Unpremultiply'>Unpremultiplied</a> input with <ahref='SkColor_Reference#Alpha'>Color Alpha</a> equal 0x80
and <ahref='SkColor_Reference#RGB'>Color RGB</a> equal 0x55, 0xAA, 0xFF. <ahref='SkColor_Reference#RGB'>Color RGB</a> is multiplied by <ahref='SkColor_Reference#Alpha'>Color Alpha</a>
to generate <ahref='undocumented#Premultiply'>Premultiplied</a> value 0x802B5580. <ahref='#SkCanvas_readPixels'>readPixels</a> converts pixel back
to <ahref='undocumented#Unpremultiply'>Unpremultiplied</a> value 0x8056A9FF, introducing error.
Copies <ahref='SkRect_Reference#Rect'>Rect</a> of pixels from <ahref='#Canvas'>Canvas</a> into <ahref='#SkCanvas_readPixels_2_pixmap'>pixmap</a>. <ahref='#Matrix'>Matrix</a> and <ahref='#Clip'>Clip</a> are
Source <ahref='SkRect_Reference#Rect'>Rect</a> corners are (<ahref='#SkCanvas_readPixels_2_srcX'>srcX</a>, <ahref='#SkCanvas_readPixels_2_srcY'>srcY</a>) and (<ahref='#SkCanvas_imageInfo'>imageInfo</a>.width(), <ahref='#SkCanvas_imageInfo'>imageInfo</a>.height()).
Destination <ahref='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<ahref='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.width(), <ahref='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.height()).
converting to <ahref='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.colorType() and <ahref='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.alphaType() if required.
<ahref='#Pixels'>Pixels</a> are readable when <ahref='undocumented#Device'>Device</a> is raster, or backed by a GPU.
<ahref='#Pixels'>Pixels</a> are not readable when <ahref='#SkCanvas'>SkCanvas</a> is returned by <ahref='undocumented#SkDocument_beginPage'>SkDocument::beginPage</a>,
returned by <ahref='undocumented#SkPictureRecorder_beginRecording'>SkPictureRecorder::beginRecording</a>, or <ahref='#Canvas'>Canvas</a> is the base of a utility
class like <ahref='undocumented#SkDebugCanvas'>SkDebugCanvas</a>.
<ahref='undocumented#Pixel'>Pixel</a> values are converted only if <ahref='SkImageInfo_Reference#Color_Type'>Color Type</a> and <ahref='SkImageInfo_Reference#Alpha_Type'>Alpha Type</a>
do not match. Only pixels within both source and destination <ahref='SkRect_Reference#Rect'>Rects</a>
are copied. <ahref='#SkCanvas_readPixels_2_pixmap'>pixmap</a> pixels contents outside <ahref='SkRect_Reference#Rect'>Rect</a> intersection are unchanged.
Pass negative values for <ahref='#SkCanvas_readPixels_2_srcX'>srcX</a> or <ahref='#SkCanvas_readPixels_2_srcY'>srcY</a> to offset pixels across or down <ahref='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.
<td>Source and destination rectangles do not intersect.</td>
</tr><tr>
<td><ahref='#Canvas'>Canvas</a> pixels could not be converted to <ahref='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.colorType() or <ahref='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.alphaType().</td>
</tr><tr>
<td><ahref='#Canvas'>Canvas</a> pixels are not readable; for instance, <ahref='#Canvas'>Canvas</a> is document-based.</td>
</tr><tr>
<td><ahref='SkPixmap_Reference#Pixmap'>Pixmap</a> pixels could not be allocated.</td>
</tr><tr>
<td><ahref='#SkCanvas_readPixels_2_pixmap'>pixmap</a>.rowBytes() is too small to contain one row of pixels.</td>
<div><fiddle-embedname="85f199032943b6483722c34a91c4e20f"><div><ahref='#SkCanvas_clear'>clear</a> takes <ahref='undocumented#Unpremultiply'>Unpremultiplied</a> input with <ahref='SkColor_Reference#Alpha'>Color Alpha</a> equal 0x80
and <ahref='SkColor_Reference#RGB'>Color RGB</a> equal 0x55, 0xAA, 0xFF. <ahref='SkColor_Reference#RGB'>Color RGB</a> is multiplied by <ahref='SkColor_Reference#Alpha'>Color Alpha</a>
to generate <ahref='undocumented#Premultiply'>Premultiplied</a> value 0x802B5580.
Copies <ahref='SkRect_Reference#Rect'>Rect</a> of pixels from <ahref='#Canvas'>Canvas</a> into <ahref='#SkCanvas_readPixels_3_bitmap'>bitmap</a>. <ahref='#Matrix'>Matrix</a> and <ahref='#Clip'>Clip</a> are
Source <ahref='SkRect_Reference#Rect'>Rect</a> corners are (<ahref='#SkCanvas_readPixels_3_srcX'>srcX</a>, <ahref='#SkCanvas_readPixels_3_srcY'>srcY</a>) and (<ahref='#SkCanvas_imageInfo'>imageInfo</a>.width(), <ahref='#SkCanvas_imageInfo'>imageInfo</a>.height()).
Destination <ahref='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<ahref='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.width(), <ahref='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.height()).
converting to <ahref='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.colorType() and <ahref='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.alphaType() if required.
<ahref='#Pixels'>Pixels</a> are readable when <ahref='undocumented#Device'>Device</a> is raster, or backed by a GPU.
<ahref='#Pixels'>Pixels</a> are not readable when <ahref='#SkCanvas'>SkCanvas</a> is returned by <ahref='undocumented#SkDocument_beginPage'>SkDocument::beginPage</a>,
returned by <ahref='undocumented#SkPictureRecorder_beginRecording'>SkPictureRecorder::beginRecording</a>, or <ahref='#Canvas'>Canvas</a> is the base of a utility
class like <ahref='undocumented#SkDebugCanvas'>SkDebugCanvas</a>.
<ahref='SkBitmap_Reference#Bitmap'>Bitmap</a> values are converted only if <ahref='SkImageInfo_Reference#Color_Type'>Color Type</a> and <ahref='SkImageInfo_Reference#Alpha_Type'>Alpha Type</a>
Pass negative values for <ahref='#SkCanvas_readPixels_3_srcX'>srcX</a> or <ahref='#SkCanvas_readPixels_3_srcY'>srcY</a> to offset pixels across or down <ahref='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.
<td>Source and destination rectangles do not intersect.</td>
</tr><tr>
<td><ahref='#Canvas'>Canvas</a> pixels could not be converted to <ahref='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.colorType() or <ahref='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.alphaType().</td>
</tr><tr>
<td><ahref='#Canvas'>Canvas</a> pixels are not readable; for instance, <ahref='#Canvas'>Canvas</a> is document-based.</td>
</tr><tr>
<td><ahref='#SkCanvas_readPixels_3_bitmap'>bitmap</a> pixels could not be allocated.</td>
</tr><tr>
<td><ahref='#SkCanvas_readPixels_3_bitmap'>bitmap</a>.rowBytes() is too small to contain one row of pixels.</td>
<div><fiddle-embedname="af6dec8ef974aa67bf102f29915bcd6a"><div><ahref='#SkCanvas_clear'>clear</a> takes <ahref='undocumented#Unpremultiply'>Unpremultiplied</a> input with <ahref='SkColor_Reference#Alpha'>Color Alpha</a> equal 0x80
and <ahref='SkColor_Reference#RGB'>Color RGB</a> equal 0x55, 0xAA, 0xFF. <ahref='SkColor_Reference#RGB'>Color RGB</a> is multiplied by <ahref='SkColor_Reference#Alpha'>Color Alpha</a>
to generate <ahref='undocumented#Premultiply'>Premultiplied</a> value 0x802B5580.
Copies <ahref='SkRect_Reference#Rect'>Rect</a> from <ahref='#SkCanvas_writePixels_pixels'>pixels</a> to <ahref='#Canvas'>Canvas</a>. <ahref='#Matrix'>Matrix</a> and <ahref='#Clip'>Clip</a> are ignored.
Source <ahref='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<ahref='#SkCanvas_writePixels_info'>info</a>.width(), <ahref='#SkCanvas_writePixels_info'>info</a>.height()).
Destination <ahref='SkRect_Reference#Rect'>Rect</a> corners are (<ahref='#SkCanvas_writePixels_x'>x</a>, <ahref='#SkCanvas_writePixels_y'>y</a>) and
<ahref='#Pixels'>Pixels</a> are writable when <ahref='undocumented#Device'>Device</a> is raster, or backed by a GPU.
<ahref='#Pixels'>Pixels</a> are not writable when <ahref='#SkCanvas'>SkCanvas</a> is returned by <ahref='undocumented#SkDocument_beginPage'>SkDocument::beginPage</a>,
returned by <ahref='undocumented#SkPictureRecorder_beginRecording'>SkPictureRecorder::beginRecording</a>, or <ahref='#Canvas'>Canvas</a> is the base of a utility
class like <ahref='undocumented#SkDebugCanvas'>SkDebugCanvas</a>.
<ahref='undocumented#Pixel'>Pixel</a> values are converted only if <ahref='SkImageInfo_Reference#Color_Type'>Color Type</a> and <ahref='SkImageInfo_Reference#Alpha_Type'>Alpha Type</a>
do not match. Only <ahref='#SkCanvas_writePixels_pixels'>pixels</a> within both source and destination rectangles
are copied. <ahref='#Canvas'>Canvas</a><ahref='#SkCanvas_writePixels_pixels'>pixels</a> outside <ahref='SkRect_Reference#Rect'>Rect</a> intersection are unchanged.
Pass negative values for <ahref='#SkCanvas_writePixels_x'>x</a> or <ahref='#SkCanvas_writePixels_y'>y</a> to offset <ahref='#SkCanvas_writePixels_pixels'>pixels</a> to the left or
<td>Source and destination rectangles do not intersect.</td>
</tr><tr>
<td><ahref='#SkCanvas_writePixels_pixels'>pixels</a> could not be converted to <ahref='#Canvas'>Canvas</a><ahref='#SkCanvas_imageInfo'>imageInfo</a>.colorType() or
<td><ahref='#Canvas'>Canvas</a><ahref='#SkCanvas_writePixels_pixels'>pixels</a> are not writable; for instance, <ahref='#Canvas'>Canvas</a> is document-based.</td>
</tr><tr>
<td><ahref='#SkCanvas_writePixels_rowBytes'>rowBytes</a> is too small to contain one row of <ahref='#SkCanvas_writePixels_pixels'>pixels</a>.</td>
<td>width, height, <ahref='SkImageInfo_Reference#Color_Type'>Color Type</a>, and <ahref='SkImageInfo_Reference#Alpha_Type'>Alpha Type</a> of <ahref='#SkCanvas_writePixels_pixels'>pixels</a></td>
<td><ahref='#SkCanvas_writePixels_pixels'>pixels</a> to copy, of size <ahref='#SkCanvas_writePixels_info'>info</a>.height() times <ahref='#SkCanvas_writePixels_rowBytes'>rowBytes</a>, or larger</td>
<td>size of one row of <ahref='#SkCanvas_writePixels_pixels'>pixels</a>; <ahref='#SkCanvas_writePixels_info'>info</a>.width() times pixel size, or larger</td>
<td>offset into <ahref='#Canvas'>Canvas</a> writable <ahref='#SkCanvas_writePixels_pixels'>pixels</a> in <ahref='#SkCanvas_writePixels_x'>x</a>; may be negative</td>
<td>offset into <ahref='#Canvas'>Canvas</a> writable <ahref='#SkCanvas_writePixels_pixels'>pixels</a> in <ahref='#SkCanvas_writePixels_y'>y</a>; may be negative</td>
Copies <ahref='SkRect_Reference#Rect'>Rect</a> from pixels to <ahref='#Canvas'>Canvas</a>. <ahref='#Matrix'>Matrix</a> and <ahref='#Clip'>Clip</a> are ignored.
Source <ahref='SkRect_Reference#Rect'>Rect</a> corners are (0, 0) and (<ahref='#SkCanvas_writePixels_2_bitmap'>bitmap</a>.width(), <ahref='#SkCanvas_writePixels_2_bitmap'>bitmap</a>.height()).
Destination <ahref='SkRect_Reference#Rect'>Rect</a> corners are (<ahref='#SkCanvas_writePixels_2_x'>x</a>, <ahref='#SkCanvas_writePixels_2_y'>y</a>) and
<ahref='#Pixels'>Pixels</a> are writable when <ahref='undocumented#Device'>Device</a> is raster, or backed by a GPU.
<ahref='#Pixels'>Pixels</a> are not writable when <ahref='#SkCanvas'>SkCanvas</a> is returned by <ahref='undocumented#SkDocument_beginPage'>SkDocument::beginPage</a>,
returned by <ahref='undocumented#SkPictureRecorder_beginRecording'>SkPictureRecorder::beginRecording</a>, or <ahref='#Canvas'>Canvas</a> is the base of a utility
class like <ahref='undocumented#SkDebugCanvas'>SkDebugCanvas</a>.
<ahref='undocumented#Pixel'>Pixel</a> values are converted only if <ahref='SkImageInfo_Reference#Color_Type'>Color Type</a> and <ahref='SkImageInfo_Reference#Alpha_Type'>Alpha Type</a>
<td>Source and destination rectangles do not intersect.</td>
</tr><tr>
<td><ahref='#SkCanvas_writePixels_2_bitmap'>bitmap</a> does not have allocated pixels.</td>
</tr><tr>
<td><ahref='#SkCanvas_writePixels_2_bitmap'>bitmap</a> pixels could not be converted to <ahref='#Canvas'>Canvas</a><ahref='#SkCanvas_imageInfo'>imageInfo</a>.colorType() or
<td><ahref='#Canvas'>Canvas</a> pixels are not writable; for instance, <ahref='#Canvas'>Canvas</a> is document based.</td>
</tr><tr>
<td><ahref='#SkCanvas_writePixels_2_bitmap'>bitmap</a> pixels are inaccessible; for instance, <ahref='#SkCanvas_writePixels_2_bitmap'>bitmap</a> wraps a texture.</td>
<ahref='#Canvas'>Canvas</a> savable state consists of <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a>.
<ahref='#Clip'>Clip</a> describes the area that may be drawn to.
<ahref='#Matrix'>Matrix</a> transforms the geometry.
<ahref='undocumented#Draw_Filter'>Draw Filter</a> (deprecated on most platforms) modifies the paint before drawing.
<ahref='#SkCanvas_save'>save</a>, <ahref='#SkCanvas_saveLayer'>saveLayer</a>, <ahref='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a>, and <ahref='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a>
<ahref='#SkCanvas_restore'>restore</a>, <ahref='#SkCanvas_restoreToCount'>restoreToCount</a>, and <ahref='#SkCanvas_destructor'>~SkCanvas()</a> revert state to its value when saved.
Each state on the stack intersects <ahref='#Clip'>Clip</a> with the previous <ahref='#Clip'>Clip</a>,
and concatenates <ahref='#Matrix'>Matrix</a> with the previous <ahref='#Matrix'>Matrix</a>.
The intersected <ahref='#Clip'>Clip</a> makes the drawing area the same or smaller;
the concatenated <ahref='#Matrix'>Matrix</a> may move the origin and potentially scale or rotate
the coordinate space.
<ahref='#Canvas'>Canvas</a> does not require balancing the state stack but it is a good idea
to do so. Calling <ahref='#SkCanvas_save'>save</a> without <ahref='#SkCanvas_restore'>restore</a> will eventually cause Skia to fail;
mismatched <ahref='#SkCanvas_save'>save</a> and <ahref='#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
<div><fiddle-embedname="9f563a2d60aa31d4b26742e5aa17aa4e"><div>While <ahref='#SkCanvas_clipRect'>clipRect</a> is given the same rectangle twice, <ahref='#Matrix'>Matrix</a> makes the second
<ahref='#SkCanvas_clipRect'>clipRect</a> draw at half the size of the first.
Saves <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a> (<ahref='undocumented#Draw_Filter'>Draw Filter</a> deprecated on most platforms).
Calling <ahref='#SkCanvas_restore'>restore</a> discards changes to <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a>,
restoring the <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a> to their state when <ahref='#SkCanvas_save'>save</a> was called.
<ahref='#Matrix'>Matrix</a> may be changed by <ahref='#SkCanvas_translate'>translate</a>, <ahref='#SkCanvas_scale'>scale</a>, <ahref='#SkCanvas_rotate'>rotate</a>, <ahref='#SkCanvas_skew'>skew</a>, <ahref='#SkCanvas_concat'>concat</a>, <ahref='#SkCanvas_setMatrix'>setMatrix</a>,
and <ahref='#SkCanvas_resetMatrix'>resetMatrix</a>. <ahref='#Clip'>Clip</a> may be changed by <ahref='#SkCanvas_clipRect'>clipRect</a>, <ahref='#SkCanvas_clipRRect'>clipRRect</a>, <ahref='#SkCanvas_clipPath'>clipPath</a>, <ahref='#SkCanvas_clipRegion'>clipRegion</a>.
Removes changes to <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a> since <ahref='#Canvas'>Canvas</a> state was
Returns the number of saved states, each containing: <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a>.
Equals the number of <ahref='#SkCanvas_save'>save</a> calls less the number of <ahref='#SkCanvas_restore'>restore</a> calls plus one.
Restores state to <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a> values when <ahref='#SkCanvas_save'>save</a>, <ahref='#SkCanvas_saveLayer'>saveLayer</a>,
<ahref='#SkCanvas_saveLayerPreserveLCDTextRequests'>saveLayerPreserveLCDTextRequests</a>, or <ahref='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a> returned <ahref='#SkCanvas_restoreToCount_saveCount'>saveCount</a>.
<ahref='#Layer'>Layer</a> may be initialized with the contents of the previous <ahref='#Layer'>Layer</a>. When <ahref='#Layer'>Layer</a> is
restored, its <ahref='SkBitmap_Reference#Bitmap'>Bitmap</a> can be modified by <ahref='SkPaint_Reference#Paint'>Paint</a> passed to <ahref='#Layer'>Layer</a> to apply
<ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Blend_Mode'>Blend Mode</a>.
Saves <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a> (<ahref='undocumented#Draw_Filter'>Draw Filter</a> deprecated on most platforms),
and allocates a <ahref='SkBitmap_Reference#Bitmap'>Bitmap</a> for subsequent drawing.
Calling <ahref='#SkCanvas_restore'>restore</a> discards changes to <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a>,
and draws the <ahref='SkBitmap_Reference#Bitmap'>Bitmap</a>.
<ahref='#Matrix'>Matrix</a> may be changed by <ahref='#SkCanvas_translate'>translate</a>, <ahref='#SkCanvas_scale'>scale</a>, <ahref='#SkCanvas_rotate'>rotate</a>, <ahref='#SkCanvas_skew'>skew</a>, <ahref='#SkCanvas_concat'>concat</a>,
<ahref='#SkCanvas_setMatrix'>setMatrix</a>, and <ahref='#SkCanvas_resetMatrix'>resetMatrix</a>. <ahref='#Clip'>Clip</a> may be changed by <ahref='#SkCanvas_clipRect'>clipRect</a>, <ahref='#SkCanvas_clipRRect'>clipRRect</a>,
<ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_saveLayer_bounds'>bounds</a> suggests but does not define the <ahref='SkBitmap_Reference#Bitmap'>Bitmap</a> size. To clip drawing to
a specific rectangle, use <ahref='#SkCanvas_clipRect'>clipRect</a>.
<div><fiddle-embedname="1a025d6018f64140af2dc36acad59008"><div>Rectangles are blurred by <ahref='undocumented#Image_Filter'>Image Filter</a> when <ahref='#SkCanvas_restore'>restore</a> draws <ahref='#Layer'>Layer</a> to main
Saves <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a> (<ahref='undocumented#Draw_Filter'>Draw Filter</a> deprecated on most platforms),
and allocates a <ahref='SkBitmap_Reference#Bitmap'>Bitmap</a> for subsequent drawing.
Calling <ahref='#SkCanvas_restore'>restore</a> discards changes to <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a>,
and draws the <ahref='SkBitmap_Reference#Bitmap'>Bitmap</a>.
<ahref='#Matrix'>Matrix</a> may be changed by <ahref='#SkCanvas_translate'>translate</a>, <ahref='#SkCanvas_scale'>scale</a>, <ahref='#SkCanvas_rotate'>rotate</a>, <ahref='#SkCanvas_skew'>skew</a>, <ahref='#SkCanvas_concat'>concat</a>,
<ahref='#SkCanvas_setMatrix'>setMatrix</a>, and <ahref='#SkCanvas_resetMatrix'>resetMatrix</a>. <ahref='#Clip'>Clip</a> may be changed by <ahref='#SkCanvas_clipRect'>clipRect</a>, <ahref='#SkCanvas_clipRRect'>clipRRect</a>,
<ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_saveLayer_2_bounds'>bounds</a> suggests but does not define the <ahref='#Layer'>Layer</a> size. To clip drawing to
a specific rectangle, use <ahref='#SkCanvas_clipRect'>clipRect</a>.
<div><fiddle-embedname="5b59231feae0c09cb1ab6a292229d7a4"><div>Rectangles are blurred by <ahref='undocumented#Image_Filter'>Image Filter</a> when <ahref='#SkCanvas_restore'>restore</a> draws <ahref='#Layer'>Layer</a> to main <ahref='#Canvas'>Canvas</a>.
The red rectangle is clipped; it does not fully fit on <ahref='#Layer'>Layer</a>.
<ahref='undocumented#Image_Filter'>Image Filter</a> blurs past edge of <ahref='#Layer'>Layer</a> so red rectangle is blurred on all sides.
Saves <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a> (<ahref='undocumented#Draw_Filter'>Draw Filter</a> deprecated on most platforms),
and allocates a <ahref='SkBitmap_Reference#Bitmap'>Bitmap</a> for subsequent drawing.
<ahref='SkPaint_Reference#LCD_Text'>LCD Text</a> is preserved when the <ahref='#Layer'>Layer</a> is drawn to the prior <ahref='#Layer'>Layer</a>.
Calling <ahref='#SkCanvas_restore'>restore</a> discards changes to <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a>,
<ahref='#Matrix'>Matrix</a> may be changed by <ahref='#SkCanvas_translate'>translate</a>, <ahref='#SkCanvas_scale'>scale</a>, <ahref='#SkCanvas_rotate'>rotate</a>, <ahref='#SkCanvas_skew'>skew</a>, <ahref='#SkCanvas_concat'>concat</a>,
<ahref='#SkCanvas_setMatrix'>setMatrix</a>, and <ahref='#SkCanvas_resetMatrix'>resetMatrix</a>. <ahref='#Clip'>Clip</a> may be changed by <ahref='#SkCanvas_clipRect'>clipRect</a>, <ahref='#SkCanvas_clipRRect'>clipRRect</a>,
<ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_saveLayerPreserveLCDTextRequests_bounds'>bounds</a> suggests but does not define the <ahref='#Layer'>Layer</a> size. To clip drawing to
a specific rectangle, use <ahref='#SkCanvas_clipRect'>clipRect</a>.
Saves <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a> (<ahref='undocumented#Draw_Filter'>Draw Filter</a> deprecated on most platforms),
and allocates <ahref='SkBitmap_Reference#Bitmap'>Bitmap</a> for subsequent drawing.
Calling <ahref='#SkCanvas_restore'>restore</a> discards changes to <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a>,
and blends <ahref='#Layer'>Layer</a> with <ahref='#SkCanvas_saveLayerAlpha_alpha'>alpha</a> opacity onto prior <ahref='#Layer'>Layer</a>.
<ahref='#Matrix'>Matrix</a> may be changed by <ahref='#SkCanvas_translate'>translate</a>, <ahref='#SkCanvas_scale'>scale</a>, <ahref='#SkCanvas_rotate'>rotate</a>, <ahref='#SkCanvas_skew'>skew</a>, <ahref='#SkCanvas_concat'>concat</a>,
<ahref='#SkCanvas_setMatrix'>setMatrix</a>, and <ahref='#SkCanvas_resetMatrix'>resetMatrix</a>. <ahref='#Clip'>Clip</a> may be changed by <ahref='#SkCanvas_clipRect'>clipRect</a>, <ahref='#SkCanvas_clipRRect'>clipRRect</a>,
<ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_saveLayerAlpha_bounds'>bounds</a> suggests but does not define <ahref='#Layer'>Layer</a> size. To clip drawing to
a specific rectangle, use <ahref='#SkCanvas_clipRect'>clipRect</a>.
<ahref='#SkCanvas_SaveLayerFlags'>SaveLayerFlags</a> provides options that may be used in any combination in <ahref='#SkCanvas_SaveLayerRec'>SaveLayerRec</a>,
defining how <ahref='#Layer'>Layer</a> allocated by <ahref='#SkCanvas_saveLayer'>saveLayer</a> operates. It may be set to zero,
<ahref='#SkCanvas_kPreserveLCDText_SaveLayerFlag'>kPreserveLCDText SaveLayerFlag</a>, <ahref='#SkCanvas_kInitWithPrevious_SaveLayerFlag'>kInitWithPrevious SaveLayerFlag</a>, or both flags.
<div><fiddle-embedname="05db6a937225e8e31ae3481173d25dae"><div><ahref='#Canvas'>Canvas</a><ahref='#Layer'>Layer</a> captures red and blue circles scaled up by four.
scalePaint blends <ahref='#Layer'>Layer</a> back with transparency.
<ahref='#SkCanvas_SaveLayerRec_fBackdrop'>fBackdrop</a> applies <ahref='undocumented#Image_Filter'>Image Filter</a> to the prior <ahref='#Layer'>Layer</a> when copying to the <ahref='#Layer'>Layer</a>;
may be nullptr. Use <ahref='#SkCanvas_kInitWithPrevious_SaveLayerFlag'>kInitWithPrevious SaveLayerFlag</a> to copy the
prior <ahref='#Layer'>Layer</a> without an <ahref='undocumented#Image_Filter'>Image Filter</a>.
<ahref='#SkCanvas_restore'>restore</a> clips <ahref='#Layer'>Layer</a> by the <ahref='SkColor_Reference#Alpha'>Color Alpha</a> channel of <ahref='#SkCanvas_SaveLayerRec_fClipMask'>fClipMask</a> when
<ahref='#Layer'>Layer</a> is copied to <ahref='undocumented#Device'>Device</a>. <ahref='#SkCanvas_SaveLayerRec_fClipMask'>fClipMask</a> may be nullptr. .
<ahref='#SkCanvas_SaveLayerRec_fClipMatrix'>fClipMatrix</a> transforms <ahref='#SkCanvas_SaveLayerRec_fClipMask'>fClipMask</a> before it clips <ahref='#Layer'>Layer</a>. If
<ahref='#SkCanvas_SaveLayerRec_fClipMask'>fClipMask</a> describes a translucent gradient, it may be scaled and rotated
without introducing artifacts. <ahref='#SkCanvas_SaveLayerRec_fClipMatrix'>fClipMatrix</a> may be nullptr.
<div><fiddle-embedname="ee8c0b120234e27364f8c9a786cf8f89"><div><ahref='#Canvas'>Canvas</a><ahref='#Layer'>Layer</a> captures a red Anti-aliased circle and a blue <ahref='undocumented#Alias'>Aliased</a> circle scaled
up by four. After drawing another red circle without scaling on top, the <ahref='#Layer'>Layer</a> is
Sets <ahref='#SkCanvas_SaveLayerRec_fBounds'>fBounds</a>, <ahref='#SkCanvas_SaveLayerRec_fPaint'>fPaint</a>, and <ahref='#SkCanvas_SaveLayerRec_fBackdrop'>fBackdrop</a> to nullptr. Clears <ahref='#SkCanvas_SaveLayerRec_fSaveLayerFlags'>fSaveLayerFlags</a>.
Sets <ahref='#SkCanvas_SaveLayerRec_fBounds'>fBounds</a>, <ahref='#SkCanvas_SaveLayerRec_fPaint'>fPaint</a>, and <ahref='#SkCanvas_SaveLayerRec_fSaveLayerFlags'>fSaveLayerFlags</a>; sets <ahref='#SkCanvas_SaveLayerRec_fBackdrop'>fBackdrop</a> to nullptr.
not readySets <ahref='#SkCanvas_SaveLayerRec_fBounds'>fBounds</a>, <ahref='#SkCanvas_SaveLayerRec_fPaint'>fPaint</a>, <ahref='#SkCanvas_SaveLayerRec_fBackdrop'>fBackdrop</a>, <ahref='#SkCanvas_SaveLayerRec_fClipMask'>fClipMask</a>, <ahref='#SkCanvas_SaveLayerRec_fClipMatrix'>fClipMatrix</a>, and <ahref='#SkCanvas_SaveLayerRec_fSaveLayerFlags'>fSaveLayerFlags</a>.
<ahref='#SkCanvas_SaveLayerRec_SaveLayerRec_4_clipMatrix'>clipMatrix</a> uses <ahref='SkColor_Reference#Alpha'>Color Alpha</a> channel of image, transformed by <ahref='#SkCanvas_SaveLayerRec_SaveLayerRec_4_clipMatrix'>clipMatrix</a>, to clip
<ahref='#Layer'>Layer</a> when drawn to <ahref='#Canvas'>Canvas</a>.
Implementation is not complete; has no effect if <ahref='undocumented#Device'>Device</a> is GPU-backed.
Saves <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a> (<ahref='undocumented#Draw_Filter'>Draw Filter</a> deprecated on most platforms),
and allocates <ahref='SkBitmap_Reference#Bitmap'>Bitmap</a> for subsequent drawing.
Calling <ahref='#SkCanvas_restore'>restore</a> discards changes to <ahref='#Matrix'>Matrix</a>, <ahref='#Clip'>Clip</a>, and <ahref='undocumented#Draw_Filter'>Draw Filter</a>,
and blends <ahref='SkBitmap_Reference#Bitmap'>Bitmap</a> with <ahref='SkColor_Reference#Alpha'>Color Alpha</a> opacity onto the prior <ahref='#Layer'>Layer</a>.
<ahref='#Matrix'>Matrix</a> may be changed by <ahref='#SkCanvas_translate'>translate</a>, <ahref='#SkCanvas_scale'>scale</a>, <ahref='#SkCanvas_rotate'>rotate</a>, <ahref='#SkCanvas_skew'>skew</a>, <ahref='#SkCanvas_concat'>concat</a>,
<ahref='#SkCanvas_setMatrix'>setMatrix</a>, and <ahref='#SkCanvas_resetMatrix'>resetMatrix</a>. <ahref='#Clip'>Clip</a> may be changed by <ahref='#SkCanvas_clipRect'>clipRect</a>, <ahref='#SkCanvas_clipRRect'>clipRRect</a>,
<div><fiddle-embedname="7d3751e82d1b6ec328ffa3d6f48ca831"><div>The example draws an image, and saves it into a <ahref='#Layer'>Layer</a> with <ahref='#SkCanvas_kInitWithPrevious_SaveLayerFlag'>kInitWithPrevious SaveLayerFlag</a>.
Next it punches a hole in <ahref='#Layer'>Layer</a> and restore with <ahref='undocumented#SkBlendMode_kPlus'>SkBlendMode::kPlus</a>.
Where <ahref='#Layer'>Layer</a> was cleared, the original image will draw unchanged.
Translate <ahref='#Matrix'>Matrix</a> by <ahref='#SkCanvas_translate_dx'>dx</a> along the x-axis and <ahref='#SkCanvas_translate_dy'>dy</a> along the y-axis.
<div><fiddle-embedname="eb93d5fa66a5f7a10f4f9210494d7222"><div><ahref='#SkCanvas_scale'>scale</a> followed by <ahref='#SkCanvas_translate'>translate</a> produces different results from <ahref='#SkCanvas_translate'>translate</a> followed
<div><fiddle-embedname="963789ac8498d4e505748ab3b15cdaa5"><div><ahref='#Draw'>Draw</a> clock hands at time 5:10. The hour hand and minute hand point up and
Rotate <ahref='#Matrix'>Matrix</a> by <ahref='#SkCanvas_rotate_2_degrees'>degrees</a> about a point at (<ahref='#SkCanvas_rotate_2_px'>px</a>, <ahref='#SkCanvas_rotate_2_py'>py</a>). Positive <ahref='#SkCanvas_rotate_2_degrees'>degrees</a> rotates
Skew <ahref='#Matrix'>Matrix</a> by <ahref='#SkCanvas_skew_sx'>sx</a> on the x-axis and <ahref='#SkCanvas_skew_sy'>sy</a> on the y-axis. A positive value of <ahref='#SkCanvas_skew_sx'>sx</a>
skews the drawing right as y increases; a positive value of <ahref='#SkCanvas_skew_sy'>sy</a> skews the drawing
Mathematically, replace <ahref='#Matrix'>Matrix</a> with a skew matrix <ahref='undocumented#Premultiply'>Premultiplied</a> with <ahref='#Matrix'>Matrix</a>.
Replace <ahref='#Matrix'>Matrix</a> with <ahref='#SkCanvas_concat_matrix'>matrix</a><ahref='undocumented#Premultiply'>Premultiplied</a> with existing <ahref='#Matrix'>Matrix</a>.
<ahref='#Clip'>Clip</a> is built from a stack of clipping paths. Each <ahref='SkPath_Reference#Path'>Path</a> in the
stack can be constructed from one or more <ahref='SkPath_Reference#Contour'>Path Contour</a> elements. The
<ahref='SkPath_Reference#Contour'>Path Contour</a> may be composed of any number of <ahref='SkPath_Reference#Verb'>Path Verb</a> segments. Each
<ahref='SkPath_Reference#Contour'>Path Contour</a> forms a closed area; <ahref='SkPath_Reference#Fill_Type'>Path Fill Type</a> defines the area enclosed
by <ahref='SkPath_Reference#Contour'>Path Contour</a>.
<ahref='#Clip'>Clip</a> stack of <ahref='SkPath_Reference#Path'>Path</a> elements successfully restrict the <ahref='SkPath_Reference#Path'>Path</a> area. Each
<ahref='SkPath_Reference#Path'>Path</a> is transformed by <ahref='#Matrix'>Matrix</a>, then intersected with or subtracted from the
prior <ahref='#Clip'>Clip</a> to form the replacement <ahref='#Clip'>Clip</a>. Use <ahref='undocumented#SkClipOp_kDifference'>SkClipOp::kDifference</a>
to subtract <ahref='SkPath_Reference#Path'>Path</a> from <ahref='#Clip'>Clip</a>; use <ahref='undocumented#SkClipOp_kIntersect'>SkClipOp::kIntersect</a> to intersect <ahref='SkPath_Reference#Path'>Path</a>
<ahref='#Clip'>Clip</a> can combine with <ahref='undocumented#Region'>Region</a>. <ahref='undocumented#Region'>Region</a> is assumed to be in <ahref='undocumented#Device'>Device</a> coordinates
<div><fiddle-embedname="862cc026601a41a58df49c0b9f0d7777"><div><ahref='#Draw'>Draw</a> a red circle with an <ahref='undocumented#Alias'>Aliased</a> clip and an Anti-aliased clip.
Replace <ahref='#Clip'>Clip</a> with the intersection or difference of <ahref='#Clip'>Clip</a> and <ahref='#SkCanvas_clipRect_rect'>rect</a>,
with an <ahref='undocumented#Alias'>Aliased</a> or Anti-aliased clip edge. <ahref='#SkCanvas_clipRect_rect'>rect</a> is transformed by <ahref='#Matrix'>Matrix</a>
before it is combined with <ahref='#Clip'>Clip</a>.
<div><fiddle-embedname="1d4e0632c97e42692775d834fe10aa99"><div>A circle drawn in pieces looks uniform when drawn <ahref='undocumented#Alias'>Aliased</a>.
Sets the maximum clip rectangle, which can be set by <ahref='#SkCanvas_clipRect'>clipRect</a>, <ahref='#SkCanvas_clipRRect'>clipRRect</a> and
<ahref='#SkCanvas_clipPath'>clipPath</a> and intersect the current clip with the specified <ahref='#SkCanvas_androidFramework_setDeviceClipRestriction_rect'>rect</a>.
Replace <ahref='#Clip'>Clip</a> with the intersection or difference of <ahref='#Clip'>Clip</a> and <ahref='#SkCanvas_clipPath_path'>path</a>,
with an <ahref='undocumented#Alias'>Aliased</a> or Anti-aliased clip edge. <ahref='SkPath_Reference#Fill_Type'>Path Fill Type</a> determines if <ahref='#SkCanvas_clipPath_path'>path</a>
describes the area inside or outside its contours; and if <ahref='SkPath_Reference#Contour'>Path Contour</a> overlaps
itself or another <ahref='SkPath_Reference#Contour'>Path Contour</a>, whether the overlaps form part of the area.
<ahref='#SkCanvas_clipPath_path'>path</a> is transformed by <ahref='#Matrix'>Matrix</a> before it is combined with <ahref='#Clip'>Clip</a>.
<div><fiddle-embedname="7856755c1bf8431c286c734b353345ad"><div>Overlapping <ahref='SkRect_Reference#Rect'>Rects</a> form a clip. When clip <ahref='SkPath_Reference#Fill_Type'>Path Fill Type</a> is set to
<ahref='SkPath_Reference#SkPath_kWinding_FillType'>SkPath::kWinding FillType</a>, the overlap is included. Set to
<ahref='SkPath_Reference#SkPath_kEvenOdd_FillType'>SkPath::kEvenOdd FillType</a>, the overlap is excluded and forms a hole.
<div><fiddle-embedname="187a7ae77a8176e417181411988534b6"><div><ahref='#Clip'>Clip</a> loops over itself covering its center twice. When clip <ahref='SkPath_Reference#Fill_Type'>Path Fill Type</a>
is set to <ahref='SkPath_Reference#SkPath_kWinding_FillType'>SkPath::kWinding FillType</a>, the overlap is included. Set to
<ahref='SkPath_Reference#SkPath_kEvenOdd_FillType'>SkPath::kEvenOdd FillType</a>, the overlap is excluded and forms a hole.
Replace <ahref='#Clip'>Clip</a> with the intersection or difference of <ahref='#Clip'>Clip</a> and <ahref='undocumented#Region'>Region</a><ahref='#SkCanvas_clipRegion_deviceRgn'>deviceRgn</a>.
Resulting <ahref='#Clip'>Clip</a> is <ahref='undocumented#Alias'>Aliased</a>; pixels are fully contained by the clip.
<ahref='#SkCanvas_clipRegion_deviceRgn'>deviceRgn</a> is unaffected by <ahref='#Matrix'>Matrix</a>.
Return true if <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_quickReject_rect'>rect</a>, transformed by <ahref='#Matrix'>Matrix</a>, can be quickly determined to be
outside of <ahref='#Clip'>Clip</a>. May return false even though <ahref='#SkCanvas_quickReject_rect'>rect</a> is outside of <ahref='#Clip'>Clip</a>.
Return <ahref='#SkCanvas_getLocalClipBounds_2_bounds'>bounds</a> of <ahref='#Clip'>Clip</a>, transformed by inverse of <ahref='#Matrix'>Matrix</a>. If <ahref='#Clip'>Clip</a> is empty,
return false, and set <ahref='#SkCanvas_getLocalClipBounds_2_bounds'>bounds</a> to <ahref='SkRect_Reference#SkRect_MakeEmpty'>SkRect::MakeEmpty</a>, where all <ahref='SkRect_Reference#Rect'>Rect</a> sides equal zero.
Return <ahref='SkIRect_Reference#IRect'>IRect</a> bounds of <ahref='#Clip'>Clip</a>, unaffected by <ahref='#Matrix'>Matrix</a>. If <ahref='#Clip'>Clip</a> is empty,
return <ahref='SkRect_Reference#SkRect_MakeEmpty'>SkRect::MakeEmpty</a>, where all <ahref='SkRect_Reference#Rect'>Rect</a> sides equal zero.
Return <ahref='SkIRect_Reference#IRect'>IRect</a><ahref='#SkCanvas_getDeviceClipBounds_2_bounds'>bounds</a> of <ahref='#Clip'>Clip</a>, unaffected by <ahref='#Matrix'>Matrix</a>. If <ahref='#Clip'>Clip</a> is empty,
return false, and set <ahref='#SkCanvas_getDeviceClipBounds_2_bounds'>bounds</a> to <ahref='SkRect_Reference#SkRect_MakeEmpty'>SkRect::MakeEmpty</a>, where all <ahref='SkRect_Reference#Rect'>Rect</a> sides equal zero.
Fill <ahref='#Clip'>Clip</a> with <ahref='SkColor_Reference#Color'>Color</a><ahref='#SkCanvas_clear_color'>color</a> using <ahref='undocumented#SkBlendMode_kSrc'>SkBlendMode::kSrc</a>.
This has the effect of replacing all pixels contained by <ahref='#Clip'>Clip</a> with <ahref='#SkCanvas_clear_color'>color</a>.
<ahref='#SkCanvas_discard'>discard</a> may do nothing, depending on the implementation of <ahref='SkSurface_Reference#Surface'>Surface</a> or <ahref='undocumented#Device'>Device</a>
Fill <ahref='#Clip'>Clip</a> with <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawPaint_paint'>paint</a>. <ahref='SkPaint_Reference#Paint'>Paint</a> components <ahref='undocumented#Mask_Filter'>Mask Filter</a>, <ahref='undocumented#Shader'>Shader</a>,
<ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Blend_Mode'>Blend Mode</a> affect drawing;
<ahref='undocumented#Path_Effect'>Path Effect</a> in <ahref='#SkCanvas_drawPaint_paint'>paint</a> is ignored.
<ahref='#Draw'>Draw</a><ahref='#SkCanvas_drawPoints_pts'>pts</a> using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a> and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawPoints_paint'>paint</a>.
<ahref='#SkCanvas_drawPoints_count'>count</a> is the number of points; if <ahref='#SkCanvas_drawPoints_count'>count</a> is less than one, has no effect.
<ahref='#SkCanvas_drawPoints_mode'>mode</a> may be one of: <ahref='#SkCanvas_kPoints_PointMode'>kPoints PointMode</a>, <ahref='#SkCanvas_kLines_PointMode'>kLines PointMode</a>, or <ahref='#SkCanvas_kPolygon_PointMode'>kPolygon PointMode</a>.
If <ahref='#SkCanvas_drawPoints_mode'>mode</a> is <ahref='#SkCanvas_kPoints_PointMode'>kPoints PointMode</a>, the shape of point drawn depends on <ahref='#SkCanvas_drawPoints_paint'>paint</a>
<ahref='SkPaint_Reference#Stroke_Cap'>Paint Stroke Cap</a>. If <ahref='#SkCanvas_drawPoints_paint'>paint</a> is set to <ahref='SkPaint_Reference#SkPaint_kRound_Cap'>SkPaint::kRound Cap</a>, each point draws a
circle of diameter <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a>. If <ahref='#SkCanvas_drawPoints_paint'>paint</a> is set to <ahref='SkPaint_Reference#SkPaint_kSquare_Cap'>SkPaint::kSquare Cap</a>
or <ahref='SkPaint_Reference#SkPaint_kButt_Cap'>SkPaint::kButt Cap</a>, each point draws a square of width and height
If <ahref='#SkCanvas_drawPoints_mode'>mode</a> is <ahref='#SkCanvas_kPolygon_PointMode'>kPolygon PointMode</a>, each adjacent pair of points draws a line segment.
<ahref='#SkCanvas_drawPoints_count'>count</a> minus one lines are drawn; the first and last point are used once.
Each line segment respects <ahref='#SkCanvas_drawPoints_paint'>paint</a><ahref='SkPaint_Reference#Stroke_Cap'>Paint Stroke Cap</a> and <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a>.
<ahref='SkPaint_Reference#Style'>Paint Style</a> is ignored, as if were set to <ahref='SkPaint_Reference#SkPaint_kStroke_Style'>SkPaint::kStroke Style</a>.
<ahref='SkPaint_Reference#Stroke_Join'>Paint Stroke Join</a>, and unlike <ahref='#SkCanvas_drawPath'>drawPath</a>, does not create a mask from all points
<ahref='#Draw'>Draw</a> point at (<ahref='#SkCanvas_drawPoint_x'>x</a>, <ahref='#SkCanvas_drawPoint_y'>y</a>) using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a> and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawPoint_paint'>paint</a>.
The shape of point drawn depends on <ahref='#SkCanvas_drawPoint_paint'>paint</a><ahref='SkPaint_Reference#Stroke_Cap'>Paint Stroke Cap</a>.
If <ahref='#SkCanvas_drawPoint_paint'>paint</a> is set to <ahref='SkPaint_Reference#SkPaint_kRound_Cap'>SkPaint::kRound Cap</a>, draw a circle of diameter
<ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a>. If <ahref='#SkCanvas_drawPoint_paint'>paint</a> is set to <ahref='SkPaint_Reference#SkPaint_kSquare_Cap'>SkPaint::kSquare Cap</a> or <ahref='SkPaint_Reference#SkPaint_kButt_Cap'>SkPaint::kButt Cap</a>,
draw a square of width and height <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a>.
<ahref='SkPaint_Reference#Style'>Paint Style</a> is ignored, as if were set to <ahref='SkPaint_Reference#SkPaint_kStroke_Style'>SkPaint::kStroke Style</a>.
<ahref='#Draw'>Draw</a> point <ahref='#SkCanvas_drawPoint_2_p'>p</a> using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a> and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawPoint_2_paint'>paint</a>.
The shape of point drawn depends on <ahref='#SkCanvas_drawPoint_2_paint'>paint</a><ahref='SkPaint_Reference#Stroke_Cap'>Paint Stroke Cap</a>.
If <ahref='#SkCanvas_drawPoint_2_paint'>paint</a> is set to <ahref='SkPaint_Reference#SkPaint_kRound_Cap'>SkPaint::kRound Cap</a>, draw a circle of diameter
<ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a>. If <ahref='#SkCanvas_drawPoint_2_paint'>paint</a> is set to <ahref='SkPaint_Reference#SkPaint_kSquare_Cap'>SkPaint::kSquare Cap</a> or <ahref='SkPaint_Reference#SkPaint_kButt_Cap'>SkPaint::kButt Cap</a>,
draw a square of width and height <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a>.
<ahref='SkPaint_Reference#Style'>Paint Style</a> is ignored, as if were set to <ahref='SkPaint_Reference#SkPaint_kStroke_Style'>SkPaint::kStroke Style</a>.
Draws line segment from (<ahref='#SkCanvas_drawLine_x0'>x0</a>, <ahref='#SkCanvas_drawLine_y0'>y0</a>) to (<ahref='#SkCanvas_drawLine_x1'>x1</a>, <ahref='#SkCanvas_drawLine_y1'>y1</a>) using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawLine_paint'>paint</a>.
In <ahref='#SkCanvas_drawLine_paint'>paint</a>: <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a> describes the line thickness;
<ahref='SkPaint_Reference#Stroke_Cap'>Paint Stroke Cap</a> draws the end rounded or square;
<ahref='SkPaint_Reference#Style'>Paint Style</a> is ignored, as if were set to <ahref='SkPaint_Reference#SkPaint_kStroke_Style'>SkPaint::kStroke Style</a>.
Draws line segment from <ahref='#SkCanvas_drawLine_2_p0'>p0</a> to <ahref='#SkCanvas_drawLine_2_p1'>p1</a> using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawLine_2_paint'>paint</a>.
In <ahref='#SkCanvas_drawLine_2_paint'>paint</a>: <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a> describes the line thickness;
<ahref='SkPaint_Reference#Stroke_Cap'>Paint Stroke Cap</a> draws the end rounded or square;
<ahref='SkPaint_Reference#Style'>Paint Style</a> is ignored, as if were set to <ahref='SkPaint_Reference#SkPaint_kStroke_Style'>SkPaint::kStroke Style</a>.
<ahref='#Draw'>Draw</a><ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawRect_rect'>rect</a> using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawRect_paint'>paint</a>.
In <ahref='#SkCanvas_drawRect_paint'>paint</a>: <ahref='SkPaint_Reference#Style'>Paint Style</a> determines if rectangle is stroked or filled;
if stroked, <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a> describes the line thickness, and
<ahref='SkPaint_Reference#Stroke_Join'>Paint Stroke Join</a> draws the corners rounded or square.
<ahref='#Draw'>Draw</a><ahref='SkIRect_Reference#IRect'>IRect</a><ahref='#SkCanvas_drawIRect_rect'>rect</a> using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawIRect_paint'>paint</a>.
In <ahref='#SkCanvas_drawIRect_paint'>paint</a>: <ahref='SkPaint_Reference#Style'>Paint Style</a> determines if rectangle is stroked or filled;
if stroked, <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a> describes the line thickness, and
<ahref='SkPaint_Reference#Stroke_Join'>Paint Stroke Join</a> draws the corners rounded or square.
<ahref='#Draw'>Draw</a><ahref='undocumented#Region'>Region</a><ahref='#SkCanvas_drawRegion_region'>region</a> using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawRegion_paint'>paint</a>.
In <ahref='#SkCanvas_drawRegion_paint'>paint</a>: <ahref='SkPaint_Reference#Style'>Paint Style</a> determines if rectangle is stroked or filled;
if stroked, <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a> describes the line thickness, and
<ahref='SkPaint_Reference#Stroke_Join'>Paint Stroke Join</a> draws the corners rounded or square.
<ahref='#Draw'>Draw</a><ahref='undocumented#Oval'>Oval</a><ahref='#SkCanvas_drawOval_oval'>oval</a> using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a>.
In <ahref='#SkCanvas_drawOval_paint'>paint</a>: <ahref='SkPaint_Reference#Style'>Paint Style</a> determines if <ahref='undocumented#Oval'>Oval</a> is stroked or filled;
if stroked, <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a> describes the line thickness.
<ahref='#Draw'>Draw</a><ahref='undocumented#Round_Rect'>Round Rect</a><ahref='#SkCanvas_drawRRect_rrect'>rrect</a> using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawRRect_paint'>paint</a>.
In <ahref='#SkCanvas_drawRRect_paint'>paint</a>: <ahref='SkPaint_Reference#Style'>Paint Style</a> determines if <ahref='#SkCanvas_drawRRect_rrect'>rrect</a> is stroked or filled;
if stroked, <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a> describes the line thickness.
<ahref='#Draw'>Draw</a><ahref='undocumented#Round_Rect'>Round Rect</a><ahref='#SkCanvas_drawDRRect_outer'>outer</a> and <ahref='#SkCanvas_drawDRRect_inner'>inner</a>
using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawDRRect_paint'>paint</a>.
<ahref='#SkCanvas_drawDRRect_outer'>outer</a> must contain <ahref='#SkCanvas_drawDRRect_inner'>inner</a> or the drawing is undefined.
In <ahref='#SkCanvas_drawDRRect_paint'>paint</a>: <ahref='SkPaint_Reference#Style'>Paint Style</a> determines if <ahref='undocumented#Round_Rect'>Round Rect</a> is stroked or filled;
if stroked, <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a> describes the line thickness.
If stroked and <ahref='undocumented#Round_Rect'>Round Rect</a> corner has zero length radii, <ahref='SkPaint_Reference#Stroke_Join'>Paint Stroke Join</a> can
GPU-backed platforms optimize drawing when both <ahref='#SkCanvas_drawDRRect_outer'>outer</a> and <ahref='#SkCanvas_drawDRRect_inner'>inner</a> are
concave and <ahref='#SkCanvas_drawDRRect_outer'>outer</a> contains <ahref='#SkCanvas_drawDRRect_inner'>inner</a>. These platforms may not be able to draw
<ahref='SkPath_Reference#Path'>Path</a> built with identical data as fast.
<div><fiddle-embedname="30823cb4edf884d330285ea161664931"><div>Outer <ahref='SkRect_Reference#Rect'>Rect</a> has no corner radii, but stroke join is rounded.
Inner <ahref='undocumented#Round_Rect'>Round Rect</a> has corner radii; outset stroke increases radii of corners.
Stroke join does not affect <ahref='#SkCanvas_drawDRRect_inner'>inner</a><ahref='undocumented#Round_Rect'>Round Rect</a> since it has no sharp corners.
<ahref='#Draw'>Draw</a><ahref='undocumented#Circle'>Circle</a> at (<ahref='#SkCanvas_drawCircle_cx'>cx</a>, <ahref='#SkCanvas_drawCircle_cy'>cy</a>) with <ahref='#SkCanvas_drawCircle_radius'>radius</a> using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawCircle_paint'>paint</a>.
If <ahref='#SkCanvas_drawCircle_radius'>radius</a> is zero or less, nothing is drawn.
In <ahref='#SkCanvas_drawCircle_paint'>paint</a>: <ahref='SkPaint_Reference#Style'>Paint Style</a> determines if <ahref='undocumented#Circle'>Circle</a> is stroked or filled;
if stroked, <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a> describes the line thickness.
<ahref='#Draw'>Draw</a><ahref='undocumented#Circle'>Circle</a> at <ahref='#SkCanvas_drawCircle_2_center'>center</a> with <ahref='#SkCanvas_drawCircle_2_radius'>radius</a> using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawCircle_2_paint'>paint</a>.
If <ahref='#SkCanvas_drawCircle_2_radius'>radius</a> is zero or less, nothing is drawn.
In <ahref='#SkCanvas_drawCircle_2_paint'>paint</a>: <ahref='SkPaint_Reference#Style'>Paint Style</a> determines if <ahref='undocumented#Circle'>Circle</a> is stroked or filled;
if stroked, <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a> describes the line thickness.
<ahref='#Draw'>Draw</a><ahref='undocumented#Arc'>Arc</a> using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawArc_paint'>paint</a>.
<ahref='undocumented#Arc'>Arc</a> is part of <ahref='undocumented#Oval'>Oval</a> bounded by <ahref='#SkCanvas_drawArc_oval'>oval</a>, sweeping from <ahref='#SkCanvas_drawArc_startAngle'>startAngle</a> to <ahref='#SkCanvas_drawArc_startAngle'>startAngle</a> plus
<ahref='#SkCanvas_drawArc_sweepAngle'>sweepAngle</a>. <ahref='#SkCanvas_drawArc_startAngle'>startAngle</a> and <ahref='#SkCanvas_drawArc_sweepAngle'>sweepAngle</a> are in degrees.
<ahref='#SkCanvas_drawArc_startAngle'>startAngle</a> of zero places start point at the right middle edge of <ahref='#SkCanvas_drawArc_oval'>oval</a>.
A positive <ahref='#SkCanvas_drawArc_sweepAngle'>sweepAngle</a> places <ahref='undocumented#Arc'>Arc</a> end point clockwise from start point;
a negative <ahref='#SkCanvas_drawArc_sweepAngle'>sweepAngle</a> places <ahref='undocumented#Arc'>Arc</a> end point counterclockwise from start point.
<ahref='#SkCanvas_drawArc_sweepAngle'>sweepAngle</a> may exceed 360 degrees, a full circle.
If <ahref='#SkCanvas_drawArc_useCenter'>useCenter</a> is true, draw a wedge that includes lines from <ahref='#SkCanvas_drawArc_oval'>oval</a>
center to <ahref='undocumented#Arc'>Arc</a> end points. If <ahref='#SkCanvas_drawArc_useCenter'>useCenter</a> is false, draw <ahref='undocumented#Arc'>Arc</a> between end points.
If <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawArc_oval'>oval</a> is empty or <ahref='#SkCanvas_drawArc_sweepAngle'>sweepAngle</a> is zero, nothing is drawn.
<ahref='#Draw'>Draw</a><ahref='undocumented#Round_Rect'>Round Rect</a> bounded by <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawRoundRect_rect'>rect</a>, with corner radii (<ahref='#SkCanvas_drawRoundRect_rx'>rx</a>, <ahref='#SkCanvas_drawRoundRect_ry'>ry</a>) using <ahref='#Clip'>Clip</a>,
<ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawRoundRect_paint'>paint</a>.
In <ahref='#SkCanvas_drawRoundRect_paint'>paint</a>: <ahref='SkPaint_Reference#Style'>Paint Style</a> determines if <ahref='undocumented#Round_Rect'>Round Rect</a> is stroked or filled;
if stroked, <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a> describes the line thickness.
If <ahref='#SkCanvas_drawRoundRect_rx'>rx</a> or <ahref='#SkCanvas_drawRoundRect_ry'>ry</a> are less than zero, they are treated as if they are zero.
If <ahref='#SkCanvas_drawRoundRect_rx'>rx</a> plus <ahref='#SkCanvas_drawRoundRect_ry'>ry</a> exceeds <ahref='#SkCanvas_drawRoundRect_rect'>rect</a> width or <ahref='#SkCanvas_drawRoundRect_rect'>rect</a> height, radii are scaled down to fit.
If <ahref='#SkCanvas_drawRoundRect_rx'>rx</a> and <ahref='#SkCanvas_drawRoundRect_ry'>ry</a> are zero, <ahref='undocumented#Round_Rect'>Round Rect</a> is drawn as <ahref='SkRect_Reference#Rect'>Rect</a> and if stroked is affected by
<ahref='#Draw'>Draw</a><ahref='SkPath_Reference#Path'>Path</a><ahref='#SkCanvas_drawPath_path'>path</a> using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawPath_paint'>paint</a>.
<ahref='SkPath_Reference#Path'>Path</a> contains an array of <ahref='SkPath_Reference#Contour'>Path Contour</a>, each of which may be open or closed.
In <ahref='#SkCanvas_drawPath_paint'>paint</a>: <ahref='SkPaint_Reference#Style'>Paint Style</a> determines if <ahref='undocumented#Round_Rect'>Round Rect</a> is stroked or filled:
if filled, <ahref='SkPath_Reference#Fill_Type'>Path Fill Type</a> determines whether <ahref='SkPath_Reference#Contour'>Path Contour</a> describes inside or
outside of fill; if stroked, <ahref='SkPaint_Reference#Stroke_Width'>Paint Stroke Width</a> describes the line thickness,
<ahref='SkPaint_Reference#Stroke_Cap'>Paint Stroke Cap</a> describes line ends, and <ahref='SkPaint_Reference#Stroke_Join'>Paint Stroke Join</a> describes how
<div><fiddle-embedname="fe2294131f422b8d6752f6a880f98ad9"><div>Top rows draw stroked <ahref='#SkCanvas_drawPath_path'>path</a> with combinations of joins and caps. The open contour
<ahref='#SkCanvas_drawImage'>drawImage</a>, <ahref='#SkCanvas_drawImageRect'>drawImageRect</a>, and <ahref='#SkCanvas_drawImageNine'>drawImageNine</a> can be called with a bare pointer or
<ahref='#Draw'>Draw</a><ahref='SkImage_Reference#Image'>Image</a><ahref='#SkCanvas_drawImage_image'>image</a>, with its <ahref='#SkCanvas_drawImage_top'>top</a>-<ahref='#SkCanvas_drawImage_left'>left</a> corner at (<ahref='#SkCanvas_drawImage_left'>left</a>, <ahref='#SkCanvas_drawImage_top'>top</a>),
using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImage_paint'>paint</a>.
If <ahref='#SkCanvas_drawImage_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, <ahref='undocumented#Blend_Mode'>Blend Mode</a>,
and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If <ahref='#SkCanvas_drawImage_image'>image</a> is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawImage_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from <ahref='#SkCanvas_drawImage_image'>image</a> bounds. If generated
mask extends beyond <ahref='#SkCanvas_drawImage_image'>image</a> bounds, replicate <ahref='#SkCanvas_drawImage_image'>image</a> edge colors, just as <ahref='undocumented#Shader'>Shader</a>
made from <ahref='SkImage_Reference#SkImage_makeShader'>SkImage::makeShader</a> with <ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set replicates the
<ahref='#SkCanvas_drawImage_image'>image</a> edge color when it samples outside of its bounds.
<ahref='#Draw'>Draw</a><ahref='SkImage_Reference#Image'>Image</a><ahref='#SkCanvas_drawImage_2_image'>image</a>, with its <ahref='#SkCanvas_drawImage_2_top'>top</a>-<ahref='#SkCanvas_drawImage_2_left'>left</a> corner at (<ahref='#SkCanvas_drawImage_2_left'>left</a>, <ahref='#SkCanvas_drawImage_2_top'>top</a>),
using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImage_2_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImage_2_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If <ahref='#SkCanvas_drawImage_2_image'>image</a> is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawImage_2_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from <ahref='#SkCanvas_drawImage_2_image'>image</a> bounds. If generated
mask extends beyond <ahref='#SkCanvas_drawImage_2_image'>image</a> bounds, replicate <ahref='#SkCanvas_drawImage_2_image'>image</a> edge colors, just as <ahref='undocumented#Shader'>Shader</a>
made from <ahref='SkImage_Reference#SkImage_makeShader'>SkImage::makeShader</a> with <ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set replicates the
<ahref='#SkCanvas_drawImage_2_image'>image</a> edge color when it samples outside of its bounds.
<ahref='undocumented#Image_Filter'>Image Filter</a> in <ahref='SkPaint_Reference#Paint'>Paint</a> may sample multiple pixels in the image. Source <ahref='SkRect_Reference#Rect'>Rect</a>
restricts the bounds of pixels that may be read. <ahref='undocumented#Image_Filter'>Image Filter</a> may slow down if
it cannot read outside the bounds, when sampling near the edge of source <ahref='SkRect_Reference#Rect'>Rect</a>.
<ahref='#SkCanvas_SrcRectConstraint'>SrcRectConstraint</a> specifies whether an <ahref='undocumented#Image_Filter'>Image Filter</a> is allowed to read pixels
<ahref='#Draw'>Draw</a><ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawImageRect_src'>src</a> of <ahref='SkImage_Reference#Image'>Image</a><ahref='#SkCanvas_drawImageRect_image'>image</a>, scaled and translated to fill <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawImageRect_dst'>dst</a>.
Additionally transform draw using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageRect_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageRect_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If <ahref='#SkCanvas_drawImageRect_image'>image</a> is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawImageRect_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from <ahref='#SkCanvas_drawImageRect_image'>image</a> bounds.
If generated mask extends beyond <ahref='#SkCanvas_drawImageRect_image'>image</a> bounds, replicate <ahref='#SkCanvas_drawImageRect_image'>image</a> edge colors, just
as <ahref='undocumented#Shader'>Shader</a> made from <ahref='SkImage_Reference#SkImage_makeShader'>SkImage::makeShader</a> with <ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set
replicates the <ahref='#SkCanvas_drawImageRect_image'>image</a> edge color when it samples outside of its bounds.
<ahref='#SkCanvas_drawImageRect_constraint'>constraint</a> set to <ahref='#SkCanvas_kStrict_SrcRectConstraint'>kStrict SrcRectConstraint</a> limits <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='undocumented#Filter_Quality'>Filter Quality</a> to
sample within <ahref='#SkCanvas_drawImageRect_src'>src</a>; set to <ahref='#SkCanvas_kFast_SrcRectConstraint'>kFast SrcRectConstraint</a> allows sampling outside to
<div><fiddle-embedname="bfd18e9cac896cdf94c9f154ccf94be8"><div>The left bitmap draws with <ahref='SkPaint_Reference#Paint'>Paint</a> default <ahref='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, and stays within
its bounds; there is no bleeding with <ahref='#SkCanvas_kFast_SrcRectConstraint'>kFast SrcRectConstraint</a>.
the middle and right bitmaps draw with <ahref='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a>; with
<ahref='#SkCanvas_kStrict_SrcRectConstraint'>kStrict SrcRectConstraint</a>, the filter remains within the checkerboard, and
with <ahref='#SkCanvas_kFast_SrcRectConstraint'>kFast SrcRectConstraint</a> red bleeds on the edges.
<ahref='#Draw'>Draw</a><ahref='SkIRect_Reference#IRect'>IRect</a><ahref='#SkCanvas_drawImageRect_2_isrc'>isrc</a> of <ahref='SkImage_Reference#Image'>Image</a><ahref='#SkCanvas_drawImageRect_2_image'>image</a>, scaled and translated to fill <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawImageRect_2_dst'>dst</a>.
Note that <ahref='#SkCanvas_drawImageRect_2_isrc'>isrc</a> is on integer pixel boundaries; <ahref='#SkCanvas_drawImageRect_2_dst'>dst</a> may include fractional
boundaries. Additionally transform draw using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a>
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageRect_2_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If <ahref='#SkCanvas_drawImageRect_2_image'>image</a> is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawImageRect_2_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from <ahref='#SkCanvas_drawImageRect_2_image'>image</a> bounds.
If generated mask extends beyond <ahref='#SkCanvas_drawImageRect_2_image'>image</a> bounds, replicate <ahref='#SkCanvas_drawImageRect_2_image'>image</a> edge colors, just
as <ahref='undocumented#Shader'>Shader</a> made from <ahref='SkImage_Reference#SkImage_makeShader'>SkImage::makeShader</a> with <ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set
replicates the <ahref='#SkCanvas_drawImageRect_2_image'>image</a> edge color when it samples outside of its bounds.
<ahref='#SkCanvas_drawImageRect_2_constraint'>constraint</a> set to <ahref='#SkCanvas_kStrict_SrcRectConstraint'>kStrict SrcRectConstraint</a> limits <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='undocumented#Filter_Quality'>Filter Quality</a> to
sample within <ahref='#SkCanvas_drawImageRect_2_isrc'>isrc</a>; set to <ahref='#SkCanvas_kFast_SrcRectConstraint'>kFast SrcRectConstraint</a> allows sampling outside to
<ahref='#Draw'>Draw</a><ahref='SkImage_Reference#Image'>Image</a><ahref='#SkCanvas_drawImageRect_3_image'>image</a>, scaled and translated to fill <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawImageRect_3_dst'>dst</a>, using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>,
and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageRect_3_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageRect_3_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If <ahref='#SkCanvas_drawImageRect_3_image'>image</a> is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawImageRect_3_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from <ahref='#SkCanvas_drawImageRect_3_image'>image</a> bounds.
If generated mask extends beyond <ahref='#SkCanvas_drawImageRect_3_image'>image</a> bounds, replicate <ahref='#SkCanvas_drawImageRect_3_image'>image</a> edge colors, just
as <ahref='undocumented#Shader'>Shader</a> made from <ahref='SkImage_Reference#SkImage_makeShader'>SkImage::makeShader</a> with <ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set
replicates the <ahref='#SkCanvas_drawImageRect_3_image'>image</a> edge color when it samples outside of its bounds.
<ahref='#SkCanvas_drawImageRect_3_constraint'>constraint</a> set to <ahref='#SkCanvas_kStrict_SrcRectConstraint'>kStrict SrcRectConstraint</a> limits <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='undocumented#Filter_Quality'>Filter Quality</a> to
sample within <ahref='#SkCanvas_drawImageRect_3_image'>image</a>; set to <ahref='#SkCanvas_kFast_SrcRectConstraint'>kFast SrcRectConstraint</a> allows sampling outside to
<ahref='#Draw'>Draw</a><ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawImageRect_4_src'>src</a> of <ahref='SkImage_Reference#Image'>Image</a><ahref='#SkCanvas_drawImageRect_4_image'>image</a>, scaled and translated to fill <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawImageRect_4_dst'>dst</a>.
Additionally transform draw using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageRect_4_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageRect_4_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If <ahref='#SkCanvas_drawImageRect_4_image'>image</a> is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawImageRect_4_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from <ahref='#SkCanvas_drawImageRect_4_image'>image</a> bounds.
If generated mask extends beyond <ahref='#SkCanvas_drawImageRect_4_image'>image</a> bounds, replicate <ahref='#SkCanvas_drawImageRect_4_image'>image</a> edge colors, just
as <ahref='undocumented#Shader'>Shader</a> made from <ahref='SkImage_Reference#SkImage_makeShader'>SkImage::makeShader</a> with <ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set
replicates the <ahref='#SkCanvas_drawImageRect_4_image'>image</a> edge color when it samples outside of its bounds.
<ahref='#SkCanvas_drawImageRect_4_constraint'>constraint</a> set to <ahref='#SkCanvas_kStrict_SrcRectConstraint'>kStrict SrcRectConstraint</a> limits <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='undocumented#Filter_Quality'>Filter Quality</a> to
sample within <ahref='#SkCanvas_drawImageRect_4_src'>src</a>; set to <ahref='#SkCanvas_kFast_SrcRectConstraint'>kFast SrcRectConstraint</a> allows sampling outside to
<div><fiddle-embedname="d4b35a9d24c32c042bd1f529b8de3c0d"><div><ahref='#Canvas'>Canvas</a> scales and translates; transformation from <ahref='#SkCanvas_drawImageRect_4_src'>src</a> to <ahref='#SkCanvas_drawImageRect_4_dst'>dst</a> also scales.
<ahref='#Draw'>Draw</a><ahref='SkIRect_Reference#IRect'>IRect</a><ahref='#SkCanvas_drawImageRect_5_isrc'>isrc</a> of <ahref='SkImage_Reference#Image'>Image</a><ahref='#SkCanvas_drawImageRect_5_image'>image</a>, scaled and translated to fill <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawImageRect_5_dst'>dst</a>.
<ahref='#SkCanvas_drawImageRect_5_isrc'>isrc</a> is on integer pixel boundaries; <ahref='#SkCanvas_drawImageRect_5_dst'>dst</a> may include fractional boundaries.
Additionally transform draw using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageRect_5_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageRect_5_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If <ahref='#SkCanvas_drawImageRect_5_image'>image</a> is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawImageRect_5_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from <ahref='#SkCanvas_drawImageRect_5_image'>image</a> bounds.
If generated mask extends beyond <ahref='#SkCanvas_drawImageRect_5_image'>image</a> bounds, replicate <ahref='#SkCanvas_drawImageRect_5_image'>image</a> edge colors, just
as <ahref='undocumented#Shader'>Shader</a> made from <ahref='SkImage_Reference#SkImage_makeShader'>SkImage::makeShader</a> with <ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set
replicates the <ahref='#SkCanvas_drawImageRect_5_image'>image</a> edge color when it samples outside of its bounds.
<ahref='#SkCanvas_drawImageRect_5_constraint'>constraint</a> set to <ahref='#SkCanvas_kStrict_SrcRectConstraint'>kStrict SrcRectConstraint</a> limits <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='undocumented#Filter_Quality'>Filter Quality</a> to
sample within <ahref='#SkCanvas_drawImageRect_5_image'>image</a>; set to <ahref='#SkCanvas_kFast_SrcRectConstraint'>kFast SrcRectConstraint</a> allows sampling outside to
<ahref='#Draw'>Draw</a><ahref='SkImage_Reference#Image'>Image</a><ahref='#SkCanvas_drawImageRect_6_image'>image</a>, scaled and translated to fill <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawImageRect_6_dst'>dst</a>,
using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageRect_6_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageRect_6_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If <ahref='#SkCanvas_drawImageRect_6_image'>image</a> is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawImageRect_6_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from <ahref='#SkCanvas_drawImageRect_6_image'>image</a> bounds.
If generated mask extends beyond <ahref='#SkCanvas_drawImageRect_6_image'>image</a> bounds, replicate <ahref='#SkCanvas_drawImageRect_6_image'>image</a> edge colors, just
as <ahref='undocumented#Shader'>Shader</a> made from <ahref='SkImage_Reference#SkImage_makeShader'>SkImage::makeShader</a> with <ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set
replicates the <ahref='#SkCanvas_drawImageRect_6_image'>image</a> edge color when it samples outside of its bounds.
<ahref='#SkCanvas_drawImageRect_6_constraint'>constraint</a> set to <ahref='#SkCanvas_kStrict_SrcRectConstraint'>kStrict SrcRectConstraint</a> limits <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='undocumented#Filter_Quality'>Filter Quality</a> to
sample within <ahref='#SkCanvas_drawImageRect_6_image'>image</a>; set to <ahref='#SkCanvas_kFast_SrcRectConstraint'>kFast SrcRectConstraint</a> allows sampling outside to
<ahref='#Draw'>Draw</a><ahref='SkImage_Reference#Image'>Image</a><ahref='#SkCanvas_drawImageNine_image'>image</a> stretched proportionally to fit into <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawImageNine_dst'>dst</a>.
<ahref='SkIRect_Reference#IRect'>IRect</a><ahref='#SkCanvas_drawImageNine_center'>center</a> divides the <ahref='#SkCanvas_drawImageNine_image'>image</a> into nine sections: four sides, four corners, and
the <ahref='#SkCanvas_drawImageNine_center'>center</a>. Corners are unmodified or scaled down proportionately if their sides
are larger than <ahref='#SkCanvas_drawImageNine_dst'>dst</a>; <ahref='#SkCanvas_drawImageNine_center'>center</a> and four sides are scaled to fit remaining space, if any.
Additionally transform draw using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageNine_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageNine_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If image is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawImageNine_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from image bounds. If <ahref='#SkCanvas_drawImageNine_paint'>paint</a>
<ahref='undocumented#Filter_Quality'>Filter Quality</a> set to <ahref='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, disable pixel filtering. For all
other values of <ahref='#SkCanvas_drawImageNine_paint'>paint</a><ahref='undocumented#Filter_Quality'>Filter Quality</a>, use <ahref='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> to filter pixels.
If generated mask extends beyond <ahref='#SkCanvas_drawImageNine_image'>image</a> bounds, replicate <ahref='#SkCanvas_drawImageNine_image'>image</a> edge colors, just
as <ahref='undocumented#Shader'>Shader</a> made from <ahref='SkImage_Reference#SkImage_makeShader'>SkImage::makeShader</a> with <ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set
replicates the <ahref='#SkCanvas_drawImageNine_image'>image</a> edge color when it samples outside of its bounds.
<div><fiddle-embedname="4f153cf1d0dbe1a95acf5badeec14dae"><div>The leftmost <ahref='#SkCanvas_drawImageNine_image'>image</a> is smaller than <ahref='#SkCanvas_drawImageNine_center'>center</a>; only corners are drawn, all scaled to fit.
The second <ahref='#SkCanvas_drawImageNine_image'>image</a> equals the size of <ahref='#SkCanvas_drawImageNine_center'>center</a>; only corners are drawn without scaling.
The remaining images are larger than <ahref='#SkCanvas_drawImageNine_center'>center</a>. All corners draw without scaling.
The sides and <ahref='#SkCanvas_drawImageNine_center'>center</a> are scaled if needed to take up the remaining space.
<ahref='#Draw'>Draw</a><ahref='SkImage_Reference#Image'>Image</a><ahref='#SkCanvas_drawImageNine_2_image'>image</a> stretched proportionally to fit into <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawImageNine_2_dst'>dst</a>.
<ahref='SkIRect_Reference#IRect'>IRect</a><ahref='#SkCanvas_drawImageNine_2_center'>center</a> divides the <ahref='#SkCanvas_drawImageNine_2_image'>image</a> into nine sections: four sides, four corners, and
the <ahref='#SkCanvas_drawImageNine_2_center'>center</a>. Corners are not scaled, or scaled down proportionately if their sides
are larger than <ahref='#SkCanvas_drawImageNine_2_dst'>dst</a>; <ahref='#SkCanvas_drawImageNine_2_center'>center</a> and four sides are scaled to fit remaining space, if any.
Additionally transform draw using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageNine_2_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageNine_2_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If <ahref='#SkCanvas_drawImageNine_2_image'>image</a> is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawImageNine_2_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from <ahref='#SkCanvas_drawImageNine_2_image'>image</a> bounds.
If generated mask extends beyond <ahref='#SkCanvas_drawImageNine_2_image'>image</a> bounds, replicate <ahref='#SkCanvas_drawImageNine_2_image'>image</a> edge colors, just
as <ahref='undocumented#Shader'>Shader</a> made from <ahref='SkImage_Reference#SkImage_makeShader'>SkImage::makeShader</a> with <ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set
replicates the <ahref='#SkCanvas_drawImageNine_2_image'>image</a> edge color when it samples outside of its bounds.
<div><fiddle-embedname="d597d9af8d17fd93e634dd12017058e2"><div>The two leftmost images has four corners and sides to the left and right of <ahref='#SkCanvas_drawImageNine_2_center'>center</a>.
The leftmost <ahref='#SkCanvas_drawImageNine_2_image'>image</a> scales the width of corners proportionately to fit.
The third and fourth <ahref='#SkCanvas_drawImageNine_2_image'>image</a> corners are not scaled; the sides and <ahref='#SkCanvas_drawImageNine_2_center'>center</a> are scaled to
<ahref='#Draw'>Draw</a><ahref='SkBitmap_Reference#Bitmap'>Bitmap</a><ahref='#SkCanvas_drawBitmap_bitmap'>bitmap</a>, with its <ahref='#SkCanvas_drawBitmap_top'>top</a>-<ahref='#SkCanvas_drawBitmap_left'>left</a> corner at (<ahref='#SkCanvas_drawBitmap_left'>left</a>, <ahref='#SkCanvas_drawBitmap_top'>top</a>),
using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawBitmap_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawBitmap_paint'>paint</a> is not nullptr, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If <ahref='#SkCanvas_drawBitmap_bitmap'>bitmap</a> is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawBitmap_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from <ahref='#SkCanvas_drawBitmap_bitmap'>bitmap</a> bounds.
just as <ahref='undocumented#Shader'>Shader</a> made from <ahref='undocumented#SkShader_MakeBitmapShader'>SkShader::MakeBitmapShader</a> with
<ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set replicates the <ahref='#SkCanvas_drawBitmap_bitmap'>bitmap</a> edge color when it samples
<ahref='#Draw'>Draw</a><ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawBitmapRect_src'>src</a> of <ahref='SkBitmap_Reference#Bitmap'>Bitmap</a><ahref='#SkCanvas_drawBitmapRect_bitmap'>bitmap</a>, scaled and translated to fill <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawBitmapRect_dst'>dst</a>.
Additionally transform draw using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawBitmapRect_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawBitmapRect_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If <ahref='#SkCanvas_drawBitmapRect_bitmap'>bitmap</a> is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawBitmapRect_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from <ahref='#SkCanvas_drawBitmapRect_bitmap'>bitmap</a> bounds.
just as <ahref='undocumented#Shader'>Shader</a> made from <ahref='undocumented#SkShader_MakeBitmapShader'>SkShader::MakeBitmapShader</a> with
<ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set replicates the <ahref='#SkCanvas_drawBitmapRect_bitmap'>bitmap</a> edge color when it samples
<ahref='#SkCanvas_drawBitmapRect_constraint'>constraint</a> set to <ahref='#SkCanvas_kStrict_SrcRectConstraint'>kStrict SrcRectConstraint</a> limits <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='undocumented#Filter_Quality'>Filter Quality</a> to
sample within <ahref='#SkCanvas_drawBitmapRect_src'>src</a>; set to <ahref='#SkCanvas_kFast_SrcRectConstraint'>kFast SrcRectConstraint</a> allows sampling outside to
<ahref='#Draw'>Draw</a><ahref='SkIRect_Reference#IRect'>IRect</a><ahref='#SkCanvas_drawBitmapRect_2_isrc'>isrc</a> of <ahref='SkBitmap_Reference#Bitmap'>Bitmap</a><ahref='#SkCanvas_drawBitmapRect_2_bitmap'>bitmap</a>, scaled and translated to fill <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawBitmapRect_2_dst'>dst</a>.
<ahref='#SkCanvas_drawBitmapRect_2_isrc'>isrc</a> is on integer pixel boundaries; <ahref='#SkCanvas_drawBitmapRect_2_dst'>dst</a> may include fractional boundaries.
Additionally transform draw using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawBitmapRect_2_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawBitmapRect_2_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If <ahref='#SkCanvas_drawBitmapRect_2_bitmap'>bitmap</a> is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawBitmapRect_2_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from <ahref='#SkCanvas_drawBitmapRect_2_bitmap'>bitmap</a> bounds.
just as <ahref='undocumented#Shader'>Shader</a> made from <ahref='undocumented#SkShader_MakeBitmapShader'>SkShader::MakeBitmapShader</a> with
<ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set replicates the <ahref='#SkCanvas_drawBitmapRect_2_bitmap'>bitmap</a> edge color when it samples
<ahref='#SkCanvas_drawBitmapRect_2_constraint'>constraint</a> set to <ahref='#SkCanvas_kStrict_SrcRectConstraint'>kStrict SrcRectConstraint</a> limits <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='undocumented#Filter_Quality'>Filter Quality</a> to
sample within <ahref='#SkCanvas_drawBitmapRect_2_isrc'>isrc</a>; set to <ahref='#SkCanvas_kFast_SrcRectConstraint'>kFast SrcRectConstraint</a> allows sampling outside to
<ahref='#Draw'>Draw</a><ahref='SkBitmap_Reference#Bitmap'>Bitmap</a><ahref='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a>, scaled and translated to fill <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawBitmapRect_3_dst'>dst</a>.
<ahref='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a> bounds is on integer pixel boundaries; <ahref='#SkCanvas_drawBitmapRect_3_dst'>dst</a> may include fractional boundaries.
Additionally transform draw using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawBitmapRect_3_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawBitmapRect_3_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If <ahref='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a> is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawBitmapRect_3_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from <ahref='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a> bounds.
just as <ahref='undocumented#Shader'>Shader</a> made from <ahref='undocumented#SkShader_MakeBitmapShader'>SkShader::MakeBitmapShader</a> with
<ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set replicates the <ahref='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a> edge color when it samples
<ahref='#SkCanvas_drawBitmapRect_3_constraint'>constraint</a> set to <ahref='#SkCanvas_kStrict_SrcRectConstraint'>kStrict SrcRectConstraint</a> limits <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='undocumented#Filter_Quality'>Filter Quality</a> to
sample within <ahref='#SkCanvas_drawBitmapRect_3_bitmap'>bitmap</a>; set to <ahref='#SkCanvas_kFast_SrcRectConstraint'>kFast SrcRectConstraint</a> allows sampling outside to
<ahref='#Draw'>Draw</a><ahref='SkBitmap_Reference#Bitmap'>Bitmap</a><ahref='#SkCanvas_drawBitmapNine_bitmap'>bitmap</a> stretched proportionally to fit into <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawBitmapNine_dst'>dst</a>.
<ahref='SkIRect_Reference#IRect'>IRect</a><ahref='#SkCanvas_drawBitmapNine_center'>center</a> divides the <ahref='#SkCanvas_drawBitmapNine_bitmap'>bitmap</a> into nine sections: four sides, four corners,
and the <ahref='#SkCanvas_drawBitmapNine_center'>center</a>. Corners are not scaled, or scaled down proportionately if their
sides are larger than <ahref='#SkCanvas_drawBitmapNine_dst'>dst</a>; <ahref='#SkCanvas_drawBitmapNine_center'>center</a> and four sides are scaled to fit remaining
Additionally transform draw using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawBitmapNine_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawBitmapNine_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If bitmap is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawBitmapNine_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from bitmap bounds. If <ahref='#SkCanvas_drawBitmapNine_paint'>paint</a>
<ahref='undocumented#Filter_Quality'>Filter Quality</a> set to <ahref='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, disable pixel filtering. For all
other values of <ahref='#SkCanvas_drawBitmapNine_paint'>paint</a><ahref='undocumented#Filter_Quality'>Filter Quality</a>, use <ahref='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> to filter pixels.
just as <ahref='undocumented#Shader'>Shader</a> made from <ahref='undocumented#SkShader_MakeBitmapShader'>SkShader::MakeBitmapShader</a> with
<ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set replicates the <ahref='#SkCanvas_drawBitmapNine_bitmap'>bitmap</a> edge color when it samples
<div><fiddle-embedname="e99e7be0d8f67dfacbecf85df585433d"><div>The two leftmost <ahref='#SkCanvas_drawBitmapNine_bitmap'>bitmap</a> draws has four corners and sides to the left and right of <ahref='#SkCanvas_drawBitmapNine_center'>center</a>.
The leftmost <ahref='#SkCanvas_drawBitmapNine_bitmap'>bitmap</a> draw scales the width of corners proportionately to fit.
The third and fourth draw corners are not scaled; the sides and <ahref='#SkCanvas_drawBitmapNine_center'>center</a> are scaled to
<ahref='#SkCanvas_Lattice'>Lattice</a> divides <ahref='SkBitmap_Reference#Bitmap'>Bitmap</a> or <ahref='SkImage_Reference#Image'>Image</a> into a rectangular grid.
Each <ahref='#SkCanvas_Lattice_RectType'>RectType</a> is one of: <ahref='#SkCanvas_Lattice_kDefault'>kDefault</a>, <ahref='#SkCanvas_Lattice_kTransparent'>kTransparent</a>, <ahref='#SkCanvas_Lattice_kFixedColor'>kFixedColor</a>.
<ahref='#Draw'>Draw</a><ahref='SkBitmap_Reference#Bitmap'>Bitmap</a><ahref='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> stretched proportionally to fit into <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawBitmapLattice_dst'>dst</a>.
<ahref='#SkCanvas_Lattice'>Lattice</a><ahref='#SkCanvas_drawBitmapLattice_lattice'>lattice</a> divides <ahref='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> into a rectangular grid.
of <ahref='#SkCanvas_drawBitmapNine'>drawBitmapNine</a>, fixed <ahref='#SkCanvas_drawBitmapLattice_lattice'>lattice</a> elements never scale larger than their initial
size and shrink proportionately when all fixed elements exceed the <ahref='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a>
Additionally transform draw using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawBitmapLattice_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawBitmapLattice_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If bitmap is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawBitmapLattice_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from bitmap bounds. If <ahref='#SkCanvas_drawBitmapLattice_paint'>paint</a>
<ahref='undocumented#Filter_Quality'>Filter Quality</a> set to <ahref='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, disable pixel filtering. For all
other values of <ahref='#SkCanvas_drawBitmapLattice_paint'>paint</a><ahref='undocumented#Filter_Quality'>Filter Quality</a>, use <ahref='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> to filter pixels.
just as <ahref='undocumented#Shader'>Shader</a> made from <ahref='undocumented#SkShader_MakeBitmapShader'>SkShader::MakeBitmapShader</a> with
<ahref='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set replicates the <ahref='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> edge color when it samples
<div><fiddle-embedname="c5bfa944e17ba4a4400dc799f032069c"><div>The two leftmost <ahref='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> draws has four corners and sides to the left and right of center.
The leftmost <ahref='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> draw scales the width of corners proportionately to fit.
<ahref='#Draw'>Draw</a><ahref='SkImage_Reference#Image'>Image</a><ahref='#SkCanvas_drawImageLattice_image'>image</a> stretched proportionally to fit into <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawImageLattice_dst'>dst</a>.
<ahref='#SkCanvas_Lattice'>Lattice</a><ahref='#SkCanvas_drawImageLattice_lattice'>lattice</a> divides <ahref='#SkCanvas_drawImageLattice_image'>image</a> into a rectangular grid.
of <ahref='#SkCanvas_drawBitmapNine'>drawBitmapNine</a>, fixed <ahref='#SkCanvas_drawImageLattice_lattice'>lattice</a> elements never scale larger than their initial
Additionally transform draw using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageLattice_paint'>paint</a>.
If <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawImageLattice_paint'>paint</a> is supplied, apply <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>,
<ahref='undocumented#Blend_Mode'>Blend Mode</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>. If image is <ahref='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <ahref='undocumented#Shader'>Shader</a>.
If <ahref='#SkCanvas_drawImageLattice_paint'>paint</a> contains <ahref='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from image bounds. If <ahref='#SkCanvas_drawImageLattice_paint'>paint</a>
<ahref='undocumented#Filter_Quality'>Filter Quality</a> set to <ahref='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, disable pixel filtering. For all
other values of <ahref='#SkCanvas_drawImageLattice_paint'>paint</a><ahref='undocumented#Filter_Quality'>Filter Quality</a>, use <ahref='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> to filter pixels.
<div><fiddle-embedname="4f153cf1d0dbe1a95acf5badeec14dae"><div>The leftmost <ahref='#SkCanvas_drawImageLattice_image'>image</a> is smaller than center; only corners are drawn, all scaled to fit.
The second <ahref='#SkCanvas_drawImageLattice_image'>image</a> equals the size of center; only corners are drawn without scaling.
<tdstyle='text-align: left; border: 2px solid #dddddd; padding: 8px; '>draws text with arrays of positions and <ahref='SkPaint_Reference#Paint'>Paint</a></td>
<ahref='#Draw'>Draw</a><ahref='#SkCanvas_drawText_text'>text</a>, with origin at (<ahref='#SkCanvas_drawText_x'>x</a>, <ahref='#SkCanvas_drawText_y'>y</a>), using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawText_paint'>paint</a>.
<ahref='#SkCanvas_drawText_text'>text</a> meaning depends on <ahref='SkPaint_Reference#Text_Encoding'>Paint Text Encoding</a>; by default, <ahref='#SkCanvas_drawText_text'>text</a> is encoded as
<ahref='#SkCanvas_drawText_x'>x</a> and <ahref='#SkCanvas_drawText_y'>y</a> meaning depends on <ahref='SkPaint_Reference#Text_Align'>Paint Text Align</a> and <ahref='SkPaint_Reference#Vertical_Text'>Paint Vertical Text</a>; by default
<ahref='#SkCanvas_drawText_text'>text</a> draws left to right, positioning the first glyph left side bearing at <ahref='#SkCanvas_drawText_x'>x</a>
and its baseline at <ahref='#SkCanvas_drawText_y'>y</a>. <ahref='undocumented#Text'>Text</a> size is affected by <ahref='#Matrix'>Matrix</a> and <ahref='SkPaint_Reference#Text_Size'>Paint Text Size</a>.
All elements of <ahref='#SkCanvas_drawText_paint'>paint</a>: <ahref='undocumented#Path_Effect'>Path Effect</a>, <ahref='undocumented#Mask_Filter'>Mask Filter</a>, <ahref='undocumented#Shader'>Shader</a>,
<ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>; apply to <ahref='#SkCanvas_drawText_text'>text</a>. By default, draws
filled 12 point black <ahref='undocumented#Glyph'>Glyphs</a>.
<div><fiddle-embedname="55f5e59350622c5e2834d1c85789f732"><div>The same <ahref='#SkCanvas_drawText_text'>text</a> is drawn varying <ahref='SkPaint_Reference#Text_Size'>Paint Text Size</a> and varying
Draws null terminated <ahref='#SkCanvas_drawString_string'>string</a>, with origin at (<ahref='#SkCanvas_drawString_x'>x</a>, <ahref='#SkCanvas_drawString_y'>y</a>), using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and
<ahref='#SkCanvas_drawString_string'>string</a> meaning depends on <ahref='SkPaint_Reference#Text_Encoding'>Paint Text Encoding</a>; by default, strings are encoded
as UTF-8. Other values of <ahref='SkPaint_Reference#Text_Encoding'>Paint Text Encoding</a> are unlikely to produce the desired
results, since zero bytes may be embedded in the <ahref='#SkCanvas_drawString_string'>string</a>.
<ahref='#SkCanvas_drawString_x'>x</a> and <ahref='#SkCanvas_drawString_y'>y</a> meaning depends on <ahref='SkPaint_Reference#Text_Align'>Paint Text Align</a> and <ahref='SkPaint_Reference#Vertical_Text'>Paint Vertical Text</a>; by default
<ahref='#SkCanvas_drawString_string'>string</a> draws left to right, positioning the first glyph left side bearing at <ahref='#SkCanvas_drawString_x'>x</a>
and its baseline at <ahref='#SkCanvas_drawString_y'>y</a>. <ahref='undocumented#Text'>Text</a> size is affected by <ahref='#Matrix'>Matrix</a> and <ahref='SkPaint_Reference#Text_Size'>Paint Text Size</a>.
All elements of <ahref='#SkCanvas_drawString_paint'>paint</a>: <ahref='undocumented#Path_Effect'>Path Effect</a>, <ahref='undocumented#Mask_Filter'>Mask Filter</a>, <ahref='undocumented#Shader'>Shader</a>,
<ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>; apply to text. By default, draws
filled 12 point black <ahref='undocumented#Glyph'>Glyphs</a>.
<ahref='#Draw'>Draw</a> null terminated <ahref='#SkCanvas_drawString_2_string'>string</a>, with origin at (<ahref='#SkCanvas_drawString_2_x'>x</a>, <ahref='#SkCanvas_drawString_2_y'>y</a>), using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and
<ahref='#SkCanvas_drawString_2_string'>string</a> meaning depends on <ahref='SkPaint_Reference#Text_Encoding'>Paint Text Encoding</a>; by default, strings are encoded
as UTF-8. Other values of <ahref='SkPaint_Reference#Text_Encoding'>Paint Text Encoding</a> are unlikely to produce the desired
results, since zero bytes may be embedded in the <ahref='#SkCanvas_drawString_2_string'>string</a>.
<ahref='#SkCanvas_drawString_2_x'>x</a> and <ahref='#SkCanvas_drawString_2_y'>y</a> meaning depends on <ahref='SkPaint_Reference#Text_Align'>Paint Text Align</a> and <ahref='SkPaint_Reference#Vertical_Text'>Paint Vertical Text</a>; by default
<ahref='#SkCanvas_drawString_2_string'>string</a> draws left to right, positioning the first glyph left side bearing at <ahref='#SkCanvas_drawString_2_x'>x</a>
and its baseline at <ahref='#SkCanvas_drawString_2_y'>y</a>. <ahref='undocumented#Text'>Text</a> size is affected by <ahref='#Matrix'>Matrix</a> and <ahref='SkPaint_Reference#Text_Size'>Paint Text Size</a>.
All elements of <ahref='#SkCanvas_drawString_2_paint'>paint</a>: <ahref='undocumented#Path_Effect'>Path Effect</a>, <ahref='undocumented#Mask_Filter'>Mask Filter</a>, <ahref='undocumented#Shader'>Shader</a>,
<ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>; apply to text. By default, draws
filled 12 point black <ahref='undocumented#Glyph'>Glyphs</a>.
<ahref='#Draw'>Draw</a> each glyph in <ahref='#SkCanvas_drawPosText_text'>text</a> with the origin in <ahref='#SkCanvas_drawPosText_pos'>pos</a> array, using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and
<ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawPosText_paint'>paint</a>. The number of entries in <ahref='#SkCanvas_drawPosText_pos'>pos</a> array must match the number of <ahref='undocumented#Glyph'>Glyphs</a>
described by <ahref='#SkCanvas_drawPosText_byteLength'>byteLength</a> of <ahref='#SkCanvas_drawPosText_text'>text</a>.
<ahref='#SkCanvas_drawPosText_text'>text</a> meaning depends on <ahref='SkPaint_Reference#Text_Encoding'>Paint Text Encoding</a>; by default, <ahref='#SkCanvas_drawPosText_text'>text</a> is encoded as
UTF-8. <ahref='#SkCanvas_drawPosText_pos'>pos</a> elements' meaning depends on <ahref='SkPaint_Reference#Text_Align'>Paint Text Align</a> and <ahref='SkPaint_Reference#Vertical_Text'>Paint Vertical Text</a>;
All elements of <ahref='#SkCanvas_drawPosText_paint'>paint</a>: <ahref='undocumented#Path_Effect'>Path Effect</a>, <ahref='undocumented#Mask_Filter'>Mask Filter</a>, <ahref='undocumented#Shader'>Shader</a>,
<ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>; apply to <ahref='#SkCanvas_drawPosText_text'>text</a>. By default, draws
filled 12 point black <ahref='undocumented#Glyph'>Glyphs</a>.
<ahref='#Draw'>Draw</a> each glyph in <ahref='#SkCanvas_drawPosTextH_text'>text</a> with its (x, y) origin composed from <ahref='#SkCanvas_drawPosTextH_xpos'>xpos</a> array and
<ahref='#SkCanvas_drawPosTextH_constY'>constY</a>, using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawPosTextH_paint'>paint</a>. The number of entries in <ahref='#SkCanvas_drawPosTextH_xpos'>xpos</a> array
must match the number of <ahref='undocumented#Glyph'>Glyphs</a> described by <ahref='#SkCanvas_drawPosTextH_byteLength'>byteLength</a> of <ahref='#SkCanvas_drawPosTextH_text'>text</a>.
<ahref='#SkCanvas_drawPosTextH_text'>text</a> meaning depends on <ahref='SkPaint_Reference#Text_Encoding'>Paint Text Encoding</a>; by default, <ahref='#SkCanvas_drawPosTextH_text'>text</a> is encoded as
UTF-8. <ahref='#SkCanvas_drawPosTextH_xpos'>xpos</a> elements' meaning depends on <ahref='SkPaint_Reference#Text_Align'>Paint Text Align</a> and <ahref='SkPaint_Reference#Vertical_Text'>Paint Vertical Text</a>;
by default each glyph left side bearing is positioned at an <ahref='#SkCanvas_drawPosTextH_xpos'>xpos</a> element and
its baseline is positioned at <ahref='#SkCanvas_drawPosTextH_constY'>constY</a>. <ahref='undocumented#Text'>Text</a> size is affected by <ahref='#Matrix'>Matrix</a> and
<ahref='SkPaint_Reference#Text_Size'>Paint Text Size</a>.
All elements of <ahref='#SkCanvas_drawPosTextH_paint'>paint</a>: <ahref='undocumented#Path_Effect'>Path Effect</a>, <ahref='undocumented#Mask_Filter'>Mask Filter</a>, <ahref='undocumented#Shader'>Shader</a>,
<ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>; apply to <ahref='#SkCanvas_drawPosTextH_text'>text</a>. By default, draws
filled 12 point black <ahref='undocumented#Glyph'>Glyphs</a>.
<ahref='#Draw'>Draw</a><ahref='#SkCanvas_drawTextOnPathHV_text'>text</a> on <ahref='SkPath_Reference#Path'>Path</a><ahref='#SkCanvas_drawTextOnPathHV_path'>path</a>, using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawTextOnPathHV_paint'>paint</a>.
Origin of <ahref='#SkCanvas_drawTextOnPathHV_text'>text</a> is at distance <ahref='#SkCanvas_drawTextOnPathHV_hOffset'>hOffset</a> along the <ahref='#SkCanvas_drawTextOnPathHV_path'>path</a>, offset by a perpendicular
vector of length <ahref='#SkCanvas_drawTextOnPathHV_vOffset'>vOffset</a>. If the <ahref='#SkCanvas_drawTextOnPathHV_path'>path</a> section corresponding the glyph advance is
mapped to projected points parallel to the <ahref='#SkCanvas_drawTextOnPathHV_path'>path</a>. If the <ahref='#SkCanvas_drawTextOnPathHV_text'>text</a> advance is larger
than the <ahref='#SkCanvas_drawTextOnPathHV_path'>path</a> length, the excess <ahref='#SkCanvas_drawTextOnPathHV_text'>text</a> is clipped.
<ahref='#SkCanvas_drawTextOnPathHV_text'>text</a> meaning depends on <ahref='SkPaint_Reference#Text_Encoding'>Paint Text Encoding</a>; by default, <ahref='#SkCanvas_drawTextOnPathHV_text'>text</a> is encoded as
UTF-8. Origin meaning depends on <ahref='SkPaint_Reference#Text_Align'>Paint Text Align</a> and <ahref='SkPaint_Reference#Vertical_Text'>Paint Vertical Text</a>; by
default <ahref='#SkCanvas_drawTextOnPathHV_text'>text</a> positions the first glyph left side bearing at origin x and its
baseline at origin y. <ahref='undocumented#Text'>Text</a> size is affected by <ahref='#Matrix'>Matrix</a> and <ahref='SkPaint_Reference#Text_Size'>Paint Text Size</a>.
All elements of <ahref='#SkCanvas_drawTextOnPathHV_paint'>paint</a>: <ahref='undocumented#Path_Effect'>Path Effect</a>, <ahref='undocumented#Mask_Filter'>Mask Filter</a>, <ahref='undocumented#Shader'>Shader</a>,
<ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>; apply to <ahref='#SkCanvas_drawTextOnPathHV_text'>text</a>. By default, draws
filled 12 point black <ahref='undocumented#Glyph'>Glyphs</a>.
<td>offset of <ahref='#SkCanvas_drawTextOnPathHV_text'>text</a> above (if negative) or below (if positive) the <ahref='#SkCanvas_drawTextOnPathHV_path'>path</a></td>
<ahref='#Draw'>Draw</a><ahref='#SkCanvas_drawTextOnPath_text'>text</a> on <ahref='SkPath_Reference#Path'>Path</a><ahref='#SkCanvas_drawTextOnPath_path'>path</a>, using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawTextOnPath_paint'>paint</a>.
Origin of <ahref='#SkCanvas_drawTextOnPath_text'>text</a> is at beginning of <ahref='#SkCanvas_drawTextOnPath_path'>path</a> offset by <ahref='#SkCanvas_drawTextOnPath_matrix'>matrix</a>, if not nullptr.
<ahref='#SkCanvas_drawTextOnPath_matrix'>matrix</a> also transforms <ahref='#SkCanvas_drawTextOnPath_text'>text</a> before <ahref='#SkCanvas_drawTextOnPath_text'>text</a> is mapped to <ahref='#SkCanvas_drawTextOnPath_path'>path</a>. If the <ahref='#SkCanvas_drawTextOnPath_path'>path</a> section
corresponding the glyph advance is curved, the glyph is drawn curved to match;
control points in the glyph are mapped to projected points parallel to the <ahref='#SkCanvas_drawTextOnPath_path'>path</a>.
If the <ahref='#SkCanvas_drawTextOnPath_text'>text</a> advance is larger than the <ahref='#SkCanvas_drawTextOnPath_path'>path</a> length, the excess <ahref='#SkCanvas_drawTextOnPath_text'>text</a> is clipped.
<ahref='#SkCanvas_drawTextOnPath_text'>text</a> meaning depends on <ahref='SkPaint_Reference#Text_Encoding'>Paint Text Encoding</a>; by default, <ahref='#SkCanvas_drawTextOnPath_text'>text</a> is encoded as
UTF-8. Origin meaning depends on <ahref='SkPaint_Reference#Text_Align'>Paint Text Align</a> and <ahref='SkPaint_Reference#Vertical_Text'>Paint Vertical Text</a>; by
default <ahref='#SkCanvas_drawTextOnPath_text'>text</a> positions the first glyph left side bearing at origin x and its
baseline at origin y. <ahref='undocumented#Text'>Text</a> size is affected by <ahref='#SkCanvas_drawTextOnPath_matrix'>matrix</a> parameter, <ahref='#Matrix'>Canvas Matrix</a>,
and <ahref='SkPaint_Reference#Text_Size'>Paint Text Size</a>.
All elements of <ahref='#SkCanvas_drawTextOnPath_paint'>paint</a>: <ahref='undocumented#Path_Effect'>Path Effect</a>, <ahref='undocumented#Mask_Filter'>Mask Filter</a>, <ahref='undocumented#Shader'>Shader</a>,
<ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>; apply to <ahref='#SkCanvas_drawTextOnPath_text'>text</a>. By default, draws
filled 12 point black <ahref='undocumented#Glyph'>Glyphs</a>. <ahref='#Canvas'>Canvas</a><ahref='#Matrix'>Matrix</a> does effect <ahref='#SkCanvas_drawTextOnPath_paint'>paint</a><ahref='undocumented#Shader'>Shader</a>, but
<ahref='#SkCanvas_drawTextOnPath_matrix'>matrix</a> parameter does not.
<ahref='#Draw'>Draw</a><ahref='#SkCanvas_drawTextRSXform_text'>text</a>, transforming each glyph by the corresponding <ahref='undocumented#SkRSXform'>SkRSXform</a>,
using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawTextRSXform_paint'>paint</a>.
Optional <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawTextRSXform_cullRect'>cullRect</a> is a conservative bounds of <ahref='#SkCanvas_drawTextRSXform_text'>text</a>, taking into account
<ahref='undocumented#RSXform'>RSXform</a> and <ahref='#SkCanvas_drawTextRSXform_paint'>paint</a>. If <ahref='#SkCanvas_drawTextRSXform_cullRect'>cullRect</a> is outside of <ahref='#Clip'>Clip</a>, canvas can skip drawing.
All elements of <ahref='#SkCanvas_drawTextRSXform_paint'>paint</a>: <ahref='undocumented#Path_Effect'>Path Effect</a>, <ahref='undocumented#Mask_Filter'>Mask Filter</a>, <ahref='undocumented#Shader'>Shader</a>,
<ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>; apply to <ahref='#SkCanvas_drawTextRSXform_text'>text</a>. By default, draws
filled 12 point black <ahref='undocumented#Glyph'>Glyphs</a>.
<ahref='#Draw'>Draw</a><ahref='undocumented#Text_Blob'>Text Blob</a><ahref='#SkCanvas_drawTextBlob_blob'>blob</a> at (<ahref='#SkCanvas_drawTextBlob_x'>x</a>, <ahref='#SkCanvas_drawTextBlob_y'>y</a>), using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawTextBlob_paint'>paint</a>.
<ahref='#SkCanvas_drawTextBlob_blob'>blob</a> contains <ahref='undocumented#Glyph'>Glyphs</a>, their positions, and <ahref='#SkCanvas_drawTextBlob_paint'>paint</a> attributes specific to text:
<ahref='undocumented#Typeface'>Typeface</a>, <ahref='SkPaint_Reference#Text_Size'>Paint Text Size</a>, <ahref='SkPaint_Reference#Text_Scale_X'>Paint Text Scale X</a>, <ahref='SkPaint_Reference#Text_Skew_X'>Paint Text Skew X</a>,
<ahref='SkPaint_Reference#Text_Align'>Paint Text Align</a>, <ahref='SkPaint_Reference#Hinting'>Paint Hinting</a>, Anti-alias, <ahref='SkPaint_Reference#Fake_Bold'>Paint Fake Bold</a>,
<ahref='SkPaint_Reference#Text_Encoding'>Paint Text Encoding</a> must be set to <ahref='SkPaint_Reference#SkPaint_kGlyphID_TextEncoding'>SkPaint::kGlyphID TextEncoding</a>.
Elements of <ahref='#SkCanvas_drawTextBlob_paint'>paint</a>: <ahref='undocumented#Path_Effect'>Path Effect</a>, <ahref='undocumented#Mask_Filter'>Mask Filter</a>, <ahref='undocumented#Shader'>Shader</a>, <ahref='undocumented#Color_Filter'>Color Filter</a>,
<ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>; apply to <ahref='#SkCanvas_drawTextBlob_blob'>blob</a>.
<ahref='#Draw'>Draw</a><ahref='undocumented#Text_Blob'>Text Blob</a><ahref='#SkCanvas_drawTextBlob_2_blob'>blob</a> at (<ahref='#SkCanvas_drawTextBlob_2_x'>x</a>, <ahref='#SkCanvas_drawTextBlob_2_y'>y</a>), using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawTextBlob_2_paint'>paint</a>.
<ahref='#SkCanvas_drawTextBlob_2_blob'>blob</a> contains <ahref='undocumented#Glyph'>Glyphs</a>, their positions, and <ahref='#SkCanvas_drawTextBlob_2_paint'>paint</a> attributes specific to text:
<ahref='undocumented#Typeface'>Typeface</a>, <ahref='SkPaint_Reference#Text_Size'>Paint Text Size</a>, <ahref='SkPaint_Reference#Text_Scale_X'>Paint Text Scale X</a>, <ahref='SkPaint_Reference#Text_Skew_X'>Paint Text Skew X</a>,
<ahref='SkPaint_Reference#Text_Align'>Paint Text Align</a>, <ahref='SkPaint_Reference#Hinting'>Paint Hinting</a>, Anti-alias, <ahref='SkPaint_Reference#Fake_Bold'>Paint Fake Bold</a>,
<ahref='SkPaint_Reference#Text_Encoding'>Paint Text Encoding</a> must be set to <ahref='SkPaint_Reference#SkPaint_kGlyphID_TextEncoding'>SkPaint::kGlyphID TextEncoding</a>.
Elements of <ahref='#SkCanvas_drawTextBlob_2_paint'>paint</a>: <ahref='undocumented#Path_Effect'>Path Effect</a>, <ahref='undocumented#Mask_Filter'>Mask Filter</a>, <ahref='undocumented#Shader'>Shader</a>, <ahref='undocumented#Color_Filter'>Color Filter</a>,
<ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Draw_Looper'>Draw Looper</a>; apply to <ahref='#SkCanvas_drawTextBlob_2_blob'>blob</a>.
<div><fiddle-embedname="af4c69fbbd165c8b0eb0c9bd49ccbd8d"><div><ahref='SkPaint_Reference#Paint'>Paint</a> attributes unrelated to text, like color, have no effect on <ahref='#SkCanvas_drawTextBlob_2_paint'>paint</a> in allocated <ahref='undocumented#Text_Blob'>Text Blob</a>.
<ahref='SkPaint_Reference#Paint'>Paint</a> attributes related to text, like text size, have no effect on <ahref='#SkCanvas_drawTextBlob_2_paint'>paint</a> passed to <ahref='#SkCanvas_drawTextBlob'>drawTextBlob</a>.
<ahref='#Draw'>Draw</a><ahref='undocumented#Picture'>Picture</a><ahref='#SkCanvas_drawPicture_picture'>picture</a>, using <ahref='#Clip'>Clip</a> and <ahref='#Matrix'>Matrix</a>.
<ahref='#Clip'>Clip</a> and <ahref='#Matrix'>Matrix</a> are unchanged by <ahref='#SkCanvas_drawPicture_picture'>picture</a> contents, as if
<ahref='#SkCanvas_save'>save</a> was called before and <ahref='#SkCanvas_restore'>restore</a> was called after <ahref='#SkCanvas_drawPicture'>drawPicture</a>.
<ahref='#Draw'>Draw</a><ahref='undocumented#Picture'>Picture</a><ahref='#SkCanvas_drawPicture_2_picture'>picture</a>, using <ahref='#Clip'>Clip</a> and <ahref='#Matrix'>Matrix</a>.
<ahref='#Clip'>Clip</a> and <ahref='#Matrix'>Matrix</a> are unchanged by <ahref='#SkCanvas_drawPicture_2_picture'>picture</a> contents, as if
<ahref='#SkCanvas_save'>save</a> was called before and <ahref='#SkCanvas_restore'>restore</a> was called after <ahref='#SkCanvas_drawPicture'>drawPicture</a>.
<ahref='#Draw'>Draw</a><ahref='undocumented#Picture'>Picture</a><ahref='#SkCanvas_drawPicture_3_picture'>picture</a>, using <ahref='#Clip'>Clip</a> and <ahref='#Matrix'>Matrix</a>; transforming <ahref='#SkCanvas_drawPicture_3_picture'>picture</a> with
<ahref='#Matrix'>Matrix</a><ahref='#SkCanvas_drawPicture_3_matrix'>matrix</a>, if provided; and use <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawPicture_3_paint'>paint</a><ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Color_Filter'>Color Filter</a>,
<ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Blend_Mode'>Blend Mode</a>, if provided.
<ahref='#SkCanvas_drawPicture_3_matrix'>matrix</a> transformation is equivalent to: <ahref='#SkCanvas_save'>save</a>, <ahref='#SkCanvas_concat'>concat</a>, <ahref='#SkCanvas_drawPicture'>drawPicture</a>, <ahref='#SkCanvas_restore'>restore</a>.
<ahref='#SkCanvas_drawPicture_3_paint'>paint</a> use is equivalent to: <ahref='#SkCanvas_saveLayer'>saveLayer</a>, <ahref='#SkCanvas_drawPicture'>drawPicture</a>, <ahref='#SkCanvas_restore'>restore</a>.
<ahref='#Draw'>Draw</a><ahref='undocumented#Picture'>Picture</a><ahref='#SkCanvas_drawPicture_4_picture'>picture</a>, using <ahref='#Clip'>Clip</a> and <ahref='#Matrix'>Matrix</a>; transforming <ahref='#SkCanvas_drawPicture_4_picture'>picture</a> with
<ahref='#Matrix'>Matrix</a><ahref='#SkCanvas_drawPicture_4_matrix'>matrix</a>, if provided; and use <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawPicture_4_paint'>paint</a><ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Color_Filter'>Color Filter</a>,
<ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Blend_Mode'>Blend Mode</a>, if provided.
<ahref='#SkCanvas_drawPicture_4_matrix'>matrix</a> transformation is equivalent to: <ahref='#SkCanvas_save'>save</a>, <ahref='#SkCanvas_concat'>concat</a>, <ahref='#SkCanvas_drawPicture'>drawPicture</a>, <ahref='#SkCanvas_restore'>restore</a>.
<ahref='#SkCanvas_drawPicture_4_paint'>paint</a> use is equivalent to: <ahref='#SkCanvas_saveLayer'>saveLayer</a>, <ahref='#SkCanvas_drawPicture'>drawPicture</a>, <ahref='#SkCanvas_restore'>restore</a>.
<ahref='#Draw'>Draw</a><ahref='undocumented#Vertices'>Vertices</a><ahref='#SkCanvas_drawVertices_vertices'>vertices</a>, a triangle mesh, using <ahref='#Clip'>Clip</a> and <ahref='#Matrix'>Matrix</a>.
If <ahref='undocumented#Texs'>Vertices Texs</a> and <ahref='undocumented#Colors'>Vertices Colors</a> are defined in <ahref='#SkCanvas_drawVertices_vertices'>vertices</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawVertices_paint'>paint</a>
contains <ahref='undocumented#Shader'>Shader</a>, <ahref='undocumented#Blend_Mode'>Blend Mode</a><ahref='#SkCanvas_drawVertices_mode'>mode</a> combines <ahref='undocumented#Colors'>Vertices Colors</a> with <ahref='undocumented#Shader'>Shader</a>.
<ahref='#Draw'>Draw</a><ahref='undocumented#Vertices'>Vertices</a><ahref='#SkCanvas_drawVertices_2_vertices'>vertices</a>, a triangle mesh, using <ahref='#Clip'>Clip</a> and <ahref='#Matrix'>Matrix</a>.
If <ahref='undocumented#Texs'>Vertices Texs</a> and <ahref='undocumented#Colors'>Vertices Colors</a> are defined in <ahref='#SkCanvas_drawVertices_2_vertices'>vertices</a>, and <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawVertices_2_paint'>paint</a>
contains <ahref='undocumented#Shader'>Shader</a>, <ahref='undocumented#Blend_Mode'>Blend Mode</a><ahref='#SkCanvas_drawVertices_2_mode'>mode</a> combines <ahref='undocumented#Colors'>Vertices Colors</a> with <ahref='undocumented#Shader'>Shader</a>.
Coons_Patch uses <ahref='#Clip'>Clip</a> and <ahref='#Matrix'>Matrix</a>, <ahref='#SkCanvas_drawPatch_paint'>paint</a><ahref='undocumented#Shader'>Shader</a>, <ahref='undocumented#Color_Filter'>Color Filter</a>,
<ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Blend_Mode'>Blend Mode</a>. If <ahref='undocumented#Shader'>Shader</a> is provided it is treated
as Coons_Patch texture; <ahref='undocumented#Blend_Mode'>Blend Mode</a><ahref='#SkCanvas_drawPatch_mode'>mode</a> combines <ahref='SkColor_Reference#Color'>Color</a><ahref='#SkCanvas_drawPatch_colors'>colors</a> and <ahref='undocumented#Shader'>Shader</a> if
<ahref='SkPoint_Reference#Point'>Point</a> array <ahref='#SkCanvas_drawPatch_cubics'>cubics</a> specifies four <ahref='SkPath_Reference#Cubic'>Cubics</a> starting at the top-left corner,
in clockwise order, sharing every fourth point. The last <ahref='SkPath_Reference#Cubic'>Cubic</a> ends at the
If <ahref='#SkCanvas_drawPatch_paint'>paint</a> contains <ahref='undocumented#Shader'>Shader</a>, <ahref='SkPoint_Reference#Point'>Point</a> array <ahref='#SkCanvas_drawPatch_texCoords'>texCoords</a> maps <ahref='undocumented#Shader'>Shader</a> as texture to
<td><ahref='undocumented#Blend_Mode'>Blend Mode</a> for <ahref='#SkCanvas_drawPatch_colors'>colors</a>, and for <ahref='undocumented#Shader'>Shader</a> if <ahref='#SkCanvas_drawPatch_paint'>paint</a> has one</td>
<td><ahref='undocumented#Shader'>Shader</a>, <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Blend_Mode'>Blend Mode</a>, used to draw</td>
Draws <ahref='SkPath_Reference#Cubic'>Cubic</a> Coons_Patch: the interpolation of four <ahref='#SkCanvas_drawPatch_2_cubics'>cubics</a> with shared corners,
Coons_Patch uses <ahref='#Clip'>Clip</a> and <ahref='#Matrix'>Matrix</a>, <ahref='#SkCanvas_drawPatch_2_paint'>paint</a><ahref='undocumented#Shader'>Shader</a>, <ahref='undocumented#Color_Filter'>Color Filter</a>,
<ahref='SkColor_Reference#Alpha'>Color Alpha</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, and <ahref='undocumented#Blend_Mode'>Blend Mode</a>. If <ahref='undocumented#Shader'>Shader</a> is provided it is treated
as Coons_Patch texture; <ahref='undocumented#Blend_Mode'>Blend Mode</a> mode combines <ahref='SkColor_Reference#Color'>Color</a><ahref='#SkCanvas_drawPatch_2_colors'>colors</a> and <ahref='undocumented#Shader'>Shader</a> if
<ahref='SkPoint_Reference#Point'>Point</a> array <ahref='#SkCanvas_drawPatch_2_cubics'>cubics</a> specifies four <ahref='SkPath_Reference#Cubic'>Cubics</a> starting at the top-left corner,
in clockwise order, sharing every fourth point. The last <ahref='SkPath_Reference#Cubic'>Cubic</a> ends at the
<ahref='SkColor_Reference#Color'>Color</a> array color associates <ahref='#SkCanvas_drawPatch_2_colors'>colors</a> with corners in top-left, top-right,
If <ahref='#SkCanvas_drawPatch_2_paint'>paint</a> contains <ahref='undocumented#Shader'>Shader</a>, <ahref='SkPoint_Reference#Point'>Point</a> array <ahref='#SkCanvas_drawPatch_2_texCoords'>texCoords</a> maps <ahref='undocumented#Shader'>Shader</a> as texture to
<td><ahref='undocumented#Shader'>Shader</a>, <ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Blend_Mode'>Blend Mode</a>, used to draw</td>
<ahref='#Draw'>Draw</a> a set of sprites from <ahref='#SkCanvas_drawAtlas_atlas'>atlas</a>, using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawAtlas_paint'>paint</a>.
to draw, if present. For each entry in the array, <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawAtlas_tex'>tex</a> locates sprite in
<ahref='#SkCanvas_drawAtlas_atlas'>atlas</a>, and <ahref='undocumented#RSXform'>RSXform</a><ahref='#SkCanvas_drawAtlas_xform'>xform</a> transforms it into destination space.
<ahref='#SkCanvas_drawAtlas_xform'>xform</a>, text, and <ahref='#SkCanvas_drawAtlas_colors'>colors</a> if present, must contain <ahref='#SkCanvas_drawAtlas_count'>count</a> entries.
Optional <ahref='#SkCanvas_drawAtlas_colors'>colors</a> are applied for each sprite using <ahref='undocumented#Blend_Mode'>Blend Mode</a>.
Optional <ahref='#SkCanvas_drawAtlas_cullRect'>cullRect</a> is a conservative bounds of all transformed sprites.
If <ahref='#SkCanvas_drawAtlas_cullRect'>cullRect</a> is outside of <ahref='#Clip'>Clip</a>, canvas can skip drawing.
<td><ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, <ahref='undocumented#Blend_Mode'>Blend Mode</a>, and so on; may be nullptr</td>
<ahref='#Draw'>Draw</a> a set of sprites from <ahref='#SkCanvas_drawAtlas_2_atlas'>atlas</a>, using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawAtlas_2_paint'>paint</a>.
to draw, if present. For each entry in the array, <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawAtlas_2_tex'>tex</a> locates sprite in
<ahref='#SkCanvas_drawAtlas_2_atlas'>atlas</a>, and <ahref='undocumented#RSXform'>RSXform</a><ahref='#SkCanvas_drawAtlas_2_xform'>xform</a> transforms it into destination space.
<ahref='#SkCanvas_drawAtlas_2_xform'>xform</a>, text, and <ahref='#SkCanvas_drawAtlas_2_colors'>colors</a> if present, must contain <ahref='#SkCanvas_drawAtlas_2_count'>count</a> entries.
Optional <ahref='#SkCanvas_drawAtlas_2_colors'>colors</a> is applied for each sprite using <ahref='undocumented#Blend_Mode'>Blend Mode</a>.
Optional <ahref='#SkCanvas_drawAtlas_2_cullRect'>cullRect</a> is a conservative bounds of all transformed sprites.
If <ahref='#SkCanvas_drawAtlas_2_cullRect'>cullRect</a> is outside of <ahref='#Clip'>Clip</a>, canvas can skip drawing.
<td><ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, <ahref='undocumented#Blend_Mode'>Blend Mode</a>, and so on; may be nullptr</td>
<ahref='#Draw'>Draw</a> a set of sprites from <ahref='#SkCanvas_drawAtlas_3_atlas'>atlas</a>, using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawAtlas_3_paint'>paint</a>.
to draw, if present. For each entry in the array, <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawAtlas_3_tex'>tex</a> locates sprite in
<ahref='#SkCanvas_drawAtlas_3_atlas'>atlas</a>, and <ahref='undocumented#RSXform'>RSXform</a><ahref='#SkCanvas_drawAtlas_3_xform'>xform</a> transforms it into destination space.
<td><ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, <ahref='undocumented#Blend_Mode'>Blend Mode</a>, and so on; may be nullptr</td>
<ahref='#Draw'>Draw</a> a set of sprites from <ahref='#SkCanvas_drawAtlas_4_atlas'>atlas</a>, using <ahref='#Clip'>Clip</a>, <ahref='#Matrix'>Matrix</a>, and optional <ahref='SkPaint_Reference#Paint'>Paint</a><ahref='#SkCanvas_drawAtlas_4_paint'>paint</a>.
to draw, if present. For each entry in the array, <ahref='SkRect_Reference#Rect'>Rect</a><ahref='#SkCanvas_drawAtlas_4_tex'>tex</a> locates sprite in
<ahref='#SkCanvas_drawAtlas_4_atlas'>atlas</a>, and <ahref='undocumented#RSXform'>RSXform</a><ahref='#SkCanvas_drawAtlas_4_xform'>xform</a> transforms it into destination space.
<td><ahref='undocumented#Color_Filter'>Color Filter</a>, <ahref='undocumented#Image_Filter'>Image Filter</a>, <ahref='undocumented#Blend_Mode'>Blend Mode</a>, and so on; may be nullptr</td>
<ahref='#Draw'>Draw</a><ahref='undocumented#Drawable'>Drawable</a><ahref='#SkCanvas_drawDrawable_drawable'>drawable</a> using <ahref='#Clip'>Clip</a> and <ahref='#Matrix'>Matrix</a>, concatenated with
<ahref='#Draw'>Draw</a><ahref='undocumented#Drawable'>Drawable</a><ahref='#SkCanvas_drawDrawable_2_drawable'>drawable</a> using <ahref='#Clip'>Clip</a> and <ahref='#Matrix'>Matrix</a>, offset by (<ahref='#SkCanvas_drawDrawable_2_x'>x</a>, <ahref='#SkCanvas_drawDrawable_2_y'>y</a>).
Associate <ahref='SkRect_Reference#Rect'>Rect</a> on <ahref='#Canvas'>Canvas</a> with an annotation; a <ahref='#SkCanvas_drawAnnotation_key'>key</a>-<ahref='#SkCanvas_drawAnnotation_value'>value</a> pair, where the <ahref='#SkCanvas_drawAnnotation_key'>key</a> is
a null-terminated utf8 string, and optional <ahref='#SkCanvas_drawAnnotation_value'>value</a> is stored as <ahref='undocumented#Data'>Data</a>.
Associate <ahref='SkRect_Reference#Rect'>Rect</a> on <ahref='#Canvas'>Canvas</a> when an annotation; a <ahref='#SkCanvas_drawAnnotation_2_key'>key</a>-<ahref='#SkCanvas_drawAnnotation_2_value'>value</a> pair, where the <ahref='#SkCanvas_drawAnnotation_2_key'>key</a> is
a null-terminated utf8 string, and optional <ahref='#SkCanvas_drawAnnotation_2_value'>value</a> is stored as <ahref='undocumented#Data'>Data</a>.