Home | History | Annotate | Download | only in api
      1 SkCanvas Reference
      2 ===
      3 
      4 # <a name="Canvas"></a> Canvas
      5 
      6 ## <a name="Overview"></a> Overview
      7 
      8 ## <a name="Subtopics"></a> Subtopics
      9 
     10 | name | description |
     11 | --- | --- |
     12 | <a href="#Classes_and_Structs">Classes and Structs</a> | embedded struct and class members |
     13 | <a href="#Constants">Constants</a> | enum and enum class, const values |
     14 | <a href="#Constructors">Constructors</a> | functions that construct <a href="SkCanvas_Reference#SkCanvas">SkCanvas</a> |
     15 | <a href="#Member_Functions">Member Functions</a> | static functions and member methods |
     16 | <a href="#Related_Functions">Related Functions</a> | similar methods grouped together |
     17 
     18 # <a name="SkCanvas"></a> Class SkCanvas
     19 <a href="#Canvas">Canvas</a> provides an interface for drawing, and how the drawing is clipped and transformed.
     20 <a href="#Canvas">Canvas</a> contains a stack of <a href="#Matrix">Matrix</a> and <a href="#Clip">Clip</a> values.
     21 
     22 <a href="#Canvas">Canvas</a> and <a href="SkPaint_Reference#Paint">Paint</a> together provide the state to draw into <a href="SkSurface_Reference#Surface">Surface</a> or <a href="undocumented#Device">Device</a>.
     23 Each <a href="#Canvas">Canvas</a> draw call transforms the geometry of the object by the concatenation of all
     24 <a href="#Matrix">Matrix</a> values in the stack. The transformed geometry is clipped by the intersection
     25 of all of <a href="#Clip">Clip</a> values in the stack. The <a href="#Canvas">Canvas</a> draw calls use <a href="SkPaint_Reference#Paint">Paint</a> to supply drawing
     26 state such as <a href="undocumented#Color">Color</a>, <a href="undocumented#Typeface">Typeface</a>, text size, stroke width, <a href="undocumented#Shader">Shader</a> and so on.
     27 
     28 To draw to a pixel-based destination, create <a href="undocumented#Raster_Surface">Raster Surface</a> or <a href="undocumented#GPU_Surface">GPU Surface</a>.
     29 Request <a href="#Canvas">Canvas</a> from <a href="SkSurface_Reference#Surface">Surface</a> to obtain the interface to draw.
     30 <a href="#Canvas">Canvas</a> generated by <a href="undocumented#Raster_Surface">Raster Surface</a> draws to memory visible to the CPU.
     31 <a href="#Canvas">Canvas</a> generated by <a href="undocumented#GPU_Surface">GPU Surface</a> uses Vulkan or OpenGL to draw to the GPU.
     32 
     33 To draw to a document, obtain <a href="#Canvas">Canvas</a> from <a href="#Canvas">SVG Canvas</a>, <a href="#PDF">Document PDF</a>, or <a href="#Recorder">Picture Recorder</a>.
     34 <a href="undocumented#Document">Document</a> based <a href="#Canvas">Canvas</a> and other <a href="#Canvas">Canvas</a> Subclasses reference <a href="undocumented#Device">Device</a> describing the
     35 destination.
     36 
     37 <a href="#Canvas">Canvas</a> can be constructed to draw to <a href="SkBitmap_Reference#Bitmap">Bitmap</a> without first creating <a href="undocumented#Raster_Surface">Raster Surface</a>.
     38 This approach may be deprecated in the future.
     39 
     40 ## <a name="Related_Functions"></a> Related Functions
     41 
     42 | name | description |
     43 | --- | --- |
     44 | <a href="#Clip">Clip</a> | stack of clipping <a href="#Path">Paths</a> |
     45 | <a href="#Draw_Image">Draw Image</a> | draws <a href="SkImage_Reference#Image">Image</a> to <a href="#Canvas">Canvas</a> |
     46 | <a href="#Layer">Layer</a> | temporary <a href="SkBitmap_Reference#Bitmap">Bitmap</a> to draw into |
     47 | <a href="#Matrix">Matrix</a> | coordinate transformation |
     48 | <a href="#State_Stack">State Stack</a> | stack of state for hierarchical drawing |
     49 
     50 ## <a name="Constants"></a> Constants
     51 
     52 | name | description |
     53 | --- | --- |
     54 | <a href="#SkCanvas_ColorBehavior">ColorBehavior</a> | Android framework only |
     55 | <a href="#SkCanvas_PointMode">PointMode</a> | sets <a href="#SkCanvas_drawPoints">drawPoints</a> options |
     56 | <a href="#SkCanvas_SrcRectConstraint">SrcRectConstraint</a> | sets <a href="#SkCanvas_drawImageRect">drawImageRect</a> options |
     57 | _anonymous | sets <a href="#SkCanvas_SaveLayerRec">SaveLayerRec</a> options |
     58 
     59 ## <a name="Classes_and_Structs"></a> Classes and Structs
     60 
     61 | name | description |
     62 | --- | --- |
     63 | <a href="#SkCanvas_Lattice">Lattice</a> | divides <a href="SkBitmap_Reference#Bitmap">Bitmap</a> or <a href="SkImage_Reference#Image">Image</a> into a rectangular grid |
     64 | <a href="#SkCanvas_SaveLayerRec">SaveLayerRec</a> | contains the state used to create the <a href="#Layer">Layer</a> |
     65 
     66 ## <a name="Constructors"></a> Constructors
     67 
     68 Create the desired type of <a href="SkSurface_Reference#Surface">Surface</a> to obtain its <a href="#Canvas">Canvas</a> when possible. <a href="#Constructors">Constructors</a> are useful
     69 when no <a href="SkSurface_Reference#Surface">Surface</a> is required, and some helpers implicitly create <a href="undocumented#Raster_Surface">Raster Surface</a>.
     70 
     71 | name | description |
     72 | --- | --- |
     73 | <a href="#SkCanvas_MakeRasterDirect">MakeRasterDirect</a> | creates from <a href="SkImageInfo_Reference#SkImageInfo">SkImageInfo</a> and <a href="#Storage">Pixel Storage</a> |
     74 | <a href="#SkCanvas_MakeRasterDirectN32">MakeRasterDirectN32</a> | creates from image data and <a href="#Storage">Pixel Storage</a> |
     75 | <a href="#SkCanvas_empty_constructor">SkCanvas()</a> | creates with no <a href="SkSurface_Reference#Surface">Surface</a>, no dimensions |
     76 | <a href="#SkCanvas_copy_SkBaseDevice_star">SkCanvas(SkBaseDevice* device)</a> | to be deprecated |
     77 | <a href="#SkCanvas_copy_const_SkBitmap">SkCanvas(const SkBitmap& bitmap)</a> | uses existing <a href="SkBitmap_Reference#Bitmap">Bitmap</a> |
     78 | <a href="#SkCanvas_const_SkBitmap">SkCanvas(const SkBitmap& bitmap, ColorBehavior behavior)</a> | Android framework only |
     79 | <a href="#SkCanvas_const_SkBitmap_const_SkSurfaceProps">SkCanvas(const SkBitmap& bitmap, const SkSurfaceProps& props)</a> | uses existing <a href="SkBitmap_Reference#Bitmap">Bitmap</a> and <a href="undocumented#Surface_Properties">Surface Properties</a> |
     80 | <a href="#SkCanvas_int_int_const_SkSurfaceProps_star">SkCanvas(int width, int height, const SkSurfaceProps* props = nullptr)</a> | no <a href="SkSurface_Reference#Surface">Surface</a>, set dimensions, <a href="undocumented#Surface_Properties">Surface Properties</a> |
     81 | <a href="#SkCanvas_makeSurface">makeSurface</a> | creates <a href="SkSurface_Reference#Surface">Surface</a> matching <a href="SkImageInfo_Reference#SkImageInfo">SkImageInfo</a> and <a href="undocumented#SkSurfaceProps">SkSurfaceProps</a> |
     82 | <a href="#SkCanvas_destructor">~SkCanvas()</a> | draws saved <a href="#Layer">Layers</a>, frees resources |
     83 
     84 ## <a name="Member_Functions"></a> Member Functions
     85 
     86 | name | description |
     87 | --- | --- |
     88 | <a href="#SkCanvas_MakeRasterDirect">MakeRasterDirect</a> | creates from <a href="SkImageInfo_Reference#SkImageInfo">SkImageInfo</a> and <a href="#Storage">Pixel Storage</a> |
     89 | <a href="#SkCanvas_MakeRasterDirectN32">MakeRasterDirectN32</a> | creates from image data and <a href="#Storage">Pixel Storage</a> |
     90 | <a href="#SkCanvas_accessTopLayerPixels">accessTopLayerPixels</a> | returns writable pixel access if available |
     91 | <a href="#SkCanvas_accessTopRasterHandle">accessTopRasterHandle</a> | returns context that tracks <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a> |
     92 | <a href="#SkCanvas_androidFramework_setDeviceClipRestriction">androidFramework setDeviceClipRestriction</a> | for use by Android framework |
     93 | <a href="#SkCanvas_clear">clear</a> | fills <a href="#Clip">Clip</a> with <a href="undocumented#Color">Color</a> |
     94 | <a href="#SkCanvas_clipPath">clipPath</a> | combines <a href="#Clip">Clip</a> with <a href="SkPath_Reference#Path">Path</a> |
     95 | <a href="#SkCanvas_clipRRect">clipRRect</a> | combines <a href="#Clip">Clip</a> with <a href="undocumented#Round_Rect">Round Rect</a> |
     96 | <a href="#SkCanvas_clipRect">clipRect</a> | combines <a href="#Clip">Clip</a> with <a href="SkRect_Reference#Rect">Rect</a> |
     97 | <a href="#SkCanvas_clipRegion">clipRegion</a> | combines <a href="#Clip">Clip</a> with <a href="undocumented#Region">Region</a> |
     98 | <a href="#SkCanvas_concat">concat</a> | multiplies <a href="#Matrix">Matrix</a> by <a href="#Matrix">Matrix</a> |
     99 | <a href="#SkCanvas_discard">discard</a> | makes <a href="#Canvas">Canvas</a> contents undefined |
    100 | <a href="#SkCanvas_drawAnnotation">drawAnnotation</a> | associates a <a href="SkRect_Reference#Rect">Rect</a> with a key-value pair |
    101 | <a href="#SkCanvas_drawArc">drawArc</a> | draws <a href="undocumented#Arc">Arc</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> |
    102 | <a href="#SkCanvas_drawAtlas">drawAtlas</a> | draws sprites using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> |
    103 | <a href="#SkCanvas_drawBitmap">drawBitmap</a> | draws <a href="SkBitmap_Reference#Bitmap">Bitmap</a> at (x, y) position |
    104 | <a href="#SkCanvas_drawBitmapLattice">drawBitmapLattice</a> | draws proportionally stretched <a href="SkBitmap_Reference#Bitmap">Bitmap</a> |
    105 | <a href="#SkCanvas_drawBitmapNine">drawBitmapNine</a> | draws <a href="undocumented#Nine_Patch">Nine Patch</a> <a href="SkBitmap_Reference#Bitmap">Bitmap</a> |
    106 | <a href="#SkCanvas_drawBitmapRect">drawBitmapRect</a> | draws <a href="SkBitmap_Reference#Bitmap">Bitmap</a>, source <a href="SkRect_Reference#Rect">Rect</a> to destination <a href="SkRect_Reference#Rect">Rect</a> |
    107 | <a href="#SkCanvas_drawCircle">drawCircle</a> | draws <a href="undocumented#Circle">Circle</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> |
    108 | <a href="#SkCanvas_drawColor">drawColor</a> | fills <a href="#Clip">Clip</a> with <a href="undocumented#Color">Color</a> and <a href="undocumented#Blend_Mode">Blend Mode</a> |
    109 | <a href="#SkCanvas_drawDRRect">drawDRRect</a> | draws double <a href="undocumented#Round_Rect">Round Rect</a> stroked or filled |
    110 | <a href="#SkCanvas_drawDrawable">drawDrawable</a> | draws <a href="undocumented#Drawable">Drawable</a>, encapsulated drawing commands |
    111 | <a href="#SkCanvas_drawIRect">drawIRect</a> | draws <a href="SkIRect_Reference#IRect">IRect</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> |
    112 | <a href="#SkCanvas_drawImage">drawImage</a> | draws <a href="SkImage_Reference#Image">Image</a> at (x, y) position |
    113 | <a href="#SkCanvas_drawImageLattice">drawImageLattice</a> | draws proportionally stretched <a href="SkImage_Reference#Image">Image</a> |
    114 | <a href="#SkCanvas_drawImageNine">drawImageNine</a> | draws <a href="undocumented#Nine_Patch">Nine Patch</a> <a href="SkImage_Reference#Image">Image</a> |
    115 | <a href="#SkCanvas_drawImageRect">drawImageRect</a> | draws <a href="SkImage_Reference#Image">Image</a>, source <a href="SkRect_Reference#Rect">Rect</a> to destination <a href="SkRect_Reference#Rect">Rect</a> |
    116 | <a href="#SkCanvas_drawLine">drawLine</a> | draws line segment between two points |
    117 | <a href="#SkCanvas_drawOval">drawOval</a> | draws <a href="undocumented#Oval">Oval</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> |
    118 | <a href="#SkCanvas_drawPaint">drawPaint</a> | fills <a href="#Clip">Clip</a> with <a href="SkPaint_Reference#Paint">Paint</a> |
    119 | <a href="#SkCanvas_drawPatch">drawPatch</a> | draws Coons_Patch |
    120 | <a href="#SkCanvas_drawPath">drawPath</a> | draws <a href="SkPath_Reference#Path">Path</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> |
    121 | <a href="#SkCanvas_drawPicture">drawPicture</a> | draws <a href="undocumented#Picture">Picture</a> using <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a> |
    122 | <a href="#SkCanvas_drawPoint">drawPoint</a> | draws point at (x, y) position |
    123 | <a href="#SkCanvas_drawPoints">drawPoints</a> | draws array as points, lines, polygon |
    124 | <a href="#SkCanvas_drawPosText">drawPosText</a> | draws text at array of (x, y) positions |
    125 | <a href="#SkCanvas_drawPosTextH">drawPosTextH</a> | draws text at x positions with common baseline |
    126 | <a href="#SkCanvas_drawRRect">drawRRect</a> | draws <a href="undocumented#Round_Rect">Round Rect</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> |
    127 | <a href="#SkCanvas_drawRect">drawRect</a> | draws <a href="SkRect_Reference#Rect">Rect</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> |
    128 | <a href="#SkCanvas_drawRegion">drawRegion</a> | draws <a href="undocumented#Region">Region</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> |
    129 | <a href="#SkCanvas_drawRoundRect">drawRoundRect</a> | draws <a href="undocumented#Round_Rect">Round Rect</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> |
    130 | <a href="#SkCanvas_drawString">drawString</a> | draws null terminated string at (x, y) using font advance |
    131 | <a href="#SkCanvas_drawText">drawText</a> | draws text at (x, y), using font advance |
    132 | <a href="#SkCanvas_drawTextBlob">drawTextBlob</a> | draws text with arrays of positions and <a href="SkPaint_Reference#Paint">Paint</a> |
    133 | <a href="#SkCanvas_drawTextOnPath">drawTextOnPath</a> | draws text following <a href="SkPath_Reference#Path">Path</a> contour |
    134 | <a href="#SkCanvas_drawTextOnPathHV">drawTextOnPathHV</a> | draws text following <a href="SkPath_Reference#Path">Path</a> with offsets |
    135 | <a href="#SkCanvas_drawTextRSXform">drawTextRSXform</a> | draws text with array of <a href="undocumented#RSXform">RSXform</a> |
    136 | <a href="#SkCanvas_drawVertices">drawVertices</a> | draws <a href="undocumented#Vertices">Vertices</a>, a triangle mesh |
    137 | <a href="#SkCanvas_flush">flush</a> | triggers execution of all pending draw operations |
    138 | <a href="#SkCanvas_getBaseLayerSize">getBaseLayerSize</a> | returns size of base <a href="#Layer">Layer</a> in global coordinates |
    139 | <a href="#SkCanvas_getDeviceClipBounds">getDeviceClipBounds</a> | returns <a href="SkIRect_Reference#IRect">IRect</a> bounds of <a href="#Clip">Clip</a> |
    140 | <a href="#SkCanvas_getDrawFilter">getDrawFilter</a> | legacy; to be deprecated |
    141 | <a href="#SkCanvas_getGrContext">getGrContext</a> | returns <a href="undocumented#GPU_Context">GPU Context</a> of the <a href="undocumented#GPU_Surface">GPU Surface</a> |
    142 | <a href="#SkCanvas_getLocalClipBounds">getLocalClipBounds</a> | returns <a href="#Clip">Clip</a> bounds in source coordinates |
    143 | <a href="#SkCanvas_getMetaData">getMetaData</a> | associates additional data with the canvas |
    144 | <a href="#SkCanvas_getProps">getProps</a> | copies <a href="undocumented#Surface_Properties">Surface Properties</a> if available |
    145 | <a href="#SkCanvas_getSaveCount">getSaveCount</a> | returns depth of stack containing <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a> |
    146 | <a href="#SkCanvas_getTotalMatrix">getTotalMatrix</a> | returns <a href="#Matrix">Matrix</a> |
    147 | <a href="#SkCanvas_imageInfo">imageInfo</a> | returns <a href="SkImageInfo_Reference#Image_Info">Image Info</a> for <a href="#Canvas">Canvas</a> |
    148 | <a href="#SkCanvas_isClipEmpty">isClipEmpty</a> | returns if <a href="#Clip">Clip</a> is empty |
    149 | <a href="#SkCanvas_isClipRect">isClipRect</a> | returns if <a href="#Clip">Clip</a> is <a href="SkRect_Reference#Rect">Rect</a> and not empty |
    150 | <a href="#SkCanvas_makeSurface">makeSurface</a> | creates <a href="SkSurface_Reference#Surface">Surface</a> matching <a href="SkImageInfo_Reference#SkImageInfo">SkImageInfo</a> and <a href="undocumented#SkSurfaceProps">SkSurfaceProps</a> |
    151 | <a href="#SkCanvas_peekPixels">peekPixels</a> | returns if <a href="#Canvas">Canvas</a> has direct access to its pixels |
    152 | <a href="#SkCanvas_quickReject">quickReject</a> | returns if <a href="SkRect_Reference#Rect">Rect</a> is outside <a href="#Clip">Clip</a> |
    153 | <a href="#SkCanvas_readPixels">readPixels</a> | copies and converts rectangle of pixels from <a href="#Canvas">Canvas</a> |
    154 | <a href="#SkCanvas_resetMatrix">resetMatrix</a> | resets <a href="#Matrix">Matrix</a> to identity |
    155 | <a href="#SkCanvas_restore">restore</a> | restores changes to <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a>, pops save stack |
    156 | <a href="#SkCanvas_restoreToCount">restoreToCount</a> | restores changes to <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a> to given depth |
    157 | <a href="#SkCanvas_rotate">rotate</a> | rotates <a href="#Matrix">Matrix</a> |
    158 | <a href="#SkCanvas_save">save</a> | saves <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a> on stack |
    159 | <a href="#SkCanvas_saveLayer">saveLayer</a> | saves <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a> on stack; creates <a href="#Layer">Layer</a> |
    160 | <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a> | saves <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a> on stack; creates <a href="#Layer">Layer</a>; sets opacity |
    161 | <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a> | saves <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a> on stack; creates <a href="#Layer">Layer</a> for LCD text |
    162 | <a href="#SkCanvas_scale">scale</a> | scales <a href="#Matrix">Matrix</a> |
    163 | <a href="#SkCanvas_setAllowSimplifyClip">setAllowSimplifyClip</a> | experimental |
    164 | <a href="#SkCanvas_setDrawFilter">setDrawFilter</a> | legacy; to be deprecated |
    165 | <a href="#SkCanvas_setMatrix">setMatrix</a> | sets <a href="#Matrix">Matrix</a> |
    166 | <a href="#SkCanvas_skew">skew</a> | skews <a href="#Matrix">Matrix</a> |
    167 | <a href="#SkCanvas_translate">translate</a> | translates <a href="#Matrix">Matrix</a> |
    168 | <a href="#SkCanvas_writePixels">writePixels</a> | copies and converts rectangle of pixels to <a href="#Canvas">Canvas</a> |
    169 
    170 <a name="SkCanvas_MakeRasterDirect"></a>
    171 ## MakeRasterDirect
    172 
    173 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    174 static std::unique_ptr&lt;SkCanvas&gt; MakeRasterDirect(const SkImageInfo& info, void* pixels,
    175                                                   size_t rowBytes,
    176                                                   const SkSurfaceProps* props = nullptr)
    177 </pre>
    178 
    179 Allocates raster <a href="#Canvas">Canvas</a> that will draw directly into <a href="#SkCanvas_MakeRasterDirect_pixels">pixels</a>.
    180 
    181 <a href="#Canvas">Canvas</a> is returned if all parameters are valid.
    182 Valid parameters include:
    183 <a href="#SkCanvas_MakeRasterDirect_info">info</a> dimensions are zero or positive;
    184 <a href="#SkCanvas_MakeRasterDirect_info">info</a> contains <a href="SkImageInfo_Reference#Color_Type">Color Type</a> and <a href="SkImageInfo_Reference#Alpha_Type">Alpha Type</a> supported by <a href="undocumented#Raster_Surface">Raster Surface</a>;
    185 <a href="#SkCanvas_MakeRasterDirect_pixels">pixels</a> is not nullptr;
    186 <a href="#SkCanvas_MakeRasterDirect_rowBytes">rowBytes</a> is zero or large enough to contain <a href="#SkCanvas_MakeRasterDirect_info">info</a> width <a href="#SkCanvas_MakeRasterDirect_pixels">pixels</a> of <a href="SkImageInfo_Reference#Color_Type">Color Type</a>.
    187 
    188 Pass zero for <a href="#SkCanvas_MakeRasterDirect_rowBytes">rowBytes</a> to compute <a href="#SkCanvas_MakeRasterDirect_rowBytes">rowBytes</a> from <a href="#SkCanvas_MakeRasterDirect_info">info</a> width and size of pixel.
    189 If <a href="#SkCanvas_MakeRasterDirect_rowBytes">rowBytes</a> is greater than zero, it must be equal to or greater than
    190 <a href="#SkCanvas_MakeRasterDirect_info">info</a> width times bytes required for <a href="SkImageInfo_Reference#Color_Type">Color Type</a>.
    191 
    192 <a href="undocumented#Pixel">Pixel</a> buffer size should be <a href="#SkCanvas_MakeRasterDirect_info">info</a> height times computed <a href="#SkCanvas_MakeRasterDirect_rowBytes">rowBytes</a>.
    193 Pixels are not initialized.
    194 To access <a href="#SkCanvas_MakeRasterDirect_pixels">pixels</a> after drawing, call <a href="#SkCanvas_flush">flush</a> or <a href="#SkCanvas_peekPixels">peekPixels</a>.
    195 
    196 ### Parameters
    197 
    198 <table>  <tr>    <td><a name="SkCanvas_MakeRasterDirect_info"> <code><strong>info </strong></code> </a></td> <td>
    199 width, height, <a href="SkImageInfo_Reference#Color_Type">Color Type</a>, <a href="SkImageInfo_Reference#Alpha_Type">Alpha Type</a>, <a href="undocumented#Color_Space">Color Space</a>, of <a href="undocumented#Raster_Surface">Raster Surface</a>;
    200 width, or height, or both, may be zero</td>
    201   </tr>  <tr>    <td><a name="SkCanvas_MakeRasterDirect_pixels"> <code><strong>pixels </strong></code> </a></td> <td>
    202 pointer to destination <a href="#SkCanvas_MakeRasterDirect_pixels">pixels</a> buffer</td>
    203   </tr>  <tr>    <td><a name="SkCanvas_MakeRasterDirect_rowBytes"> <code><strong>rowBytes </strong></code> </a></td> <td>
    204 interval from one <a href="SkSurface_Reference#Surface">Surface</a> row to the next, or zero</td>
    205   </tr>  <tr>    <td><a name="SkCanvas_MakeRasterDirect_props"> <code><strong>props </strong></code> </a></td> <td>
    206 LCD striping orientation and setting for device independent fonts;
    207 may be nullptr</td>
    208   </tr>
    209 </table>
    210 
    211 ### Return Value
    212 
    213 <a href="#Canvas">Canvas</a> if all parameters are valid; otherwise, nullptr
    214 
    215 ### Example
    216 
    217 <div><fiddle-embed name="525285073aae7e53eb8f454a398f880c"><div>Allocates a three by three bitmap, clears it to white, and draws a black pixel
    218 in the center.</div>
    219 
    220 #### Example Output
    221 
    222 ~~~~
    223 ---
    224 -x-
    225 ---
    226 ~~~~
    227 
    228 </fiddle-embed></div>
    229 
    230 ### See Also
    231 
    232 <a href="#SkCanvas_MakeRasterDirectN32">MakeRasterDirectN32</a> <a href="#SkSurface_MakeRasterDirect">SkSurface::MakeRasterDirect</a>
    233 
    234 ---
    235 
    236 <a name="SkCanvas_MakeRasterDirectN32"></a>
    237 ## MakeRasterDirectN32
    238 
    239 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    240 static std::unique_ptr&lt;SkCanvas&gt; MakeRasterDirectN32(int width, int height, SkPMColor* pixels,
    241                                                      size_t rowBytes)
    242 </pre>
    243 
    244 Allocates raster <a href="#Canvas">Canvas</a> specified by inline image specification. Subsequent <a href="#Canvas">Canvas</a>
    245 calls draw into <a href="#SkCanvas_MakeRasterDirectN32_pixels">pixels</a>.
    246 <a href="SkImageInfo_Reference#Color_Type">Color Type</a> is set to <a href="SkImageInfo_Reference#SkColorType">kN32 SkColorType</a>.
    247 <a href="SkImageInfo_Reference#Alpha_Type">Alpha Type</a> is set to <a href="SkImageInfo_Reference#SkAlphaType">kPremul SkAlphaType</a>.
    248 To access <a href="#SkCanvas_MakeRasterDirectN32_pixels">pixels</a> after drawing, call <a href="#SkCanvas_flush">flush</a> or <a href="#SkCanvas_peekPixels">peekPixels</a>.
    249 
    250 <a href="#Canvas">Canvas</a> is returned if all parameters are valid.
    251 Valid parameters include:
    252 <a href="#SkCanvas_MakeRasterDirectN32_width">width</a> and <a href="#SkCanvas_MakeRasterDirectN32_height">height</a> are zero or positive;
    253 <a href="#SkCanvas_MakeRasterDirectN32_pixels">pixels</a> is not nullptr;
    254 <a href="#SkCanvas_MakeRasterDirectN32_rowBytes">rowBytes</a> is zero or large enough to contain <a href="#SkCanvas_MakeRasterDirectN32_width">width</a> <a href="#SkCanvas_MakeRasterDirectN32_pixels">pixels</a> of <a href="SkImageInfo_Reference#SkColorType">kN32 SkColorType</a>.
    255 
    256 Pass zero for <a href="#SkCanvas_MakeRasterDirectN32_rowBytes">rowBytes</a> to compute <a href="#SkCanvas_MakeRasterDirectN32_rowBytes">rowBytes</a> from <a href="#SkCanvas_MakeRasterDirectN32_width">width</a> and size of pixel.
    257 If <a href="#SkCanvas_MakeRasterDirectN32_rowBytes">rowBytes</a> is greater than zero, it must be equal to or greater than
    258 <a href="#SkCanvas_MakeRasterDirectN32_width">width</a> times bytes required for <a href="SkImageInfo_Reference#Color_Type">Color Type</a>.
    259 
    260 <a href="undocumented#Pixel">Pixel</a> buffer size should be <a href="#SkCanvas_MakeRasterDirectN32_height">height</a> times <a href="#SkCanvas_MakeRasterDirectN32_rowBytes">rowBytes</a>.
    261 
    262 ### Parameters
    263 
    264 <table>  <tr>    <td><a name="SkCanvas_MakeRasterDirectN32_width"> <code><strong>width </strong></code> </a></td> <td>
    265 pixel column count on <a href="undocumented#Raster_Surface">Raster Surface</a> created; must be zero or greater</td>
    266   </tr>  <tr>    <td><a name="SkCanvas_MakeRasterDirectN32_height"> <code><strong>height </strong></code> </a></td> <td>
    267 pixel row count on <a href="undocumented#Raster_Surface">Raster Surface</a> created; must be zero or greater</td>
    268   </tr>  <tr>    <td><a name="SkCanvas_MakeRasterDirectN32_pixels"> <code><strong>pixels </strong></code> </a></td> <td>
    269 pointer to destination <a href="#SkCanvas_MakeRasterDirectN32_pixels">pixels</a> buffer; buffer size should be <a href="#SkCanvas_MakeRasterDirectN32_height">height</a>
    270 times <a href="#SkCanvas_MakeRasterDirectN32_rowBytes">rowBytes</a></td>
    271   </tr>  <tr>    <td><a name="SkCanvas_MakeRasterDirectN32_rowBytes"> <code><strong>rowBytes </strong></code> </a></td> <td>
    272 interval from one <a href="SkSurface_Reference#Surface">Surface</a> row to the next, or zero</td>
    273   </tr>
    274 </table>
    275 
    276 ### Return Value
    277 
    278 <a href="#Canvas">Canvas</a> if all parameters are valid; otherwise, nullptr
    279 
    280 ### Example
    281 
    282 <div><fiddle-embed name="a9b116a7ebd1708237ce81ef532e9cb4"><div>Allocates a three by three bitmap, clears it to white, and draws a black pixel
    283 in the center.</div>
    284 
    285 #### Example Output
    286 
    287 ~~~~
    288 ---
    289 -x-
    290 ---
    291 ~~~~
    292 
    293 </fiddle-embed></div>
    294 
    295 ### See Also
    296 
    297 <a href="#SkCanvas_MakeRasterDirect">MakeRasterDirect</a> <a href="#SkSurface_MakeRasterDirect">SkSurface::MakeRasterDirect</a> <a href="#SkImageInfo_MakeN32Premul">SkImageInfo::MakeN32Premul</a><sup><a href="#SkImageInfo_MakeN32Premul_2">[2]</a></sup>
    298 
    299 ---
    300 
    301 <a name="SkCanvas_empty_constructor"></a>
    302 ## SkCanvas
    303 
    304 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    305 SkCanvas()
    306 </pre>
    307 
    308 Creates an empty <a href="#Canvas">Canvas</a> with no backing device or pixels, with
    309 a width and height of zero.
    310 
    311 ### Return Value
    312 
    313 empty <a href="#Canvas">Canvas</a>
    314 
    315 ### Example
    316 
    317 <div><fiddle-embed name="903451d6c93bf69e2833747a3e8cc8f7"><div>Passes a placeholder to a function that requires one.</div>
    318 
    319 #### Example Output
    320 
    321 ~~~~
    322 paint draws text left to right
    323 paint draws text top to bottom
    324 paint draws text top to bottom
    325 ~~~~
    326 
    327 </fiddle-embed></div>
    328 
    329 ### See Also
    330 
    331 <a href="#SkCanvas_MakeRasterDirect">MakeRasterDirect</a> <a href="#SkRasterHandleAllocator_MakeCanvas">SkRasterHandleAllocator::MakeCanvas</a> <a href="#SkSurface_getCanvas">SkSurface::getCanvas</a> <a href="undocumented#SkCreateColorSpaceXformCanvas">SkCreateColorSpaceXformCanvas</a>
    332 
    333 ---
    334 
    335 <a name="SkCanvas_int_int_const_SkSurfaceProps_star"></a>
    336 ## SkCanvas
    337 
    338 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    339 SkCanvas(int width, int height, const SkSurfaceProps* props = nullptr)
    340 </pre>
    341 
    342 Creates <a href="#Canvas">Canvas</a> of the specified dimensions without a <a href="SkSurface_Reference#Surface">Surface</a>.
    343 Used by Subclasses with custom implementations for draw methods.
    344 
    345 If <a href="#SkCanvas_int_int_const_SkSurfaceProps_star_props">props</a> equals nullptr, <a href="undocumented#Surface_Properties">Surface Properties</a> are created with
    346 <a href="undocumented#Surface_Properties_Legacy_Font_Host">Surface Properties Legacy Font Host</a> settings, which choose the pixel striping
    347 direction and order. Since a platform may dynamically change its direction when
    348 the device is rotated, and since a platform may have multiple monitors with
    349 different characteristics, it is best not to rely on this legacy behavior.
    350 
    351 ### Parameters
    352 
    353 <table>  <tr>    <td><a name="SkCanvas_int_int_const_SkSurfaceProps_star_width"> <code><strong>width </strong></code> </a></td> <td>
    354 zero or greater</td>
    355   </tr>  <tr>    <td><a name="SkCanvas_int_int_const_SkSurfaceProps_star_height"> <code><strong>height </strong></code> </a></td> <td>
    356 zero or greater</td>
    357   </tr>  <tr>    <td><a name="SkCanvas_int_int_const_SkSurfaceProps_star_props"> <code><strong>props </strong></code> </a></td> <td>
    358 LCD striping orientation and setting for device independent fonts;
    359 may be nullptr</td>
    360   </tr>
    361 </table>
    362 
    363 ### Return Value
    364 
    365 <a href="#Canvas">Canvas</a> placeholder with dimensions
    366 
    367 ### Example
    368 
    369 <div><fiddle-embed name="ce6a5ef2df447970b4453489d9d67930">
    370 
    371 #### Example Output
    372 
    373 ~~~~
    374 canvas is empty
    375 ~~~~
    376 
    377 </fiddle-embed></div>
    378 
    379 ### See Also
    380 
    381 <a href="#SkCanvas_MakeRasterDirect">MakeRasterDirect</a> <a href="undocumented#SkSurfaceProps">SkSurfaceProps</a> <a href="undocumented#SkPixelGeometry">SkPixelGeometry</a> <a href="undocumented#SkCreateColorSpaceXformCanvas">SkCreateColorSpaceXformCanvas</a>
    382 
    383 ---
    384 
    385 <a name="SkCanvas_copy_SkBaseDevice_star"></a>
    386 ## SkCanvas
    387 
    388 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    389 explicit SkCanvas(SkBaseDevice* device)
    390 </pre>
    391 
    392 Construct a canvas that draws into <a href="#SkCanvas_copy_SkBaseDevice_star_device">device</a>.
    393 Used by child classes of <a href="#SkCanvas">SkCanvas</a>.
    394 
    395 ### Parameters
    396 
    397 <table>  <tr>    <td><a name="SkCanvas_copy_SkBaseDevice_star_device"> <code><strong>device </strong></code> </a></td> <td>
    398 specifies a <a href="#SkCanvas_copy_SkBaseDevice_star_device">device</a> for the canvas to draw into</td>
    399   </tr>
    400 </table>
    401 
    402 ### Return Value
    403 
    404 <a href="#Canvas">Canvas</a> that can be used to draw into <a href="#SkCanvas_copy_SkBaseDevice_star_device">device</a>
    405 
    406 ### See Also
    407 
    408 <a href="#SkCanvas_MakeRasterDirect">MakeRasterDirect</a> <a href="#SkRasterHandleAllocator_MakeCanvas">SkRasterHandleAllocator::MakeCanvas</a> <a href="#SkSurface_getCanvas">SkSurface::getCanvas</a> <a href="undocumented#SkCreateColorSpaceXformCanvas">SkCreateColorSpaceXformCanvas</a>
    409 
    410 ---
    411 
    412 <a name="SkCanvas_copy_const_SkBitmap"></a>
    413 ## SkCanvas
    414 
    415 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    416 explicit SkCanvas(const SkBitmap& bitmap)
    417 </pre>
    418 
    419 Construct a canvas that draws into <a href="#SkCanvas_copy_const_SkBitmap_bitmap">bitmap</a>.
    420 Sets <a href="#SkSurfaceProps_kLegacyFontHost_InitType">SkSurfaceProps::kLegacyFontHost InitType</a> in constructed <a href="SkSurface_Reference#Surface">Surface</a>.
    421 
    422 <a href="SkBitmap_Reference#Bitmap">Bitmap</a> is copied so that subsequently editing <a href="#SkCanvas_copy_const_SkBitmap_bitmap">bitmap</a> will not affect
    423 constructed <a href="#Canvas">Canvas</a>.
    424 
    425 May be deprecated in the future.
    426 
    427 ### Parameters
    428 
    429 <table>  <tr>    <td><a name="SkCanvas_copy_const_SkBitmap_bitmap"> <code><strong>bitmap </strong></code> </a></td> <td>
    430 width, height, <a href="SkImageInfo_Reference#Color_Type">Color Type</a>, <a href="SkImageInfo_Reference#Alpha_Type">Alpha Type</a>, and pixel
    431 storage of <a href="undocumented#Raster_Surface">Raster Surface</a></td>
    432   </tr>
    433 </table>
    434 
    435 ### Return Value
    436 
    437 <a href="#Canvas">Canvas</a> that can be used to draw into <a href="#SkCanvas_copy_const_SkBitmap_bitmap">bitmap</a>
    438 
    439 ### Example
    440 
    441 <div><fiddle-embed name="dd92db963af190e849894038f39b598a"><div>The actual output depends on the installed fonts.</div>
    442 
    443 #### Example Output
    444 
    445 ~~~~
    446 -----
    447 ---x-
    448 ---x-
    449 ---x-
    450 ---x-
    451 ---x-
    452 ---x-
    453 -----
    454 ---x-
    455 ---x-
    456 -----
    457 ~~~~
    458 
    459 </fiddle-embed></div>
    460 
    461 ### See Also
    462 
    463 <a href="#SkCanvas_MakeRasterDirect">MakeRasterDirect</a> <a href="#SkRasterHandleAllocator_MakeCanvas">SkRasterHandleAllocator::MakeCanvas</a> <a href="#SkSurface_getCanvas">SkSurface::getCanvas</a> <a href="undocumented#SkCreateColorSpaceXformCanvas">SkCreateColorSpaceXformCanvas</a>
    464 
    465 ---
    466 
    467 ## <a name="SkCanvas_ColorBehavior"></a> Enum SkCanvas::ColorBehavior
    468 
    469 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    470 enum class <a href="#SkCanvas_ColorBehavior">ColorBehavior</a> {
    471 <a href="#SkCanvas_ColorBehavior_kLegacy">kLegacy</a>,
    472 };</pre>
    473 
    474 ### Constants
    475 
    476 <table>
    477   <tr>
    478     <td><a name="SkCanvas_ColorBehavior_kLegacy"> <code><strong>SkCanvas::ColorBehavior::kLegacy </strong></code> </a></td><td>0</td><td>Is a placeholder to allow specialized constructor; has no meaning.</td>
    479   </tr>
    480 
    481 </table>
    482 
    483 <a name="SkCanvas_const_SkBitmap"></a>
    484 ## SkCanvas
    485 
    486 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    487 SkCanvas(const SkBitmap& bitmap, ColorBehavior behavior)
    488 </pre>
    489 
    490 ### Parameters
    491 
    492 <table>  <tr>    <td><a name="SkCanvas_const_SkBitmap_bitmap"> <code><strong>bitmap </strong></code> </a></td> <td>
    493 specifies a <a href="#SkCanvas_const_SkBitmap_bitmap">bitmap</a> for the canvas to draw into</td>
    494   </tr>  <tr>    <td><a name="SkCanvas_const_SkBitmap_behavior"> <code><strong>behavior </strong></code> </a></td> <td>
    495 specializes this constructor; value is unused</td>
    496   </tr>
    497 </table>
    498 
    499 ### Return Value
    500 
    501 <a href="#Canvas">Canvas</a> that can be used to draw into <a href="#SkCanvas_const_SkBitmap_bitmap">bitmap</a>
    502 
    503 ---
    504 
    505 <a name="SkCanvas_const_SkBitmap_const_SkSurfaceProps"></a>
    506 ## SkCanvas
    507 
    508 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    509 SkCanvas(const SkBitmap& bitmap, const SkSurfaceProps& props)
    510 </pre>
    511 
    512 Construct a canvas that draws into <a href="#SkCanvas_const_SkBitmap_const_SkSurfaceProps_bitmap">bitmap</a>.
    513 Use <a href="#SkCanvas_const_SkBitmap_const_SkSurfaceProps_props">props</a> to match the device characteristics, like LCD striping.
    514 
    515 <a href="#SkCanvas_const_SkBitmap_const_SkSurfaceProps_bitmap">bitmap</a> is copied so that subsequently editing <a href="#SkCanvas_const_SkBitmap_const_SkSurfaceProps_bitmap">bitmap</a> will not affect
    516 constructed <a href="#Canvas">Canvas</a>.
    517 
    518 ### Parameters
    519 
    520 <table>  <tr>    <td><a name="SkCanvas_const_SkBitmap_const_SkSurfaceProps_bitmap"> <code><strong>bitmap </strong></code> </a></td> <td>
    521 width, height, <a href="SkImageInfo_Reference#Color_Type">Color Type</a>, <a href="SkImageInfo_Reference#Alpha_Type">Alpha Type</a>,
    522 and pixel storage of <a href="undocumented#Raster_Surface">Raster Surface</a></td>
    523   </tr>  <tr>    <td><a name="SkCanvas_const_SkBitmap_const_SkSurfaceProps_props"> <code><strong>props </strong></code> </a></td> <td>
    524 order and orientation of RGB striping; and whether to use
    525 device independent fonts</td>
    526   </tr>
    527 </table>
    528 
    529 ### Return Value
    530 
    531 <a href="#Canvas">Canvas</a> that can be used to draw into <a href="#SkCanvas_const_SkBitmap_const_SkSurfaceProps_bitmap">bitmap</a>
    532 
    533 ### Example
    534 
    535 <div><fiddle-embed name="c26cfae4c42cb445240335cc12a50235"><div>The actual output depends on the installed fonts.</div>
    536 
    537 #### Example Output
    538 
    539 ~~~~
    540 -----
    541 ---x-
    542 ---x-
    543 ---x-
    544 ---x-
    545 ---x-
    546 ---x-
    547 -----
    548 ---x-
    549 ---x-
    550 -----
    551 ~~~~
    552 
    553 </fiddle-embed></div>
    554 
    555 ### See Also
    556 
    557 <a href="#SkCanvas_MakeRasterDirect">MakeRasterDirect</a> <a href="#SkRasterHandleAllocator_MakeCanvas">SkRasterHandleAllocator::MakeCanvas</a> <a href="#SkSurface_getCanvas">SkSurface::getCanvas</a> <a href="undocumented#SkCreateColorSpaceXformCanvas">SkCreateColorSpaceXformCanvas</a>
    558 
    559 ---
    560 
    561 <a name="SkCanvas_destructor"></a>
    562 ## ~SkCanvas
    563 
    564 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    565 virtual ~SkCanvas()
    566 </pre>
    567 
    568 Draws saved <a href="#Layer">Layers</a>, if any.
    569 Frees up resources used by <a href="#Canvas">Canvas</a>.
    570 
    571 ### Example
    572 
    573 <div><fiddle-embed name="b7bc91ff16c9b9351b2a127f35394b82"><div><a href="#Canvas">Canvas</a> <a href="#Layer">Layer</a> draws into bitmap. <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a> sets up an additional
    574 drawing surface that blends with the bitmap. When <a href="#Layer">Layer</a> goes out of
    575 scope, <a href="#Layer">Layer</a> Destructor is called. The saved <a href="#Layer">Layer</a> is restored, drawing
    576 transparent letters.</div></fiddle-embed></div>
    577 
    578 ### See Also
    579 
    580 <a href="#State_Stack">State Stack</a>
    581 
    582 ---
    583 
    584 <a name="SkCanvas_getMetaData"></a>
    585 ## getMetaData
    586 
    587 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    588 SkMetaData& getMetaData()
    589 </pre>
    590 
    591 Returns storage to associate additional data with the canvas.
    592 The storage is freed when <a href="#Canvas">Canvas</a> is deleted.
    593 
    594 ### Return Value
    595 
    596 storage that can be read from and written to
    597 
    598 ### Example
    599 
    600 <div><fiddle-embed name="1598396056045e8d0c583b748293d652">
    601 
    602 #### Example Output
    603 
    604 ~~~~
    605 before: (null)
    606 during: Hello!
    607 after: (null)
    608 ~~~~
    609 
    610 </fiddle-embed></div>
    611 
    612 ### See Also
    613 
    614 <a href="undocumented#SkMetaData">SkMetaData</a>
    615 
    616 ---
    617 
    618 <a name="SkCanvas_imageInfo"></a>
    619 ## imageInfo
    620 
    621 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    622 SkImageInfo imageInfo() const
    623 </pre>
    624 
    625 Returns <a href="SkImageInfo_Reference#Image_Info">Image Info</a> for <a href="#Canvas">Canvas</a>. If <a href="#Canvas">Canvas</a> is not associated with <a href="undocumented#Raster_Surface">Raster Surface</a> or
    626 <a href="undocumented#GPU_Surface">GPU Surface</a>, returned <a href="SkImageInfo_Reference#Color_Type">Color Type</a> is set to <a href="SkImageInfo_Reference#SkColorType">kUnknown SkColorType</a>.
    627 
    628 ### Return Value
    629 
    630 dimensions and <a href="SkImageInfo_Reference#Color_Type">Color Type</a> of <a href="#Canvas">Canvas</a>
    631 
    632 ### Example
    633 
    634 <div><fiddle-embed name="d93389d971f8084c4ccc7a66e4e157ee">
    635 
    636 #### Example Output
    637 
    638 ~~~~
    639 emptyInfo == canvasInfo
    640 ~~~~
    641 
    642 </fiddle-embed></div>
    643 
    644 ### See Also
    645 
    646 <a href="SkImageInfo_Reference#SkImageInfo">SkImageInfo</a> <a href="#SkCanvas_MakeRasterDirect">MakeRasterDirect</a> <a href="#SkCanvas_makeSurface">makeSurface</a>
    647 
    648 ---
    649 
    650 <a name="SkCanvas_getProps"></a>
    651 ## getProps
    652 
    653 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    654 bool getProps(SkSurfaceProps* props) const
    655 </pre>
    656 
    657 If <a href="#Canvas">Canvas</a> is associated with <a href="undocumented#Raster_Surface">Raster Surface</a> or
    658 <a href="undocumented#GPU_Surface">GPU Surface</a>, copies <a href="undocumented#Surface_Properties">Surface Properties</a> and returns true. Otherwise,
    659 return false and leave <a href="#SkCanvas_getProps_props">props</a> unchanged.
    660 
    661 ### Parameters
    662 
    663 <table>  <tr>    <td><a name="SkCanvas_getProps_props"> <code><strong>props </strong></code> </a></td> <td>
    664 storage for writable <a href="undocumented#SkSurfaceProps">SkSurfaceProps</a></td>
    665   </tr>
    666 </table>
    667 
    668 ### Return Value
    669 
    670 true if <a href="undocumented#Surface_Properties">Surface Properties</a> was copied
    671 
    672 ### Example
    673 
    674 <div><fiddle-embed name="0fbf2dedc2619bbfbf173c9e3bc1a508">
    675 
    676 #### Example Output
    677 
    678 ~~~~
    679 isRGB:0
    680 isRGB:1
    681 ~~~~
    682 
    683 </fiddle-embed></div>
    684 
    685 ### See Also
    686 
    687 <a href="undocumented#SkSurfaceProps">SkSurfaceProps</a> <a href="#SkCanvas_makeSurface">makeSurface</a>
    688 
    689 ---
    690 
    691 <a name="SkCanvas_flush"></a>
    692 ## flush
    693 
    694 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    695 void flush()
    696 </pre>
    697 
    698 Triggers the immediate execution of all pending draw operations.
    699 If <a href="#Canvas">Canvas</a> is associated with <a href="undocumented#GPU_Surface">GPU Surface</a>, resolves all pending GPU operations.
    700 If <a href="#Canvas">Canvas</a> is associated with <a href="undocumented#Raster_Surface">Raster Surface</a>, has no effect; raster draw
    701 operations are never deferred.
    702 
    703 ### See Also
    704 
    705 <a href="#SkCanvas_peekPixels">peekPixels</a> <a href="#SkSurface_flush">SkSurface::flush()</a> <a href="#flush">GrContext::flush()</a> <a href="#SkSurface_prepareForExternalIO">SkSurface::prepareForExternalIO</a> GrContext::abandonContext()
    706 
    707 ---
    708 
    709 <a name="SkCanvas_getBaseLayerSize"></a>
    710 ## getBaseLayerSize
    711 
    712 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    713 virtual SkISize getBaseLayerSize() const
    714 </pre>
    715 
    716 Gets the size of the base or root <a href="#Layer">Layer</a> in global canvas coordinates. The
    717 origin of the base <a href="#Layer">Layer</a> is always (0,0). The area available for drawing may be
    718 smaller (due to clipping or <a href="#SkCanvas_saveLayer">saveLayer</a>).
    719 
    720 ### Return Value
    721 
    722 integral width and height of base <a href="#Layer">Layer</a>
    723 
    724 ### Example
    725 
    726 <div><fiddle-embed name="374e245d91cd729eca48fd20e631fdf3">
    727 
    728 #### Example Output
    729 
    730 ~~~~
    731 clip=10,30
    732 size=20,30
    733 ~~~~
    734 
    735 </fiddle-embed></div>
    736 
    737 ### See Also
    738 
    739 <a href="#SkCanvas_getDeviceClipBounds">getDeviceClipBounds</a><sup><a href="#SkCanvas_getDeviceClipBounds_2">[2]</a></sup>
    740 
    741 ---
    742 
    743 <a name="SkCanvas_makeSurface"></a>
    744 ## makeSurface
    745 
    746 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    747 sk_sp&lt;SkSurface&gt; makeSurface(const SkImageInfo& info, const SkSurfaceProps* props = nullptr)
    748 </pre>
    749 
    750 Creates <a href="SkSurface_Reference#Surface">Surface</a> matching <a href="#SkCanvas_makeSurface_info">info</a> and <a href="#SkCanvas_makeSurface_props">props</a>, and associates it with <a href="#Canvas">Canvas</a>.
    751 Returns nullptr if no match found.
    752 
    753 If <a href="#SkCanvas_makeSurface_props">props</a> is nullptr, matches <a href="undocumented#Surface_Properties">Surface Properties</a> in <a href="#Canvas">Canvas</a>. If <a href="#SkCanvas_makeSurface_props">props</a> is nullptr and <a href="#Canvas">Canvas</a>
    754 does not have <a href="undocumented#Surface_Properties">Surface Properties</a>, creates <a href="SkSurface_Reference#Surface">Surface</a> with default <a href="undocumented#Surface_Properties">Surface Properties</a>.
    755 
    756 ### Parameters
    757 
    758 <table>  <tr>    <td><a name="SkCanvas_makeSurface_info"> <code><strong>info </strong></code> </a></td> <td>
    759 width, height, <a href="SkImageInfo_Reference#Color_Type">Color Type</a>, <a href="SkImageInfo_Reference#Alpha_Type">Alpha Type</a>, and <a href="undocumented#Color_Space">Color Space</a></td>
    760   </tr>  <tr>    <td><a name="SkCanvas_makeSurface_props"> <code><strong>props </strong></code> </a></td> <td>
    761 <a href="undocumented#Surface_Properties">Surface Properties</a> to match; may be nullptr to match <a href="#Canvas">Canvas</a></td>
    762   </tr>
    763 </table>
    764 
    765 ### Return Value
    766 
    767 <a href="SkSurface_Reference#Surface">Surface</a> matching <a href="#SkCanvas_makeSurface_info">info</a> and <a href="#SkCanvas_makeSurface_props">props</a>, or nullptr if no match is available
    768 
    769 ### Example
    770 
    771 <div><fiddle-embed name="1ce28351444b41ab2b8e3128a4b9b9c2">
    772 
    773 #### Example Output
    774 
    775 ~~~~
    776 compatible != nullptr
    777 size = 3, 4
    778 ~~~~
    779 
    780 </fiddle-embed></div>
    781 
    782 ### See Also
    783 
    784 <a href="SkSurface_Reference#SkSurface">SkSurface</a> <a href="#SkSurface_makeSurface">SkSurface::makeSurface</a> <a href="SkImageInfo_Reference#SkImageInfo">SkImageInfo</a> <a href="undocumented#SkSurfaceProps">SkSurfaceProps</a>
    785 
    786 ---
    787 
    788 <a name="SkCanvas_getGrContext"></a>
    789 ## getGrContext
    790 
    791 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    792 virtual GrContext* getGrContext()
    793 </pre>
    794 
    795 Returns <a href="undocumented#GPU_Context">GPU Context</a> of the <a href="undocumented#GPU_Surface">GPU Surface</a> associated with <a href="#Canvas">Canvas</a>.
    796 
    797 ### Return Value
    798 
    799 <a href="undocumented#GPU_Context">GPU Context</a>, if available; nullptr otherwise
    800 
    801 ### Example
    802 
    803 <div><fiddle-embed name="c4ea949e5fa5a0630dcb6b0204bd498f"></fiddle-embed></div>
    804 
    805 ### See Also
    806 
    807 <a href="undocumented#GrContext">GrContext</a>
    808 
    809 ---
    810 
    811 <a name="SkCanvas_accessTopLayerPixels"></a>
    812 ## accessTopLayerPixels
    813 
    814 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    815 void* accessTopLayerPixels(SkImageInfo* info, size_t* rowBytes, SkIPoint* origin = nullptr)
    816 </pre>
    817 
    818 Returns the pixel base address, <a href="SkImageInfo_Reference#Image_Info">Image Info</a>, <a href="#SkCanvas_accessTopLayerPixels_rowBytes">rowBytes</a>, and <a href="#SkCanvas_accessTopLayerPixels_origin">origin</a> if the pixels
    819 can be read directly. The returned address is only valid
    820 while <a href="#Canvas">Canvas</a> is in scope and unchanged. Any <a href="#Canvas">Canvas</a> call or <a href="SkSurface_Reference#Surface">Surface</a> call
    821 may invalidate the returned address and other returned values.
    822 
    823 If pixels are inaccessible, <a href="#SkCanvas_accessTopLayerPixels_info">info</a>, <a href="#SkCanvas_accessTopLayerPixels_rowBytes">rowBytes</a>, and <a href="#SkCanvas_accessTopLayerPixels_origin">origin</a> are unchanged.
    824 
    825 ### Parameters
    826 
    827 <table>  <tr>    <td><a name="SkCanvas_accessTopLayerPixels_info"> <code><strong>info </strong></code> </a></td> <td>
    828 storage for writable pixels' <a href="SkImageInfo_Reference#Image_Info">Image Info</a>; may be nullptr</td>
    829   </tr>  <tr>    <td><a name="SkCanvas_accessTopLayerPixels_rowBytes"> <code><strong>rowBytes </strong></code> </a></td> <td>
    830 storage for writable pixels' row bytes; may be nullptr</td>
    831   </tr>  <tr>    <td><a name="SkCanvas_accessTopLayerPixels_origin"> <code><strong>origin </strong></code> </a></td> <td>
    832 storage for <a href="#Canvas">Canvas</a> top <a href="#Layer">Layer</a> <a href="#SkCanvas_accessTopLayerPixels_origin">origin</a>, its top-left corner;
    833 may be nullptr</td>
    834   </tr>
    835 </table>
    836 
    837 ### Return Value
    838 
    839 address of pixels, or nullptr if inaccessible
    840 
    841 ### Example
    842 
    843 <div><fiddle-embed name="38d0d6ca9bea146d31bcbec197856359"></fiddle-embed></div>
    844 
    845 ### Example
    846 
    847 <div><fiddle-embed name="a7ac9c21bbabcdeeca00f72a61cd0f3e"><div>Draws "" on the device. Then draws "" in <a href="#Layer">Layer</a>, and reads
    848 <a href="#Layer">Layer</a> to add a large dotted "". Finally blends <a href="#Layer">Layer</a> with the
    849 device.
    850 
    851 The <a href="#Layer">Layer</a> and blended result appear on the CPU and GPU but the large dotted
    852 "" appear only on the CPU.</div></fiddle-embed></div>
    853 
    854 ### See Also
    855 
    856 <a href="SkImageInfo_Reference#SkImageInfo">SkImageInfo</a> <a href="SkPixmap_Reference#SkPixmap">SkPixmap</a>
    857 
    858 ---
    859 
    860 <a name="SkCanvas_accessTopRasterHandle"></a>
    861 ## accessTopRasterHandle
    862 
    863 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    864 SkRasterHandleAllocator::Handle accessTopRasterHandle() const
    865 </pre>
    866 
    867 Returns custom context that tracks the <a href="#Matrix">Matrix</a> and <a href="#Clip">Clip</a>.
    868 
    869 Use <a href="undocumented#Raster_Handle_Allocator">Raster Handle Allocator</a> to blend Skia drawing with custom drawing, typically performed
    870 by the host platform user interface. The custom context returned is generated by
    871 <a href="#SkRasterHandleAllocator_MakeCanvas">SkRasterHandleAllocator::MakeCanvas</a>, which creates a custom canvas with raster storage for
    872 the drawing destination.
    873 
    874 ### Return Value
    875 
    876 context of custom allocation
    877 
    878 ### Example
    879 
    880 <div><fiddle-embed name="4486d0c0b22ad2931db130f42da4c80c"><div></div>
    881 
    882 #### Example Output
    883 
    884 ~~~~
    885 context = skia
    886 ~~~~
    887 
    888 </fiddle-embed></div>
    889 
    890 ### See Also
    891 
    892 <a href="undocumented#SkRasterHandleAllocator">SkRasterHandleAllocator</a>
    893 
    894 ---
    895 
    896 <a name="SkCanvas_peekPixels"></a>
    897 ## peekPixels
    898 
    899 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    900 bool peekPixels(SkPixmap* pixmap)
    901 </pre>
    902 
    903 Returns true if <a href="#Canvas">Canvas</a> has direct access to its pixels.
    904 
    905 Pixels are readable when <a href="undocumented#Device">Device</a> is raster. Pixels are not readable when <a href="#Canvas">Canvas</a>
    906 is returned from <a href="undocumented#GPU_Surface">GPU Surface</a>, returned by <a href="#SkDocument_beginPage">SkDocument::beginPage</a>, returned by
    907 <a href="#SkPictureRecorder_beginRecording">SkPictureRecorder::beginRecording</a>, or <a href="#Canvas">Canvas</a> is the base of a utility class
    908 like <a href="undocumented#SkDumpCanvas">SkDumpCanvas</a>.
    909 
    910 <a href="#SkCanvas_peekPixels_pixmap">pixmap</a> is valid only while <a href="#Canvas">Canvas</a> is in scope and unchanged. Any
    911 <a href="#Canvas">Canvas</a> or <a href="SkSurface_Reference#Surface">Surface</a> call may invalidate the <a href="#SkCanvas_peekPixels_pixmap">pixmap</a> values.
    912 
    913 ### Parameters
    914 
    915 <table>  <tr>    <td><a name="SkCanvas_peekPixels_pixmap"> <code><strong>pixmap </strong></code> </a></td> <td>
    916 storage for pixel state if pixels are readable; otherwise, ignored</td>
    917   </tr>
    918 </table>
    919 
    920 ### Return Value
    921 
    922 true if <a href="#Canvas">Canvas</a> has direct access to pixels
    923 
    924 ### Example
    925 
    926 <div><fiddle-embed name="e9411d676d1fa13b46331abe9e14ad3e">
    927 
    928 #### Example Output
    929 
    930 ~~~~
    931 width=256 height=256
    932 ~~~~
    933 
    934 </fiddle-embed></div>
    935 
    936 ### See Also
    937 
    938 <a href="#SkCanvas_readPixels">readPixels</a><sup><a href="#SkCanvas_readPixels_2">[2]</a></sup><sup><a href="#SkCanvas_readPixels_3">[3]</a></sup> <a href="#SkBitmap_peekPixels">SkBitmap::peekPixels</a> <a href="#SkImage_peekPixels">SkImage::peekPixels</a> <a href="#SkSurface_peekPixels">SkSurface::peekPixels</a>
    939 
    940 ---
    941 
    942 <a name="SkCanvas_readPixels"></a>
    943 ## readPixels
    944 
    945 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
    946 bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes, int srcX, int srcY)
    947 </pre>
    948 
    949 Copies <a href="SkRect_Reference#Rect">Rect</a> of pixels from <a href="#Canvas">Canvas</a> into <a href="#SkCanvas_readPixels_dstPixels">dstPixels</a>. <a href="#Matrix">Matrix</a> and <a href="#Clip">Clip</a> are
    950 ignored.
    951 
    952 Source <a href="SkRect_Reference#Rect">Rect</a> corners are (<a href="#SkCanvas_readPixels_srcX">srcX</a>, <a href="#SkCanvas_readPixels_srcY">srcY</a>) and (<a href="#SkCanvas_imageInfo">imageInfo</a>.width(), <a href="#SkCanvas_imageInfo">imageInfo</a>.height()).
    953 Destination <a href="SkRect_Reference#Rect">Rect</a> corners are (0, 0) and (<a href="#SkCanvas_readPixels_dstInfo">dstInfo</a>.width(), <a href="#SkCanvas_readPixels_dstInfo">dstInfo</a>.height()).
    954 Copies each readable pixel intersecting both rectangles, without scaling,
    955 converting to <a href="#SkCanvas_readPixels_dstInfo">dstInfo</a>.colorType() and <a href="#SkCanvas_readPixels_dstInfo">dstInfo</a>.alphaType() if required.
    956 
    957 Pixels are readable when <a href="undocumented#Device">Device</a> is raster, or backed by a GPU.
    958 Pixels are not readable when <a href="#SkCanvas">SkCanvas</a> is returned by <a href="#SkDocument_beginPage">SkDocument::beginPage</a>,
    959 returned by <a href="#SkPictureRecorder_beginRecording">SkPictureRecorder::beginRecording</a>, or <a href="#Canvas">Canvas</a> is the base of a utility
    960 class like <a href="undocumented#SkDumpCanvas">SkDumpCanvas</a>.
    961 
    962 The destination pixel storage must be allocated by the caller.
    963 
    964 <a href="undocumented#Pixel">Pixel</a> values are converted only if <a href="SkImageInfo_Reference#Color_Type">Color Type</a> and <a href="SkImageInfo_Reference#Alpha_Type">Alpha Type</a>
    965 do not match. Only pixels within both source and destination rectangles
    966 are copied. <a href="#SkCanvas_readPixels_dstPixels">dstPixels</a> contents outside <a href="SkRect_Reference#Rect">Rect</a> intersection are unchanged.
    967 
    968 Pass negative values for <a href="#SkCanvas_readPixels_srcX">srcX</a> or <a href="#SkCanvas_readPixels_srcY">srcY</a> to offset pixels across or down destination.
    969 
    970 Does not copy, and returns false if:
    971 
    972 <table>  <tr>
    973     <td>Source and destination rectangles do not intersect.</td>  </tr>  <tr>
    974     <td><a href="#Canvas">Canvas</a> pixels could not be converted to <a href="#SkCanvas_readPixels_dstInfo">dstInfo</a>.colorType() or <a href="#SkCanvas_readPixels_dstInfo">dstInfo</a>.alphaType().</td>  </tr>  <tr>
    975     <td><a href="#Canvas">Canvas</a> pixels are not readable; for instance, <a href="#Canvas">Canvas</a> is document-based.</td>  </tr>  <tr>
    976     <td><a href="#SkCanvas_readPixels_dstRowBytes">dstRowBytes</a> is too small to contain one row of pixels.</td>  </tr>
    977 </table>
    978 
    979 ### Parameters
    980 
    981 <table>  <tr>    <td><a name="SkCanvas_readPixels_dstInfo"> <code><strong>dstInfo </strong></code> </a></td> <td>
    982 width, height, <a href="SkImageInfo_Reference#Color_Type">Color Type</a>, and <a href="SkImageInfo_Reference#Alpha_Type">Alpha Type</a> of <a href="#SkCanvas_readPixels_dstPixels">dstPixels</a></td>
    983   </tr>  <tr>    <td><a name="SkCanvas_readPixels_dstPixels"> <code><strong>dstPixels </strong></code> </a></td> <td>
    984 storage for pixels; <a href="#SkCanvas_readPixels_dstInfo">dstInfo</a>.height() times <a href="#SkCanvas_readPixels_dstRowBytes">dstRowBytes</a>, or larger</td>
    985   </tr>  <tr>    <td><a name="SkCanvas_readPixels_dstRowBytes"> <code><strong>dstRowBytes </strong></code> </a></td> <td>
    986 size of one destination row; <a href="#SkCanvas_readPixels_dstInfo">dstInfo</a>.width() times pixel size, or larger</td>
    987   </tr>  <tr>    <td><a name="SkCanvas_readPixels_srcX"> <code><strong>srcX </strong></code> </a></td> <td>
    988 offset into readable pixels in x; may be negative</td>
    989   </tr>  <tr>    <td><a name="SkCanvas_readPixels_srcY"> <code><strong>srcY </strong></code> </a></td> <td>
    990 offset into readable pixels in y; may be negative</td>
    991   </tr>
    992 </table>
    993 
    994 ### Return Value
    995 
    996 true if pixels were copied
    997 
    998 ### Example
    999 
   1000 <div><fiddle-embed name="2964297993747769b0760874c19e0168"><div>A black circle drawn on a blue background provides an image to copy.
   1001 <a href="#SkCanvas_readPixels">readPixels</a> copies one quarter of the canvas into each of the four corners.
   1002 The copied quarter circles overdraw the original circle.</div></fiddle-embed></div>
   1003 
   1004 ### Example
   1005 
   1006 <div><fiddle-embed name="481e990e923a0ed34654f4361b94f096"><div><a href="#Canvas">Canvas</a> returned by <a href="undocumented#Raster_Surface">Raster Surface</a> has <a href="#Premultiply">Premultiplied</a> pixel values.
   1007 <a href="#SkCanvas_clear">clear</a> takes <a href="#Unpremultiply">Unpremultiplied</a> input with <a href="#Alpha">Color Alpha</a> equal 0x80
   1008 and <a href="#RGB">Color RGB</a> equal 0x55, 0xAA, 0xFF. <a href="#RGB">Color RGB</a> is multiplied by <a href="#Alpha">Color Alpha</a>
   1009 to generate <a href="#Premultiply">Premultiplied</a> value 0x802B5580. <a href="#SkCanvas_readPixels">readPixels</a> converts pixel back
   1010 to <a href="#Unpremultiply">Unpremultiplied</a> value 0x8056A9FF, introducing error.</div>
   1011 
   1012 #### Example Output
   1013 
   1014 ~~~~
   1015 pixel = 802b5580
   1016 pixel = 8056a9ff
   1017 ~~~~
   1018 
   1019 </fiddle-embed></div>
   1020 
   1021 ### See Also
   1022 
   1023 <a href="#SkCanvas_peekPixels">peekPixels</a> <a href="#SkCanvas_writePixels">writePixels</a><sup><a href="#SkCanvas_writePixels_2">[2]</a></sup> <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkBitmap_readPixels">SkBitmap::readPixels</a><sup><a href="#SkBitmap_readPixels_2">[2]</a></sup><sup><a href="#SkBitmap_readPixels_3">[3]</a></sup><sup><a href="#SkBitmap_readPixels_4">[4]</a></sup> <a href="#SkPixmap_readPixels">SkPixmap::readPixels</a><sup><a href="#SkPixmap_readPixels_2">[2]</a></sup><sup><a href="#SkPixmap_readPixels_3">[3]</a></sup><sup><a href="#SkPixmap_readPixels_4">[4]</a></sup><sup><a href="#SkPixmap_readPixels_5">[5]</a></sup> <a href="#SkImage_readPixels">SkImage::readPixels</a><sup><a href="#SkImage_readPixels_2">[2]</a></sup> <a href="#SkSurface_readPixels">SkSurface::readPixels</a><sup><a href="#SkSurface_readPixels_2">[2]</a></sup><sup><a href="#SkSurface_readPixels_3">[3]</a></sup>
   1024 
   1025 ---
   1026 
   1027 <a name="SkCanvas_readPixels_2"></a>
   1028 
   1029 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1030 bool readPixels(const SkPixmap& pixmap, int srcX, int srcY)
   1031 </pre>
   1032 
   1033 Copies <a href="SkRect_Reference#Rect">Rect</a> of pixels from <a href="#Canvas">Canvas</a> into <a href="#SkCanvas_readPixels_2_pixmap">pixmap</a>. <a href="#Matrix">Matrix</a> and <a href="#Clip">Clip</a> are
   1034 ignored.
   1035 
   1036 Source <a href="SkRect_Reference#Rect">Rect</a> corners are (<a href="#SkCanvas_readPixels_2_srcX">srcX</a>, <a href="#SkCanvas_readPixels_2_srcY">srcY</a>) and (<a href="#SkCanvas_imageInfo">imageInfo</a>.width(), <a href="#SkCanvas_imageInfo">imageInfo</a>.height()).
   1037 Destination <a href="SkRect_Reference#Rect">Rect</a> corners are (0, 0) and (<a href="#SkCanvas_readPixels_2_pixmap">pixmap</a>.width(), <a href="#SkCanvas_readPixels_2_pixmap">pixmap</a>.height()).
   1038 Copies each readable pixel intersecting both rectangles, without scaling,
   1039 converting to <a href="#SkCanvas_readPixels_2_pixmap">pixmap</a>.colorType() and <a href="#SkCanvas_readPixels_2_pixmap">pixmap</a>.alphaType() if required.
   1040 
   1041 Pixels are readable when <a href="undocumented#Device">Device</a> is raster, or backed by a GPU.
   1042 Pixels are not readable when <a href="#SkCanvas">SkCanvas</a> is returned by <a href="#SkDocument_beginPage">SkDocument::beginPage</a>,
   1043 returned by <a href="#SkPictureRecorder_beginRecording">SkPictureRecorder::beginRecording</a>, or <a href="#Canvas">Canvas</a> is the base of a utility
   1044 class like <a href="undocumented#SkDumpCanvas">SkDumpCanvas</a>.
   1045 
   1046 Caller must allocate pixel storage in <a href="#SkCanvas_readPixels_2_pixmap">pixmap</a> if needed.
   1047 
   1048 <a href="undocumented#Pixel">Pixel</a> values are converted only if <a href="SkImageInfo_Reference#Color_Type">Color Type</a> and <a href="SkImageInfo_Reference#Alpha_Type">Alpha Type</a>
   1049 do not match. Only pixels within both source and destination <a href="#Rect">Rects</a>
   1050 are copied. <a href="#SkCanvas_readPixels_2_pixmap">pixmap</a> pixels contents outside <a href="SkRect_Reference#Rect">Rect</a> intersection are unchanged.
   1051 
   1052 Pass negative values for <a href="#SkCanvas_readPixels_2_srcX">srcX</a> or <a href="#SkCanvas_readPixels_2_srcY">srcY</a> to offset pixels across or down <a href="#SkCanvas_readPixels_2_pixmap">pixmap</a>.
   1053 
   1054 Does not copy, and returns false if:
   1055 
   1056 <table>  <tr>
   1057     <td>Source and destination rectangles do not intersect.</td>  </tr>  <tr>
   1058     <td><a href="#Canvas">Canvas</a> pixels could not be converted to <a href="#SkCanvas_readPixels_2_pixmap">pixmap</a>.colorType() or <a href="#SkCanvas_readPixels_2_pixmap">pixmap</a>.alphaType().</td>  </tr>  <tr>
   1059     <td><a href="#Canvas">Canvas</a> pixels are not readable; for instance, <a href="#Canvas">Canvas</a> is document-based.</td>  </tr>  <tr>
   1060     <td><a href="SkPixmap_Reference#Pixmap">Pixmap</a> pixels could not be allocated.</td>  </tr>  <tr>
   1061     <td><a href="#SkCanvas_readPixels_2_pixmap">pixmap</a>.rowBytes() is too small to contain one row of pixels.</td>  </tr>
   1062 </table>
   1063 
   1064 ### Parameters
   1065 
   1066 <table>  <tr>    <td><a name="SkCanvas_readPixels_2_pixmap"> <code><strong>pixmap </strong></code> </a></td> <td>
   1067 storage for pixels copied from <a href="#Canvas">Canvas</a></td>
   1068   </tr>  <tr>    <td><a name="SkCanvas_readPixels_2_srcX"> <code><strong>srcX </strong></code> </a></td> <td>
   1069 offset into readable pixels in x; may be negative</td>
   1070   </tr>  <tr>    <td><a name="SkCanvas_readPixels_2_srcY"> <code><strong>srcY </strong></code> </a></td> <td>
   1071 offset into readable pixels in y; may be negative</td>
   1072   </tr>
   1073 </table>
   1074 
   1075 ### Return Value
   1076 
   1077 true if pixels were copied
   1078 
   1079 ### Example
   1080 
   1081 <div><fiddle-embed name="85f199032943b6483722c34a91c4e20f"><div><a href="#SkCanvas_clear">clear</a> takes <a href="#Unpremultiply">Unpremultiplied</a> input with <a href="#Alpha">Color Alpha</a> equal 0x80
   1082 and <a href="#RGB">Color RGB</a> equal 0x55, 0xAA, 0xFF. <a href="#RGB">Color RGB</a> is multiplied by <a href="#Alpha">Color Alpha</a>
   1083 to generate <a href="#Premultiply">Premultiplied</a> value 0x802B5580.</div>
   1084 
   1085 #### Example Output
   1086 
   1087 ~~~~
   1088 pixel = 802b5580
   1089 ~~~~
   1090 
   1091 </fiddle-embed></div>
   1092 
   1093 ### See Also
   1094 
   1095 <a href="#SkCanvas_peekPixels">peekPixels</a> <a href="#SkCanvas_writePixels">writePixels</a><sup><a href="#SkCanvas_writePixels_2">[2]</a></sup> <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkBitmap_readPixels">SkBitmap::readPixels</a><sup><a href="#SkBitmap_readPixels_2">[2]</a></sup><sup><a href="#SkBitmap_readPixels_3">[3]</a></sup><sup><a href="#SkBitmap_readPixels_4">[4]</a></sup> <a href="#SkPixmap_readPixels">SkPixmap::readPixels</a><sup><a href="#SkPixmap_readPixels_2">[2]</a></sup><sup><a href="#SkPixmap_readPixels_3">[3]</a></sup><sup><a href="#SkPixmap_readPixels_4">[4]</a></sup><sup><a href="#SkPixmap_readPixels_5">[5]</a></sup> <a href="#SkImage_readPixels">SkImage::readPixels</a><sup><a href="#SkImage_readPixels_2">[2]</a></sup> <a href="#SkSurface_readPixels">SkSurface::readPixels</a><sup><a href="#SkSurface_readPixels_2">[2]</a></sup><sup><a href="#SkSurface_readPixels_3">[3]</a></sup>
   1096 
   1097 ---
   1098 
   1099 <a name="SkCanvas_readPixels_3"></a>
   1100 
   1101 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1102 bool readPixels(const SkBitmap& bitmap, int srcX, int srcY)
   1103 </pre>
   1104 
   1105 Copies <a href="SkRect_Reference#Rect">Rect</a> of pixels from <a href="#Canvas">Canvas</a> into <a href="#SkCanvas_readPixels_3_bitmap">bitmap</a>. <a href="#Matrix">Matrix</a> and <a href="#Clip">Clip</a> are
   1106 ignored.
   1107 
   1108 Source <a href="SkRect_Reference#Rect">Rect</a> corners are (<a href="#SkCanvas_readPixels_3_srcX">srcX</a>, <a href="#SkCanvas_readPixels_3_srcY">srcY</a>) and (<a href="#SkCanvas_imageInfo">imageInfo</a>.width(), <a href="#SkCanvas_imageInfo">imageInfo</a>.height()).
   1109 Destination <a href="SkRect_Reference#Rect">Rect</a> corners are (0, 0) and (<a href="#SkCanvas_readPixels_3_bitmap">bitmap</a>.width(), <a href="#SkCanvas_readPixels_3_bitmap">bitmap</a>.height()).
   1110 Copies each readable pixel intersecting both rectangles, without scaling,
   1111 converting to <a href="#SkCanvas_readPixels_3_bitmap">bitmap</a>.colorType() and <a href="#SkCanvas_readPixels_3_bitmap">bitmap</a>.alphaType() if required.
   1112 
   1113 Pixels are readable when <a href="undocumented#Device">Device</a> is raster, or backed by a GPU.
   1114 Pixels are not readable when <a href="#SkCanvas">SkCanvas</a> is returned by <a href="#SkDocument_beginPage">SkDocument::beginPage</a>,
   1115 returned by <a href="#SkPictureRecorder_beginRecording">SkPictureRecorder::beginRecording</a>, or <a href="#Canvas">Canvas</a> is the base of a utility
   1116 class like <a href="undocumented#SkDumpCanvas">SkDumpCanvas</a>.
   1117 
   1118 Caller must allocate pixel storage in <a href="#SkCanvas_readPixels_3_bitmap">bitmap</a> if needed.
   1119 
   1120 <a href="SkBitmap_Reference#Bitmap">Bitmap</a> values are converted only if <a href="SkImageInfo_Reference#Color_Type">Color Type</a> and <a href="SkImageInfo_Reference#Alpha_Type">Alpha Type</a>
   1121 do not match. Only pixels within both source and destination rectangles
   1122 are copied. <a href="SkBitmap_Reference#Bitmap">Bitmap</a> pixels outside <a href="SkRect_Reference#Rect">Rect</a> intersection are unchanged.
   1123 
   1124 Pass negative values for <a href="#SkCanvas_readPixels_3_srcX">srcX</a> or <a href="#SkCanvas_readPixels_3_srcY">srcY</a> to offset pixels across or down <a href="#SkCanvas_readPixels_3_bitmap">bitmap</a>.
   1125 
   1126 Does not copy, and returns false if:
   1127 
   1128 <table>  <tr>
   1129     <td>Source and destination rectangles do not intersect.</td>  </tr>  <tr>
   1130     <td><a href="#Canvas">Canvas</a> pixels could not be converted to <a href="#SkCanvas_readPixels_3_bitmap">bitmap</a>.colorType() or <a href="#SkCanvas_readPixels_3_bitmap">bitmap</a>.alphaType().</td>  </tr>  <tr>
   1131     <td><a href="#Canvas">Canvas</a> pixels are not readable; for instance, <a href="#Canvas">Canvas</a> is document-based.</td>  </tr>  <tr>
   1132     <td><a href="#SkCanvas_readPixels_3_bitmap">bitmap</a> pixels could not be allocated.</td>  </tr>  <tr>
   1133     <td><a href="#SkCanvas_readPixels_3_bitmap">bitmap</a>.rowBytes() is too small to contain one row of pixels.</td>  </tr>
   1134 </table>
   1135 
   1136 ### Parameters
   1137 
   1138 <table>  <tr>    <td><a name="SkCanvas_readPixels_3_bitmap"> <code><strong>bitmap </strong></code> </a></td> <td>
   1139 storage for pixels copied from <a href="#Canvas">Canvas</a></td>
   1140   </tr>  <tr>    <td><a name="SkCanvas_readPixels_3_srcX"> <code><strong>srcX </strong></code> </a></td> <td>
   1141 offset into readable pixels in x; may be negative</td>
   1142   </tr>  <tr>    <td><a name="SkCanvas_readPixels_3_srcY"> <code><strong>srcY </strong></code> </a></td> <td>
   1143 offset into readable pixels in y; may be negative</td>
   1144   </tr>
   1145 </table>
   1146 
   1147 ### Return Value
   1148 
   1149 true if pixels were copied
   1150 
   1151 ### Example
   1152 
   1153 <div><fiddle-embed name="af6dec8ef974aa67bf102f29915bcd6a"><div><a href="#SkCanvas_clear">clear</a> takes <a href="#Unpremultiply">Unpremultiplied</a> input with <a href="#Alpha">Color Alpha</a> equal 0x80
   1154 and <a href="#RGB">Color RGB</a> equal 0x55, 0xAA, 0xFF. <a href="#RGB">Color RGB</a> is multiplied by <a href="#Alpha">Color Alpha</a>
   1155 to generate <a href="#Premultiply">Premultiplied</a> value 0x802B5580.</div>
   1156 
   1157 #### Example Output
   1158 
   1159 ~~~~
   1160 pixel = 802b5580
   1161 ~~~~
   1162 
   1163 </fiddle-embed></div>
   1164 
   1165 ### See Also
   1166 
   1167 <a href="#SkCanvas_peekPixels">peekPixels</a> <a href="#SkCanvas_writePixels">writePixels</a><sup><a href="#SkCanvas_writePixels_2">[2]</a></sup> <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkBitmap_readPixels">SkBitmap::readPixels</a><sup><a href="#SkBitmap_readPixels_2">[2]</a></sup><sup><a href="#SkBitmap_readPixels_3">[3]</a></sup><sup><a href="#SkBitmap_readPixels_4">[4]</a></sup> <a href="#SkPixmap_readPixels">SkPixmap::readPixels</a><sup><a href="#SkPixmap_readPixels_2">[2]</a></sup><sup><a href="#SkPixmap_readPixels_3">[3]</a></sup><sup><a href="#SkPixmap_readPixels_4">[4]</a></sup><sup><a href="#SkPixmap_readPixels_5">[5]</a></sup> <a href="#SkImage_readPixels">SkImage::readPixels</a><sup><a href="#SkImage_readPixels_2">[2]</a></sup> <a href="#SkSurface_readPixels">SkSurface::readPixels</a><sup><a href="#SkSurface_readPixels_2">[2]</a></sup><sup><a href="#SkSurface_readPixels_3">[3]</a></sup>
   1168 
   1169 ---
   1170 
   1171 <a name="SkCanvas_writePixels"></a>
   1172 ## writePixels
   1173 
   1174 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1175 bool writePixels(const SkImageInfo& info, const void* pixels, size_t rowBytes, int x, int y)
   1176 </pre>
   1177 
   1178 Copies <a href="SkRect_Reference#Rect">Rect</a> from <a href="#SkCanvas_writePixels_pixels">pixels</a> to <a href="#Canvas">Canvas</a>. <a href="#Matrix">Matrix</a> and <a href="#Clip">Clip</a> are ignored.
   1179 Source <a href="SkRect_Reference#Rect">Rect</a> corners are (0, 0) and (<a href="#SkCanvas_writePixels_info">info</a>.width(), <a href="#SkCanvas_writePixels_info">info</a>.height()).
   1180 Destination <a href="SkRect_Reference#Rect">Rect</a> corners are (<a href="#SkCanvas_writePixels_x">x</a>, <a href="#SkCanvas_writePixels_y">y</a>) and
   1181 (<a href="#SkCanvas_imageInfo">imageInfo</a>.width(), <a href="#SkCanvas_imageInfo">imageInfo</a>.height()).
   1182 
   1183 Copies each readable pixel intersecting both rectangles, without scaling,
   1184 converting to <a href="#SkCanvas_imageInfo">imageInfo</a>.colorType() and <a href="#SkCanvas_imageInfo">imageInfo</a>.alphaType() if required.
   1185 
   1186 Pixels are writable when <a href="undocumented#Device">Device</a> is raster, or backed by a GPU.
   1187 Pixels are not writable when <a href="#SkCanvas">SkCanvas</a> is returned by <a href="#SkDocument_beginPage">SkDocument::beginPage</a>,
   1188 returned by <a href="#SkPictureRecorder_beginRecording">SkPictureRecorder::beginRecording</a>, or <a href="#Canvas">Canvas</a> is the base of a utility
   1189 class like <a href="undocumented#SkDumpCanvas">SkDumpCanvas</a>.
   1190 
   1191 <a href="undocumented#Pixel">Pixel</a> values are converted only if <a href="SkImageInfo_Reference#Color_Type">Color Type</a> and <a href="SkImageInfo_Reference#Alpha_Type">Alpha Type</a>
   1192 do not match. Only <a href="#SkCanvas_writePixels_pixels">pixels</a> within both source and destination rectangles
   1193 are copied. <a href="#Canvas">Canvas</a> <a href="#SkCanvas_writePixels_pixels">pixels</a> outside <a href="SkRect_Reference#Rect">Rect</a> intersection are unchanged.
   1194 
   1195 Pass negative values for <a href="#SkCanvas_writePixels_x">x</a> or <a href="#SkCanvas_writePixels_y">y</a> to offset <a href="#SkCanvas_writePixels_pixels">pixels</a> to the left or
   1196 above <a href="#Canvas">Canvas</a> <a href="#SkCanvas_writePixels_pixels">pixels</a>.
   1197 
   1198 Does not copy, and returns false if:
   1199 
   1200 <table>  <tr>
   1201     <td>Source and destination rectangles do not intersect.</td>  </tr>  <tr>
   1202     <td><a href="#SkCanvas_writePixels_pixels">pixels</a> could not be converted to <a href="#Canvas">Canvas</a> <a href="#SkCanvas_imageInfo">imageInfo</a>.colorType() or
   1203 <a href="#SkCanvas_imageInfo">imageInfo</a>.alphaType().</td>  </tr>  <tr>
   1204     <td><a href="#Canvas">Canvas</a> <a href="#SkCanvas_writePixels_pixels">pixels</a> are not writable; for instance, <a href="#Canvas">Canvas</a> is document-based.</td>  </tr>  <tr>
   1205     <td><a href="#SkCanvas_writePixels_rowBytes">rowBytes</a> is too small to contain one row of <a href="#SkCanvas_writePixels_pixels">pixels</a>.</td>  </tr>
   1206 </table>
   1207 
   1208 ### Parameters
   1209 
   1210 <table>  <tr>    <td><a name="SkCanvas_writePixels_info"> <code><strong>info </strong></code> </a></td> <td>
   1211 width, height, <a href="SkImageInfo_Reference#Color_Type">Color Type</a>, and <a href="SkImageInfo_Reference#Alpha_Type">Alpha Type</a> of <a href="#SkCanvas_writePixels_pixels">pixels</a></td>
   1212   </tr>  <tr>    <td><a name="SkCanvas_writePixels_pixels"> <code><strong>pixels </strong></code> </a></td> <td>
   1213 <a href="#SkCanvas_writePixels_pixels">pixels</a> to copy, of size <a href="#SkCanvas_writePixels_info">info</a>.height() times <a href="#SkCanvas_writePixels_rowBytes">rowBytes</a>, or larger</td>
   1214   </tr>  <tr>    <td><a name="SkCanvas_writePixels_rowBytes"> <code><strong>rowBytes </strong></code> </a></td> <td>
   1215 size of one row of <a href="#SkCanvas_writePixels_pixels">pixels</a>; <a href="#SkCanvas_writePixels_info">info</a>.width() times pixel size, or larger</td>
   1216   </tr>  <tr>    <td><a name="SkCanvas_writePixels_x"> <code><strong>x </strong></code> </a></td> <td>
   1217 offset into <a href="#Canvas">Canvas</a> writable <a href="#SkCanvas_writePixels_pixels">pixels</a> in <a href="#SkCanvas_writePixels_x">x</a>; may be negative</td>
   1218   </tr>  <tr>    <td><a name="SkCanvas_writePixels_y"> <code><strong>y </strong></code> </a></td> <td>
   1219 offset into <a href="#Canvas">Canvas</a> writable <a href="#SkCanvas_writePixels_pixels">pixels</a> in <a href="#SkCanvas_writePixels_y">y</a>; may be negative</td>
   1220   </tr>
   1221 </table>
   1222 
   1223 ### Return Value
   1224 
   1225 true if <a href="#SkCanvas_writePixels_pixels">pixels</a> were written to <a href="#Canvas">Canvas</a>
   1226 
   1227 ### Example
   1228 
   1229 <div><fiddle-embed name="29b98ebf58aa9fd1edfaabf9f4490b3a"></fiddle-embed></div>
   1230 
   1231 ### See Also
   1232 
   1233 <a href="#SkCanvas_readPixels">readPixels</a><sup><a href="#SkCanvas_readPixels_2">[2]</a></sup><sup><a href="#SkCanvas_readPixels_3">[3]</a></sup> <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkBitmap_writePixels">SkBitmap::writePixels</a><sup><a href="#SkBitmap_writePixels_2">[2]</a></sup><sup><a href="#SkBitmap_writePixels_3">[3]</a></sup>
   1234 
   1235 ---
   1236 
   1237 <a name="SkCanvas_writePixels_2"></a>
   1238 
   1239 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1240 bool writePixels(const SkBitmap& bitmap, int x, int y)
   1241 </pre>
   1242 
   1243 Copies <a href="SkRect_Reference#Rect">Rect</a> from pixels to <a href="#Canvas">Canvas</a>. <a href="#Matrix">Matrix</a> and <a href="#Clip">Clip</a> are ignored.
   1244 Source <a href="SkRect_Reference#Rect">Rect</a> corners are (0, 0) and (<a href="#SkCanvas_writePixels_2_bitmap">bitmap</a>.width(), <a href="#SkCanvas_writePixels_2_bitmap">bitmap</a>.height()).
   1245 
   1246 Destination <a href="SkRect_Reference#Rect">Rect</a> corners are (<a href="#SkCanvas_writePixels_2_x">x</a>, <a href="#SkCanvas_writePixels_2_y">y</a>) and
   1247 (<a href="#SkCanvas_imageInfo">imageInfo</a>.width(), <a href="#SkCanvas_imageInfo">imageInfo</a>.height()).
   1248 
   1249 Copies each readable pixel intersecting both rectangles, without scaling,
   1250 converting to <a href="#SkCanvas_imageInfo">imageInfo</a>.colorType() and <a href="#SkCanvas_imageInfo">imageInfo</a>.alphaType() if required.
   1251 
   1252 Pixels are writable when <a href="undocumented#Device">Device</a> is raster, or backed by a GPU.
   1253 Pixels are not writable when <a href="#SkCanvas">SkCanvas</a> is returned by <a href="#SkDocument_beginPage">SkDocument::beginPage</a>,
   1254 returned by <a href="#SkPictureRecorder_beginRecording">SkPictureRecorder::beginRecording</a>, or <a href="#Canvas">Canvas</a> is the base of a utility
   1255 class like <a href="undocumented#SkDumpCanvas">SkDumpCanvas</a>.
   1256 
   1257 <a href="undocumented#Pixel">Pixel</a> values are converted only if <a href="SkImageInfo_Reference#Color_Type">Color Type</a> and <a href="SkImageInfo_Reference#Alpha_Type">Alpha Type</a>
   1258 do not match. Only pixels within both source and destination rectangles
   1259 are copied. <a href="#Canvas">Canvas</a> pixels outside <a href="SkRect_Reference#Rect">Rect</a> intersection are unchanged.
   1260 
   1261 Pass negative values for <a href="#SkCanvas_writePixels_2_x">x</a> or <a href="#SkCanvas_writePixels_2_y">y</a> to offset pixels to the left or
   1262 above <a href="#Canvas">Canvas</a> pixels.
   1263 
   1264 Does not copy, and returns false if:
   1265 
   1266 <table>  <tr>
   1267     <td>Source and destination rectangles do not intersect.</td>  </tr>  <tr>
   1268     <td><a href="#SkCanvas_writePixels_2_bitmap">bitmap</a> does not have allocated pixels.</td>  </tr>  <tr>
   1269     <td><a href="#SkCanvas_writePixels_2_bitmap">bitmap</a> pixels could not be converted to <a href="#Canvas">Canvas</a> <a href="#SkCanvas_imageInfo">imageInfo</a>.colorType() or
   1270 <a href="#SkCanvas_imageInfo">imageInfo</a>.alphaType().</td>  </tr>  <tr>
   1271     <td><a href="#Canvas">Canvas</a> pixels are not writable; for instance, <a href="#Canvas">Canvas</a> is document based.</td>  </tr>  <tr>
   1272     <td><a href="#SkCanvas_writePixels_2_bitmap">bitmap</a> pixels are inaccessible; for instance, <a href="#SkCanvas_writePixels_2_bitmap">bitmap</a> wraps a texture.</td>  </tr>
   1273 </table>
   1274 
   1275 ### Parameters
   1276 
   1277 <table>  <tr>    <td><a name="SkCanvas_writePixels_2_bitmap"> <code><strong>bitmap </strong></code> </a></td> <td>
   1278 contains pixels copied to <a href="#Canvas">Canvas</a></td>
   1279   </tr>  <tr>    <td><a name="SkCanvas_writePixels_2_x"> <code><strong>x </strong></code> </a></td> <td>
   1280 offset into <a href="#Canvas">Canvas</a> writable pixels in <a href="#SkCanvas_writePixels_2_x">x</a>; may be negative</td>
   1281   </tr>  <tr>    <td><a name="SkCanvas_writePixels_2_y"> <code><strong>y </strong></code> </a></td> <td>
   1282 offset into <a href="#Canvas">Canvas</a> writable pixels in <a href="#SkCanvas_writePixels_2_y">y</a>; may be negative</td>
   1283   </tr>
   1284 </table>
   1285 
   1286 ### Return Value
   1287 
   1288 true if pixels were written to <a href="#Canvas">Canvas</a>
   1289 
   1290 ### Example
   1291 
   1292 <div><fiddle-embed name="8b128e067881f9251357653692fa28da"></fiddle-embed></div>
   1293 
   1294 ### See Also
   1295 
   1296 <a href="#SkCanvas_readPixels">readPixels</a><sup><a href="#SkCanvas_readPixels_2">[2]</a></sup><sup><a href="#SkCanvas_readPixels_3">[3]</a></sup> <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkBitmap_writePixels">SkBitmap::writePixels</a><sup><a href="#SkBitmap_writePixels_2">[2]</a></sup><sup><a href="#SkBitmap_writePixels_3">[3]</a></sup>
   1297 
   1298 ---
   1299 
   1300 ## <a name="State_Stack"></a> State Stack
   1301 
   1302 <a href="#Canvas">Canvas</a> maintains a stack of state that allows hierarchical drawing, commonly used
   1303 to implement windows and views. The initial state has an identity matrix and and
   1304 an infinite clip. Even with a wide-open clip, drawing is constrained by the
   1305 bounds of the <a href="#Canvas">Canvas</a> <a href="SkSurface_Reference#Surface">Surface</a> or <a href="undocumented#Device">Device</a>.
   1306 
   1307 <a href="#Canvas">Canvas</a> savable state consists of <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a>.
   1308 <a href="#Clip">Clip</a> describes the area that may be drawn to.
   1309 <a href="#Matrix">Matrix</a> transforms the geometry.
   1310 <a href="undocumented#Draw_Filter">Draw Filter</a> (deprecated on most platforms) modifies the paint before drawing.
   1311 
   1312 <a href="#SkCanvas_save">save</a>, <a href="#SkCanvas_saveLayer">saveLayer</a>, <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a>, and <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a>
   1313 save state and return the depth of the stack.
   1314 
   1315 <a href="#SkCanvas_restore">restore</a>, <a href="#SkCanvas_restoreToCount">restoreToCount</a>, and
   1316 
   1317 ### Example
   1318 
   1319 <div><fiddle-embed name="a4548baa133302e933b4d3442c06f5b3"><div>Draw to ever smaller clips; then restore drawing to full canvas.
   1320 Note that the second <a href="#SkCanvas_clipRect">clipRect</a> is not permitted to enlarge <a href="#Clip">Clip</a>.</div></fiddle-embed></div>
   1321 
   1322 Each <a href="#Clip">Clip</a> uses the current <a href="#Matrix">Matrix</a> for its coordinates.
   1323 
   1324 ### Example
   1325 
   1326 <div><fiddle-embed name="9f563a2d60aa31d4b26742e5aa17aa4e"><div>While <a href="#SkCanvas_clipRect">clipRect</a> is given the same rectangle twice, <a href="#Matrix">Matrix</a> makes the second
   1327 <a href="#SkCanvas_clipRect">clipRect</a> draw at half the size of the first.</div></fiddle-embed></div>
   1328 
   1329 ### See Also
   1330 
   1331 <a href="#SkCanvas_save">save</a> <a href="#SkCanvas_saveLayer">saveLayer</a><sup><a href="#SkCanvas_saveLayer_2">[2]</a></sup><sup><a href="#SkCanvas_saveLayer_3">[3]</a></sup> <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a> <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a> <a href="#SkCanvas_restore">restore</a> <a href="#SkCanvas_restoreToCount">restoreToCount</a>
   1332 
   1333 <a name="SkCanvas_save"></a>
   1334 ## save
   1335 
   1336 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1337 int save()
   1338 </pre>
   1339 
   1340 Saves <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a> (<a href="undocumented#Draw_Filter">Draw Filter</a> deprecated on most platforms).
   1341 Calling <a href="#SkCanvas_restore">restore</a> discards changes to <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a>,
   1342 restoring the <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a> to their state when <a href="#SkCanvas_save">save</a> was called.
   1343 
   1344 <a href="#Matrix">Matrix</a> may be changed by <a href="#SkCanvas_translate">translate</a>, <a href="#SkCanvas_scale">scale</a>, <a href="#SkCanvas_rotate">rotate</a>, <a href="#SkCanvas_skew">skew</a>, <a href="#SkCanvas_concat">concat</a>, <a href="#SkCanvas_setMatrix">setMatrix</a>,
   1345 and <a href="#SkCanvas_resetMatrix">resetMatrix</a>. <a href="#Clip">Clip</a> may be changed by <a href="#SkCanvas_clipRect">clipRect</a>, <a href="#SkCanvas_clipRRect">clipRRect</a>, <a href="#SkCanvas_clipPath">clipPath</a>, <a href="#SkCanvas_clipRegion">clipRegion</a>.
   1346 
   1347 Saved <a href="#Canvas">Canvas</a> state is put on a stack; multiple calls to <a href="#SkCanvas_save">save</a> should be balance
   1348 by an equal number of calls to <a href="#SkCanvas_restore">restore</a>.
   1349 
   1350 Call <a href="#SkCanvas_restoreToCount">restoreToCount</a> with result to restore this and subsequent saves.
   1351 
   1352 ### Return Value
   1353 
   1354 depth of saved stack
   1355 
   1356 ### Example
   1357 
   1358 <div><fiddle-embed name="e477dce358a9ba3b0aa1bf33b8a376de"><div>The black square is translated 50 pixels down and to the right.
   1359 Restoring <a href="#Canvas">Canvas</a> state removes <a href="#SkCanvas_translate">translate</a> from <a href="#Canvas">Canvas</a> stack;
   1360 the red square is not translated, and is drawn at the origin.</div></fiddle-embed></div>
   1361 
   1362 ### See Also
   1363 
   1364 <a href="#SkCanvas_saveLayer">saveLayer</a><sup><a href="#SkCanvas_saveLayer_2">[2]</a></sup><sup><a href="#SkCanvas_saveLayer_3">[3]</a></sup> <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a> <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a> <a href="#SkCanvas_restore">restore</a> <a href="#SkCanvas_restoreToCount">restoreToCount</a>
   1365 
   1366 ---
   1367 
   1368 <a name="SkCanvas_restore"></a>
   1369 ## restore
   1370 
   1371 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1372 void restore()
   1373 </pre>
   1374 
   1375 Removes changes to <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a> since <a href="#Canvas">Canvas</a> state was
   1376 last saved. The state is removed from the stack.
   1377 
   1378 Does nothing if the stack is empty.
   1379 
   1380 ### Example
   1381 
   1382 <div><fiddle-embed name="e78471212a67f2f4fd39496e17a30d17"></fiddle-embed></div>
   1383 
   1384 ### See Also
   1385 
   1386 <a href="#SkCanvas_save">save</a> <a href="#SkCanvas_saveLayer">saveLayer</a><sup><a href="#SkCanvas_saveLayer_2">[2]</a></sup><sup><a href="#SkCanvas_saveLayer_3">[3]</a></sup> <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a> <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a> <a href="#SkCanvas_restoreToCount">restoreToCount</a>
   1387 
   1388 ---
   1389 
   1390 <a name="SkCanvas_getSaveCount"></a>
   1391 ## getSaveCount
   1392 
   1393 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1394 int getSaveCount() const
   1395 </pre>
   1396 
   1397 Returns the number of saved states, each containing: <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a>.
   1398 Equals the number of <a href="#SkCanvas_save">save</a> calls less the number of <a href="#SkCanvas_restore">restore</a> calls plus one.
   1399 The save count of a new canvas is one.
   1400 
   1401 ### Return Value
   1402 
   1403 depth of save state stack
   1404 
   1405 ### Example
   1406 
   1407 <div><fiddle-embed name="005f2b207e078baac596681924fe591e">
   1408 
   1409 #### Example Output
   1410 
   1411 ~~~~
   1412 depth = 1
   1413 depth = 2
   1414 depth = 1
   1415 ~~~~
   1416 
   1417 </fiddle-embed></div>
   1418 
   1419 ### See Also
   1420 
   1421 <a href="#SkCanvas_save">save</a> <a href="#SkCanvas_restore">restore</a> <a href="#SkCanvas_restoreToCount">restoreToCount</a>
   1422 
   1423 ---
   1424 
   1425 <a name="SkCanvas_restoreToCount"></a>
   1426 ## restoreToCount
   1427 
   1428 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1429 void restoreToCount(int saveCount)
   1430 </pre>
   1431 
   1432 Restores state to <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a> values when <a href="#SkCanvas_save">save</a>, <a href="#SkCanvas_saveLayer">saveLayer</a>,
   1433 <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a>, or <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a> returned <a href="#SkCanvas_restoreToCount_saveCount">saveCount</a>.
   1434 
   1435 Does nothing if <a href="#SkCanvas_restoreToCount_saveCount">saveCount</a> is greater than state stack count.
   1436 Restores state to initial values if <a href="#SkCanvas_restoreToCount_saveCount">saveCount</a> is less than or equal to one.
   1437 
   1438 ### Parameters
   1439 
   1440 <table>  <tr>    <td><a name="SkCanvas_restoreToCount_saveCount"> <code><strong>saveCount </strong></code> </a></td> <td>
   1441 depth of state stack to restore</td>
   1442   </tr>
   1443 </table>
   1444 
   1445 ### Example
   1446 
   1447 <div><fiddle-embed name="9ed0d56436e114c7097fd49eed1aea47">
   1448 
   1449 #### Example Output
   1450 
   1451 ~~~~
   1452 depth = 1
   1453 depth = 3
   1454 depth = 1
   1455 ~~~~
   1456 
   1457 </fiddle-embed></div>
   1458 
   1459 ### See Also
   1460 
   1461 <a href="#SkCanvas_restore">restore</a> <a href="#SkCanvas_getSaveCount">getSaveCount</a> <a href="#SkCanvas_save">save</a>
   1462 
   1463 ---
   1464 
   1465 ## <a name="Layer"></a> Layer
   1466 
   1467 <a href="#Layer">Layer</a> allocates a temporary <a href="SkBitmap_Reference#Bitmap">Bitmap</a> to draw into. When the drawing is
   1468 complete, the <a href="SkBitmap_Reference#Bitmap">Bitmap</a> is drawn into the <a href="#Canvas">Canvas</a>.
   1469 
   1470 <a href="#Layer">Layer</a> is saved in a stack along with other saved state. When state with a <a href="#Layer">Layer</a>
   1471 is restored, the <a href="SkBitmap_Reference#Bitmap">Bitmap</a> is drawn into the previous <a href="#Layer">Layer</a>.
   1472 
   1473 <a href="#Layer">Layer</a> may be initialized with the contents of the previous <a href="#Layer">Layer</a>. When <a href="#Layer">Layer</a> is
   1474 restored, its <a href="SkBitmap_Reference#Bitmap">Bitmap</a> can be modified by <a href="SkPaint_Reference#Paint">Paint</a> passed to <a href="#Layer">Layer</a> to apply
   1475 <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Blend_Mode">Blend Mode</a>.
   1476 
   1477 <a name="SkCanvas_saveLayer"></a>
   1478 ## saveLayer
   1479 
   1480 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1481 int saveLayer(const SkRect* bounds, const SkPaint* paint)
   1482 </pre>
   1483 
   1484 Saves <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a> (<a href="undocumented#Draw_Filter">Draw Filter</a> deprecated on most platforms),
   1485 and allocates a <a href="SkBitmap_Reference#Bitmap">Bitmap</a> for subsequent drawing.
   1486 Calling <a href="#SkCanvas_restore">restore</a> discards changes to <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a>,
   1487 and draws the <a href="SkBitmap_Reference#Bitmap">Bitmap</a>.
   1488 
   1489 <a href="#Matrix">Matrix</a> may be changed by <a href="#SkCanvas_translate">translate</a>, <a href="#SkCanvas_scale">scale</a>, <a href="#SkCanvas_rotate">rotate</a>, <a href="#SkCanvas_skew">skew</a>, <a href="#SkCanvas_concat">concat</a>,
   1490 <a href="#SkCanvas_setMatrix">setMatrix</a>, and <a href="#SkCanvas_resetMatrix">resetMatrix</a>. <a href="#Clip">Clip</a> may be changed by <a href="#SkCanvas_clipRect">clipRect</a>, <a href="#SkCanvas_clipRRect">clipRRect</a>,
   1491 <a href="#SkCanvas_clipPath">clipPath</a>, <a href="#SkCanvas_clipRegion">clipRegion</a>.
   1492 
   1493 <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_saveLayer_bounds">bounds</a> suggests but does not define the <a href="SkBitmap_Reference#Bitmap">Bitmap</a> size. To clip drawing to
   1494 a specific rectangle, use <a href="#SkCanvas_clipRect">clipRect</a>.
   1495 
   1496 Optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_saveLayer_paint">paint</a> applies <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and
   1497 <a href="undocumented#Blend_Mode">Blend Mode</a> when <a href="#SkCanvas_restore">restore</a> is called.
   1498 
   1499 Call <a href="#SkCanvas_restoreToCount">restoreToCount</a> with returned value to restore this and subsequent saves.
   1500 
   1501 ### Parameters
   1502 
   1503 <table>  <tr>    <td><a name="SkCanvas_saveLayer_bounds"> <code><strong>bounds </strong></code> </a></td> <td>
   1504 hint to limit the size of the <a href="#Layer">Layer</a>; may be nullptr</td>
   1505   </tr>  <tr>    <td><a name="SkCanvas_saveLayer_paint"> <code><strong>paint </strong></code> </a></td> <td>
   1506 graphics state for <a href="#Layer">Layer</a>; may be nullptr</td>
   1507   </tr>
   1508 </table>
   1509 
   1510 ### Return Value
   1511 
   1512 depth of saved stack
   1513 
   1514 ### Example
   1515 
   1516 <div><fiddle-embed name="1a025d6018f64140af2dc36acad59008"><div>Rectangles are blurred by <a href="undocumented#Image_Filter">Image Filter</a> when <a href="#SkCanvas_restore">restore</a> draws <a href="#Layer">Layer</a> to main
   1517 <a href="#Canvas">Canvas</a>.</div></fiddle-embed></div>
   1518 
   1519 ### See Also
   1520 
   1521 <a href="#SkCanvas_save">save</a> <a href="#SkCanvas_restore">restore</a> <a href="#SkCanvas_saveLayer">saveLayer</a><sup><a href="#SkCanvas_saveLayer_2">[2]</a></sup><sup><a href="#SkCanvas_saveLayer_3">[3]</a></sup> <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a> <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a> <a href="#SkCanvas_SaveLayerRec">SaveLayerRec</a>
   1522 
   1523 ---
   1524 
   1525 <a name="SkCanvas_saveLayer_2"></a>
   1526 
   1527 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1528 int saveLayer(const SkRect& bounds, const SkPaint* paint)
   1529 </pre>
   1530 
   1531 Saves <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a> (<a href="undocumented#Draw_Filter">Draw Filter</a> deprecated on most platforms),
   1532 and allocates a <a href="SkBitmap_Reference#Bitmap">Bitmap</a> for subsequent drawing.
   1533 Calling <a href="#SkCanvas_restore">restore</a> discards changes to <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a>,
   1534 and draws the <a href="SkBitmap_Reference#Bitmap">Bitmap</a>.
   1535 
   1536 <a href="#Matrix">Matrix</a> may be changed by <a href="#SkCanvas_translate">translate</a>, <a href="#SkCanvas_scale">scale</a>, <a href="#SkCanvas_rotate">rotate</a>, <a href="#SkCanvas_skew">skew</a>, <a href="#SkCanvas_concat">concat</a>,
   1537 <a href="#SkCanvas_setMatrix">setMatrix</a>, and <a href="#SkCanvas_resetMatrix">resetMatrix</a>. <a href="#Clip">Clip</a> may be changed by <a href="#SkCanvas_clipRect">clipRect</a>, <a href="#SkCanvas_clipRRect">clipRRect</a>,
   1538 <a href="#SkCanvas_clipPath">clipPath</a>, <a href="#SkCanvas_clipRegion">clipRegion</a>.
   1539 
   1540 <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_saveLayer_2_bounds">bounds</a> suggests but does not define the <a href="#Layer">Layer</a> size. To clip drawing to
   1541 a specific rectangle, use <a href="#SkCanvas_clipRect">clipRect</a>.
   1542 
   1543 Optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_saveLayer_2_paint">paint</a> applies <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and
   1544 <a href="undocumented#Blend_Mode">Blend Mode</a> when <a href="#SkCanvas_restore">restore</a> is called.
   1545 
   1546 Call <a href="#SkCanvas_restoreToCount">restoreToCount</a> with returned value to restore this and subsequent saves.
   1547 
   1548 ### Parameters
   1549 
   1550 <table>  <tr>    <td><a name="SkCanvas_saveLayer_2_bounds"> <code><strong>bounds </strong></code> </a></td> <td>
   1551 hint to limit the size of <a href="#Layer">Layer</a>; may be nullptr</td>
   1552   </tr>  <tr>    <td><a name="SkCanvas_saveLayer_2_paint"> <code><strong>paint </strong></code> </a></td> <td>
   1553 graphics state for <a href="#Layer">Layer</a>; may be nullptr</td>
   1554   </tr>
   1555 </table>
   1556 
   1557 ### Return Value
   1558 
   1559 depth of saved stack
   1560 
   1561 ### Example
   1562 
   1563 <div><fiddle-embed name="5b59231feae0c09cb1ab6a292229d7a4"><div>Rectangles are blurred by <a href="undocumented#Image_Filter">Image Filter</a> when <a href="#SkCanvas_restore">restore</a> draws <a href="#Layer">Layer</a> to main <a href="#Canvas">Canvas</a>.
   1564 The red rectangle is clipped; it does not fully fit on <a href="#Layer">Layer</a>.
   1565 <a href="undocumented#Image_Filter">Image Filter</a> blurs past edge of <a href="#Layer">Layer</a> so red rectangle is blurred on all sides.</div></fiddle-embed></div>
   1566 
   1567 ### See Also
   1568 
   1569 <a href="#SkCanvas_save">save</a> <a href="#SkCanvas_restore">restore</a> <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a> <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a> <a href="#SkCanvas_SaveLayerRec">SaveLayerRec</a>
   1570 
   1571 ---
   1572 
   1573 <a name="SkCanvas_saveLayerPreserveLCDTextRequests"></a>
   1574 ## saveLayerPreserveLCDTextRequests
   1575 
   1576 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1577 int saveLayerPreserveLCDTextRequests(const SkRect* bounds, const SkPaint* paint)
   1578 </pre>
   1579 
   1580 Saves <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a> (<a href="undocumented#Draw_Filter">Draw Filter</a> deprecated on most platforms),
   1581 and allocates a <a href="SkBitmap_Reference#Bitmap">Bitmap</a> for subsequent drawing.
   1582 <a href="SkPaint_Reference#LCD_Text">LCD Text</a> is preserved when the <a href="#Layer">Layer</a> is drawn to the prior <a href="#Layer">Layer</a>.
   1583 
   1584 Calling <a href="#SkCanvas_restore">restore</a> discards changes to <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a>,
   1585 and draws <a href="#Layer">Layer</a>.
   1586 
   1587 <a href="#Matrix">Matrix</a> may be changed by <a href="#SkCanvas_translate">translate</a>, <a href="#SkCanvas_scale">scale</a>, <a href="#SkCanvas_rotate">rotate</a>, <a href="#SkCanvas_skew">skew</a>, <a href="#SkCanvas_concat">concat</a>,
   1588 <a href="#SkCanvas_setMatrix">setMatrix</a>, and <a href="#SkCanvas_resetMatrix">resetMatrix</a>. <a href="#Clip">Clip</a> may be changed by <a href="#SkCanvas_clipRect">clipRect</a>, <a href="#SkCanvas_clipRRect">clipRRect</a>,
   1589 <a href="#SkCanvas_clipPath">clipPath</a>, <a href="#SkCanvas_clipRegion">clipRegion</a>.
   1590 <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_saveLayerPreserveLCDTextRequests_bounds">bounds</a> suggests but does not define the <a href="#Layer">Layer</a> size. To clip drawing to
   1591 a specific rectangle, use <a href="#SkCanvas_clipRect">clipRect</a>.
   1592 
   1593 Optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_saveLayerPreserveLCDTextRequests_paint">paint</a> applies <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and
   1594 <a href="undocumented#Blend_Mode">Blend Mode</a> when <a href="#SkCanvas_restore">restore</a> is called.
   1595 
   1596 Call <a href="#SkCanvas_restoreToCount">restoreToCount</a> with returned value to restore this and subsequent saves.
   1597 
   1598 Draw text on an opaque background so that <a href="SkPaint_Reference#LCD_Text">LCD Text</a> blends correctly with the
   1599 prior <a href="#Layer">Layer</a>. <a href="SkPaint_Reference#LCD_Text">LCD Text</a> drawn on a background with transparency may result in
   1600 incorrect blending.
   1601 
   1602 ### Parameters
   1603 
   1604 <table>  <tr>    <td><a name="SkCanvas_saveLayerPreserveLCDTextRequests_bounds"> <code><strong>bounds </strong></code> </a></td> <td>
   1605 hint to limit the size of <a href="#Layer">Layer</a>; may be nullptr</td>
   1606   </tr>  <tr>    <td><a name="SkCanvas_saveLayerPreserveLCDTextRequests_paint"> <code><strong>paint </strong></code> </a></td> <td>
   1607 graphics state for <a href="#Layer">Layer</a>; may be nullptr</td>
   1608   </tr>
   1609 </table>
   1610 
   1611 ### Return Value
   1612 
   1613 depth of saved stack
   1614 
   1615 ### Example
   1616 
   1617 <div><fiddle-embed name="8460bf8b013f46c67e0bd96e13451aff"></fiddle-embed></div>
   1618 
   1619 ### See Also
   1620 
   1621 <a href="#SkCanvas_save">save</a> <a href="#SkCanvas_restore">restore</a> <a href="#SkCanvas_saveLayer">saveLayer</a><sup><a href="#SkCanvas_saveLayer_2">[2]</a></sup><sup><a href="#SkCanvas_saveLayer_3">[3]</a></sup> <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a> <a href="#SkCanvas_SaveLayerRec">SaveLayerRec</a>
   1622 
   1623 ---
   1624 
   1625 <a name="SkCanvas_saveLayerAlpha"></a>
   1626 ## saveLayerAlpha
   1627 
   1628 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1629 int saveLayerAlpha(const SkRect* bounds, U8CPU alpha)
   1630 </pre>
   1631 
   1632 Saves <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a> (<a href="undocumented#Draw_Filter">Draw Filter</a> deprecated on most platforms),
   1633 and allocates <a href="SkBitmap_Reference#Bitmap">Bitmap</a> for subsequent drawing.
   1634 
   1635 Calling <a href="#SkCanvas_restore">restore</a> discards changes to <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a>,
   1636 and blends <a href="#Layer">Layer</a> with <a href="#SkCanvas_saveLayerAlpha_alpha">alpha</a> opacity onto prior <a href="#Layer">Layer</a>.
   1637 
   1638 <a href="#Matrix">Matrix</a> may be changed by <a href="#SkCanvas_translate">translate</a>, <a href="#SkCanvas_scale">scale</a>, <a href="#SkCanvas_rotate">rotate</a>, <a href="#SkCanvas_skew">skew</a>, <a href="#SkCanvas_concat">concat</a>,
   1639 <a href="#SkCanvas_setMatrix">setMatrix</a>, and <a href="#SkCanvas_resetMatrix">resetMatrix</a>. <a href="#Clip">Clip</a> may be changed by <a href="#SkCanvas_clipRect">clipRect</a>, <a href="#SkCanvas_clipRRect">clipRRect</a>,
   1640 <a href="#SkCanvas_clipPath">clipPath</a>, <a href="#SkCanvas_clipRegion">clipRegion</a>.
   1641 
   1642 <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_saveLayerAlpha_bounds">bounds</a> suggests but does not define <a href="#Layer">Layer</a> size. To clip drawing to
   1643 a specific rectangle, use <a href="#SkCanvas_clipRect">clipRect</a>.
   1644 
   1645 <a href="#SkCanvas_saveLayerAlpha_alpha">alpha</a> of zero is fully transparent, 255 is fully opaque.
   1646 
   1647 Call <a href="#SkCanvas_restoreToCount">restoreToCount</a> with returned value to restore this and subsequent saves.
   1648 
   1649 ### Parameters
   1650 
   1651 <table>  <tr>    <td><a name="SkCanvas_saveLayerAlpha_bounds"> <code><strong>bounds </strong></code> </a></td> <td>
   1652 hint to limit the size of <a href="#Layer">Layer</a>; may be nullptr</td>
   1653   </tr>  <tr>    <td><a name="SkCanvas_saveLayerAlpha_alpha"> <code><strong>alpha </strong></code> </a></td> <td>
   1654 opacity of <a href="#Layer">Layer</a></td>
   1655   </tr>
   1656 </table>
   1657 
   1658 ### Return Value
   1659 
   1660 depth of saved stack
   1661 
   1662 ### Example
   1663 
   1664 <div><fiddle-embed name="8ab88d86fb438856cc48d6e2f08a6e24"></fiddle-embed></div>
   1665 
   1666 ### See Also
   1667 
   1668 <a href="#SkCanvas_save">save</a> <a href="#SkCanvas_restore">restore</a> <a href="#SkCanvas_saveLayer">saveLayer</a><sup><a href="#SkCanvas_saveLayer_2">[2]</a></sup><sup><a href="#SkCanvas_saveLayer_3">[3]</a></sup> <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a> <a href="#SkCanvas_SaveLayerRec">SaveLayerRec</a>
   1669 
   1670 ---
   1671 
   1672 ## <a name="SkCanvas__anonymous"></a> Enum SkCanvas::_anonymous
   1673 
   1674 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1675 enum {
   1676 <a href="#SkCanvas_kIsOpaque_SaveLayerFlag">kIsOpaque SaveLayerFlag</a> = 1 << 0,
   1677 <a href="#SkCanvas_kPreserveLCDText_SaveLayerFlag">kPreserveLCDText SaveLayerFlag</a> = 1 << 1,
   1678 <a href="#SkCanvas_kInitWithPrevious_SaveLayerFlag">kInitWithPrevious SaveLayerFlag</a> = 1 << 2,
   1679 <a href="#SkCanvas_kDontClipToLayer_Legacy_SaveLayerFlag">kDontClipToLayer Legacy SaveLayerFlag</a> = kDontClipToLayer_PrivateSaveLayerFlag,
   1680 };</pre>
   1681 
   1682 <a href="#SkCanvas_SaveLayerFlags">SaveLayerFlags</a> provides options that may be used in any combination in <a href="#SkCanvas_SaveLayerRec">SaveLayerRec</a>,
   1683 defining how <a href="#Layer">Layer</a> allocated by <a href="#SkCanvas_saveLayer">saveLayer</a> operates.
   1684 
   1685 ### Constants
   1686 
   1687 <table>
   1688   <tr>
   1689     <td><a name="SkCanvas_kIsOpaque_SaveLayerFlag"> <code><strong>SkCanvas::kIsOpaque_SaveLayerFlag </strong></code> </a></td><td>1</td><td>Creates <a href="#Layer">Layer</a> without transparency. Flag is ignored if <a href="#Layer">Layer</a> <a href="SkPaint_Reference#Paint">Paint</a> contains
   1690 <a href="undocumented#Image_Filter">Image Filter</a> or <a href="undocumented#Color_Filter">Color Filter</a>.</td>
   1691   </tr>
   1692   <tr>
   1693     <td><a name="SkCanvas_kPreserveLCDText_SaveLayerFlag"> <code><strong>SkCanvas::kPreserveLCDText_SaveLayerFlag </strong></code> </a></td><td>2</td><td>Creates <a href="#Layer">Layer</a> for LCD text. Flag is ignored if <a href="#Layer">Layer</a> <a href="SkPaint_Reference#Paint">Paint</a> contains
   1694 <a href="undocumented#Image_Filter">Image Filter</a> or <a href="undocumented#Color_Filter">Color Filter</a>.</td>
   1695   </tr>
   1696   <tr>
   1697     <td><a name="SkCanvas_kInitWithPrevious_SaveLayerFlag"> <code><strong>SkCanvas::kInitWithPrevious_SaveLayerFlag </strong></code> </a></td><td>4</td><td>Initializes <a href="#Layer">Layer</a> with the contents of the previous <a href="#Layer">Layer</a>.</td>
   1698   </tr>
   1699   <tr>
   1700     <td><a name="SkCanvas_kDontClipToLayer_Legacy_SaveLayerFlag"> <code><strong>SkCanvas::kDontClipToLayer_Legacy_SaveLayerFlag </strong></code> </a></td><td>0x80000000</td><td>Only present on Android.
   1701 Skips setting a clip to the <a href="#Layer">Layer</a> bounds.</td>
   1702   </tr>
   1703 </table>
   1704 
   1705 ### Example
   1706 
   1707 <div><fiddle-embed name="d314c688925d2c549d4762f5cc6e6a1a"><div><a href="#Canvas">Canvas</a> <a href="#Layer">Layer</a> captures red and blue circles scaled up by four.
   1708 scalePaint blends <a href="#Layer">Layer</a> back with transparency.</div></fiddle-embed></div>
   1709 
   1710 ### See Also
   1711 
   1712 <a href="#SkCanvas_save">save</a> <a href="#SkCanvas_restore">restore</a> <a href="#SkCanvas_saveLayer">saveLayer</a><sup><a href="#SkCanvas_saveLayer_2">[2]</a></sup><sup><a href="#SkCanvas_saveLayer_3">[3]</a></sup> <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a> <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a> <a href="#SkCanvas_SaveLayerRec">SaveLayerRec</a>
   1713 
   1714 
   1715 
   1716 # <a name="SkCanvas_SaveLayerRec"></a> Struct SkCanvas::SaveLayerRec
   1717 
   1718 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1719 struct <a href="#SkCanvas_SaveLayerRec_SaveLayerRec">SaveLayerRec</a> {
   1720 <a href="#SkCanvas_SaveLayerRec_SaveLayerRec">SaveLayerRec</a>*(...
   1721 
   1722 const <a href="SkRect_Reference#SkRect">SkRect</a>*           <a href="#SkCanvas_SaveLayerRec_fBounds">fBounds</a>;
   1723 const <a href="SkPaint_Reference#SkPaint">SkPaint</a>*          <a href="#SkCanvas_SaveLayerRec_fPaint">fPaint</a>;
   1724 const <a href="undocumented#SkImageFilter">SkImageFilter</a>*    <a href="#SkCanvas_SaveLayerRec_fBackdrop">fBackdrop</a>;
   1725 <a href="#SkCanvas_SaveLayerFlags">SaveLayerFlags</a>          <a href="#SkCanvas_SaveLayerRec_fSaveLayerFlags">fSaveLayerFlags</a>;
   1726 };</pre>
   1727 
   1728 <a href="#SkCanvas_SaveLayerRec_SaveLayerRec">SaveLayerRec</a> contains the state used to create the <a href="#Layer">Layer</a>.
   1729 
   1730 <a name="SkCanvas_SaveLayerRec_fBounds"> <code><strong>const SkRect*           fBounds</strong></code> </a>
   1731 
   1732 <a href="#SkCanvas_SaveLayerRec_fBounds">fBounds</a> is used as a hint to limit the size of <a href="#Layer">Layer</a>; may be nullptr.
   1733 <a href="#SkCanvas_SaveLayerRec_fBounds">fBounds</a> suggests but does not define <a href="#Layer">Layer</a> size. To clip drawing to
   1734 a specific rectangle, use <a href="#SkCanvas_clipRect">clipRect</a>.
   1735 
   1736 <a name="SkCanvas_SaveLayerRec_fPaint"> <code><strong>const SkPaint*          fPaint</strong></code> </a>
   1737 
   1738 <a href="#SkCanvas_SaveLayerRec_fPaint">fPaint</a> modifies how <a href="#Layer">Layer</a> overlays the prior <a href="#Layer">Layer</a>; may be nullptr.
   1739 <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Draw_Looper">Draw Looper</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and
   1740 <a href="undocumented#Mask_Filter">Mask Filter</a> affect <a href="#Layer">Layer</a> draw.
   1741 
   1742 <a name="SkCanvas_SaveLayerRec_fBackdrop"> <code><strong>const SkImageFilter*    fBackdrop</strong></code> </a>
   1743 
   1744 <a href="#SkCanvas_SaveLayerRec_fBackdrop">fBackdrop</a> applies <a href="undocumented#Image_Filter">Image Filter</a> to the prior <a href="#Layer">Layer</a> when copying to the <a href="#Layer">Layer</a>;
   1745 may be nullptr. Use <a href="#SkCanvas_kInitWithPrevious_SaveLayerFlag">kInitWithPrevious SaveLayerFlag</a> to copy the
   1746 prior <a href="#Layer">Layer</a> without an <a href="undocumented#Image_Filter">Image Filter</a>.
   1747 
   1748 <a name="SkCanvas_SaveLayerRec_fClipMask"> <code><strong>const SkImage*          fClipMask</strong></code> </a>
   1749 
   1750 <a href="#SkCanvas_restore">restore</a> clips <a href="#Layer">Layer</a> by the <a href="#Alpha">Color Alpha</a> channel of <a href="#SkCanvas_SaveLayerRec_fClipMask">fClipMask</a> when
   1751 <a href="#Layer">Layer</a> is copied to <a href="undocumented#Device">Device</a>. <a href="#SkCanvas_SaveLayerRec_fClipMask">fClipMask</a> may be nullptr.    .
   1752 
   1753 <a name="SkCanvas_SaveLayerRec_fClipMatrix"> <code><strong>const SkMatrix*         fClipMatrix</strong></code> </a>
   1754 
   1755 <a href="#SkCanvas_SaveLayerRec_fClipMatrix">fClipMatrix</a> transforms <a href="#SkCanvas_SaveLayerRec_fClipMask">fClipMask</a> before it clips <a href="#Layer">Layer</a>. If
   1756 <a href="#SkCanvas_SaveLayerRec_fClipMask">fClipMask</a> describes a translucent gradient, it may be scaled and rotated
   1757 without introducing artifacts. <a href="#SkCanvas_SaveLayerRec_fClipMatrix">fClipMatrix</a> may be nullptr.
   1758 
   1759 <a name="SkCanvas_SaveLayerRec_fSaveLayerFlags"> <code><strong>SaveLayerFlags          fSaveLayerFlags</strong></code> </a>
   1760 
   1761 <a href="#SkCanvas_SaveLayerRec_fSaveLayerFlags">fSaveLayerFlags</a> are used to create <a href="#Layer">Layer</a> without transparency,
   1762 create <a href="#Layer">Layer</a> for LCD text, and to create <a href="#Layer">Layer</a> with the
   1763 contents of the previous <a href="#Layer">Layer</a>.
   1764 
   1765 ### Example
   1766 
   1767 <div><fiddle-embed name="7b18146582fc2440656b839a173ed500"><div><a href="#Canvas">Canvas</a> <a href="#Layer">Layer</a> captures a red Anti-aliased circle and a blue <a href="#Alias">Aliased</a> circle scaled
   1768 up by four. After drawing another red circle without scaling on top, the <a href="#Layer">Layer</a> is
   1769 transferred to the main canvas.</div></fiddle-embed></div>
   1770 
   1771 <a name="SkCanvas_SaveLayerRec_SaveLayerRec"></a>
   1772 ## SaveLayerRec
   1773 
   1774 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1775 SaveLayerRec()
   1776 </pre>
   1777 
   1778 Sets <a href="#SkCanvas_SaveLayerRec_fBounds">fBounds</a>, <a href="#SkCanvas_SaveLayerRec_fPaint">fPaint</a>, and <a href="#SkCanvas_SaveLayerRec_fBackdrop">fBackdrop</a> to nullptr. Clears <a href="#SkCanvas_SaveLayerRec_fSaveLayerFlags">fSaveLayerFlags</a>.
   1779 
   1780 ### Return Value
   1781 
   1782 empty <a href="#SkCanvas_SaveLayerRec_SaveLayerRec">SaveLayerRec</a>
   1783 
   1784 ### Example
   1785 
   1786 <div><fiddle-embed name="ac7c834dce2eac6ef49c15e820e94003">
   1787 
   1788 #### Example Output
   1789 
   1790 ~~~~
   1791 rec1 == rec2
   1792 ~~~~
   1793 
   1794 </fiddle-embed></div>
   1795 
   1796 ### See Also
   1797 
   1798 <a href="#SkCanvas_save">save</a> <a href="#SkCanvas_restore">restore</a> <a href="#SkCanvas_saveLayer">saveLayer</a><sup><a href="#SkCanvas_saveLayer_2">[2]</a></sup><sup><a href="#SkCanvas_saveLayer_3">[3]</a></sup> <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a> <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a>
   1799 
   1800 ---
   1801 
   1802 <a name="SkCanvas_SaveLayerRec_SaveLayerRec_2"></a>
   1803 
   1804 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1805 SaveLayerRec(const SkRect* bounds, const SkPaint* paint, SaveLayerFlags saveLayerFlags = 0)
   1806 </pre>
   1807 
   1808 Sets <a href="#SkCanvas_SaveLayerRec_fBounds">fBounds</a>, <a href="#SkCanvas_SaveLayerRec_fPaint">fPaint</a>, and <a href="#SkCanvas_SaveLayerRec_fSaveLayerFlags">fSaveLayerFlags</a>; sets <a href="#SkCanvas_SaveLayerRec_fBackdrop">fBackdrop</a> to nullptr.
   1809 
   1810 ### Parameters
   1811 
   1812 <table>  <tr>    <td><a name="SkCanvas_SaveLayerRec_SaveLayerRec_2_bounds"> <code><strong>bounds </strong></code> </a></td> <td>
   1813 <a href="#Layer">Layer</a> dimensions; may be nullptr</td>
   1814   </tr>  <tr>    <td><a name="SkCanvas_SaveLayerRec_SaveLayerRec_2_paint"> <code><strong>paint </strong></code> </a></td> <td>
   1815 applied to <a href="#Layer">Layer</a> when overlaying prior <a href="#Layer">Layer</a>; may be nullptr</td>
   1816   </tr>  <tr>    <td><a name="SkCanvas_SaveLayerRec_SaveLayerRec_2_saveLayerFlags"> <code><strong>saveLayerFlags </strong></code> </a></td> <td>
   1817 <a href="#SkCanvas_SaveLayerRec_SaveLayerRec">SaveLayerRec</a> options to modify <a href="#Layer">Layer</a></td>
   1818   </tr>
   1819 </table>
   1820 
   1821 ### Return Value
   1822 
   1823 <a href="#SkCanvas_SaveLayerRec_SaveLayerRec">SaveLayerRec</a> with empty backdrop
   1824 
   1825 ### Example
   1826 
   1827 <div><fiddle-embed name="027f920259888fc19591ea9a90d92873">
   1828 
   1829 #### Example Output
   1830 
   1831 ~~~~
   1832 rec1 == rec2
   1833 ~~~~
   1834 
   1835 </fiddle-embed></div>
   1836 
   1837 ### See Also
   1838 
   1839 <a href="#SkCanvas_save">save</a> <a href="#SkCanvas_restore">restore</a> <a href="#SkCanvas_saveLayer">saveLayer</a><sup><a href="#SkCanvas_saveLayer_2">[2]</a></sup><sup><a href="#SkCanvas_saveLayer_3">[3]</a></sup> <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a> <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a>
   1840 
   1841 ---
   1842 
   1843 <a name="SkCanvas_SaveLayerRec_SaveLayerRec_3"></a>
   1844 
   1845 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1846 SaveLayerRec(const SkRect* bounds, const SkPaint* paint, const SkImageFilter* backdrop,
   1847              SaveLayerFlags saveLayerFlags)
   1848 </pre>
   1849 
   1850 Sets <a href="#SkCanvas_SaveLayerRec_fBounds">fBounds</a>, <a href="#SkCanvas_SaveLayerRec_fPaint">fPaint</a>, <a href="#SkCanvas_SaveLayerRec_fBackdrop">fBackdrop</a>, and <a href="#SkCanvas_SaveLayerRec_fSaveLayerFlags">fSaveLayerFlags</a>.
   1851 
   1852 ### Parameters
   1853 
   1854 <table>  <tr>    <td><a name="SkCanvas_SaveLayerRec_SaveLayerRec_3_bounds"> <code><strong>bounds </strong></code> </a></td> <td>
   1855 <a href="#Layer">Layer</a> dimensions; may be nullptr</td>
   1856   </tr>  <tr>    <td><a name="SkCanvas_SaveLayerRec_SaveLayerRec_3_paint"> <code><strong>paint </strong></code> </a></td> <td>
   1857 applied to <a href="#Layer">Layer</a> when overlaying prior <a href="#Layer">Layer</a>;
   1858 may be nullptr</td>
   1859   </tr>  <tr>    <td><a name="SkCanvas_SaveLayerRec_SaveLayerRec_3_backdrop"> <code><strong>backdrop </strong></code> </a></td> <td>
   1860 prior <a href="#Layer">Layer</a> copied with <a href="undocumented#Image_Filter">Image Filter</a>; may be nullptr</td>
   1861   </tr>  <tr>    <td><a name="SkCanvas_SaveLayerRec_SaveLayerRec_3_saveLayerFlags"> <code><strong>saveLayerFlags </strong></code> </a></td> <td>
   1862 <a href="#SkCanvas_SaveLayerRec_SaveLayerRec">SaveLayerRec</a> options to modify <a href="#Layer">Layer</a></td>
   1863   </tr>
   1864 </table>
   1865 
   1866 ### Return Value
   1867 
   1868 <a href="#SkCanvas_SaveLayerRec_SaveLayerRec">SaveLayerRec</a> fully specified
   1869 
   1870 ### Example
   1871 
   1872 <div><fiddle-embed name="9b7fa2fe855642ffff6538829db15328">
   1873 
   1874 #### Example Output
   1875 
   1876 ~~~~
   1877 rec1 == rec2
   1878 ~~~~
   1879 
   1880 </fiddle-embed></div>
   1881 
   1882 ### See Also
   1883 
   1884 <a href="#SkCanvas_save">save</a> <a href="#SkCanvas_restore">restore</a> <a href="#SkCanvas_saveLayer">saveLayer</a><sup><a href="#SkCanvas_saveLayer_2">[2]</a></sup><sup><a href="#SkCanvas_saveLayer_3">[3]</a></sup> <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a> <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a>
   1885 
   1886 ---
   1887 
   1888 <a name="SkCanvas_SaveLayerRec_SaveLayerRec_4"></a>
   1889 
   1890 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1891 SaveLayerRec(const SkRect* bounds, const SkPaint* paint, const SkImageFilter* backdrop,
   1892              const SkImage* clipMask, const SkMatrix* clipMatrix, SaveLayerFlags saveLayerFlags)
   1893 </pre>
   1894 
   1895 Not ready for general use.Sets <a href="#SkCanvas_SaveLayerRec_fBounds">fBounds</a>, <a href="#SkCanvas_SaveLayerRec_fPaint">fPaint</a>, <a href="#SkCanvas_SaveLayerRec_fBackdrop">fBackdrop</a>, <a href="#SkCanvas_SaveLayerRec_fClipMask">fClipMask</a>, <a href="#SkCanvas_SaveLayerRec_fClipMatrix">fClipMatrix</a>, and <a href="#SkCanvas_SaveLayerRec_fSaveLayerFlags">fSaveLayerFlags</a>.
   1896 <a href="#SkCanvas_SaveLayerRec_SaveLayerRec_4_clipMatrix">clipMatrix</a> uses <a href="#Alpha">Color Alpha</a> channel of image, transformed by <a href="#SkCanvas_SaveLayerRec_SaveLayerRec_4_clipMatrix">clipMatrix</a>, to clip
   1897 <a href="#Layer">Layer</a> when drawn to <a href="#Canvas">Canvas</a>.
   1898 
   1899 Implementation is not complete; has no effect if <a href="undocumented#Device">Device</a> is GPU-backed.
   1900 
   1901 ### Parameters
   1902 
   1903 <table>  <tr>    <td><a name="SkCanvas_SaveLayerRec_SaveLayerRec_4_bounds"> <code><strong>bounds </strong></code> </a></td> <td>
   1904 <a href="#Layer">Layer</a> dimensions; may be nullptr</td>
   1905   </tr>  <tr>    <td><a name="SkCanvas_SaveLayerRec_SaveLayerRec_4_paint"> <code><strong>paint </strong></code> </a></td> <td>
   1906 graphics state applied to <a href="#Layer">Layer</a> when overlaying prior
   1907 <a href="#Layer">Layer</a>; may be nullptr</td>
   1908   </tr>  <tr>    <td><a name="SkCanvas_SaveLayerRec_SaveLayerRec_4_backdrop"> <code><strong>backdrop </strong></code> </a></td> <td>
   1909 prior <a href="#Layer">Layer</a> copied with <a href="undocumented#Image_Filter">Image Filter</a>;
   1910 may be nullptr</td>
   1911   </tr>  <tr>    <td><a name="SkCanvas_SaveLayerRec_SaveLayerRec_4_clipMask"> <code><strong>clipMask </strong></code> </a></td> <td>
   1912 clip applied to <a href="#Layer">Layer</a>; may be nullptr</td>
   1913   </tr>  <tr>    <td><a name="SkCanvas_SaveLayerRec_SaveLayerRec_4_clipMatrix"> <code><strong>clipMatrix </strong></code> </a></td> <td>
   1914 matrix applied to <a href="#SkCanvas_SaveLayerRec_SaveLayerRec_4_clipMask">clipMask</a>; may be nullptr to use
   1915 identity matrix</td>
   1916   </tr>  <tr>    <td><a name="SkCanvas_SaveLayerRec_SaveLayerRec_4_saveLayerFlags"> <code><strong>saveLayerFlags </strong></code> </a></td> <td>
   1917 <a href="#SkCanvas_SaveLayerRec_SaveLayerRec">SaveLayerRec</a> options to modify <a href="#Layer">Layer</a></td>
   1918   </tr>
   1919 </table>
   1920 
   1921 ### Return Value
   1922 
   1923 <a href="#SkCanvas_SaveLayerRec_SaveLayerRec">SaveLayerRec</a> fully specified
   1924 
   1925 ### See Also
   1926 
   1927 <a href="#SkCanvas_save">save</a> <a href="#SkCanvas_restore">restore</a> <a href="#SkCanvas_saveLayer">saveLayer</a><sup><a href="#SkCanvas_saveLayer_2">[2]</a></sup><sup><a href="#SkCanvas_saveLayer_3">[3]</a></sup> <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a> <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a>
   1928 
   1929 ---
   1930 
   1931 <a name="SkCanvas_saveLayer_3"></a>
   1932 
   1933 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1934 int saveLayer(const SaveLayerRec& layerRec)
   1935 </pre>
   1936 
   1937 Saves <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a> (<a href="undocumented#Draw_Filter">Draw Filter</a> deprecated on most platforms),
   1938 and allocates <a href="SkBitmap_Reference#Bitmap">Bitmap</a> for subsequent drawing.
   1939 
   1940 Calling <a href="#SkCanvas_restore">restore</a> discards changes to <a href="#Matrix">Matrix</a>, <a href="#Clip">Clip</a>, and <a href="undocumented#Draw_Filter">Draw Filter</a>,
   1941 and blends <a href="SkBitmap_Reference#Bitmap">Bitmap</a> with <a href="#Alpha">Color Alpha</a> opacity onto the prior <a href="#Layer">Layer</a>.
   1942 
   1943 <a href="#Matrix">Matrix</a> may be changed by <a href="#SkCanvas_translate">translate</a>, <a href="#SkCanvas_scale">scale</a>, <a href="#SkCanvas_rotate">rotate</a>, <a href="#SkCanvas_skew">skew</a>, <a href="#SkCanvas_concat">concat</a>,
   1944 <a href="#SkCanvas_setMatrix">setMatrix</a>, and <a href="#SkCanvas_resetMatrix">resetMatrix</a>. <a href="#Clip">Clip</a> may be changed by <a href="#SkCanvas_clipRect">clipRect</a>, <a href="#SkCanvas_clipRRect">clipRRect</a>,
   1945 <a href="#SkCanvas_clipPath">clipPath</a>, <a href="#SkCanvas_clipRegion">clipRegion</a>.
   1946 
   1947 <a href="#SkCanvas_SaveLayerRec">SaveLayerRec</a> contains the state used to create the <a href="#Layer">Layer</a>.
   1948 
   1949 Call <a href="#SkCanvas_restoreToCount">restoreToCount</a> with returned value to restore this and subsequent saves.
   1950 
   1951 ### Parameters
   1952 
   1953 <table>  <tr>    <td><a name="SkCanvas_saveLayer_3_layerRec"> <code><strong>layerRec </strong></code> </a></td> <td>
   1954 <a href="#Layer">Layer</a> state</td>
   1955   </tr>
   1956 </table>
   1957 
   1958 ### Return Value
   1959 
   1960 depth of save state stack
   1961 
   1962 ### Example
   1963 
   1964 <div><fiddle-embed name="7d3751e82d1b6ec328ffa3d6f48ca831"><div>The example draws an image, and saves it into a <a href="#Layer">Layer</a> with <a href="#SkCanvas_kInitWithPrevious_SaveLayerFlag">kInitWithPrevious SaveLayerFlag</a>.
   1965 Next it punches a hole in <a href="#Layer">Layer</a> and restore with <a href="#SkBlendMode_kPlus">SkBlendMode::kPlus</a>.
   1966 Where <a href="#Layer">Layer</a> was cleared, the original image will draw unchanged.
   1967 Outside of the circle the mandrill is brightened.</div></fiddle-embed></div>
   1968 
   1969 ### See Also
   1970 
   1971 <a href="#SkCanvas_save">save</a> <a href="#SkCanvas_restore">restore</a> <a href="#SkCanvas_saveLayer">saveLayer</a><sup><a href="#SkCanvas_saveLayer_2">[2]</a></sup><sup><a href="#SkCanvas_saveLayer_3">[3]</a></sup> <a href="#SkCanvas_saveLayerPreserveLCDTextRequests">saveLayerPreserveLCDTextRequests</a> <a href="#SkCanvas_saveLayerAlpha">saveLayerAlpha</a>
   1972 
   1973 ---
   1974 
   1975 ## <a name="Matrix"></a> Matrix
   1976 
   1977 <a name="SkCanvas_translate"></a>
   1978 ## translate
   1979 
   1980 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   1981 void translate(SkScalar dx, SkScalar dy)
   1982 </pre>
   1983 
   1984 Translate <a href="#Matrix">Matrix</a> by <a href="#SkCanvas_translate_dx">dx</a> along the x-axis and <a href="#SkCanvas_translate_dy">dy</a> along the y-axis.
   1985 
   1986 Mathematically, replace <a href="#Matrix">Matrix</a> with a translation matrix
   1987 <a href="#Premultiply">Premultiplied</a> with <a href="#Matrix">Matrix</a>.
   1988 
   1989 This has the effect of moving the drawing by (<a href="#SkCanvas_translate_dx">dx</a>, <a href="#SkCanvas_translate_dy">dy</a>) before transforming
   1990 the result with <a href="#Matrix">Matrix</a>.
   1991 
   1992 ### Parameters
   1993 
   1994 <table>  <tr>    <td><a name="SkCanvas_translate_dx"> <code><strong>dx </strong></code> </a></td> <td>
   1995 distance to translate in x</td>
   1996   </tr>  <tr>    <td><a name="SkCanvas_translate_dy"> <code><strong>dy </strong></code> </a></td> <td>
   1997 distance to translate in y</td>
   1998   </tr>
   1999 </table>
   2000 
   2001 ### Example
   2002 
   2003 <div><fiddle-embed name="eb93d5fa66a5f7a10f4f9210494d7222"><div><a href="#SkCanvas_scale">scale</a> followed by <a href="#SkCanvas_translate">translate</a> produces different results from <a href="#SkCanvas_translate">translate</a> followed
   2004 by <a href="#SkCanvas_scale">scale</a>.
   2005 
   2006 The blue stroke follows translate of (50, 50); a black
   2007 fill follows scale of (2, 1/2.f). After restoring the clip, which resets
   2008 <a href="#Matrix">Matrix</a>, a red frame follows the same scale of (2, 1/2.f); a gray fill
   2009 follows translate of (50, 50).</div></fiddle-embed></div>
   2010 
   2011 ### See Also
   2012 
   2013 <a href="#SkCanvas_concat">concat</a> <a href="#SkCanvas_scale">scale</a> <a href="#SkCanvas_skew">skew</a> <a href="#SkCanvas_rotate">rotate</a><sup><a href="#SkCanvas_rotate_2">[2]</a></sup> <a href="#SkCanvas_setMatrix">setMatrix</a>
   2014 
   2015 ---
   2016 
   2017 <a name="SkCanvas_scale"></a>
   2018 ## scale
   2019 
   2020 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2021 void scale(SkScalar sx, SkScalar sy)
   2022 </pre>
   2023 
   2024 Scale <a href="#Matrix">Matrix</a> by <a href="#SkCanvas_scale_sx">sx</a> on the x-axis and <a href="#SkCanvas_scale_sy">sy</a> on the y-axis.
   2025 
   2026 Mathematically, replace <a href="#Matrix">Matrix</a> with a scale matrix
   2027 <a href="#Premultiply">Premultiplied</a> with <a href="#Matrix">Matrix</a>.
   2028 
   2029 This has the effect of scaling the drawing by (<a href="#SkCanvas_scale_sx">sx</a>, <a href="#SkCanvas_scale_sy">sy</a>) before transforming
   2030 the result with <a href="#Matrix">Matrix</a>.
   2031 
   2032 ### Parameters
   2033 
   2034 <table>  <tr>    <td><a name="SkCanvas_scale_sx"> <code><strong>sx </strong></code> </a></td> <td>
   2035 amount to scale in x</td>
   2036   </tr>  <tr>    <td><a name="SkCanvas_scale_sy"> <code><strong>sy </strong></code> </a></td> <td>
   2037 amount to scale in y</td>
   2038   </tr>
   2039 </table>
   2040 
   2041 ### Example
   2042 
   2043 <div><fiddle-embed name="7d0d801ef13c6c6da51e840c22ac15b0"></fiddle-embed></div>
   2044 
   2045 ### See Also
   2046 
   2047 <a href="#SkCanvas_concat">concat</a> <a href="#SkCanvas_translate">translate</a> <a href="#SkCanvas_skew">skew</a> <a href="#SkCanvas_rotate">rotate</a><sup><a href="#SkCanvas_rotate_2">[2]</a></sup> <a href="#SkCanvas_setMatrix">setMatrix</a>
   2048 
   2049 ---
   2050 
   2051 <a name="SkCanvas_rotate"></a>
   2052 ## rotate
   2053 
   2054 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2055 void rotate(SkScalar degrees)
   2056 </pre>
   2057 
   2058 Rotate <a href="#Matrix">Matrix</a> by <a href="#SkCanvas_rotate_degrees">degrees</a>. Positive <a href="#SkCanvas_rotate_degrees">degrees</a> rotates clockwise.
   2059 
   2060 Mathematically, replace <a href="#Matrix">Matrix</a> with a rotation matrix
   2061 <a href="#Premultiply">Premultiplied</a> with <a href="#Matrix">Matrix</a>.
   2062 
   2063 This has the effect of rotating the drawing by <a href="#SkCanvas_rotate_degrees">degrees</a> before transforming
   2064 the result with <a href="#Matrix">Matrix</a>.
   2065 
   2066 ### Parameters
   2067 
   2068 <table>  <tr>    <td><a name="SkCanvas_rotate_degrees"> <code><strong>degrees </strong></code> </a></td> <td>
   2069 amount to rotate, in <a href="#SkCanvas_rotate_degrees">degrees</a></td>
   2070   </tr>
   2071 </table>
   2072 
   2073 ### Example
   2074 
   2075 <div><fiddle-embed name="caafb205771b714948e00dcd58ccaf1f"><div>Draw clock hands at time 5:10. The hour hand and minute hand point up and
   2076 are rotated clockwise.</div></fiddle-embed></div>
   2077 
   2078 ### See Also
   2079 
   2080 <a href="#SkCanvas_concat">concat</a> <a href="#SkCanvas_translate">translate</a> <a href="#SkCanvas_skew">skew</a> <a href="#SkCanvas_scale">scale</a> <a href="#SkCanvas_setMatrix">setMatrix</a>
   2081 
   2082 ---
   2083 
   2084 <a name="SkCanvas_rotate_2"></a>
   2085 
   2086 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2087 void rotate(SkScalar degrees, SkScalar px, SkScalar py)
   2088 </pre>
   2089 
   2090 Rotate <a href="#Matrix">Matrix</a> by <a href="#SkCanvas_rotate_2_degrees">degrees</a> about a point at (<a href="#SkCanvas_rotate_2_px">px</a>, <a href="#SkCanvas_rotate_2_py">py</a>). Positive <a href="#SkCanvas_rotate_2_degrees">degrees</a> rotates
   2091 clockwise.
   2092 
   2093 Mathematically, construct a rotation matrix. <a href="undocumented#Premultiply">Premultiply</a> the rotation matrix by
   2094 a translation matrix, then replace <a href="#Matrix">Matrix</a> with the resulting matrix
   2095 <a href="#Premultiply">Premultiplied</a> with <a href="#Matrix">Matrix</a>.
   2096 
   2097 This has the effect of rotating the drawing about a given point before
   2098 transforming the result with <a href="#Matrix">Matrix</a>.
   2099 
   2100 ### Parameters
   2101 
   2102 <table>  <tr>    <td><a name="SkCanvas_rotate_2_degrees"> <code><strong>degrees </strong></code> </a></td> <td>
   2103 amount to rotate, in <a href="#SkCanvas_rotate_2_degrees">degrees</a></td>
   2104   </tr>  <tr>    <td><a name="SkCanvas_rotate_2_px"> <code><strong>px </strong></code> </a></td> <td>
   2105 x-coordinate of the point to rotate about</td>
   2106   </tr>  <tr>    <td><a name="SkCanvas_rotate_2_py"> <code><strong>py </strong></code> </a></td> <td>
   2107 y-coordinate of the point to rotate about</td>
   2108   </tr>
   2109 </table>
   2110 
   2111 ### Example
   2112 
   2113 <div><fiddle-embed name="bcf5baea1c66a957d5ffd7b54bbbfeff"></fiddle-embed></div>
   2114 
   2115 ### See Also
   2116 
   2117 <a href="#SkCanvas_concat">concat</a> <a href="#SkCanvas_translate">translate</a> <a href="#SkCanvas_skew">skew</a> <a href="#SkCanvas_scale">scale</a> <a href="#SkCanvas_setMatrix">setMatrix</a>
   2118 
   2119 ---
   2120 
   2121 <a name="SkCanvas_skew"></a>
   2122 ## skew
   2123 
   2124 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2125 void skew(SkScalar sx, SkScalar sy)
   2126 </pre>
   2127 
   2128 Skew <a href="#Matrix">Matrix</a> by <a href="#SkCanvas_skew_sx">sx</a> on the x-axis and <a href="#SkCanvas_skew_sy">sy</a> on the y-axis. A positive value of <a href="#SkCanvas_skew_sx">sx</a>
   2129 skews the drawing right as y increases; a positive value of <a href="#SkCanvas_skew_sy">sy</a> skews the drawing
   2130 down as x increases.
   2131 
   2132 Mathematically, replace <a href="#Matrix">Matrix</a> with a skew matrix <a href="#Premultiply">Premultiplied</a> with <a href="#Matrix">Matrix</a>.
   2133 
   2134 This has the effect of skewing the drawing by (<a href="#SkCanvas_skew_sx">sx</a>, <a href="#SkCanvas_skew_sy">sy</a>) before transforming
   2135 the result with <a href="#Matrix">Matrix</a>.
   2136 
   2137 ### Parameters
   2138 
   2139 <table>  <tr>    <td><a name="SkCanvas_skew_sx"> <code><strong>sx </strong></code> </a></td> <td>
   2140 amount to skew in x</td>
   2141   </tr>  <tr>    <td><a name="SkCanvas_skew_sy"> <code><strong>sy </strong></code> </a></td> <td>
   2142 amount to skew in y</td>
   2143   </tr>
   2144 </table>
   2145 
   2146 ### Example
   2147 
   2148 <div><fiddle-embed name="2e2acc21d7774df7e0940a30ad2ca99e"><div>Black text mimics an oblique text style by using a negative skew in x that
   2149 shifts the geometry to the right as the y values decrease.
   2150 <a href="#Red">Red</a> text uses a positive skew in y to shift the geometry down as the x values
   2151 increase.
   2152 <a href="#Blue">Blue</a> text combines x and y skew to rotate and scale.</div></fiddle-embed></div>
   2153 
   2154 ### See Also
   2155 
   2156 <a href="#SkCanvas_concat">concat</a> <a href="#SkCanvas_translate">translate</a> <a href="#SkCanvas_rotate">rotate</a><sup><a href="#SkCanvas_rotate_2">[2]</a></sup> <a href="#SkCanvas_scale">scale</a> <a href="#SkCanvas_setMatrix">setMatrix</a>
   2157 
   2158 ---
   2159 
   2160 <a name="SkCanvas_concat"></a>
   2161 ## concat
   2162 
   2163 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2164 void concat(const SkMatrix& matrix)
   2165 </pre>
   2166 
   2167 Replace <a href="#Matrix">Matrix</a> with <a href="#SkCanvas_concat_matrix">matrix</a> <a href="#Premultiply">Premultiplied</a> with existing <a href="#Matrix">Matrix</a>.
   2168 
   2169 This has the effect of transforming the drawn geometry by <a href="#SkCanvas_concat_matrix">matrix</a>, before
   2170 transforming the result with existing <a href="#Matrix">Matrix</a>.
   2171 
   2172 ### Parameters
   2173 
   2174 <table>  <tr>    <td><a name="SkCanvas_concat_matrix"> <code><strong>matrix </strong></code> </a></td> <td>
   2175 <a href="#SkCanvas_concat_matrix">matrix</a> to <a href="undocumented#Premultiply">Premultiply</a> with existing <a href="#Matrix">Matrix</a></td>
   2176   </tr>
   2177 </table>
   2178 
   2179 ### Example
   2180 
   2181 <div><fiddle-embed name="8f6818b25a92a88638ad99b2dd293f61"></fiddle-embed></div>
   2182 
   2183 ### See Also
   2184 
   2185 <a href="#SkCanvas_translate">translate</a> <a href="#SkCanvas_rotate">rotate</a><sup><a href="#SkCanvas_rotate_2">[2]</a></sup> <a href="#SkCanvas_scale">scale</a> <a href="#SkCanvas_skew">skew</a> <a href="#SkCanvas_setMatrix">setMatrix</a>
   2186 
   2187 ---
   2188 
   2189 <a name="SkCanvas_setMatrix"></a>
   2190 ## setMatrix
   2191 
   2192 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2193 void setMatrix(const SkMatrix& matrix)
   2194 </pre>
   2195 
   2196 Replace <a href="#Matrix">Matrix</a> with <a href="#SkCanvas_setMatrix_matrix">matrix</a>.
   2197 Unlike <a href="#SkCanvas_concat">concat</a>, any prior <a href="#SkCanvas_setMatrix_matrix">matrix</a> state is overwritten.
   2198 
   2199 ### Parameters
   2200 
   2201 <table>  <tr>    <td><a name="SkCanvas_setMatrix_matrix"> <code><strong>matrix </strong></code> </a></td> <td>
   2202 <a href="#SkCanvas_setMatrix_matrix">matrix</a> to copy, replacing existing <a href="#Matrix">Matrix</a></td>
   2203   </tr>
   2204 </table>
   2205 
   2206 ### Example
   2207 
   2208 <div><fiddle-embed name="24b9cf7e6f9a08394e1e07413bd8733a"></fiddle-embed></div>
   2209 
   2210 ### See Also
   2211 
   2212 <a href="#SkCanvas_resetMatrix">resetMatrix</a> <a href="#SkCanvas_concat">concat</a> <a href="#SkCanvas_translate">translate</a> <a href="#SkCanvas_rotate">rotate</a><sup><a href="#SkCanvas_rotate_2">[2]</a></sup> <a href="#SkCanvas_scale">scale</a> <a href="#SkCanvas_skew">skew</a>
   2213 
   2214 ---
   2215 
   2216 <a name="SkCanvas_resetMatrix"></a>
   2217 ## resetMatrix
   2218 
   2219 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2220 void resetMatrix()
   2221 </pre>
   2222 
   2223 Sets <a href="#Matrix">Matrix</a> to the identity matrix.
   2224 Any prior matrix state is overwritten.
   2225 
   2226 ### Example
   2227 
   2228 <div><fiddle-embed name="412afffdf4682baa503a4e2e99201967"></fiddle-embed></div>
   2229 
   2230 ### See Also
   2231 
   2232 <a href="#SkCanvas_setMatrix">setMatrix</a> <a href="#SkCanvas_concat">concat</a> <a href="#SkCanvas_translate">translate</a> <a href="#SkCanvas_rotate">rotate</a><sup><a href="#SkCanvas_rotate_2">[2]</a></sup> <a href="#SkCanvas_scale">scale</a> <a href="#SkCanvas_skew">skew</a>
   2233 
   2234 ---
   2235 
   2236 <a name="SkCanvas_getTotalMatrix"></a>
   2237 ## getTotalMatrix
   2238 
   2239 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2240 const SkMatrix& getTotalMatrix() const
   2241 </pre>
   2242 
   2243 Returns <a href="#Matrix">Matrix</a>.
   2244 This does not account for translation by <a href="undocumented#Device">Device</a> or <a href="SkSurface_Reference#Surface">Surface</a>.
   2245 
   2246 ### Return Value
   2247 
   2248 <a href="#Matrix">Matrix</a> in <a href="#Canvas">Canvas</a>
   2249 
   2250 ### Example
   2251 
   2252 <div><fiddle-embed name="c0d5fa544759704768f47cac91ae3832">
   2253 
   2254 #### Example Output
   2255 
   2256 ~~~~
   2257 isIdentity true
   2258 ~~~~
   2259 
   2260 </fiddle-embed></div>
   2261 
   2262 ### See Also
   2263 
   2264 <a href="#SkCanvas_setMatrix">setMatrix</a> <a href="#SkCanvas_resetMatrix">resetMatrix</a> <a href="#SkCanvas_concat">concat</a>
   2265 
   2266 ---
   2267 
   2268 ## <a name="Clip"></a> Clip
   2269 
   2270 <a href="#Clip">Clip</a> is built from a stack of clipping paths. Each <a href="SkPath_Reference#Path">Path</a> in the
   2271 stack can be constructed from one or more <a href="#Contour">Path Contour</a> elements. The
   2272 <a href="#Contour">Path Contour</a> may be composed of any number of <a href="#Verb">Path Verb</a> segments. Each
   2273 <a href="#Contour">Path Contour</a> forms a closed area; <a href="#Fill_Type">Path Fill Type</a> defines the area enclosed
   2274 by <a href="#Contour">Path Contour</a>.
   2275 
   2276 <a href="#Clip">Clip</a> stack of <a href="SkPath_Reference#Path">Path</a> elements successfully restrict the <a href="SkPath_Reference#Path">Path</a> area. Each
   2277 <a href="SkPath_Reference#Path">Path</a> is transformed by <a href="#Matrix">Matrix</a>, then intersected with or subtracted from the
   2278 prior <a href="#Clip">Clip</a> to form the replacement <a href="#Clip">Clip</a>. Use <a href="#SkClipOp_kDifference">SkClipOp::kDifference</a>
   2279 to subtract <a href="SkPath_Reference#Path">Path</a> from <a href="#Clip">Clip</a>; use <a href="#SkClipOp_kIntersect">SkClipOp::kIntersect</a> to intersect <a href="SkPath_Reference#Path">Path</a>
   2280 with <a href="#Clip">Clip</a>.
   2281 
   2282 A clipping <a href="SkPath_Reference#Path">Path</a> may be Anti-aliased; if <a href="SkPath_Reference#Path">Path</a>, after transformation, is
   2283 composed of horizontal and vertical lines, clearing Anti-alias allows whole pixels
   2284 to either be inside or outside the clip. The fastest drawing has a <a href="#Alias">Aliased</a>,
   2285 rectangular clip.
   2286 
   2287 If clipping <a href="SkPath_Reference#Path">Path</a> has Anti-alias set, clip may partially clip a pixel, requiring
   2288 that drawing blend partially with the destination along the edge. A rotated
   2289 rectangular Anti-aliased clip looks smoother but draws slower.
   2290 
   2291 <a href="#Clip">Clip</a> can combine with <a href="SkRect_Reference#Rect">Rect</a> and <a href="undocumented#Round_Rect">Round Rect</a> primitives; like
   2292 <a href="SkPath_Reference#Path">Path</a>, these are transformed by <a href="#Matrix">Matrix</a> before they are combined with <a href="#Clip">Clip</a>.
   2293 
   2294 <a href="#Clip">Clip</a> can combine with <a href="undocumented#Region">Region</a>. <a href="undocumented#Region">Region</a> is assumed to be in <a href="undocumented#Device">Device</a> coordinates
   2295 and is unaffected by <a href="#Matrix">Matrix</a>.
   2296 
   2297 ### Example
   2298 
   2299 <div><fiddle-embed name="d2e60e5171f26ff9ddefae48387f889b"><div>Draw a red circle with an <a href="#Alias">Aliased</a> clip and an Anti-aliased clip.
   2300 Use an image filter to zoom into the pixels drawn.
   2301 The edge of the <a href="#Alias">Aliased</a> clip fully draws pixels in the red circle.
   2302 The edge of the Anti-aliased clip partially draws pixels in the red circle.</div></fiddle-embed></div>
   2303 
   2304 <a name="SkCanvas_clipRect"></a>
   2305 ## clipRect
   2306 
   2307 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2308 void clipRect(const SkRect& rect, SkClipOp op, bool doAntiAlias)
   2309 </pre>
   2310 
   2311 Replace <a href="#Clip">Clip</a> with the intersection or difference of <a href="#Clip">Clip</a> and <a href="#SkCanvas_clipRect_rect">rect</a>,
   2312 with an <a href="#Alias">Aliased</a> or Anti-aliased clip edge. <a href="#SkCanvas_clipRect_rect">rect</a> is transformed by <a href="#Matrix">Matrix</a>
   2313 before it is combined with <a href="#Clip">Clip</a>.
   2314 
   2315 ### Parameters
   2316 
   2317 <table>  <tr>    <td><a name="SkCanvas_clipRect_rect"> <code><strong>rect </strong></code> </a></td> <td>
   2318 <a href="SkRect_Reference#Rect">Rect</a> to combine with <a href="#Clip">Clip</a></td>
   2319   </tr>  <tr>    <td><a name="SkCanvas_clipRect_op"> <code><strong>op </strong></code> </a></td> <td>
   2320 <a href="#Op">Clip Op</a> to apply to <a href="#Clip">Clip</a></td>
   2321   </tr>  <tr>    <td><a name="SkCanvas_clipRect_doAntiAlias"> <code><strong>doAntiAlias </strong></code> </a></td> <td>
   2322 true if <a href="#Clip">Clip</a> is to be Anti-aliased</td>
   2323   </tr>
   2324 </table>
   2325 
   2326 ### Example
   2327 
   2328 <div><fiddle-embed name="6a614faa0fbcf19958b5559c19b02d0f"></fiddle-embed></div>
   2329 
   2330 ### See Also
   2331 
   2332 <a href="#SkCanvas_clipRRect">clipRRect</a><sup><a href="#SkCanvas_clipRRect_2">[2]</a></sup><sup><a href="#SkCanvas_clipRRect_3">[3]</a></sup> <a href="#SkCanvas_clipPath">clipPath</a><sup><a href="#SkCanvas_clipPath_2">[2]</a></sup><sup><a href="#SkCanvas_clipPath_3">[3]</a></sup> <a href="#SkCanvas_clipRegion">clipRegion</a>
   2333 
   2334 ---
   2335 
   2336 <a name="SkCanvas_clipRect_2"></a>
   2337 
   2338 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2339 void clipRect(const SkRect& rect, SkClipOp op)
   2340 </pre>
   2341 
   2342 Replace <a href="#Clip">Clip</a> with the intersection or difference of <a href="#Clip">Clip</a> and <a href="#SkCanvas_clipRect_2_rect">rect</a>.
   2343 Resulting <a href="#Clip">Clip</a> is <a href="#Alias">Aliased</a>; pixels are fully contained by the clip.
   2344 <a href="#SkCanvas_clipRect_2_rect">rect</a> is transformed by <a href="#Matrix">Matrix</a> before it is combined with <a href="#Clip">Clip</a>.
   2345 
   2346 ### Parameters
   2347 
   2348 <table>  <tr>    <td><a name="SkCanvas_clipRect_2_rect"> <code><strong>rect </strong></code> </a></td> <td>
   2349 <a href="SkRect_Reference#Rect">Rect</a> to combine with <a href="#Clip">Clip</a></td>
   2350   </tr>  <tr>    <td><a name="SkCanvas_clipRect_2_op"> <code><strong>op </strong></code> </a></td> <td>
   2351 <a href="#Op">Clip Op</a> to apply to <a href="#Clip">Clip</a></td>
   2352   </tr>
   2353 </table>
   2354 
   2355 ### Example
   2356 
   2357 <div><fiddle-embed name="13bbc5fa5597a6cd4d704b419dbc66d9"></fiddle-embed></div>
   2358 
   2359 ### See Also
   2360 
   2361 <a href="#SkCanvas_clipRRect">clipRRect</a><sup><a href="#SkCanvas_clipRRect_2">[2]</a></sup><sup><a href="#SkCanvas_clipRRect_3">[3]</a></sup> <a href="#SkCanvas_clipPath">clipPath</a><sup><a href="#SkCanvas_clipPath_2">[2]</a></sup><sup><a href="#SkCanvas_clipPath_3">[3]</a></sup> <a href="#SkCanvas_clipRegion">clipRegion</a>
   2362 
   2363 ---
   2364 
   2365 <a name="SkCanvas_clipRect_3"></a>
   2366 
   2367 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2368 void clipRect(const SkRect& rect, bool doAntiAlias = false)
   2369 </pre>
   2370 
   2371 Replace <a href="#Clip">Clip</a> with the intersection of <a href="#Clip">Clip</a> and <a href="#SkCanvas_clipRect_3_rect">rect</a>.
   2372 Resulting <a href="#Clip">Clip</a> is <a href="#Alias">Aliased</a>; pixels are fully contained by the clip.
   2373 <a href="#SkCanvas_clipRect_3_rect">rect</a> is transformed by <a href="#Matrix">Matrix</a>
   2374 before it is combined with <a href="#Clip">Clip</a>.
   2375 
   2376 ### Parameters
   2377 
   2378 <table>  <tr>    <td><a name="SkCanvas_clipRect_3_rect"> <code><strong>rect </strong></code> </a></td> <td>
   2379 <a href="SkRect_Reference#Rect">Rect</a> to combine with <a href="#Clip">Clip</a></td>
   2380   </tr>  <tr>    <td><a name="SkCanvas_clipRect_3_doAntiAlias"> <code><strong>doAntiAlias </strong></code> </a></td> <td>
   2381 true if <a href="#Clip">Clip</a> is to be Anti-aliased</td>
   2382   </tr>
   2383 </table>
   2384 
   2385 ### Example
   2386 
   2387 <div><fiddle-embed name="1d4e0632c97e42692775d834fe10aa99"><div>A circle drawn in pieces looks uniform when drawn <a href="#Alias">Aliased</a>.
   2388 The same circle pieces blend with pixels more than once when Anti-aliased,
   2389 visible as a thin pair of lines through the right circle.</div></fiddle-embed></div>
   2390 
   2391 ### See Also
   2392 
   2393 <a href="#SkCanvas_clipRRect">clipRRect</a><sup><a href="#SkCanvas_clipRRect_2">[2]</a></sup><sup><a href="#SkCanvas_clipRRect_3">[3]</a></sup> <a href="#SkCanvas_clipPath">clipPath</a><sup><a href="#SkCanvas_clipPath_2">[2]</a></sup><sup><a href="#SkCanvas_clipPath_3">[3]</a></sup> <a href="#SkCanvas_clipRegion">clipRegion</a>
   2394 
   2395 ---
   2396 
   2397 <a name="SkCanvas_androidFramework_setDeviceClipRestriction"></a>
   2398 ## androidFramework_setDeviceClipRestriction
   2399 
   2400 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2401 void androidFramework_setDeviceClipRestriction(const SkIRect& rect)
   2402 </pre>
   2403 
   2404 Sets the maximum clip rectangle, which can be set by <a href="#SkCanvas_clipRect">clipRect</a>, <a href="#SkCanvas_clipRRect">clipRRect</a> and
   2405 <a href="#SkCanvas_clipPath">clipPath</a> and intersect the current clip with the specified <a href="#SkCanvas_androidFramework_setDeviceClipRestriction_rect">rect</a>.
   2406 The maximum clip affects only future clipping operations; it is not retroactive.
   2407 The clip restriction is not recorded in pictures.
   2408 
   2409 Pass an empty <a href="#SkCanvas_androidFramework_setDeviceClipRestriction_rect">rect</a> to disable maximum clip.
   2410 
   2411 ### Parameters
   2412 
   2413 <table>  <tr>    <td><a name="SkCanvas_androidFramework_setDeviceClipRestriction_rect"> <code><strong>rect </strong></code> </a></td> <td>
   2414 maximum allowed clip in device coordinates</td>
   2415   </tr>
   2416 #
   2417 
   2418 ---
   2419 
   2420 </table>
   2421 
   2422 <a name="SkCanvas_clipRRect"></a>
   2423 ## clipRRect
   2424 
   2425 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2426 void clipRRect(const SkRRect& rrect, SkClipOp op, bool doAntiAlias)
   2427 </pre>
   2428 
   2429 Replace <a href="#Clip">Clip</a> with the intersection or difference of <a href="#Clip">Clip</a> and <a href="#SkCanvas_clipRRect_rrect">rrect</a>,
   2430 with an <a href="#Alias">Aliased</a> or Anti-aliased clip edge.
   2431 <a href="#SkCanvas_clipRRect_rrect">rrect</a> is transformed by <a href="#Matrix">Matrix</a>
   2432 before it is combined with <a href="#Clip">Clip</a>.
   2433 
   2434 ### Parameters
   2435 
   2436 <table>  <tr>    <td><a name="SkCanvas_clipRRect_rrect"> <code><strong>rrect </strong></code> </a></td> <td>
   2437 <a href="undocumented#Round_Rect">Round Rect</a> to combine with <a href="#Clip">Clip</a></td>
   2438   </tr>  <tr>    <td><a name="SkCanvas_clipRRect_op"> <code><strong>op </strong></code> </a></td> <td>
   2439 <a href="#Op">Clip Op</a> to apply to <a href="#Clip">Clip</a></td>
   2440   </tr>  <tr>    <td><a name="SkCanvas_clipRRect_doAntiAlias"> <code><strong>doAntiAlias </strong></code> </a></td> <td>
   2441 true if <a href="#Clip">Clip</a> is to be Anti-aliased</td>
   2442   </tr>
   2443 </table>
   2444 
   2445 ### Example
   2446 
   2447 <div><fiddle-embed name="182ef48ab5e04ba3578496fda8d9fa36"></fiddle-embed></div>
   2448 
   2449 ### See Also
   2450 
   2451 <a href="#SkCanvas_clipRect">clipRect</a><sup><a href="#SkCanvas_clipRect_2">[2]</a></sup><sup><a href="#SkCanvas_clipRect_3">[3]</a></sup> <a href="#SkCanvas_clipPath">clipPath</a><sup><a href="#SkCanvas_clipPath_2">[2]</a></sup><sup><a href="#SkCanvas_clipPath_3">[3]</a></sup> <a href="#SkCanvas_clipRegion">clipRegion</a>
   2452 
   2453 ---
   2454 
   2455 <a name="SkCanvas_clipRRect_2"></a>
   2456 
   2457 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2458 void clipRRect(const SkRRect& rrect, SkClipOp op)
   2459 </pre>
   2460 
   2461 Replace <a href="#Clip">Clip</a> with the intersection or difference of <a href="#Clip">Clip</a> and <a href="#SkCanvas_clipRRect_2_rrect">rrect</a>.
   2462 Resulting <a href="#Clip">Clip</a> is <a href="#Alias">Aliased</a>; pixels are fully contained by the clip.
   2463 <a href="#SkCanvas_clipRRect_2_rrect">rrect</a> is transformed by <a href="#Matrix">Matrix</a> before it is combined with <a href="#Clip">Clip</a>.
   2464 
   2465 ### Parameters
   2466 
   2467 <table>  <tr>    <td><a name="SkCanvas_clipRRect_2_rrect"> <code><strong>rrect </strong></code> </a></td> <td>
   2468 <a href="undocumented#Round_Rect">Round Rect</a> to combine with <a href="#Clip">Clip</a></td>
   2469   </tr>  <tr>    <td><a name="SkCanvas_clipRRect_2_op"> <code><strong>op </strong></code> </a></td> <td>
   2470 <a href="#Op">Clip Op</a> to apply to <a href="#Clip">Clip</a></td>
   2471   </tr>
   2472 </table>
   2473 
   2474 ### Example
   2475 
   2476 <div><fiddle-embed name="ef6ae2eaae6761130ce38065d0364abd"></fiddle-embed></div>
   2477 
   2478 ### See Also
   2479 
   2480 <a href="#SkCanvas_clipRect">clipRect</a><sup><a href="#SkCanvas_clipRect_2">[2]</a></sup><sup><a href="#SkCanvas_clipRect_3">[3]</a></sup> <a href="#SkCanvas_clipPath">clipPath</a><sup><a href="#SkCanvas_clipPath_2">[2]</a></sup><sup><a href="#SkCanvas_clipPath_3">[3]</a></sup> <a href="#SkCanvas_clipRegion">clipRegion</a>
   2481 
   2482 ---
   2483 
   2484 <a name="SkCanvas_clipRRect_3"></a>
   2485 
   2486 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2487 void clipRRect(const SkRRect& rrect, bool doAntiAlias = false)
   2488 </pre>
   2489 
   2490 Replace <a href="#Clip">Clip</a> with the intersection of <a href="#Clip">Clip</a> and <a href="#SkCanvas_clipRRect_3_rrect">rrect</a>,
   2491 with an <a href="#Alias">Aliased</a> or Anti-aliased clip edge.
   2492 <a href="#SkCanvas_clipRRect_3_rrect">rrect</a> is transformed by <a href="#Matrix">Matrix</a> before it is combined with <a href="#Clip">Clip</a>.
   2493 
   2494 ### Parameters
   2495 
   2496 <table>  <tr>    <td><a name="SkCanvas_clipRRect_3_rrect"> <code><strong>rrect </strong></code> </a></td> <td>
   2497 <a href="undocumented#Round_Rect">Round Rect</a> to combine with <a href="#Clip">Clip</a></td>
   2498   </tr>  <tr>    <td><a name="SkCanvas_clipRRect_3_doAntiAlias"> <code><strong>doAntiAlias </strong></code> </a></td> <td>
   2499 true if <a href="#Clip">Clip</a> is to be Anti-aliased</td>
   2500   </tr>
   2501 </table>
   2502 
   2503 ### Example
   2504 
   2505 <div><fiddle-embed name="f583114580b2176fe3e75b0994476a84"></fiddle-embed></div>
   2506 
   2507 ### See Also
   2508 
   2509 <a href="#SkCanvas_clipRect">clipRect</a><sup><a href="#SkCanvas_clipRect_2">[2]</a></sup><sup><a href="#SkCanvas_clipRect_3">[3]</a></sup> <a href="#SkCanvas_clipPath">clipPath</a><sup><a href="#SkCanvas_clipPath_2">[2]</a></sup><sup><a href="#SkCanvas_clipPath_3">[3]</a></sup> <a href="#SkCanvas_clipRegion">clipRegion</a>
   2510 
   2511 ---
   2512 
   2513 <a name="SkCanvas_clipPath"></a>
   2514 ## clipPath
   2515 
   2516 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2517 void clipPath(const SkPath& path, SkClipOp op, bool doAntiAlias)
   2518 </pre>
   2519 
   2520 Replace <a href="#Clip">Clip</a> with the intersection or difference of <a href="#Clip">Clip</a> and <a href="#SkCanvas_clipPath_path">path</a>,
   2521 with an <a href="#Alias">Aliased</a> or Anti-aliased clip edge. <a href="#Fill_Type">Path Fill Type</a> determines if <a href="#SkCanvas_clipPath_path">path</a>
   2522 describes the area inside or outside its contours; and if <a href="#Contour">Path Contour</a> overlaps
   2523 itself or another <a href="#Contour">Path Contour</a>, whether the overlaps form part of the area.
   2524 <a href="#SkCanvas_clipPath_path">path</a> is transformed by <a href="#Matrix">Matrix</a> before it is combined with <a href="#Clip">Clip</a>.
   2525 
   2526 ### Parameters
   2527 
   2528 <table>  <tr>    <td><a name="SkCanvas_clipPath_path"> <code><strong>path </strong></code> </a></td> <td>
   2529 <a href="SkPath_Reference#Path">Path</a> to combine with <a href="#Clip">Clip</a></td>
   2530   </tr>  <tr>    <td><a name="SkCanvas_clipPath_op"> <code><strong>op </strong></code> </a></td> <td>
   2531 <a href="#Op">Clip Op</a> to apply to <a href="#Clip">Clip</a></td>
   2532   </tr>  <tr>    <td><a name="SkCanvas_clipPath_doAntiAlias"> <code><strong>doAntiAlias </strong></code> </a></td> <td>
   2533 true if <a href="#Clip">Clip</a> is to be Anti-aliased</td>
   2534   </tr>
   2535 </table>
   2536 
   2537 ### Example
   2538 
   2539 <div><fiddle-embed name="ee47ae6b813bfaa55e1a7b7c053ed60d"><div>Top figure uses <a href="#SkPath_kInverseWinding_FillType">SkPath::kInverseWinding FillType</a> and <a href="#SkClipOp_kDifference">SkClipOp::kDifference</a>;
   2540 area outside clip is subtracted from circle.
   2541 
   2542 Bottom figure uses <a href="#SkPath_kWinding_FillType">SkPath::kWinding FillType</a> and <a href="#SkClipOp_kIntersect">SkClipOp::kIntersect</a>;
   2543 area inside clip is intersected with circle.</div></fiddle-embed></div>
   2544 
   2545 ### See Also
   2546 
   2547 <a href="#SkCanvas_clipRect">clipRect</a><sup><a href="#SkCanvas_clipRect_2">[2]</a></sup><sup><a href="#SkCanvas_clipRect_3">[3]</a></sup> <a href="#SkCanvas_clipRRect">clipRRect</a><sup><a href="#SkCanvas_clipRRect_2">[2]</a></sup><sup><a href="#SkCanvas_clipRRect_3">[3]</a></sup> <a href="#SkCanvas_clipRegion">clipRegion</a>
   2548 
   2549 ---
   2550 
   2551 <a name="SkCanvas_clipPath_2"></a>
   2552 
   2553 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2554 void clipPath(const SkPath& path, SkClipOp op)
   2555 </pre>
   2556 
   2557 Replace <a href="#Clip">Clip</a> with the intersection or difference of <a href="#Clip">Clip</a> and <a href="#SkCanvas_clipPath_2_path">path</a>.
   2558 Resulting <a href="#Clip">Clip</a> is <a href="#Alias">Aliased</a>; pixels are fully contained by the clip.
   2559 <a href="#Fill_Type">Path Fill Type</a> determines if <a href="#SkCanvas_clipPath_2_path">path</a>
   2560 describes the area inside or outside its contours; and if <a href="#Contour">Path Contour</a> overlaps
   2561 itself or another <a href="#Contour">Path Contour</a>, whether the overlaps form part of the area.
   2562 <a href="#SkCanvas_clipPath_2_path">path</a> is transformed by <a href="#Matrix">Matrix</a>
   2563 before it is combined with <a href="#Clip">Clip</a>.
   2564 
   2565 ### Parameters
   2566 
   2567 <table>  <tr>    <td><a name="SkCanvas_clipPath_2_path"> <code><strong>path </strong></code> </a></td> <td>
   2568 <a href="SkPath_Reference#Path">Path</a> to combine with <a href="#Clip">Clip</a></td>
   2569   </tr>  <tr>    <td><a name="SkCanvas_clipPath_2_op"> <code><strong>op </strong></code> </a></td> <td>
   2570 <a href="#Op">Clip Op</a> to apply to <a href="#Clip">Clip</a></td>
   2571   </tr>
   2572 </table>
   2573 
   2574 ### Example
   2575 
   2576 <div><fiddle-embed name="7856755c1bf8431c286c734b353345ad"><div>Overlapping <a href="#Rect">Rects</a> form a clip. When clip <a href="#Fill_Type">Path Fill Type</a> is set to
   2577 <a href="#SkPath_kWinding_FillType">SkPath::kWinding FillType</a>, the overlap is included. Set to
   2578 <a href="#SkPath_kEvenOdd_FillType">SkPath::kEvenOdd FillType</a>, the overlap is excluded and forms a hole.</div></fiddle-embed></div>
   2579 
   2580 ### See Also
   2581 
   2582 <a href="#SkCanvas_clipRect">clipRect</a><sup><a href="#SkCanvas_clipRect_2">[2]</a></sup><sup><a href="#SkCanvas_clipRect_3">[3]</a></sup> <a href="#SkCanvas_clipRRect">clipRRect</a><sup><a href="#SkCanvas_clipRRect_2">[2]</a></sup><sup><a href="#SkCanvas_clipRRect_3">[3]</a></sup> <a href="#SkCanvas_clipRegion">clipRegion</a>
   2583 
   2584 ---
   2585 
   2586 <a name="SkCanvas_clipPath_3"></a>
   2587 
   2588 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2589 void clipPath(const SkPath& path, bool doAntiAlias = false)
   2590 </pre>
   2591 
   2592 Replace <a href="#Clip">Clip</a> with the intersection of <a href="#Clip">Clip</a> and <a href="#SkCanvas_clipPath_3_path">path</a>.
   2593 Resulting <a href="#Clip">Clip</a> is <a href="#Alias">Aliased</a>; pixels are fully contained by the clip.
   2594 <a href="#Fill_Type">Path Fill Type</a> determines if <a href="#SkCanvas_clipPath_3_path">path</a>
   2595 describes the area inside or outside its contours; and if <a href="#Contour">Path Contour</a> overlaps
   2596 itself or another <a href="#Contour">Path Contour</a>, whether the overlaps form part of the area.
   2597 <a href="#SkCanvas_clipPath_3_path">path</a> is transformed by <a href="#Matrix">Matrix</a> before it is combined with <a href="#Clip">Clip</a>.
   2598 
   2599 ### Parameters
   2600 
   2601 <table>  <tr>    <td><a name="SkCanvas_clipPath_3_path"> <code><strong>path </strong></code> </a></td> <td>
   2602 <a href="SkPath_Reference#Path">Path</a> to combine with <a href="#Clip">Clip</a></td>
   2603   </tr>  <tr>    <td><a name="SkCanvas_clipPath_3_doAntiAlias"> <code><strong>doAntiAlias </strong></code> </a></td> <td>
   2604 true if <a href="#Clip">Clip</a> is to be Anti-aliased</td>
   2605   </tr>
   2606 </table>
   2607 
   2608 ### Example
   2609 
   2610 <div><fiddle-embed name="187a7ae77a8176e417181411988534b6"><div><a href="#Clip">Clip</a> loops over itself covering its center twice. When clip <a href="#Fill_Type">Path Fill Type</a>
   2611 is set to <a href="#SkPath_kWinding_FillType">SkPath::kWinding FillType</a>, the overlap is included. Set to
   2612 <a href="#SkPath_kEvenOdd_FillType">SkPath::kEvenOdd FillType</a>, the overlap is excluded and forms a hole.</div></fiddle-embed></div>
   2613 
   2614 ### See Also
   2615 
   2616 <a href="#SkCanvas_clipRect">clipRect</a><sup><a href="#SkCanvas_clipRect_2">[2]</a></sup><sup><a href="#SkCanvas_clipRect_3">[3]</a></sup> <a href="#SkCanvas_clipRRect">clipRRect</a><sup><a href="#SkCanvas_clipRRect_2">[2]</a></sup><sup><a href="#SkCanvas_clipRRect_3">[3]</a></sup> <a href="#SkCanvas_clipRegion">clipRegion</a>
   2617 
   2618 ---
   2619 
   2620 <a name="SkCanvas_setAllowSimplifyClip"></a>
   2621 ## setAllowSimplifyClip
   2622 
   2623 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2624 void setAllowSimplifyClip(bool allow)
   2625 </pre>
   2626 
   2627 Only used for testing.Set to simplify clip stack using <a href="undocumented#PathOps">PathOps</a>.
   2628 
   2629 ---
   2630 
   2631 <a name="SkCanvas_clipRegion"></a>
   2632 ## clipRegion
   2633 
   2634 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2635 void clipRegion(const SkRegion& deviceRgn, SkClipOp op = SkClipOp::kIntersect)
   2636 </pre>
   2637 
   2638 Replace <a href="#Clip">Clip</a> with the intersection or difference of <a href="#Clip">Clip</a> and <a href="undocumented#Region">Region</a> <a href="#SkCanvas_clipRegion_deviceRgn">deviceRgn</a>.
   2639 Resulting <a href="#Clip">Clip</a> is <a href="#Alias">Aliased</a>; pixels are fully contained by the clip.
   2640 <a href="#SkCanvas_clipRegion_deviceRgn">deviceRgn</a> is unaffected by <a href="#Matrix">Matrix</a>.
   2641 
   2642 ### Parameters
   2643 
   2644 <table>  <tr>    <td><a name="SkCanvas_clipRegion_deviceRgn"> <code><strong>deviceRgn </strong></code> </a></td> <td>
   2645 <a href="undocumented#Region">Region</a> to combine with <a href="#Clip">Clip</a></td>
   2646   </tr>  <tr>    <td><a name="SkCanvas_clipRegion_op"> <code><strong>op </strong></code> </a></td> <td>
   2647 <a href="#Op">Clip Op</a> to apply to <a href="#Clip">Clip</a></td>
   2648   </tr>
   2649 </table>
   2650 
   2651 ### Example
   2652 
   2653 <div><fiddle-embed name="7bb57c0e456c5fda2c2cca4abb68b19e"><div>region is unaffected by canvas rotation; iRect is affected by canvas rotation.
   2654 Both clips are <a href="#Alias">Aliased</a>; this is not noticeable on <a href="undocumented#Region">Region</a> clip because it
   2655 aligns to pixel boundaries.</div></fiddle-embed></div>
   2656 
   2657 ### See Also
   2658 
   2659 <a href="#SkCanvas_clipRect">clipRect</a><sup><a href="#SkCanvas_clipRect_2">[2]</a></sup><sup><a href="#SkCanvas_clipRect_3">[3]</a></sup> <a href="#SkCanvas_clipRRect">clipRRect</a><sup><a href="#SkCanvas_clipRRect_2">[2]</a></sup><sup><a href="#SkCanvas_clipRRect_3">[3]</a></sup> <a href="#SkCanvas_clipPath">clipPath</a><sup><a href="#SkCanvas_clipPath_2">[2]</a></sup><sup><a href="#SkCanvas_clipPath_3">[3]</a></sup>
   2660 
   2661 ---
   2662 
   2663 <a name="SkCanvas_quickReject"></a>
   2664 ## quickReject
   2665 
   2666 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2667 bool quickReject(const SkRect& rect) const
   2668 </pre>
   2669 
   2670 Return true if <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_quickReject_rect">rect</a>, transformed by <a href="#Matrix">Matrix</a>, can be quickly determined to be
   2671 outside of <a href="#Clip">Clip</a>. May return false even though <a href="#SkCanvas_quickReject_rect">rect</a> is outside of <a href="#Clip">Clip</a>.
   2672 
   2673 Use to check if an area to be drawn is clipped out, to skip subsequent draw calls.
   2674 
   2675 ### Parameters
   2676 
   2677 <table>  <tr>    <td><a name="SkCanvas_quickReject_rect"> <code><strong>rect </strong></code> </a></td> <td>
   2678 <a href="SkRect_Reference#Rect">Rect</a> to compare with <a href="#Clip">Clip</a></td>
   2679   </tr>
   2680 </table>
   2681 
   2682 ### Return Value
   2683 
   2684 true if <a href="#SkCanvas_quickReject_rect">rect</a>, transformed by <a href="#Matrix">Matrix</a>, does not intersect <a href="#Clip">Clip</a>
   2685 
   2686 ### Example
   2687 
   2688 <div><fiddle-embed name="c15e39862d5f07b0fed44c71e86f7cc9">
   2689 
   2690 #### Example Output
   2691 
   2692 ~~~~
   2693 quickReject true
   2694 quickReject false
   2695 ~~~~
   2696 
   2697 </fiddle-embed></div>
   2698 
   2699 ### See Also
   2700 
   2701 <a href="#SkCanvas_getLocalClipBounds">getLocalClipBounds</a><sup><a href="#SkCanvas_getLocalClipBounds_2">[2]</a></sup> <a href="#SkCanvas_getTotalMatrix">getTotalMatrix</a> <a href="#SkBitmap_drawsNothing">SkBitmap::drawsNothing</a>
   2702 
   2703 ---
   2704 
   2705 <a name="SkCanvas_quickReject_2"></a>
   2706 
   2707 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2708 bool quickReject(const SkPath& path) const
   2709 </pre>
   2710 
   2711 Return true if <a href="#SkCanvas_quickReject_2_path">path</a>, transformed by <a href="#Matrix">Matrix</a>, can be quickly determined to be
   2712 outside of <a href="#Clip">Clip</a>. May return false even though <a href="#SkCanvas_quickReject_2_path">path</a> is outside of <a href="#Clip">Clip</a>.
   2713 
   2714 Use to check if an area to be drawn is clipped out, to skip subsequent draw calls.
   2715 
   2716 ### Parameters
   2717 
   2718 <table>  <tr>    <td><a name="SkCanvas_quickReject_2_path"> <code><strong>path </strong></code> </a></td> <td>
   2719 <a href="SkPath_Reference#Path">Path</a> to compare with <a href="#Clip">Clip</a></td>
   2720   </tr>
   2721 </table>
   2722 
   2723 ### Return Value
   2724 
   2725 true if <a href="#SkCanvas_quickReject_2_path">path</a>, transformed by <a href="#Matrix">Matrix</a>, does not intersect <a href="#Clip">Clip</a>
   2726 
   2727 ### Example
   2728 
   2729 <div><fiddle-embed name="64723a541c40073157abf2ca67907e15">
   2730 
   2731 #### Example Output
   2732 
   2733 ~~~~
   2734 quickReject true
   2735 quickReject false
   2736 ~~~~
   2737 
   2738 </fiddle-embed></div>
   2739 
   2740 ### See Also
   2741 
   2742 <a href="#SkCanvas_getLocalClipBounds">getLocalClipBounds</a><sup><a href="#SkCanvas_getLocalClipBounds_2">[2]</a></sup> <a href="#SkCanvas_getTotalMatrix">getTotalMatrix</a> <a href="#SkBitmap_drawsNothing">SkBitmap::drawsNothing</a>
   2743 
   2744 ---
   2745 
   2746 <a name="SkCanvas_getLocalClipBounds"></a>
   2747 ## getLocalClipBounds
   2748 
   2749 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2750 SkRect getLocalClipBounds() const
   2751 </pre>
   2752 
   2753 Return bounds of <a href="#Clip">Clip</a>, transformed by inverse of <a href="#Matrix">Matrix</a>. If <a href="#Clip">Clip</a> is empty,
   2754 return <a href="#SkRect_MakeEmpty">SkRect::MakeEmpty</a>, where all <a href="SkRect_Reference#Rect">Rect</a> sides equal zero.
   2755 
   2756 <a href="SkRect_Reference#Rect">Rect</a> returned is outset by one to account for partial pixel coverage if <a href="#Clip">Clip</a>
   2757 is Anti-aliased.
   2758 
   2759 ### Return Value
   2760 
   2761 bounds of <a href="#Clip">Clip</a> in local coordinates
   2762 
   2763 ### Example
   2764 
   2765 <div><fiddle-embed name="0b36ff64daf88c046b4ae6ed4ee64db9"><div>Initial bounds is device bounds outset by 1 on all sides.
   2766 Clipped bounds is <a href="#SkCanvas_clipPath">clipPath</a> bounds outset by 1 on all sides.
   2767 Scaling the canvas by two in x and y scales the local bounds by 1/2 in x and y.</div>
   2768 
   2769 #### Example Output
   2770 
   2771 ~~~~
   2772 left:-1  top:-1  right:257  bottom:257
   2773 left:29  top:129  right:121  bottom:231
   2774 left:14.5  top:64.5  right:60.5  bottom:115.5
   2775 ~~~~
   2776 
   2777 </fiddle-embed></div>
   2778 
   2779 ### See Also
   2780 
   2781 <a href="#SkCanvas_getDeviceClipBounds">getDeviceClipBounds</a><sup><a href="#SkCanvas_getDeviceClipBounds_2">[2]</a></sup> <a href="#SkCanvas_getBaseLayerSize">getBaseLayerSize</a> <a href="#SkCanvas_quickReject">quickReject</a><sup><a href="#SkCanvas_quickReject_2">[2]</a></sup>
   2782 
   2783 ---
   2784 
   2785 <a name="SkCanvas_getLocalClipBounds_2"></a>
   2786 
   2787 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2788 bool getLocalClipBounds(SkRect* bounds) const
   2789 </pre>
   2790 
   2791 Return <a href="#SkCanvas_getLocalClipBounds_2_bounds">bounds</a> of <a href="#Clip">Clip</a>, transformed by inverse of <a href="#Matrix">Matrix</a>. If <a href="#Clip">Clip</a> is empty,
   2792 return false, and set <a href="#SkCanvas_getLocalClipBounds_2_bounds">bounds</a> to <a href="#SkRect_MakeEmpty">SkRect::MakeEmpty</a>, where all <a href="SkRect_Reference#Rect">Rect</a> sides equal zero.
   2793 
   2794 <a href="#SkCanvas_getLocalClipBounds_2_bounds">bounds</a> is outset by one to account for partial pixel coverage if <a href="#Clip">Clip</a>
   2795 is Anti-aliased.
   2796 
   2797 ### Parameters
   2798 
   2799 <table>  <tr>    <td><a name="SkCanvas_getLocalClipBounds_2_bounds"> <code><strong>bounds </strong></code> </a></td> <td>
   2800 <a href="SkRect_Reference#Rect">Rect</a> of <a href="#Clip">Clip</a> in local coordinates</td>
   2801   </tr>
   2802 </table>
   2803 
   2804 ### Return Value
   2805 
   2806 true if <a href="#Clip">Clip</a> <a href="#SkCanvas_getLocalClipBounds_2_bounds">bounds</a> is not empty
   2807 
   2808 ### Example
   2809 
   2810 <div><fiddle-embed name="85496614e90c66b020f8a70db8d06f4a">
   2811 
   2812 #### Example Output
   2813 
   2814 ~~~~
   2815 local bounds empty = false
   2816 local bounds empty = true
   2817 ~~~~
   2818 
   2819 </fiddle-embed></div>
   2820 
   2821 ### See Also
   2822 
   2823 <a href="#SkCanvas_getDeviceClipBounds">getDeviceClipBounds</a><sup><a href="#SkCanvas_getDeviceClipBounds_2">[2]</a></sup> <a href="#SkCanvas_getBaseLayerSize">getBaseLayerSize</a> <a href="#SkCanvas_quickReject">quickReject</a><sup><a href="#SkCanvas_quickReject_2">[2]</a></sup>
   2824 
   2825 ---
   2826 
   2827 <a name="SkCanvas_getDeviceClipBounds"></a>
   2828 ## getDeviceClipBounds
   2829 
   2830 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2831 SkIRect getDeviceClipBounds() const
   2832 </pre>
   2833 
   2834 Return <a href="SkIRect_Reference#IRect">IRect</a> bounds of <a href="#Clip">Clip</a>, unaffected by <a href="#Matrix">Matrix</a>. If <a href="#Clip">Clip</a> is empty,
   2835 return <a href="#SkRect_MakeEmpty">SkRect::MakeEmpty</a>, where all <a href="SkRect_Reference#Rect">Rect</a> sides equal zero.
   2836 
   2837 Unlike <a href="#SkCanvas_getLocalClipBounds">getLocalClipBounds</a>, returned <a href="SkIRect_Reference#IRect">IRect</a> is not outset.
   2838 
   2839 ### Return Value
   2840 
   2841 bounds of <a href="#Clip">Clip</a> in <a href="undocumented#Device">Device</a> coordinates
   2842 
   2843 ### Example
   2844 
   2845 <div><fiddle-embed name="5f4c910afa4a5a61702e5119eab2cac9"><div>Initial bounds is device bounds, not outset.
   2846 Clipped bounds is <a href="#SkCanvas_clipPath">clipPath</a> bounds, not outset.
   2847 Scaling the canvas by 1/2 in x and y scales the device bounds by 1/2 in x and y.</div>
   2848 
   2849 #### Example Output
   2850 
   2851 ~~~~
   2852 left:0  top:0  right:256  bottom:256
   2853 left:30  top:130  right:120  bottom:230
   2854 left:15  top:65  right:60  bottom:115
   2855 ~~~~
   2856 
   2857 </fiddle-embed></div>
   2858 
   2859 ### See Also
   2860 
   2861 <a href="#SkCanvas_getLocalClipBounds">getLocalClipBounds</a><sup><a href="#SkCanvas_getLocalClipBounds_2">[2]</a></sup> <a href="#SkCanvas_getBaseLayerSize">getBaseLayerSize</a> <a href="#SkCanvas_quickReject">quickReject</a><sup><a href="#SkCanvas_quickReject_2">[2]</a></sup>
   2862 
   2863 ---
   2864 
   2865 <a name="SkCanvas_getDeviceClipBounds_2"></a>
   2866 
   2867 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2868 bool getDeviceClipBounds(SkIRect* bounds) const
   2869 </pre>
   2870 
   2871 Return <a href="SkIRect_Reference#IRect">IRect</a> <a href="#SkCanvas_getDeviceClipBounds_2_bounds">bounds</a> of <a href="#Clip">Clip</a>, unaffected by <a href="#Matrix">Matrix</a>. If <a href="#Clip">Clip</a> is empty,
   2872 return false, and set <a href="#SkCanvas_getDeviceClipBounds_2_bounds">bounds</a> to <a href="#SkRect_MakeEmpty">SkRect::MakeEmpty</a>, where all <a href="SkRect_Reference#Rect">Rect</a> sides equal zero.
   2873 
   2874 Unlike <a href="#SkCanvas_getLocalClipBounds">getLocalClipBounds</a>, <a href="#SkCanvas_getDeviceClipBounds_2_bounds">bounds</a> is not outset.
   2875 
   2876 ### Parameters
   2877 
   2878 <table>  <tr>    <td><a name="SkCanvas_getDeviceClipBounds_2_bounds"> <code><strong>bounds </strong></code> </a></td> <td>
   2879 <a href="SkRect_Reference#Rect">Rect</a> of <a href="#Clip">Clip</a> in device coordinates</td>
   2880   </tr>
   2881 </table>
   2882 
   2883 ### Return Value
   2884 
   2885 true if <a href="#Clip">Clip</a> <a href="#SkCanvas_getDeviceClipBounds_2_bounds">bounds</a> is not empty
   2886 
   2887 ### Example
   2888 
   2889 <div><fiddle-embed name="6abb99f849a1f0e33e1dedc00d1c4f7a">
   2890 
   2891 #### Example Output
   2892 
   2893 ~~~~
   2894 device bounds empty = false
   2895 device bounds empty = true
   2896 ~~~~
   2897 
   2898 </fiddle-embed></div>
   2899 
   2900 ### See Also
   2901 
   2902 <a href="#SkCanvas_getLocalClipBounds">getLocalClipBounds</a><sup><a href="#SkCanvas_getLocalClipBounds_2">[2]</a></sup> <a href="#SkCanvas_getBaseLayerSize">getBaseLayerSize</a> <a href="#SkCanvas_quickReject">quickReject</a><sup><a href="#SkCanvas_quickReject_2">[2]</a></sup>
   2903 
   2904 ---
   2905 
   2906 <a name="SkCanvas_drawColor"></a>
   2907 ## drawColor
   2908 
   2909 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2910 void drawColor(SkColor color, SkBlendMode mode = SkBlendMode::kSrcOver)
   2911 </pre>
   2912 
   2913 Fill <a href="#Clip">Clip</a> with <a href="undocumented#Color">Color</a> <a href="#SkCanvas_drawColor_color">color</a>.
   2914 <a href="#SkCanvas_drawColor_mode">mode</a> determines how <a href="#ARGB">Color ARGB</a> is combined with destination.
   2915 
   2916 ### Parameters
   2917 
   2918 <table>  <tr>    <td><a name="SkCanvas_drawColor_color"> <code><strong>color </strong></code> </a></td> <td>
   2919 <a href="#Unpremultiply">Unpremultiplied</a> <a href="#ARGB">Color ARGB</a></td>
   2920   </tr>  <tr>    <td><a name="SkCanvas_drawColor_mode"> <code><strong>mode </strong></code> </a></td> <td>
   2921 <a href="undocumented#SkBlendMode">SkBlendMode</a> used to combine source <a href="#SkCanvas_drawColor_color">color</a> and destination</td>
   2922   </tr>
   2923 </table>
   2924 
   2925 ### Example
   2926 
   2927 <div><fiddle-embed name="9cf94fead1e6b17d836c704b4eac269a"></fiddle-embed></div>
   2928 
   2929 ### See Also
   2930 
   2931 <a href="#SkCanvas_clear">clear</a> <a href="#SkBitmap_erase">SkBitmap::erase</a> <a href="#SkCanvas_drawPaint">drawPaint</a>
   2932 
   2933 ---
   2934 
   2935 <a name="SkCanvas_clear"></a>
   2936 ## clear
   2937 
   2938 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2939 void clear(SkColor color)
   2940 </pre>
   2941 
   2942 Fill <a href="#Clip">Clip</a> with <a href="undocumented#Color">Color</a> <a href="#SkCanvas_clear_color">color</a> using <a href="#SkBlendMode_kSrc">SkBlendMode::kSrc</a>.
   2943 This has the effect of replacing all pixels contained by <a href="#Clip">Clip</a> with <a href="#SkCanvas_clear_color">color</a>.
   2944 
   2945 ### Parameters
   2946 
   2947 <table>  <tr>    <td><a name="SkCanvas_clear_color"> <code><strong>color </strong></code> </a></td> <td>
   2948 <a href="#Unpremultiply">Unpremultiplied</a> <a href="#ARGB">Color ARGB</a></td>
   2949   </tr>
   2950 </table>
   2951 
   2952 ### Example
   2953 
   2954 <div><fiddle-embed name="d97750e04989d42dc879406127b22c0b"></fiddle-embed></div>
   2955 
   2956 ### See Also
   2957 
   2958 <a href="#SkCanvas_drawColor">drawColor</a> <a href="#SkBitmap_erase">SkBitmap::erase</a> <a href="#SkCanvas_drawPaint">drawPaint</a>
   2959 
   2960 ---
   2961 
   2962 <a name="SkCanvas_discard"></a>
   2963 ## discard
   2964 
   2965 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2966 void discard()
   2967 </pre>
   2968 
   2969 Make <a href="#Canvas">Canvas</a> contents undefined. Subsequent calls that read <a href="#Canvas">Canvas</a> pixels,
   2970 such as drawing with <a href="undocumented#SkBlendMode">SkBlendMode</a>, return undefined results. <a href="#SkCanvas_discard">discard</a> does
   2971 not change <a href="#Clip">Clip</a> or <a href="#Matrix">Matrix</a>.
   2972 
   2973 <a href="#SkCanvas_discard">discard</a> may do nothing, depending on the implementation of <a href="SkSurface_Reference#Surface">Surface</a> or <a href="undocumented#Device">Device</a>
   2974 that created <a href="#Canvas">Canvas</a>.
   2975 
   2976 <a href="#SkCanvas_discard">discard</a> allows optimized performance on subsequent draws by removing
   2977 cached data associated with <a href="SkSurface_Reference#Surface">Surface</a> or <a href="undocumented#Device">Device</a>.
   2978 It is not necessary to call <a href="#SkCanvas_discard">discard</a> once done with <a href="#Canvas">Canvas</a>;
   2979 any cached data is deleted when owning <a href="SkSurface_Reference#Surface">Surface</a> or <a href="undocumented#Device">Device</a> is deleted.
   2980 
   2981 ### See Also
   2982 
   2983 <a href="#SkCanvas_flush">flush</a> <a href="#SkSurface_prepareForExternalIO">SkSurface::prepareForExternalIO</a> GrContext::abandonContext
   2984 
   2985 ---
   2986 
   2987 <a name="SkCanvas_drawPaint"></a>
   2988 ## drawPaint
   2989 
   2990 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   2991 void drawPaint(const SkPaint& paint)
   2992 </pre>
   2993 
   2994 Fill <a href="#Clip">Clip</a> with <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawPaint_paint">paint</a>. <a href="SkPaint_Reference#Paint">Paint</a> components <a href="undocumented#Mask_Filter">Mask Filter</a>, <a href="undocumented#Shader">Shader</a>,
   2995 <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Blend_Mode">Blend Mode</a> affect drawing;
   2996 <a href="undocumented#Path_Effect">Path Effect</a> in <a href="#SkCanvas_drawPaint_paint">paint</a> is ignored.
   2997 
   2998 ### Parameters
   2999 
   3000 <table>  <tr>    <td><a name="SkCanvas_drawPaint_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3001 graphics state used to fill <a href="#Canvas">Canvas</a></td>
   3002   </tr>
   3003 </table>
   3004 
   3005 ### Example
   3006 
   3007 <div><fiddle-embed name="1cd076b9b1a7c976cdca72b93c4f42dd"></fiddle-embed></div>
   3008 
   3009 ### See Also
   3010 
   3011 <a href="#SkCanvas_clear">clear</a> <a href="#SkCanvas_drawColor">drawColor</a> <a href="#SkBitmap_erase">SkBitmap::erase</a>
   3012 
   3013 ---
   3014 
   3015 ## <a name="SkCanvas_PointMode"></a> Enum SkCanvas::PointMode
   3016 
   3017 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3018 enum <a href="#SkCanvas_PointMode">PointMode</a> {
   3019 <a href="#SkCanvas_kPoints_PointMode">kPoints PointMode</a>,
   3020 <a href="#SkCanvas_kLines_PointMode">kLines PointMode</a>,
   3021 <a href="#SkCanvas_kPolygon_PointMode">kPolygon PointMode</a>,
   3022 };</pre>
   3023 
   3024 Selects if an array of points are drawn as discrete points, as lines, or as
   3025 an open polygon.
   3026 
   3027 ### Constants
   3028 
   3029 <table>
   3030   <tr>
   3031     <td><a name="SkCanvas_kPoints_PointMode"> <code><strong>SkCanvas::kPoints_PointMode </strong></code> </a></td><td>0</td><td>Draw each point separately.</td>
   3032   </tr>
   3033   <tr>
   3034     <td><a name="SkCanvas_kLines_PointMode"> <code><strong>SkCanvas::kLines_PointMode </strong></code> </a></td><td>1</td><td>Draw each pair of points as a line segment.</td>
   3035   </tr>
   3036   <tr>
   3037     <td><a name="SkCanvas_kPolygon_PointMode"> <code><strong>SkCanvas::kPolygon_PointMode </strong></code> </a></td><td>2</td><td>Draw the array of points as a open polygon.</td>
   3038   </tr>
   3039 </table>
   3040 
   3041 ### Example
   3042 
   3043 <div><fiddle-embed name="292b4b2008961b6f612434d3121fc4ce"><div>The upper left corner shows three squares when drawn as points.
   3044 The upper right corner shows one line; when drawn as lines, two points are required per line.
   3045 The lower right corner shows two lines; when draw as polygon, no miter is drawn at the corner.
   3046 The lower left corner shows two lines with a miter when path contains polygon.</div></fiddle-embed></div>
   3047 
   3048 ### See Also
   3049 
   3050 <a href="#SkCanvas_drawLine">drawLine</a><sup><a href="#SkCanvas_drawLine_2">[2]</a></sup> <a href="#SkCanvas_drawPoint">drawPoint</a><sup><a href="#SkCanvas_drawPoint_2">[2]</a></sup> <a href="#SkCanvas_drawPath">drawPath</a>
   3051 
   3052 
   3053 
   3054 <a name="SkCanvas_drawPoints"></a>
   3055 ## drawPoints
   3056 
   3057 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3058 void drawPoints(PointMode mode, size_t count, const SkPoint pts[], const SkPaint& paint)
   3059 </pre>
   3060 
   3061 Draw <a href="#SkCanvas_drawPoints_pts">pts</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a> and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawPoints_paint">paint</a>.
   3062 <a href="#SkCanvas_drawPoints_count">count</a> is the number of points; if <a href="#SkCanvas_drawPoints_count">count</a> is less than one, has no effect.
   3063 <a href="#SkCanvas_drawPoints_mode">mode</a> may be one of: <a href="#SkCanvas_kPoints_PointMode">kPoints PointMode</a>, <a href="#SkCanvas_kLines_PointMode">kLines PointMode</a>, or <a href="#SkCanvas_kPolygon_PointMode">kPolygon PointMode</a>.
   3064 
   3065 If <a href="#SkCanvas_drawPoints_mode">mode</a> is <a href="#SkCanvas_kPoints_PointMode">kPoints PointMode</a>, the shape of point drawn depends on <a href="#SkCanvas_drawPoints_paint">paint</a>
   3066 <a href="#Stroke_Cap">Paint Stroke Cap</a>. If <a href="#SkCanvas_drawPoints_paint">paint</a> is set to <a href="#SkPaint_kRound_Cap">SkPaint::kRound Cap</a>, each point draws a
   3067 circle of diameter <a href="#Stroke_Width">Paint Stroke Width</a>. If <a href="#SkCanvas_drawPoints_paint">paint</a> is set to <a href="#SkPaint_kSquare_Cap">SkPaint::kSquare Cap</a>
   3068 or <a href="#SkPaint_kButt_Cap">SkPaint::kButt Cap</a>, each point draws a square of width and height
   3069 <a href="#Stroke_Width">Paint Stroke Width</a>.
   3070 
   3071 If <a href="#SkCanvas_drawPoints_mode">mode</a> is <a href="#SkCanvas_kLines_PointMode">kLines PointMode</a>, each pair of points draws a line segment.
   3072 One line is drawn for every two points; each point is used once. If <a href="#SkCanvas_drawPoints_count">count</a> is odd,
   3073 the final point is ignored.
   3074 
   3075 If <a href="#SkCanvas_drawPoints_mode">mode</a> is <a href="#SkCanvas_kPolygon_PointMode">kPolygon PointMode</a>, each adjacent pair of points draws a line segment.
   3076 <a href="#SkCanvas_drawPoints_count">count</a> minus one lines are drawn; the first and last point are used once.
   3077 
   3078 Each line segment respects <a href="#SkCanvas_drawPoints_paint">paint</a> <a href="#Stroke_Cap">Paint Stroke Cap</a> and <a href="#Stroke_Width">Paint Stroke Width</a>.
   3079 <a href="#Style">Paint Style</a> is ignored, as if were set to <a href="#SkPaint_kStroke_Style">SkPaint::kStroke Style</a>.
   3080 
   3081 Always draws each element one at a time; is not affected by
   3082 <a href="#Stroke_Join">Paint Stroke Join</a>, and unlike <a href="#SkCanvas_drawPath">drawPath</a>, does not create a mask from all points
   3083 and lines before drawing.
   3084 
   3085 ### Parameters
   3086 
   3087 <table>  <tr>    <td><a name="SkCanvas_drawPoints_mode"> <code><strong>mode </strong></code> </a></td> <td>
   3088 whether <a href="#SkCanvas_drawPoints_pts">pts</a> draws points or lines</td>
   3089   </tr>  <tr>    <td><a name="SkCanvas_drawPoints_count"> <code><strong>count </strong></code> </a></td> <td>
   3090 number of points in the array</td>
   3091   </tr>  <tr>    <td><a name="SkCanvas_drawPoints_pts"> <code><strong>pts </strong></code> </a></td> <td>
   3092 array of points to draw</td>
   3093   </tr>  <tr>    <td><a name="SkCanvas_drawPoints_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3094 stroke, blend, color, and so on, used to draw</td>
   3095   </tr>
   3096 </table>
   3097 
   3098 ### Example
   3099 
   3100 <div><fiddle-embed name="f1dfbb0d5a17c8beab19af29f2aaba8c"><div>
   3101 
   3102 <table>  <tr>
   3103     <td>The first column draws points.</td>  </tr>  <tr>
   3104     <td>The second column draws points as lines.</td>  </tr>  <tr>
   3105     <td>The third column draws points as a polygon.</td>  </tr>  <tr>
   3106     <td>The fourth column draws points as a polygonal path.</td>  </tr>  <tr>
   3107     <td>The first row uses a round cap and round join.</td>  </tr>  <tr>
   3108     <td>The second row uses a square cap and a miter join.</td>  </tr>  <tr>
   3109     <td>The third row uses a butt cap and a bevel join.</td>  </tr>
   3110 </table>
   3111 
   3112 The transparent color makes multiple line draws visible;
   3113 the path is drawn all at once.</div></fiddle-embed></div>
   3114 
   3115 ### See Also
   3116 
   3117 <a href="#SkCanvas_drawLine">drawLine</a><sup><a href="#SkCanvas_drawLine_2">[2]</a></sup> <a href="#SkCanvas_drawPoint">drawPoint</a><sup><a href="#SkCanvas_drawPoint_2">[2]</a></sup> <a href="#SkCanvas_drawPath">drawPath</a>
   3118 
   3119 ---
   3120 
   3121 <a name="SkCanvas_drawPoint"></a>
   3122 ## drawPoint
   3123 
   3124 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3125 void drawPoint(SkScalar x, SkScalar y, const SkPaint& paint)
   3126 </pre>
   3127 
   3128 Draw point at (<a href="#SkCanvas_drawPoint_x">x</a>, <a href="#SkCanvas_drawPoint_y">y</a>) using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a> and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawPoint_paint">paint</a>.
   3129 
   3130 The shape of point drawn depends on <a href="#SkCanvas_drawPoint_paint">paint</a> <a href="#Stroke_Cap">Paint Stroke Cap</a>.
   3131 If <a href="#SkCanvas_drawPoint_paint">paint</a> is set to <a href="#SkPaint_kRound_Cap">SkPaint::kRound Cap</a>, draw a circle of diameter
   3132 <a href="#Stroke_Width">Paint Stroke Width</a>. If <a href="#SkCanvas_drawPoint_paint">paint</a> is set to <a href="#SkPaint_kSquare_Cap">SkPaint::kSquare Cap</a> or <a href="#SkPaint_kButt_Cap">SkPaint::kButt Cap</a>,
   3133 draw a square of width and height <a href="#Stroke_Width">Paint Stroke Width</a>.
   3134 <a href="#Style">Paint Style</a> is ignored, as if were set to <a href="#SkPaint_kStroke_Style">SkPaint::kStroke Style</a>.
   3135 
   3136 ### Parameters
   3137 
   3138 <table>  <tr>    <td><a name="SkCanvas_drawPoint_x"> <code><strong>x </strong></code> </a></td> <td>
   3139 left edge of circle or square</td>
   3140   </tr>  <tr>    <td><a name="SkCanvas_drawPoint_y"> <code><strong>y </strong></code> </a></td> <td>
   3141 top edge of circle or square</td>
   3142   </tr>  <tr>    <td><a name="SkCanvas_drawPoint_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3143 stroke, blend, color, and so on, used to draw</td>
   3144   </tr>
   3145 </table>
   3146 
   3147 ### Example
   3148 
   3149 <div><fiddle-embed name="3476b553e7b547b604a3f6969f02d933"></fiddle-embed></div>
   3150 
   3151 ### See Also
   3152 
   3153 <a href="#SkCanvas_drawPoints">drawPoints</a> <a href="#SkCanvas_drawCircle">drawCircle</a><sup><a href="#SkCanvas_drawCircle_2">[2]</a></sup> <a href="#SkCanvas_drawRect">drawRect</a> <a href="#SkCanvas_drawLine">drawLine</a><sup><a href="#SkCanvas_drawLine_2">[2]</a></sup> <a href="#SkCanvas_drawPath">drawPath</a>
   3154 
   3155 ---
   3156 
   3157 <a name="SkCanvas_drawPoint_2"></a>
   3158 
   3159 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3160 void drawPoint(SkPoint p, const SkPaint& paint)
   3161 </pre>
   3162 
   3163 Draw point <a href="#SkCanvas_drawPoint_2_p">p</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a> and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawPoint_2_paint">paint</a>.
   3164 
   3165 The shape of point drawn depends on <a href="#SkCanvas_drawPoint_2_paint">paint</a> <a href="#Stroke_Cap">Paint Stroke Cap</a>.
   3166 If <a href="#SkCanvas_drawPoint_2_paint">paint</a> is set to <a href="#SkPaint_kRound_Cap">SkPaint::kRound Cap</a>, draw a circle of diameter
   3167 <a href="#Stroke_Width">Paint Stroke Width</a>. If <a href="#SkCanvas_drawPoint_2_paint">paint</a> is set to <a href="#SkPaint_kSquare_Cap">SkPaint::kSquare Cap</a> or <a href="#SkPaint_kButt_Cap">SkPaint::kButt Cap</a>,
   3168 draw a square of width and height <a href="#Stroke_Width">Paint Stroke Width</a>.
   3169 <a href="#Style">Paint Style</a> is ignored, as if were set to <a href="#SkPaint_kStroke_Style">SkPaint::kStroke Style</a>.
   3170 
   3171 ### Parameters
   3172 
   3173 <table>  <tr>    <td><a name="SkCanvas_drawPoint_2_p"> <code><strong>p </strong></code> </a></td> <td>
   3174 top-left edge of circle or square</td>
   3175   </tr>  <tr>    <td><a name="SkCanvas_drawPoint_2_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3176 stroke, blend, color, and so on, used to draw</td>
   3177   </tr>
   3178 </table>
   3179 
   3180 ### Example
   3181 
   3182 <div><fiddle-embed name="1a0a839061c69d870acca2bcfbdf1a41"></fiddle-embed></div>
   3183 
   3184 ### See Also
   3185 
   3186 <a href="#SkCanvas_drawPoints">drawPoints</a> <a href="#SkCanvas_drawCircle">drawCircle</a><sup><a href="#SkCanvas_drawCircle_2">[2]</a></sup> <a href="#SkCanvas_drawRect">drawRect</a> <a href="#SkCanvas_drawLine">drawLine</a><sup><a href="#SkCanvas_drawLine_2">[2]</a></sup> <a href="#SkCanvas_drawPath">drawPath</a>
   3187 
   3188 ---
   3189 
   3190 <a name="SkCanvas_drawLine"></a>
   3191 ## drawLine
   3192 
   3193 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3194 void drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1, const SkPaint& paint)
   3195 </pre>
   3196 
   3197 Draws line segment from (<a href="#SkCanvas_drawLine_x0">x0</a>, <a href="#SkCanvas_drawLine_y0">y0</a>) to (<a href="#SkCanvas_drawLine_x1">x1</a>, <a href="#SkCanvas_drawLine_y1">y1</a>) using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawLine_paint">paint</a>.
   3198 In <a href="#SkCanvas_drawLine_paint">paint</a>: <a href="#Stroke_Width">Paint Stroke Width</a> describes the line thickness;
   3199 <a href="#Stroke_Cap">Paint Stroke Cap</a> draws the end rounded or square;
   3200 <a href="#Style">Paint Style</a> is ignored, as if were set to <a href="#SkPaint_kStroke_Style">SkPaint::kStroke Style</a>.
   3201 
   3202 ### Parameters
   3203 
   3204 <table>  <tr>    <td><a name="SkCanvas_drawLine_x0"> <code><strong>x0 </strong></code> </a></td> <td>
   3205 start of line segment on x-axis</td>
   3206   </tr>  <tr>    <td><a name="SkCanvas_drawLine_y0"> <code><strong>y0 </strong></code> </a></td> <td>
   3207 start of line segment on y-axis</td>
   3208   </tr>  <tr>    <td><a name="SkCanvas_drawLine_x1"> <code><strong>x1 </strong></code> </a></td> <td>
   3209 end of line segment on x-axis</td>
   3210   </tr>  <tr>    <td><a name="SkCanvas_drawLine_y1"> <code><strong>y1 </strong></code> </a></td> <td>
   3211 end of line segment on y-axis</td>
   3212   </tr>  <tr>    <td><a name="SkCanvas_drawLine_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3213 stroke, blend, color, and so on, used to draw</td>
   3214   </tr>
   3215 </table>
   3216 
   3217 ### Example
   3218 
   3219 <div><fiddle-embed name="d10ee4a265f278d02afe11ad889b293b"></fiddle-embed></div>
   3220 
   3221 ### See Also
   3222 
   3223 <a href="#SkCanvas_drawPoint">drawPoint</a><sup><a href="#SkCanvas_drawPoint_2">[2]</a></sup> <a href="#SkCanvas_drawCircle">drawCircle</a><sup><a href="#SkCanvas_drawCircle_2">[2]</a></sup> <a href="#SkCanvas_drawRect">drawRect</a> <a href="#SkCanvas_drawPath">drawPath</a>
   3224 
   3225 ---
   3226 
   3227 <a name="SkCanvas_drawLine_2"></a>
   3228 
   3229 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3230 void drawLine(SkPoint p0, SkPoint p1, const SkPaint& paint)
   3231 </pre>
   3232 
   3233 Draws line segment from <a href="#SkCanvas_drawLine_2_p0">p0</a> to <a href="#SkCanvas_drawLine_2_p1">p1</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawLine_2_paint">paint</a>.
   3234 In <a href="#SkCanvas_drawLine_2_paint">paint</a>: <a href="#Stroke_Width">Paint Stroke Width</a> describes the line thickness;
   3235 <a href="#Stroke_Cap">Paint Stroke Cap</a> draws the end rounded or square;
   3236 <a href="#Style">Paint Style</a> is ignored, as if were set to <a href="#SkPaint_kStroke_Style">SkPaint::kStroke Style</a>.
   3237 
   3238 ### Parameters
   3239 
   3240 <table>  <tr>    <td><a name="SkCanvas_drawLine_2_p0"> <code><strong>p0 </strong></code> </a></td> <td>
   3241 start of line segment</td>
   3242   </tr>  <tr>    <td><a name="SkCanvas_drawLine_2_p1"> <code><strong>p1 </strong></code> </a></td> <td>
   3243 end of line segment</td>
   3244   </tr>  <tr>    <td><a name="SkCanvas_drawLine_2_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3245 stroke, blend, color, and so on, used to draw</td>
   3246   </tr>
   3247 </table>
   3248 
   3249 ### Example
   3250 
   3251 <div><fiddle-embed name="f8525816cb596dde1a3855446792c8e0"></fiddle-embed></div>
   3252 
   3253 ### See Also
   3254 
   3255 <a href="#SkCanvas_drawPoint">drawPoint</a><sup><a href="#SkCanvas_drawPoint_2">[2]</a></sup> <a href="#SkCanvas_drawCircle">drawCircle</a><sup><a href="#SkCanvas_drawCircle_2">[2]</a></sup> <a href="#SkCanvas_drawRect">drawRect</a> <a href="#SkCanvas_drawPath">drawPath</a>
   3256 
   3257 ---
   3258 
   3259 <a name="SkCanvas_drawRect"></a>
   3260 ## drawRect
   3261 
   3262 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3263 void drawRect(const SkRect& rect, const SkPaint& paint)
   3264 </pre>
   3265 
   3266 Draw <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawRect_rect">rect</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawRect_paint">paint</a>.
   3267 In <a href="#SkCanvas_drawRect_paint">paint</a>: <a href="#Style">Paint Style</a> determines if rectangle is stroked or filled;
   3268 if stroked, <a href="#Stroke_Width">Paint Stroke Width</a> describes the line thickness, and
   3269 <a href="#Stroke_Join">Paint Stroke Join</a> draws the corners rounded or square.
   3270 
   3271 ### Parameters
   3272 
   3273 <table>  <tr>    <td><a name="SkCanvas_drawRect_rect"> <code><strong>rect </strong></code> </a></td> <td>
   3274 rectangle to draw</td>
   3275   </tr>  <tr>    <td><a name="SkCanvas_drawRect_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3276 stroke or fill, blend, color, and so on, used to draw</td>
   3277   </tr>
   3278 </table>
   3279 
   3280 ### Example
   3281 
   3282 <div><fiddle-embed name="871b0da9b4a23de11ae7a772ce14aed3"></fiddle-embed></div>
   3283 
   3284 ### See Also
   3285 
   3286 <a href="#SkCanvas_drawIRect">drawIRect</a> <a href="#SkCanvas_drawRRect">drawRRect</a> <a href="#SkCanvas_drawRoundRect">drawRoundRect</a> <a href="#SkCanvas_drawRegion">drawRegion</a> <a href="#SkCanvas_drawPath">drawPath</a> <a href="#SkCanvas_drawLine">drawLine</a><sup><a href="#SkCanvas_drawLine_2">[2]</a></sup>
   3287 
   3288 ---
   3289 
   3290 <a name="SkCanvas_drawIRect"></a>
   3291 ## drawIRect
   3292 
   3293 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3294 void drawIRect(const SkIRect& rect, const SkPaint& paint)
   3295 </pre>
   3296 
   3297 Draw <a href="SkIRect_Reference#IRect">IRect</a> <a href="#SkCanvas_drawIRect_rect">rect</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawIRect_paint">paint</a>.
   3298 In <a href="#SkCanvas_drawIRect_paint">paint</a>: <a href="#Style">Paint Style</a> determines if rectangle is stroked or filled;
   3299 if stroked, <a href="#Stroke_Width">Paint Stroke Width</a> describes the line thickness, and
   3300 <a href="#Stroke_Join">Paint Stroke Join</a> draws the corners rounded or square.
   3301 
   3302 ### Parameters
   3303 
   3304 <table>  <tr>    <td><a name="SkCanvas_drawIRect_rect"> <code><strong>rect </strong></code> </a></td> <td>
   3305 rectangle to draw</td>
   3306   </tr>  <tr>    <td><a name="SkCanvas_drawIRect_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3307 stroke or fill, blend, color, and so on, used to draw</td>
   3308   </tr>
   3309 </table>
   3310 
   3311 ### Example
   3312 
   3313 <div><fiddle-embed name="d3d8ca584134560750b1efa4a4c6e138"></fiddle-embed></div>
   3314 
   3315 ### See Also
   3316 
   3317 <a href="#SkCanvas_drawRect">drawRect</a> <a href="#SkCanvas_drawRRect">drawRRect</a> <a href="#SkCanvas_drawRoundRect">drawRoundRect</a> <a href="#SkCanvas_drawRegion">drawRegion</a> <a href="#SkCanvas_drawPath">drawPath</a> <a href="#SkCanvas_drawLine">drawLine</a><sup><a href="#SkCanvas_drawLine_2">[2]</a></sup>
   3318 
   3319 ---
   3320 
   3321 <a name="SkCanvas_drawRegion"></a>
   3322 ## drawRegion
   3323 
   3324 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3325 void drawRegion(const SkRegion& region, const SkPaint& paint)
   3326 </pre>
   3327 
   3328 Draw <a href="undocumented#Region">Region</a> <a href="#SkCanvas_drawRegion_region">region</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawRegion_paint">paint</a>.
   3329 In <a href="#SkCanvas_drawRegion_paint">paint</a>: <a href="#Style">Paint Style</a> determines if rectangle is stroked or filled;
   3330 if stroked, <a href="#Stroke_Width">Paint Stroke Width</a> describes the line thickness, and
   3331 <a href="#Stroke_Join">Paint Stroke Join</a> draws the corners rounded or square.
   3332 
   3333 ### Parameters
   3334 
   3335 <table>  <tr>    <td><a name="SkCanvas_drawRegion_region"> <code><strong>region </strong></code> </a></td> <td>
   3336 <a href="#SkCanvas_drawRegion_region">region</a> to draw</td>
   3337   </tr>  <tr>    <td><a name="SkCanvas_drawRegion_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3338 <a href="SkPaint_Reference#Paint">Paint</a> stroke or fill, blend, color, and so on, used to draw</td>
   3339   </tr>
   3340 </table>
   3341 
   3342 ### Example
   3343 
   3344 <div><fiddle-embed name="80309e0deca0f8add616cec7bec634ca"></fiddle-embed></div>
   3345 
   3346 ### See Also
   3347 
   3348 <a href="#SkCanvas_drawRect">drawRect</a> <a href="#SkCanvas_drawIRect">drawIRect</a> <a href="#SkCanvas_drawPath">drawPath</a>
   3349 
   3350 ---
   3351 
   3352 <a name="SkCanvas_drawOval"></a>
   3353 ## drawOval
   3354 
   3355 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3356 void drawOval(const SkRect& oval, const SkPaint& paint)
   3357 </pre>
   3358 
   3359 Draw <a href="undocumented#Oval">Oval</a> <a href="#SkCanvas_drawOval_oval">oval</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a>.
   3360 In <a href="#SkCanvas_drawOval_paint">paint</a>: <a href="#Style">Paint Style</a> determines if <a href="undocumented#Oval">Oval</a> is stroked or filled;
   3361 if stroked, <a href="#Stroke_Width">Paint Stroke Width</a> describes the line thickness.
   3362 
   3363 ### Parameters
   3364 
   3365 <table>  <tr>    <td><a name="SkCanvas_drawOval_oval"> <code><strong>oval </strong></code> </a></td> <td>
   3366 <a href="SkRect_Reference#Rect">Rect</a> bounds of <a href="undocumented#Oval">Oval</a></td>
   3367   </tr>  <tr>    <td><a name="SkCanvas_drawOval_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3368 <a href="SkPaint_Reference#Paint">Paint</a> stroke or fill, blend, color, and so on, used to draw</td>
   3369   </tr>
   3370 </table>
   3371 
   3372 ### Example
   3373 
   3374 <div><fiddle-embed name="8b6b86f8a022811cd29a9c6ab771df12"></fiddle-embed></div>
   3375 
   3376 ### See Also
   3377 
   3378 <a href="#SkCanvas_drawCircle">drawCircle</a><sup><a href="#SkCanvas_drawCircle_2">[2]</a></sup> <a href="#SkCanvas_drawPoint">drawPoint</a><sup><a href="#SkCanvas_drawPoint_2">[2]</a></sup> <a href="#SkCanvas_drawPath">drawPath</a> <a href="#SkCanvas_drawRRect">drawRRect</a> <a href="#SkCanvas_drawRoundRect">drawRoundRect</a>
   3379 
   3380 ---
   3381 
   3382 <a name="SkCanvas_drawRRect"></a>
   3383 ## drawRRect
   3384 
   3385 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3386 void drawRRect(const SkRRect& rrect, const SkPaint& paint)
   3387 </pre>
   3388 
   3389 Draw <a href="undocumented#Round_Rect">Round Rect</a> <a href="#SkCanvas_drawRRect_rrect">rrect</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawRRect_paint">paint</a>.
   3390 In <a href="#SkCanvas_drawRRect_paint">paint</a>: <a href="#Style">Paint Style</a> determines if <a href="#SkCanvas_drawRRect_rrect">rrect</a> is stroked or filled;
   3391 if stroked, <a href="#Stroke_Width">Paint Stroke Width</a> describes the line thickness.
   3392 
   3393 <a href="#SkCanvas_drawRRect_rrect">rrect</a> may represent a rectangle, circle, oval, uniformly rounded rectangle, or
   3394 may have any combination of positive non-square radii for the four corners.
   3395 
   3396 ### Parameters
   3397 
   3398 <table>  <tr>    <td><a name="SkCanvas_drawRRect_rrect"> <code><strong>rrect </strong></code> </a></td> <td>
   3399 <a href="undocumented#Round_Rect">Round Rect</a> with up to eight corner radii to draw</td>
   3400   </tr>  <tr>    <td><a name="SkCanvas_drawRRect_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3401 <a href="SkPaint_Reference#Paint">Paint</a> stroke or fill, blend, color, and so on, used to draw</td>
   3402   </tr>
   3403 </table>
   3404 
   3405 ### Example
   3406 
   3407 <div><fiddle-embed name="369cdbfb2a200d5bb8ae40f7cc1025c3"></fiddle-embed></div>
   3408 
   3409 ### See Also
   3410 
   3411 <a href="#SkCanvas_drawRect">drawRect</a> <a href="#SkCanvas_drawRoundRect">drawRoundRect</a> <a href="#SkCanvas_drawDRRect">drawDRRect</a> <a href="#SkCanvas_drawCircle">drawCircle</a><sup><a href="#SkCanvas_drawCircle_2">[2]</a></sup> <a href="#SkCanvas_drawOval">drawOval</a> <a href="#SkCanvas_drawPath">drawPath</a>
   3412 
   3413 ---
   3414 
   3415 <a name="SkCanvas_drawDRRect"></a>
   3416 ## drawDRRect
   3417 
   3418 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3419 void drawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint)
   3420 </pre>
   3421 
   3422 Draw <a href="undocumented#Round_Rect">Round Rect</a> <a href="#SkCanvas_drawDRRect_outer">outer</a> and <a href="#SkCanvas_drawDRRect_inner">inner</a>
   3423 using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawDRRect_paint">paint</a>.
   3424 <a href="#SkCanvas_drawDRRect_outer">outer</a> must contain <a href="#SkCanvas_drawDRRect_inner">inner</a> or the drawing is undefined.
   3425 In <a href="#SkCanvas_drawDRRect_paint">paint</a>: <a href="#Style">Paint Style</a> determines if <a href="undocumented#Round_Rect">Round Rect</a> is stroked or filled;
   3426 if stroked, <a href="#Stroke_Width">Paint Stroke Width</a> describes the line thickness.
   3427 If stroked and <a href="undocumented#Round_Rect">Round Rect</a> corner has zero length radii, <a href="#Stroke_Join">Paint Stroke Join</a> can
   3428 draw corners rounded or square.
   3429 
   3430 GPU-backed platforms optimize drawing when both <a href="#SkCanvas_drawDRRect_outer">outer</a> and <a href="#SkCanvas_drawDRRect_inner">inner</a> are
   3431 concave and <a href="#SkCanvas_drawDRRect_outer">outer</a> contains <a href="#SkCanvas_drawDRRect_inner">inner</a>. These platforms may not be able to draw
   3432 <a href="SkPath_Reference#Path">Path</a> built with identical data as fast.
   3433 
   3434 ### Parameters
   3435 
   3436 <table>  <tr>    <td><a name="SkCanvas_drawDRRect_outer"> <code><strong>outer </strong></code> </a></td> <td>
   3437 <a href="undocumented#Round_Rect">Round Rect</a> <a href="#SkCanvas_drawDRRect_outer">outer</a> bounds to draw</td>
   3438   </tr>  <tr>    <td><a name="SkCanvas_drawDRRect_inner"> <code><strong>inner </strong></code> </a></td> <td>
   3439 <a href="undocumented#Round_Rect">Round Rect</a> <a href="#SkCanvas_drawDRRect_inner">inner</a> bounds to draw</td>
   3440   </tr>  <tr>    <td><a name="SkCanvas_drawDRRect_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3441 <a href="SkPaint_Reference#Paint">Paint</a> stroke or fill, blend, color, and so on, used to draw</td>
   3442   </tr>
   3443 </table>
   3444 
   3445 ### Example
   3446 
   3447 <div><fiddle-embed name="02e33141f13da2f19aef7feb7117b541"></fiddle-embed></div>
   3448 
   3449 ### Example
   3450 
   3451 <div><fiddle-embed name="30823cb4edf884d330285ea161664931"><div>Outer <a href="SkRect_Reference#Rect">Rect</a> has no corner radii, but stroke join is rounded.
   3452 Inner <a href="undocumented#Round_Rect">Round Rect</a> has corner radii; outset stroke increases radii of corners.
   3453 Stroke join does not affect <a href="#SkCanvas_drawDRRect_inner">inner</a> <a href="undocumented#Round_Rect">Round Rect</a> since it has no sharp corners.</div></fiddle-embed></div>
   3454 
   3455 ### See Also
   3456 
   3457 <a href="#SkCanvas_drawRect">drawRect</a> <a href="#SkCanvas_drawRoundRect">drawRoundRect</a> <a href="#SkCanvas_drawRRect">drawRRect</a> <a href="#SkCanvas_drawCircle">drawCircle</a><sup><a href="#SkCanvas_drawCircle_2">[2]</a></sup> <a href="#SkCanvas_drawOval">drawOval</a> <a href="#SkCanvas_drawPath">drawPath</a>
   3458 
   3459 ---
   3460 
   3461 <a name="SkCanvas_drawCircle"></a>
   3462 ## drawCircle
   3463 
   3464 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3465 void drawCircle(SkScalar cx, SkScalar cy, SkScalar radius, const SkPaint& paint)
   3466 </pre>
   3467 
   3468 Draw <a href="undocumented#Circle">Circle</a> at (<a href="#SkCanvas_drawCircle_cx">cx</a>, <a href="#SkCanvas_drawCircle_cy">cy</a>) with <a href="#SkCanvas_drawCircle_radius">radius</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawCircle_paint">paint</a>.
   3469 If <a href="#SkCanvas_drawCircle_radius">radius</a> is zero or less, nothing is drawn.
   3470 In <a href="#SkCanvas_drawCircle_paint">paint</a>: <a href="#Style">Paint Style</a> determines if <a href="undocumented#Circle">Circle</a> is stroked or filled;
   3471 if stroked, <a href="#Stroke_Width">Paint Stroke Width</a> describes the line thickness.
   3472 
   3473 ### Parameters
   3474 
   3475 <table>  <tr>    <td><a name="SkCanvas_drawCircle_cx"> <code><strong>cx </strong></code> </a></td> <td>
   3476 <a href="undocumented#Circle">Circle</a> center on the x-axis</td>
   3477   </tr>  <tr>    <td><a name="SkCanvas_drawCircle_cy"> <code><strong>cy </strong></code> </a></td> <td>
   3478 <a href="undocumented#Circle">Circle</a> center on the y-axis</td>
   3479   </tr>  <tr>    <td><a name="SkCanvas_drawCircle_radius"> <code><strong>radius </strong></code> </a></td> <td>
   3480 half the diameter of <a href="undocumented#Circle">Circle</a></td>
   3481   </tr>  <tr>    <td><a name="SkCanvas_drawCircle_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3482 <a href="SkPaint_Reference#Paint">Paint</a> stroke or fill, blend, color, and so on, used to draw</td>
   3483   </tr>
   3484 </table>
   3485 
   3486 ### Example
   3487 
   3488 <div><fiddle-embed name="841229e25ca9dfb68bd0dc4dfff356eb"></fiddle-embed></div>
   3489 
   3490 ### See Also
   3491 
   3492 <a href="#SkCanvas_drawOval">drawOval</a> <a href="#SkCanvas_drawRRect">drawRRect</a> <a href="#SkCanvas_drawRoundRect">drawRoundRect</a> <a href="#SkCanvas_drawPath">drawPath</a> <a href="#SkCanvas_drawArc">drawArc</a> <a href="#SkCanvas_drawPoint">drawPoint</a><sup><a href="#SkCanvas_drawPoint_2">[2]</a></sup> <a href="#SkCanvas_drawLine">drawLine</a><sup><a href="#SkCanvas_drawLine_2">[2]</a></sup>
   3493 
   3494 ---
   3495 
   3496 <a name="SkCanvas_drawCircle_2"></a>
   3497 
   3498 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3499 void drawCircle(SkPoint center, SkScalar radius, const SkPaint& paint)
   3500 </pre>
   3501 
   3502 Draw <a href="undocumented#Circle">Circle</a> at <a href="#SkCanvas_drawCircle_2_center">center</a> with <a href="#SkCanvas_drawCircle_2_radius">radius</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawCircle_2_paint">paint</a>.
   3503 If <a href="#SkCanvas_drawCircle_2_radius">radius</a> is zero or less, nothing is drawn.
   3504 In <a href="#SkCanvas_drawCircle_2_paint">paint</a>: <a href="#Style">Paint Style</a> determines if <a href="undocumented#Circle">Circle</a> is stroked or filled;
   3505 if stroked, <a href="#Stroke_Width">Paint Stroke Width</a> describes the line thickness.
   3506 
   3507 ### Parameters
   3508 
   3509 <table>  <tr>    <td><a name="SkCanvas_drawCircle_2_center"> <code><strong>center </strong></code> </a></td> <td>
   3510 <a href="undocumented#Circle">Circle</a> <a href="#SkCanvas_drawCircle_2_center">center</a></td>
   3511   </tr>  <tr>    <td><a name="SkCanvas_drawCircle_2_radius"> <code><strong>radius </strong></code> </a></td> <td>
   3512 half the diameter of <a href="undocumented#Circle">Circle</a></td>
   3513   </tr>  <tr>    <td><a name="SkCanvas_drawCircle_2_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3514 <a href="SkPaint_Reference#Paint">Paint</a> stroke or fill, blend, color, and so on, used to draw</td>
   3515   </tr>
   3516 </table>
   3517 
   3518 ### Example
   3519 
   3520 <div><fiddle-embed name="9303ffae45ddd0b0a1f93d816a1762f4"></fiddle-embed></div>
   3521 
   3522 ### See Also
   3523 
   3524 <a href="#SkCanvas_drawOval">drawOval</a> <a href="#SkCanvas_drawRRect">drawRRect</a> <a href="#SkCanvas_drawRoundRect">drawRoundRect</a> <a href="#SkCanvas_drawPath">drawPath</a> <a href="#SkCanvas_drawArc">drawArc</a> <a href="#SkCanvas_drawPoint">drawPoint</a><sup><a href="#SkCanvas_drawPoint_2">[2]</a></sup> <a href="#SkCanvas_drawLine">drawLine</a><sup><a href="#SkCanvas_drawLine_2">[2]</a></sup>
   3525 
   3526 ---
   3527 
   3528 <a name="SkCanvas_drawArc"></a>
   3529 ## drawArc
   3530 
   3531 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3532 void drawArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle, bool useCenter,
   3533              const SkPaint& paint)
   3534 </pre>
   3535 
   3536 Draw <a href="undocumented#Arc">Arc</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawArc_paint">paint</a>.
   3537 
   3538 <a href="undocumented#Arc">Arc</a> is part of <a href="undocumented#Oval">Oval</a> bounded by <a href="#SkCanvas_drawArc_oval">oval</a>, sweeping from <a href="#SkCanvas_drawArc_startAngle">startAngle</a> to <a href="#SkCanvas_drawArc_startAngle">startAngle</a> plus
   3539 <a href="#SkCanvas_drawArc_sweepAngle">sweepAngle</a>. <a href="#SkCanvas_drawArc_startAngle">startAngle</a> and <a href="#SkCanvas_drawArc_sweepAngle">sweepAngle</a> are in degrees.
   3540 
   3541 <a href="#SkCanvas_drawArc_startAngle">startAngle</a> of zero places start point at the right middle edge of <a href="#SkCanvas_drawArc_oval">oval</a>.
   3542 A positive <a href="#SkCanvas_drawArc_sweepAngle">sweepAngle</a> places <a href="undocumented#Arc">Arc</a> end point clockwise from start point;
   3543 a negative <a href="#SkCanvas_drawArc_sweepAngle">sweepAngle</a> places <a href="undocumented#Arc">Arc</a> end point counterclockwise from start point.
   3544 <a href="#SkCanvas_drawArc_sweepAngle">sweepAngle</a> may exceed 360 degrees, a full circle.
   3545 If <a href="#SkCanvas_drawArc_useCenter">useCenter</a> is true, draw a wedge that includes lines from <a href="#SkCanvas_drawArc_oval">oval</a>
   3546 center to <a href="undocumented#Arc">Arc</a> end points. If <a href="#SkCanvas_drawArc_useCenter">useCenter</a> is false, draw <a href="undocumented#Arc">Arc</a> between end points.
   3547 
   3548 If <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawArc_oval">oval</a> is empty or <a href="#SkCanvas_drawArc_sweepAngle">sweepAngle</a> is zero, nothing is drawn.
   3549 
   3550 ### Parameters
   3551 
   3552 <table>  <tr>    <td><a name="SkCanvas_drawArc_oval"> <code><strong>oval </strong></code> </a></td> <td>
   3553 <a href="SkRect_Reference#Rect">Rect</a> bounds of <a href="undocumented#Oval">Oval</a> containing <a href="undocumented#Arc">Arc</a> to draw</td>
   3554   </tr>  <tr>    <td><a name="SkCanvas_drawArc_startAngle"> <code><strong>startAngle </strong></code> </a></td> <td>
   3555 angle in degrees where <a href="undocumented#Arc">Arc</a> begins</td>
   3556   </tr>  <tr>    <td><a name="SkCanvas_drawArc_sweepAngle"> <code><strong>sweepAngle </strong></code> </a></td> <td>
   3557 sweep angle in degrees; positive is clockwise</td>
   3558   </tr>  <tr>    <td><a name="SkCanvas_drawArc_useCenter"> <code><strong>useCenter </strong></code> </a></td> <td>
   3559 if true, include the center of the <a href="#SkCanvas_drawArc_oval">oval</a></td>
   3560   </tr>  <tr>    <td><a name="SkCanvas_drawArc_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3561 <a href="SkPaint_Reference#Paint">Paint</a> stroke or fill, blend, color, and so on, used to draw</td>
   3562   </tr>
   3563 </table>
   3564 
   3565 ### Example
   3566 
   3567 <div><fiddle-embed name="11f0fbe7b30d776913c2e7c92c02ff57"></fiddle-embed></div>
   3568 
   3569 ### Example
   3570 
   3571 <div><fiddle-embed name="e91dbe45974489b8962c815017b7914f"></fiddle-embed></div>
   3572 
   3573 ### See Also
   3574 
   3575 <a href="#SkPath_arcTo">SkPath::arcTo</a><sup><a href="#SkPath_arcTo_2">[2]</a></sup><sup><a href="#SkPath_arcTo_3">[3]</a></sup><sup><a href="#SkPath_arcTo_4">[4]</a></sup><sup><a href="#SkPath_arcTo_5">[5]</a></sup> <a href="#SkCanvas_drawCircle">drawCircle</a><sup><a href="#SkCanvas_drawCircle_2">[2]</a></sup> <a href="#SkCanvas_drawOval">drawOval</a> <a href="#SkCanvas_drawPath">drawPath</a>
   3576 
   3577 ---
   3578 
   3579 <a name="SkCanvas_drawRoundRect"></a>
   3580 ## drawRoundRect
   3581 
   3582 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3583 void drawRoundRect(const SkRect& rect, SkScalar rx, SkScalar ry, const SkPaint& paint)
   3584 </pre>
   3585 
   3586 Draw <a href="undocumented#Round_Rect">Round Rect</a> bounded by <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawRoundRect_rect">rect</a>, with corner radii (<a href="#SkCanvas_drawRoundRect_rx">rx</a>, <a href="#SkCanvas_drawRoundRect_ry">ry</a>) using <a href="#Clip">Clip</a>,
   3587 <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawRoundRect_paint">paint</a>.
   3588 
   3589 In <a href="#SkCanvas_drawRoundRect_paint">paint</a>: <a href="#Style">Paint Style</a> determines if <a href="undocumented#Round_Rect">Round Rect</a> is stroked or filled;
   3590 if stroked, <a href="#Stroke_Width">Paint Stroke Width</a> describes the line thickness.
   3591 If <a href="#SkCanvas_drawRoundRect_rx">rx</a> or <a href="#SkCanvas_drawRoundRect_ry">ry</a> are less than zero, they are treated as if they are zero.
   3592 If <a href="#SkCanvas_drawRoundRect_rx">rx</a> plus <a href="#SkCanvas_drawRoundRect_ry">ry</a> exceeds <a href="#SkCanvas_drawRoundRect_rect">rect</a> width or <a href="#SkCanvas_drawRoundRect_rect">rect</a> height, radii are scaled down to fit.
   3593 If <a href="#SkCanvas_drawRoundRect_rx">rx</a> and <a href="#SkCanvas_drawRoundRect_ry">ry</a> are zero, <a href="undocumented#Round_Rect">Round Rect</a> is drawn as <a href="SkRect_Reference#Rect">Rect</a> and if stroked is affected by
   3594 <a href="#Stroke_Join">Paint Stroke Join</a>.
   3595 
   3596 ### Parameters
   3597 
   3598 <table>  <tr>    <td><a name="SkCanvas_drawRoundRect_rect"> <code><strong>rect </strong></code> </a></td> <td>
   3599 <a href="SkRect_Reference#Rect">Rect</a> bounds of <a href="undocumented#Round_Rect">Round Rect</a> to draw</td>
   3600   </tr>  <tr>    <td><a name="SkCanvas_drawRoundRect_rx"> <code><strong>rx </strong></code> </a></td> <td>
   3601 axis length in x of oval describing rounded corners</td>
   3602   </tr>  <tr>    <td><a name="SkCanvas_drawRoundRect_ry"> <code><strong>ry </strong></code> </a></td> <td>
   3603 axis length in y of oval describing rounded corners</td>
   3604   </tr>  <tr>    <td><a name="SkCanvas_drawRoundRect_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3605 stroke, blend, color, and so on, used to draw</td>
   3606   </tr>
   3607 </table>
   3608 
   3609 ### Example
   3610 
   3611 <div><fiddle-embed name="199fe818c09026c114e165bff166a39f"><div>Top row has a zero radius a generates a rectangle.
   3612 Second row radii sum to less than sides.
   3613 Third row radii sum equals sides.
   3614 Fourth row radii sum exceeds sides; radii are scaled to fit.</div></fiddle-embed></div>
   3615 
   3616 ### See Also
   3617 
   3618 DrawRRect <a href="#SkCanvas_drawRect">drawRect</a> <a href="#SkCanvas_drawDRRect">drawDRRect</a> <a href="#SkCanvas_drawPath">drawPath</a> <a href="#SkCanvas_drawCircle">drawCircle</a><sup><a href="#SkCanvas_drawCircle_2">[2]</a></sup> <a href="#SkCanvas_drawOval">drawOval</a> <a href="#SkCanvas_drawPoint">drawPoint</a><sup><a href="#SkCanvas_drawPoint_2">[2]</a></sup>
   3619 
   3620 ---
   3621 
   3622 <a name="SkCanvas_drawPath"></a>
   3623 ## drawPath
   3624 
   3625 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3626 void drawPath(const SkPath& path, const SkPaint& paint)
   3627 </pre>
   3628 
   3629 Draw <a href="SkPath_Reference#Path">Path</a> <a href="#SkCanvas_drawPath_path">path</a> using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawPath_paint">paint</a>.
   3630 <a href="SkPath_Reference#Path">Path</a> contains an array of <a href="#Contour">Path Contour</a>, each of which may be open or closed.
   3631 
   3632 In <a href="#SkCanvas_drawPath_paint">paint</a>: <a href="#Style">Paint Style</a> determines if <a href="undocumented#Round_Rect">Round Rect</a> is stroked or filled:
   3633 if filled, <a href="#Fill_Type">Path Fill Type</a> determines whether <a href="#Contour">Path Contour</a> describes inside or
   3634 outside of fill; if stroked, <a href="#Stroke_Width">Paint Stroke Width</a> describes the line thickness,
   3635 <a href="#Stroke_Cap">Paint Stroke Cap</a> describes line ends, and <a href="#Stroke_Join">Paint Stroke Join</a> describes how
   3636 corners are drawn.
   3637 
   3638 ### Parameters
   3639 
   3640 <table>  <tr>    <td><a name="SkCanvas_drawPath_path"> <code><strong>path </strong></code> </a></td> <td>
   3641 <a href="SkPath_Reference#Path">Path</a> to draw</td>
   3642   </tr>  <tr>    <td><a name="SkCanvas_drawPath_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3643 stroke, blend, color, and so on, used to draw</td>
   3644   </tr>
   3645 </table>
   3646 
   3647 ### Example
   3648 
   3649 <div><fiddle-embed name="d489555a878cb2ab08eea5faf516f54e"><div>Top rows draw stroked <a href="#SkCanvas_drawPath_path">path</a> with combinations of joins and caps. The open contour
   3650 is affected by caps; the closed contour is affected by joins.
   3651 Bottom row draws fill the same for open and closed contour.
   3652 First bottom column shows winding fills overlap.
   3653 Second bottom column shows even odd fills exclude overlap.
   3654 Third bottom column shows inverse winding fills area outside both contours.</div></fiddle-embed></div>
   3655 
   3656 ### See Also
   3657 
   3658 <a href="SkPath_Reference#SkPath">SkPath</a> <a href="#SkCanvas_drawLine">drawLine</a><sup><a href="#SkCanvas_drawLine_2">[2]</a></sup> <a href="#SkCanvas_drawArc">drawArc</a> <a href="#SkCanvas_drawRect">drawRect</a> <a href="#SkCanvas_drawPoints">drawPoints</a>
   3659 
   3660 ---
   3661 
   3662 ## <a name="Draw_Image"></a> Draw Image
   3663 
   3664 <a href="#SkCanvas_drawImage">drawImage</a>, <a href="#SkCanvas_drawImageRect">drawImageRect</a>, and <a href="#SkCanvas_drawImageNine">drawImageNine</a> can be called with a bare pointer or
   3665 a smart pointer as a convenience. The pairs of calls are otherwise identical.
   3666 
   3667 <a name="SkCanvas_drawImage"></a>
   3668 ## drawImage
   3669 
   3670 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3671 void drawImage(const SkImage* image, SkScalar left, SkScalar top, const SkPaint* paint = nullptr)
   3672 </pre>
   3673 
   3674 Draw <a href="SkImage_Reference#Image">Image</a> <a href="#SkCanvas_drawImage_image">image</a>, with its <a href="#SkCanvas_drawImage_top">top</a>-<a href="#SkCanvas_drawImage_left">left</a> corner at (<a href="#SkCanvas_drawImage_left">left</a>, <a href="#SkCanvas_drawImage_top">top</a>),
   3675 using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImage_paint">paint</a>.
   3676 
   3677 If <a href="#SkCanvas_drawImage_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>, <a href="undocumented#Blend_Mode">Blend Mode</a>,
   3678 and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawImage_image">image</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   3679 If <a href="#SkCanvas_drawImage_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawImage_image">image</a> bounds. If generated
   3680 mask extends beyond <a href="#SkCanvas_drawImage_image">image</a> bounds, replicate <a href="#SkCanvas_drawImage_image">image</a> edge colors, just as <a href="undocumented#Shader">Shader</a>
   3681 made from <a href="#SkImage_makeShader">SkImage::makeShader</a> with <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set replicates the
   3682 <a href="#SkCanvas_drawImage_image">image</a> edge color when it samples outside of its bounds.
   3683 
   3684 ### Parameters
   3685 
   3686 <table>  <tr>    <td><a name="SkCanvas_drawImage_image"> <code><strong>image </strong></code> </a></td> <td>
   3687 uncompressed rectangular map of pixels</td>
   3688   </tr>  <tr>    <td><a name="SkCanvas_drawImage_left"> <code><strong>left </strong></code> </a></td> <td>
   3689 <a href="#SkCanvas_drawImage_left">left</a> side of <a href="#SkCanvas_drawImage_image">image</a></td>
   3690   </tr>  <tr>    <td><a name="SkCanvas_drawImage_top"> <code><strong>top </strong></code> </a></td> <td>
   3691 <a href="#SkCanvas_drawImage_top">top</a> side of <a href="#SkCanvas_drawImage_image">image</a></td>
   3692   </tr>  <tr>    <td><a name="SkCanvas_drawImage_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3693 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   3694 and so on; or nullptr</td>
   3695   </tr>
   3696 </table>
   3697 
   3698 ### Example
   3699 
   3700 <div><fiddle-embed name="185746dc0faa6f1df30c4afe098646ff"></fiddle-embed></div>
   3701 
   3702 ### See Also
   3703 
   3704 <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawImageLattice">drawImageLattice</a> <a href="#SkCanvas_drawImageNine">drawImageNine</a><sup><a href="#SkCanvas_drawImageNine_2">[2]</a></sup> <a href="#SkCanvas_drawImageRect">drawImageRect</a><sup><a href="#SkCanvas_drawImageRect_2">[2]</a></sup><sup><a href="#SkCanvas_drawImageRect_3">[3]</a></sup><sup><a href="#SkCanvas_drawImageRect_4">[4]</a></sup><sup><a href="#SkCanvas_drawImageRect_5">[5]</a></sup><sup><a href="#SkCanvas_drawImageRect_6">[6]</a></sup> <a href="#SkPaint_setImageFilter">SkPaint::setImageFilter</a>
   3705 
   3706 ---
   3707 
   3708 <a name="SkCanvas_drawImage_2"></a>
   3709 
   3710 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3711 void drawImage(const sk_sp&lt;SkImage&gt;& image, SkScalar left, SkScalar top,
   3712                const SkPaint* paint = nullptr)
   3713 </pre>
   3714 
   3715 Draw <a href="SkImage_Reference#Image">Image</a> <a href="#SkCanvas_drawImage_2_image">image</a>, with its <a href="#SkCanvas_drawImage_2_top">top</a>-<a href="#SkCanvas_drawImage_2_left">left</a> corner at (<a href="#SkCanvas_drawImage_2_left">left</a>, <a href="#SkCanvas_drawImage_2_top">top</a>),
   3716 using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImage_2_paint">paint</a>.
   3717 
   3718 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImage_2_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   3719 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawImage_2_image">image</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   3720 If <a href="#SkCanvas_drawImage_2_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawImage_2_image">image</a> bounds. If generated
   3721 mask extends beyond <a href="#SkCanvas_drawImage_2_image">image</a> bounds, replicate <a href="#SkCanvas_drawImage_2_image">image</a> edge colors, just as <a href="undocumented#Shader">Shader</a>
   3722 made from <a href="#SkImage_makeShader">SkImage::makeShader</a> with <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set replicates the
   3723 <a href="#SkCanvas_drawImage_2_image">image</a> edge color when it samples outside of its bounds.
   3724 
   3725 ### Parameters
   3726 
   3727 <table>  <tr>    <td><a name="SkCanvas_drawImage_2_image"> <code><strong>image </strong></code> </a></td> <td>
   3728 uncompressed rectangular map of pixels</td>
   3729   </tr>  <tr>    <td><a name="SkCanvas_drawImage_2_left"> <code><strong>left </strong></code> </a></td> <td>
   3730 <a href="#SkCanvas_drawImage_2_left">left</a> side of <a href="#SkCanvas_drawImage_2_image">image</a></td>
   3731   </tr>  <tr>    <td><a name="SkCanvas_drawImage_2_top"> <code><strong>top </strong></code> </a></td> <td>
   3732 pop side of <a href="#SkCanvas_drawImage_2_image">image</a></td>
   3733   </tr>  <tr>    <td><a name="SkCanvas_drawImage_2_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3734 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   3735 and so on; or nullptr</td>
   3736   </tr>
   3737 </table>
   3738 
   3739 ### Example
   3740 
   3741 <div><fiddle-embed name="a4e877e891b1be5faa2b7fd07f673a10"></fiddle-embed></div>
   3742 
   3743 ### See Also
   3744 
   3745 <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawImageLattice">drawImageLattice</a> <a href="#SkCanvas_drawImageNine">drawImageNine</a><sup><a href="#SkCanvas_drawImageNine_2">[2]</a></sup> <a href="#SkCanvas_drawImageRect">drawImageRect</a><sup><a href="#SkCanvas_drawImageRect_2">[2]</a></sup><sup><a href="#SkCanvas_drawImageRect_3">[3]</a></sup><sup><a href="#SkCanvas_drawImageRect_4">[4]</a></sup><sup><a href="#SkCanvas_drawImageRect_5">[5]</a></sup><sup><a href="#SkCanvas_drawImageRect_6">[6]</a></sup> <a href="#SkPaint_setImageFilter">SkPaint::setImageFilter</a>
   3746 
   3747 ---
   3748 
   3749 ## <a name="SkCanvas_SrcRectConstraint"></a> Enum SkCanvas::SrcRectConstraint
   3750 
   3751 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3752 enum <a href="#SkCanvas_SrcRectConstraint">SrcRectConstraint</a> {
   3753 <a href="#SkCanvas_kStrict_SrcRectConstraint">kStrict SrcRectConstraint</a>,
   3754 <a href="#SkCanvas_kFast_SrcRectConstraint">kFast SrcRectConstraint</a>,
   3755 };</pre>
   3756 
   3757 <a href="#SkCanvas_SrcRectConstraint">SrcRectConstraint</a> controls the behavior at the edge of source <a href="SkRect_Reference#Rect">Rect</a>,
   3758 provided to <a href="#SkCanvas_drawImageRect">drawImageRect</a>, trading off speed for precision.
   3759 
   3760 <a href="undocumented#Image_Filter">Image Filter</a> in <a href="SkPaint_Reference#Paint">Paint</a> may sample multiple pixels in the image. Source <a href="SkRect_Reference#Rect">Rect</a>
   3761 restricts the bounds of pixels that may be read. <a href="undocumented#Image_Filter">Image Filter</a> may slow down if
   3762 it cannot read outside the bounds, when sampling near the edge of source <a href="SkRect_Reference#Rect">Rect</a>.
   3763 <a href="#SkCanvas_SrcRectConstraint">SrcRectConstraint</a> specifies whether an <a href="undocumented#Image_Filter">Image Filter</a> is allowed to read pixels
   3764 outside source <a href="SkRect_Reference#Rect">Rect</a>.
   3765 
   3766 ### Constants
   3767 
   3768 <table>
   3769   <tr>
   3770     <td><a name="SkCanvas_kStrict_SrcRectConstraint"> <code><strong>SkCanvas::kStrict_SrcRectConstraint </strong></code> </a></td><td>Requires Image_Filter to respect source Rect,</td><td>sampling only inside of its bounds, possibly with a performance penalty.</td>
   3771   </tr>
   3772   <tr>
   3773     <td><a name="SkCanvas_kFast_SrcRectConstraint"> <code><strong>SkCanvas::kFast_SrcRectConstraint </strong></code> </a></td><td>Permits Image_Filter to sample outside of source Rect</td><td>by half the width of <a href="undocumented#Image_Filter">Image Filter</a>, permitting it to run faster but with
   3774 error at the image edges.</td>
   3775   </tr>
   3776 </table>
   3777 
   3778 ### Example
   3779 
   3780 <div><fiddle-embed name="5df49d1f4da37275a1f10ef7f1a749f0"><div>redBorder contains a black and white checkerboard bordered by red.
   3781 redBorder is drawn scaled by 16 on the left.
   3782 The middle and right bitmaps are filtered checkerboards.
   3783 Drawing the checkerboard with <a href="#SkCanvas_kStrict_SrcRectConstraint">kStrict SrcRectConstraint</a> shows only a blur of black and white.
   3784 Drawing the checkerboard with <a href="#SkCanvas_kFast_SrcRectConstraint">kFast SrcRectConstraint</a> allows red to bleed in the corners.</div></fiddle-embed></div>
   3785 
   3786 ### See Also
   3787 
   3788 <a href="#SkCanvas_drawImageRect">drawImageRect</a><sup><a href="#SkCanvas_drawImageRect_2">[2]</a></sup><sup><a href="#SkCanvas_drawImageRect_3">[3]</a></sup><sup><a href="#SkCanvas_drawImageRect_4">[4]</a></sup><sup><a href="#SkCanvas_drawImageRect_5">[5]</a></sup><sup><a href="#SkCanvas_drawImageRect_6">[6]</a></sup> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkPaint_setImageFilter">SkPaint::setImageFilter</a>
   3789 
   3790 
   3791 
   3792 <a name="SkCanvas_drawImageRect"></a>
   3793 ## drawImageRect
   3794 
   3795 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3796 void drawImageRect(const SkImage* image, const SkRect& src, const SkRect& dst, const SkPaint* paint,
   3797                    SrcRectConstraint constraint = kStrict_SrcRectConstraint)
   3798 </pre>
   3799 
   3800 Draw <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawImageRect_src">src</a> of <a href="SkImage_Reference#Image">Image</a> <a href="#SkCanvas_drawImageRect_image">image</a>, scaled and translated to fill <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawImageRect_dst">dst</a>.
   3801 Additionally transform draw using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageRect_paint">paint</a>.
   3802 
   3803 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageRect_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   3804 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawImageRect_image">image</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   3805 If <a href="#SkCanvas_drawImageRect_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawImageRect_image">image</a> bounds.
   3806 
   3807 If generated mask extends beyond <a href="#SkCanvas_drawImageRect_image">image</a> bounds, replicate <a href="#SkCanvas_drawImageRect_image">image</a> edge colors, just
   3808 as <a href="undocumented#Shader">Shader</a> made from <a href="#SkImage_makeShader">SkImage::makeShader</a> with <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set
   3809 replicates the <a href="#SkCanvas_drawImageRect_image">image</a> edge color when it samples outside of its bounds.
   3810 
   3811 <a href="#SkCanvas_drawImageRect_constraint">constraint</a> set to <a href="#SkCanvas_kStrict_SrcRectConstraint">kStrict SrcRectConstraint</a> limits <a href="SkPaint_Reference#Paint">Paint</a> <a href="undocumented#Filter_Quality">Filter Quality</a> to
   3812 sample within <a href="#SkCanvas_drawImageRect_src">src</a>; set to <a href="#SkCanvas_kFast_SrcRectConstraint">kFast SrcRectConstraint</a> allows sampling outside to
   3813 improve performance.
   3814 
   3815 ### Parameters
   3816 
   3817 <table>  <tr>    <td><a name="SkCanvas_drawImageRect_image"> <code><strong>image </strong></code> </a></td> <td>
   3818 <a href="SkImage_Reference#Image">Image</a> containing pixels, dimensions, and format</td>
   3819   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_src"> <code><strong>src </strong></code> </a></td> <td>
   3820 source <a href="SkRect_Reference#Rect">Rect</a> of <a href="#SkCanvas_drawImageRect_image">image</a> to draw from</td>
   3821   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_dst"> <code><strong>dst </strong></code> </a></td> <td>
   3822 destination <a href="SkRect_Reference#Rect">Rect</a> of <a href="#SkCanvas_drawImageRect_image">image</a> to draw to</td>
   3823   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3824 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   3825 and so on; or nullptr</td>
   3826   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_constraint"> <code><strong>constraint </strong></code> </a></td> <td>
   3827 filter strictly within <a href="#SkCanvas_drawImageRect_src">src</a> or draw faster</td>
   3828   </tr>
   3829 </table>
   3830 
   3831 ### Example
   3832 
   3833 <div><fiddle-embed name="2b01c707ef8b5ce3023b7a1d55fce059"><div>The left bitmap draws with <a href="SkPaint_Reference#Paint">Paint</a> default <a href="undocumented#SkFilterQuality">kNone SkFilterQuality</a>, and stays within
   3834 its bounds; there is no bleeding with <a href="#SkCanvas_kFast_SrcRectConstraint">kFast SrcRectConstraint</a>.
   3835 the middle and right bitmaps draw with <a href="undocumented#SkFilterQuality">kLow SkFilterQuality</a>; with
   3836 <a href="#SkCanvas_kStrict_SrcRectConstraint">kStrict SrcRectConstraint</a>, the filter remains within the checkerboard, and
   3837 with <a href="#SkCanvas_kFast_SrcRectConstraint">kFast SrcRectConstraint</a> red bleeds on the edges.</div></fiddle-embed></div>
   3838 
   3839 ### See Also
   3840 
   3841 <a href="#SkCanvas_SrcRectConstraint">SrcRectConstraint</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkCanvas_drawImageLattice">drawImageLattice</a> <a href="#SkCanvas_drawImageNine">drawImageNine</a><sup><a href="#SkCanvas_drawImageNine_2">[2]</a></sup>
   3842 
   3843 ---
   3844 
   3845 <a name="SkCanvas_drawImageRect_2"></a>
   3846 
   3847 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3848 void drawImageRect(const SkImage* image, const SkIRect& isrc, const SkRect& dst, const SkPaint* paint,
   3849                    SrcRectConstraint constraint = kStrict_SrcRectConstraint)
   3850 </pre>
   3851 
   3852 Draw <a href="SkIRect_Reference#IRect">IRect</a> <a href="#SkCanvas_drawImageRect_2_isrc">isrc</a> of <a href="SkImage_Reference#Image">Image</a> <a href="#SkCanvas_drawImageRect_2_image">image</a>, scaled and translated to fill <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawImageRect_2_dst">dst</a>.
   3853 Note that <a href="#SkCanvas_drawImageRect_2_isrc">isrc</a> is on integer pixel boundaries; <a href="#SkCanvas_drawImageRect_2_dst">dst</a> may include fractional
   3854 boundaries. Additionally transform draw using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a>
   3855 <a href="#SkCanvas_drawImageRect_2_paint">paint</a>.
   3856 
   3857 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageRect_2_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   3858 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawImageRect_2_image">image</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   3859 If <a href="#SkCanvas_drawImageRect_2_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawImageRect_2_image">image</a> bounds.
   3860 
   3861 If generated mask extends beyond <a href="#SkCanvas_drawImageRect_2_image">image</a> bounds, replicate <a href="#SkCanvas_drawImageRect_2_image">image</a> edge colors, just
   3862 as <a href="undocumented#Shader">Shader</a> made from <a href="#SkImage_makeShader">SkImage::makeShader</a> with <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set
   3863 replicates the <a href="#SkCanvas_drawImageRect_2_image">image</a> edge color when it samples outside of its bounds.
   3864 
   3865 <a href="#SkCanvas_drawImageRect_2_constraint">constraint</a> set to <a href="#SkCanvas_kStrict_SrcRectConstraint">kStrict SrcRectConstraint</a> limits <a href="SkPaint_Reference#Paint">Paint</a> <a href="undocumented#Filter_Quality">Filter Quality</a> to
   3866 sample within <a href="#SkCanvas_drawImageRect_2_isrc">isrc</a>; set to <a href="#SkCanvas_kFast_SrcRectConstraint">kFast SrcRectConstraint</a> allows sampling outside to
   3867 improve performance.
   3868 
   3869 ### Parameters
   3870 
   3871 <table>  <tr>    <td><a name="SkCanvas_drawImageRect_2_image"> <code><strong>image </strong></code> </a></td> <td>
   3872 <a href="SkImage_Reference#Image">Image</a> containing pixels, dimensions, and format</td>
   3873   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_2_isrc"> <code><strong>isrc </strong></code> </a></td> <td>
   3874 source <a href="SkIRect_Reference#IRect">IRect</a> of <a href="#SkCanvas_drawImageRect_2_image">image</a> to draw from</td>
   3875   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_2_dst"> <code><strong>dst </strong></code> </a></td> <td>
   3876 destination <a href="SkRect_Reference#Rect">Rect</a> of <a href="#SkCanvas_drawImageRect_2_image">image</a> to draw to</td>
   3877   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_2_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3878 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   3879 and so on; or nullptr</td>
   3880   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_2_constraint"> <code><strong>constraint </strong></code> </a></td> <td>
   3881 filter strictly within <a href="#SkCanvas_drawImageRect_2_isrc">isrc</a> or draw faster</td>
   3882   </tr>
   3883 </table>
   3884 
   3885 ### Example
   3886 
   3887 <div><fiddle-embed name="b63b8f9f587b8d918973dc065ce4a593"></fiddle-embed></div>
   3888 
   3889 ### See Also
   3890 
   3891 <a href="#SkCanvas_SrcRectConstraint">SrcRectConstraint</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkCanvas_drawImageLattice">drawImageLattice</a> <a href="#SkCanvas_drawImageNine">drawImageNine</a><sup><a href="#SkCanvas_drawImageNine_2">[2]</a></sup>
   3892 
   3893 ---
   3894 
   3895 <a name="SkCanvas_drawImageRect_3"></a>
   3896 
   3897 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3898 void drawImageRect(const SkImage* image, const SkRect& dst, const SkPaint* paint,
   3899                    SrcRectConstraint constraint = kStrict_SrcRectConstraint)
   3900 </pre>
   3901 
   3902 Draw <a href="SkImage_Reference#Image">Image</a> <a href="#SkCanvas_drawImageRect_3_image">image</a>, scaled and translated to fill <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawImageRect_3_dst">dst</a>, using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>,
   3903 and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageRect_3_paint">paint</a>.
   3904 
   3905 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageRect_3_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   3906 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawImageRect_3_image">image</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   3907 If <a href="#SkCanvas_drawImageRect_3_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawImageRect_3_image">image</a> bounds.
   3908 
   3909 If generated mask extends beyond <a href="#SkCanvas_drawImageRect_3_image">image</a> bounds, replicate <a href="#SkCanvas_drawImageRect_3_image">image</a> edge colors, just
   3910 as <a href="undocumented#Shader">Shader</a> made from <a href="#SkImage_makeShader">SkImage::makeShader</a> with <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set
   3911 replicates the <a href="#SkCanvas_drawImageRect_3_image">image</a> edge color when it samples outside of its bounds.
   3912 
   3913 <a href="#SkCanvas_drawImageRect_3_constraint">constraint</a> set to <a href="#SkCanvas_kStrict_SrcRectConstraint">kStrict SrcRectConstraint</a> limits <a href="SkPaint_Reference#Paint">Paint</a> <a href="undocumented#Filter_Quality">Filter Quality</a> to
   3914 sample within <a href="#SkCanvas_drawImageRect_3_image">image</a>; set to <a href="#SkCanvas_kFast_SrcRectConstraint">kFast SrcRectConstraint</a> allows sampling outside to
   3915 improve performance.
   3916 
   3917 ### Parameters
   3918 
   3919 <table>  <tr>    <td><a name="SkCanvas_drawImageRect_3_image"> <code><strong>image </strong></code> </a></td> <td>
   3920 <a href="SkImage_Reference#Image">Image</a> containing pixels, dimensions, and format</td>
   3921   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_3_dst"> <code><strong>dst </strong></code> </a></td> <td>
   3922 destination <a href="SkRect_Reference#Rect">Rect</a> of <a href="#SkCanvas_drawImageRect_3_image">image</a> to draw to</td>
   3923   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_3_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3924 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   3925 and so on; or nullptr</td>
   3926   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_3_constraint"> <code><strong>constraint </strong></code> </a></td> <td>
   3927 filter strictly within <a href="#SkCanvas_drawImageRect_3_image">image</a> or draw faster</td>
   3928   </tr>
   3929 </table>
   3930 
   3931 ### Example
   3932 
   3933 <div><fiddle-embed name="3cf8fb639fef99993cafc064d550c739"></fiddle-embed></div>
   3934 
   3935 ### See Also
   3936 
   3937 <a href="#SkCanvas_SrcRectConstraint">SrcRectConstraint</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkCanvas_drawImageLattice">drawImageLattice</a> <a href="#SkCanvas_drawImageNine">drawImageNine</a><sup><a href="#SkCanvas_drawImageNine_2">[2]</a></sup>
   3938 
   3939 ---
   3940 
   3941 <a name="SkCanvas_drawImageRect_4"></a>
   3942 
   3943 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3944 void drawImageRect(const sk_sp&lt;SkImage&gt;& image, const SkRect& src, const SkRect& dst,
   3945                    const SkPaint* paint, SrcRectConstraint constraint = kStrict_SrcRectConstraint)
   3946 </pre>
   3947 
   3948 Draw <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawImageRect_4_src">src</a> of <a href="SkImage_Reference#Image">Image</a> <a href="#SkCanvas_drawImageRect_4_image">image</a>, scaled and translated to fill <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawImageRect_4_dst">dst</a>.
   3949 Additionally transform draw using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageRect_4_paint">paint</a>.
   3950 
   3951 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageRect_4_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   3952 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawImageRect_4_image">image</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   3953 If <a href="#SkCanvas_drawImageRect_4_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawImageRect_4_image">image</a> bounds.
   3954 
   3955 If generated mask extends beyond <a href="#SkCanvas_drawImageRect_4_image">image</a> bounds, replicate <a href="#SkCanvas_drawImageRect_4_image">image</a> edge colors, just
   3956 as <a href="undocumented#Shader">Shader</a> made from <a href="#SkImage_makeShader">SkImage::makeShader</a> with <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set
   3957 replicates the <a href="#SkCanvas_drawImageRect_4_image">image</a> edge color when it samples outside of its bounds.
   3958 
   3959 <a href="#SkCanvas_drawImageRect_4_constraint">constraint</a> set to <a href="#SkCanvas_kStrict_SrcRectConstraint">kStrict SrcRectConstraint</a> limits <a href="SkPaint_Reference#Paint">Paint</a> <a href="undocumented#Filter_Quality">Filter Quality</a> to
   3960 sample within <a href="#SkCanvas_drawImageRect_4_src">src</a>; set to <a href="#SkCanvas_kFast_SrcRectConstraint">kFast SrcRectConstraint</a> allows sampling outside to
   3961 improve performance.
   3962 
   3963 ### Parameters
   3964 
   3965 <table>  <tr>    <td><a name="SkCanvas_drawImageRect_4_image"> <code><strong>image </strong></code> </a></td> <td>
   3966 <a href="SkImage_Reference#Image">Image</a> containing pixels, dimensions, and format</td>
   3967   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_4_src"> <code><strong>src </strong></code> </a></td> <td>
   3968 source <a href="SkRect_Reference#Rect">Rect</a> of <a href="#SkCanvas_drawImageRect_4_image">image</a> to draw from</td>
   3969   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_4_dst"> <code><strong>dst </strong></code> </a></td> <td>
   3970 destination <a href="SkRect_Reference#Rect">Rect</a> of <a href="#SkCanvas_drawImageRect_4_image">image</a> to draw to</td>
   3971   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_4_paint"> <code><strong>paint </strong></code> </a></td> <td>
   3972 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   3973 and so on; or nullptr</td>
   3974   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_4_constraint"> <code><strong>constraint </strong></code> </a></td> <td>
   3975 filter strictly within <a href="#SkCanvas_drawImageRect_4_src">src</a> or draw faster</td>
   3976   </tr>
   3977 </table>
   3978 
   3979 ### Example
   3980 
   3981 <div><fiddle-embed name="589999454db90c573f7facfb007253a7"><div><a href="#Canvas">Canvas</a> scales and translates; transformation from <a href="#SkCanvas_drawImageRect_4_src">src</a> to <a href="#SkCanvas_drawImageRect_4_dst">dst</a> also scales.
   3982 The two matrices are concatenated to create the final transformation.</div></fiddle-embed></div>
   3983 
   3984 ### See Also
   3985 
   3986 <a href="#SkCanvas_SrcRectConstraint">SrcRectConstraint</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkCanvas_drawImageLattice">drawImageLattice</a> <a href="#SkCanvas_drawImageNine">drawImageNine</a><sup><a href="#SkCanvas_drawImageNine_2">[2]</a></sup>
   3987 
   3988 ---
   3989 
   3990 <a name="SkCanvas_drawImageRect_5"></a>
   3991 
   3992 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   3993 void drawImageRect(const sk_sp&lt;SkImage&gt;& image, const SkIRect& isrc, const SkRect& dst,
   3994                    const SkPaint* paint, SrcRectConstraint constraint = kStrict_SrcRectConstraint)
   3995 </pre>
   3996 
   3997 Draw <a href="SkIRect_Reference#IRect">IRect</a> <a href="#SkCanvas_drawImageRect_5_isrc">isrc</a> of <a href="SkImage_Reference#Image">Image</a> <a href="#SkCanvas_drawImageRect_5_image">image</a>, scaled and translated to fill <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawImageRect_5_dst">dst</a>.
   3998 <a href="#SkCanvas_drawImageRect_5_isrc">isrc</a> is on integer pixel boundaries; <a href="#SkCanvas_drawImageRect_5_dst">dst</a> may include fractional boundaries.
   3999 Additionally transform draw using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageRect_5_paint">paint</a>.
   4000 
   4001 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageRect_5_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4002 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawImageRect_5_image">image</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   4003 If <a href="#SkCanvas_drawImageRect_5_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawImageRect_5_image">image</a> bounds.
   4004 
   4005 If generated mask extends beyond <a href="#SkCanvas_drawImageRect_5_image">image</a> bounds, replicate <a href="#SkCanvas_drawImageRect_5_image">image</a> edge colors, just
   4006 as <a href="undocumented#Shader">Shader</a> made from <a href="#SkImage_makeShader">SkImage::makeShader</a> with <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set
   4007 replicates the <a href="#SkCanvas_drawImageRect_5_image">image</a> edge color when it samples outside of its bounds.
   4008 
   4009 <a href="#SkCanvas_drawImageRect_5_constraint">constraint</a> set to <a href="#SkCanvas_kStrict_SrcRectConstraint">kStrict SrcRectConstraint</a> limits <a href="SkPaint_Reference#Paint">Paint</a> <a href="undocumented#Filter_Quality">Filter Quality</a> to
   4010 sample within <a href="#SkCanvas_drawImageRect_5_image">image</a>; set to <a href="#SkCanvas_kFast_SrcRectConstraint">kFast SrcRectConstraint</a> allows sampling outside to
   4011 improve performance.
   4012 
   4013 ### Parameters
   4014 
   4015 <table>  <tr>    <td><a name="SkCanvas_drawImageRect_5_image"> <code><strong>image </strong></code> </a></td> <td>
   4016 <a href="SkImage_Reference#Image">Image</a> containing pixels, dimensions, and format</td>
   4017   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_5_isrc"> <code><strong>isrc </strong></code> </a></td> <td>
   4018 source <a href="SkIRect_Reference#IRect">IRect</a> of <a href="#SkCanvas_drawImageRect_5_image">image</a> to draw from</td>
   4019   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_5_dst"> <code><strong>dst </strong></code> </a></td> <td>
   4020 destination <a href="SkRect_Reference#Rect">Rect</a> of <a href="#SkCanvas_drawImageRect_5_image">image</a> to draw to</td>
   4021   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_5_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4022 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4023 and so on; or nullptr</td>
   4024   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_5_constraint"> <code><strong>constraint </strong></code> </a></td> <td>
   4025 filter strictly within <a href="#SkCanvas_drawImageRect_5_image">image</a> or draw faster</td>
   4026   </tr>
   4027 </table>
   4028 
   4029 ### Example
   4030 
   4031 <div><fiddle-embed name="249fadde5d0d0fc515e9f53f188af48b"></fiddle-embed></div>
   4032 
   4033 ### See Also
   4034 
   4035 <a href="#SkCanvas_SrcRectConstraint">SrcRectConstraint</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkCanvas_drawImageLattice">drawImageLattice</a> <a href="#SkCanvas_drawImageNine">drawImageNine</a><sup><a href="#SkCanvas_drawImageNine_2">[2]</a></sup>
   4036 
   4037 ---
   4038 
   4039 <a name="SkCanvas_drawImageRect_6"></a>
   4040 
   4041 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4042 void drawImageRect(const sk_sp&lt;SkImage&gt;& image, const SkRect& dst, const SkPaint* paint,
   4043                    SrcRectConstraint constraint = kStrict_SrcRectConstraint)
   4044 </pre>
   4045 
   4046 Draw <a href="SkImage_Reference#Image">Image</a> <a href="#SkCanvas_drawImageRect_6_image">image</a>, scaled and translated to fill <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawImageRect_6_dst">dst</a>,
   4047 using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageRect_6_paint">paint</a>.
   4048 
   4049 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageRect_6_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4050 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawImageRect_6_image">image</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   4051 If <a href="#SkCanvas_drawImageRect_6_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawImageRect_6_image">image</a> bounds.
   4052 
   4053 If generated mask extends beyond <a href="#SkCanvas_drawImageRect_6_image">image</a> bounds, replicate <a href="#SkCanvas_drawImageRect_6_image">image</a> edge colors, just
   4054 as <a href="undocumented#Shader">Shader</a> made from <a href="#SkImage_makeShader">SkImage::makeShader</a> with <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set
   4055 replicates the <a href="#SkCanvas_drawImageRect_6_image">image</a> edge color when it samples outside of its bounds.
   4056 
   4057 <a href="#SkCanvas_drawImageRect_6_constraint">constraint</a> set to <a href="#SkCanvas_kStrict_SrcRectConstraint">kStrict SrcRectConstraint</a> limits <a href="SkPaint_Reference#Paint">Paint</a> <a href="undocumented#Filter_Quality">Filter Quality</a> to
   4058 sample within <a href="#SkCanvas_drawImageRect_6_image">image</a>; set to <a href="#SkCanvas_kFast_SrcRectConstraint">kFast SrcRectConstraint</a> allows sampling outside to
   4059 improve performance.
   4060 
   4061 ### Parameters
   4062 
   4063 <table>  <tr>    <td><a name="SkCanvas_drawImageRect_6_image"> <code><strong>image </strong></code> </a></td> <td>
   4064 <a href="SkImage_Reference#Image">Image</a> containing pixels, dimensions, and format</td>
   4065   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_6_dst"> <code><strong>dst </strong></code> </a></td> <td>
   4066 destination <a href="SkRect_Reference#Rect">Rect</a> of <a href="#SkCanvas_drawImageRect_6_image">image</a> to draw to</td>
   4067   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_6_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4068 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4069 and so on; or nullptr</td>
   4070   </tr>  <tr>    <td><a name="SkCanvas_drawImageRect_6_constraint"> <code><strong>constraint </strong></code> </a></td> <td>
   4071 filter strictly within <a href="#SkCanvas_drawImageRect_6_image">image</a> or draw faster</td>
   4072   </tr>
   4073 </table>
   4074 
   4075 ### Example
   4076 
   4077 <div><fiddle-embed name="37a85bd2247487c7af584e42c1cabe4a"></fiddle-embed></div>
   4078 
   4079 ### See Also
   4080 
   4081 <a href="#SkCanvas_SrcRectConstraint">SrcRectConstraint</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkCanvas_drawImageLattice">drawImageLattice</a> <a href="#SkCanvas_drawImageNine">drawImageNine</a><sup><a href="#SkCanvas_drawImageNine_2">[2]</a></sup>
   4082 
   4083 ---
   4084 
   4085 <a name="SkCanvas_drawImageNine"></a>
   4086 ## drawImageNine
   4087 
   4088 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4089 void drawImageNine(const SkImage* image, const SkIRect& center, const SkRect& dst,
   4090                    const SkPaint* paint = nullptr)
   4091 </pre>
   4092 
   4093 Draw <a href="SkImage_Reference#Image">Image</a> <a href="#SkCanvas_drawImageNine_image">image</a> stretched proportionally to fit into <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawImageNine_dst">dst</a>.
   4094 <a href="SkIRect_Reference#IRect">IRect</a> <a href="#SkCanvas_drawImageNine_center">center</a> divides the <a href="#SkCanvas_drawImageNine_image">image</a> into nine sections: four sides, four corners, and
   4095 the <a href="#SkCanvas_drawImageNine_center">center</a>. Corners are unmodified or scaled down proportionately if their sides
   4096 are larger than <a href="#SkCanvas_drawImageNine_dst">dst</a>; <a href="#SkCanvas_drawImageNine_center">center</a> and four sides are scaled to fit remaining space, if any.
   4097 
   4098 Additionally transform draw using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageNine_paint">paint</a>.
   4099 
   4100 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageNine_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4101 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawImageNine_image">image</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   4102 If <a href="#SkCanvas_drawImageNine_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawImageNine_image">image</a> bounds.
   4103 
   4104 If generated mask extends beyond <a href="#SkCanvas_drawImageNine_image">image</a> bounds, replicate <a href="#SkCanvas_drawImageNine_image">image</a> edge colors, just
   4105 as <a href="undocumented#Shader">Shader</a> made from <a href="#SkImage_makeShader">SkImage::makeShader</a> with <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set
   4106 replicates the <a href="#SkCanvas_drawImageNine_image">image</a> edge color when it samples outside of its bounds.
   4107 
   4108 ### Parameters
   4109 
   4110 <table>  <tr>    <td><a name="SkCanvas_drawImageNine_image"> <code><strong>image </strong></code> </a></td> <td>
   4111 <a href="SkImage_Reference#Image">Image</a> containing pixels, dimensions, and format</td>
   4112   </tr>  <tr>    <td><a name="SkCanvas_drawImageNine_center"> <code><strong>center </strong></code> </a></td> <td>
   4113 <a href="SkIRect_Reference#IRect">IRect</a> edge of <a href="#SkCanvas_drawImageNine_image">image</a> corners and sides</td>
   4114   </tr>  <tr>    <td><a name="SkCanvas_drawImageNine_dst"> <code><strong>dst </strong></code> </a></td> <td>
   4115 destination <a href="SkRect_Reference#Rect">Rect</a> of <a href="#SkCanvas_drawImageNine_image">image</a> to draw to</td>
   4116   </tr>  <tr>    <td><a name="SkCanvas_drawImageNine_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4117 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4118 and so on; or nullptr</td>
   4119   </tr>
   4120 </table>
   4121 
   4122 ### Example
   4123 
   4124 <div><fiddle-embed name="47f78f3f70ccd9e6c40ee3203a5c71dd"><div>The leftmost <a href="#SkCanvas_drawImageNine_image">image</a> is smaller than <a href="#SkCanvas_drawImageNine_center">center</a>; only corners are drawn, all scaled to fit.
   4125 The second <a href="#SkCanvas_drawImageNine_image">image</a> equals the size of <a href="#SkCanvas_drawImageNine_center">center</a>; only corners are drawn without scaling.
   4126 The remaining images are larger than <a href="#SkCanvas_drawImageNine_center">center</a>. All corners draw without scaling.
   4127 The sides and <a href="#SkCanvas_drawImageNine_center">center</a> are scaled if needed to take up the remaining space.</div></fiddle-embed></div>
   4128 
   4129 ### See Also
   4130 
   4131 <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkCanvas_drawBitmapNine">drawBitmapNine</a> <a href="#SkCanvas_drawImageLattice">drawImageLattice</a> <a href="#SkCanvas_drawImageRect">drawImageRect</a><sup><a href="#SkCanvas_drawImageRect_2">[2]</a></sup><sup><a href="#SkCanvas_drawImageRect_3">[3]</a></sup><sup><a href="#SkCanvas_drawImageRect_4">[4]</a></sup><sup><a href="#SkCanvas_drawImageRect_5">[5]</a></sup><sup><a href="#SkCanvas_drawImageRect_6">[6]</a></sup>
   4132 
   4133 ---
   4134 
   4135 <a name="SkCanvas_drawImageNine_2"></a>
   4136 
   4137 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4138 void drawImageNine(const sk_sp&lt;SkImage&gt;& image, const SkIRect& center, const SkRect& dst,
   4139                    const SkPaint* paint = nullptr)
   4140 </pre>
   4141 
   4142 Draw <a href="SkImage_Reference#Image">Image</a> <a href="#SkCanvas_drawImageNine_2_image">image</a> stretched proportionally to fit into <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawImageNine_2_dst">dst</a>.
   4143 <a href="SkIRect_Reference#IRect">IRect</a> <a href="#SkCanvas_drawImageNine_2_center">center</a> divides the <a href="#SkCanvas_drawImageNine_2_image">image</a> into nine sections: four sides, four corners, and
   4144 the <a href="#SkCanvas_drawImageNine_2_center">center</a>. Corners are not scaled, or scaled down proportionately if their sides
   4145 are larger than <a href="#SkCanvas_drawImageNine_2_dst">dst</a>; <a href="#SkCanvas_drawImageNine_2_center">center</a> and four sides are scaled to fit remaining space, if any.
   4146 
   4147 Additionally transform draw using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageNine_2_paint">paint</a>.
   4148 
   4149 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageNine_2_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4150 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawImageNine_2_image">image</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   4151 If <a href="#SkCanvas_drawImageNine_2_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawImageNine_2_image">image</a> bounds.
   4152 
   4153 If generated mask extends beyond <a href="#SkCanvas_drawImageNine_2_image">image</a> bounds, replicate <a href="#SkCanvas_drawImageNine_2_image">image</a> edge colors, just
   4154 as <a href="undocumented#Shader">Shader</a> made from <a href="#SkImage_makeShader">SkImage::makeShader</a> with <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set
   4155 replicates the <a href="#SkCanvas_drawImageNine_2_image">image</a> edge color when it samples outside of its bounds.
   4156 
   4157 ### Parameters
   4158 
   4159 <table>  <tr>    <td><a name="SkCanvas_drawImageNine_2_image"> <code><strong>image </strong></code> </a></td> <td>
   4160 <a href="SkImage_Reference#Image">Image</a> containing pixels, dimensions, and format</td>
   4161   </tr>  <tr>    <td><a name="SkCanvas_drawImageNine_2_center"> <code><strong>center </strong></code> </a></td> <td>
   4162 <a href="SkIRect_Reference#IRect">IRect</a> edge of <a href="#SkCanvas_drawImageNine_2_image">image</a> corners and sides</td>
   4163   </tr>  <tr>    <td><a name="SkCanvas_drawImageNine_2_dst"> <code><strong>dst </strong></code> </a></td> <td>
   4164 destination <a href="SkRect_Reference#Rect">Rect</a> of <a href="#SkCanvas_drawImageNine_2_image">image</a> to draw to</td>
   4165   </tr>  <tr>    <td><a name="SkCanvas_drawImageNine_2_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4166 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4167 and so on; or nullptr</td>
   4168   </tr>
   4169 </table>
   4170 
   4171 ### Example
   4172 
   4173 <div><fiddle-embed name="e941e553970569d1ffb03a42f7fcd6d9"><div>The two leftmost images has four corners and sides to the left and right of <a href="#SkCanvas_drawImageNine_2_center">center</a>.
   4174 The leftmost <a href="#SkCanvas_drawImageNine_2_image">image</a> scales the width of corners proportionately to fit.
   4175 The third and fourth <a href="#SkCanvas_drawImageNine_2_image">image</a> corners are not scaled; the sides and <a href="#SkCanvas_drawImageNine_2_center">center</a> are scaled to
   4176 fill the remaining space.
   4177 The rightmost <a href="#SkCanvas_drawImageNine_2_image">image</a> has four corners scaled vertically to fit, and uses sides above
   4178 and below <a href="#SkCanvas_drawImageNine_2_center">center</a> to fill the remaining space.</div></fiddle-embed></div>
   4179 
   4180 ### See Also
   4181 
   4182 <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkCanvas_drawBitmapNine">drawBitmapNine</a> <a href="#SkCanvas_drawImageLattice">drawImageLattice</a> <a href="#SkCanvas_drawImageRect">drawImageRect</a><sup><a href="#SkCanvas_drawImageRect_2">[2]</a></sup><sup><a href="#SkCanvas_drawImageRect_3">[3]</a></sup><sup><a href="#SkCanvas_drawImageRect_4">[4]</a></sup><sup><a href="#SkCanvas_drawImageRect_5">[5]</a></sup><sup><a href="#SkCanvas_drawImageRect_6">[6]</a></sup>
   4183 
   4184 ---
   4185 
   4186 <a name="SkCanvas_drawBitmap"></a>
   4187 ## drawBitmap
   4188 
   4189 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4190 void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top, const SkPaint* paint = nullptr)
   4191 </pre>
   4192 
   4193 Draw <a href="SkBitmap_Reference#Bitmap">Bitmap</a> <a href="#SkCanvas_drawBitmap_bitmap">bitmap</a>, with its <a href="#SkCanvas_drawBitmap_top">top</a>-<a href="#SkCanvas_drawBitmap_left">left</a> corner at (<a href="#SkCanvas_drawBitmap_left">left</a>, <a href="#SkCanvas_drawBitmap_top">top</a>),
   4194 using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawBitmap_paint">paint</a>.
   4195 
   4196 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawBitmap_paint">paint</a> is not nullptr, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4197 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawBitmap_bitmap">bitmap</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   4198 If <a href="#SkCanvas_drawBitmap_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawBitmap_bitmap">bitmap</a> bounds.
   4199 
   4200 If generated mask extends beyond <a href="#SkCanvas_drawBitmap_bitmap">bitmap</a> bounds, replicate <a href="#SkCanvas_drawBitmap_bitmap">bitmap</a> edge colors,
   4201 just as <a href="undocumented#Shader">Shader</a> made from <a href="#SkShader_MakeBitmapShader">SkShader::MakeBitmapShader</a> with
   4202 <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set replicates the <a href="#SkCanvas_drawBitmap_bitmap">bitmap</a> edge color when it samples
   4203 outside of its bounds.
   4204 
   4205 ### Parameters
   4206 
   4207 <table>  <tr>    <td><a name="SkCanvas_drawBitmap_bitmap"> <code><strong>bitmap </strong></code> </a></td> <td>
   4208 <a href="SkBitmap_Reference#Bitmap">Bitmap</a> containing pixels, dimensions, and format</td>
   4209   </tr>  <tr>    <td><a name="SkCanvas_drawBitmap_left"> <code><strong>left </strong></code> </a></td> <td>
   4210 <a href="#SkCanvas_drawBitmap_left">left</a> side of <a href="#SkCanvas_drawBitmap_bitmap">bitmap</a></td>
   4211   </tr>  <tr>    <td><a name="SkCanvas_drawBitmap_top"> <code><strong>top </strong></code> </a></td> <td>
   4212 <a href="#SkCanvas_drawBitmap_top">top</a> side of <a href="#SkCanvas_drawBitmap_bitmap">bitmap</a></td>
   4213   </tr>  <tr>    <td><a name="SkCanvas_drawBitmap_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4214 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4215 and so on; or nullptr</td>
   4216   </tr>
   4217 </table>
   4218 
   4219 ### Example
   4220 
   4221 <div><fiddle-embed name="70d7fbf7de82264dd66a526d98d31def"></fiddle-embed></div>
   4222 
   4223 ### See Also
   4224 
   4225 <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkCanvas_drawBitmapLattice">drawBitmapLattice</a> <a href="#SkCanvas_drawBitmapNine">drawBitmapNine</a> <a href="#SkCanvas_drawBitmapRect">drawBitmapRect</a><sup><a href="#SkCanvas_drawBitmapRect_2">[2]</a></sup><sup><a href="#SkCanvas_drawBitmapRect_3">[3]</a></sup> <a href="#SkBitmap_readPixels">SkBitmap::readPixels</a><sup><a href="#SkBitmap_readPixels_2">[2]</a></sup><sup><a href="#SkBitmap_readPixels_3">[3]</a></sup><sup><a href="#SkBitmap_readPixels_4">[4]</a></sup> <a href="#SkBitmap_writePixels">SkBitmap::writePixels</a><sup><a href="#SkBitmap_writePixels_2">[2]</a></sup><sup><a href="#SkBitmap_writePixels_3">[3]</a></sup>
   4226 
   4227 ---
   4228 
   4229 <a name="SkCanvas_drawBitmapRect"></a>
   4230 ## drawBitmapRect
   4231 
   4232 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4233 void drawBitmapRect(const SkBitmap& bitmap, const SkRect& src, const SkRect& dst,
   4234                     const SkPaint* paint, SrcRectConstraint constraint = kStrict_SrcRectConstraint)
   4235 </pre>
   4236 
   4237 Draw <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawBitmapRect_src">src</a> of <a href="SkBitmap_Reference#Bitmap">Bitmap</a> <a href="#SkCanvas_drawBitmapRect_bitmap">bitmap</a>, scaled and translated to fill <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawBitmapRect_dst">dst</a>.
   4238 Additionally transform draw using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawBitmapRect_paint">paint</a>.
   4239 
   4240 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawBitmapRect_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4241 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawBitmapRect_bitmap">bitmap</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   4242 If <a href="#SkCanvas_drawBitmapRect_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawBitmapRect_bitmap">bitmap</a> bounds.
   4243 
   4244 If generated mask extends beyond <a href="#SkCanvas_drawBitmapRect_bitmap">bitmap</a> bounds, replicate <a href="#SkCanvas_drawBitmapRect_bitmap">bitmap</a> edge colors,
   4245 just as <a href="undocumented#Shader">Shader</a> made from <a href="#SkShader_MakeBitmapShader">SkShader::MakeBitmapShader</a> with
   4246 <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set replicates the <a href="#SkCanvas_drawBitmapRect_bitmap">bitmap</a> edge color when it samples
   4247 outside of its bounds.
   4248 
   4249 <a href="#SkCanvas_drawBitmapRect_constraint">constraint</a> set to <a href="#SkCanvas_kStrict_SrcRectConstraint">kStrict SrcRectConstraint</a> limits <a href="SkPaint_Reference#Paint">Paint</a> <a href="undocumented#Filter_Quality">Filter Quality</a> to
   4250 sample within <a href="#SkCanvas_drawBitmapRect_src">src</a>; set to <a href="#SkCanvas_kFast_SrcRectConstraint">kFast SrcRectConstraint</a> allows sampling outside to
   4251 improve performance.
   4252 
   4253 ### Parameters
   4254 
   4255 <table>  <tr>    <td><a name="SkCanvas_drawBitmapRect_bitmap"> <code><strong>bitmap </strong></code> </a></td> <td>
   4256 <a href="SkBitmap_Reference#Bitmap">Bitmap</a> containing pixels, dimensions, and format</td>
   4257   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapRect_src"> <code><strong>src </strong></code> </a></td> <td>
   4258 source <a href="SkRect_Reference#Rect">Rect</a> of image to draw from</td>
   4259   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapRect_dst"> <code><strong>dst </strong></code> </a></td> <td>
   4260 destination <a href="SkRect_Reference#Rect">Rect</a> of image to draw to</td>
   4261   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapRect_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4262 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4263 and so on; or nullptr</td>
   4264   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapRect_constraint"> <code><strong>constraint </strong></code> </a></td> <td>
   4265 filter strictly within <a href="#SkCanvas_drawBitmapRect_src">src</a> or draw faster</td>
   4266   </tr>
   4267 </table>
   4268 
   4269 ### Example
   4270 
   4271 <div><fiddle-embed name="de449106e78ec558d9921b9f076de164"></fiddle-embed></div>
   4272 
   4273 ### See Also
   4274 
   4275 <a href="#SkCanvas_drawImageRect">drawImageRect</a><sup><a href="#SkCanvas_drawImageRect_2">[2]</a></sup><sup><a href="#SkCanvas_drawImageRect_3">[3]</a></sup><sup><a href="#SkCanvas_drawImageRect_4">[4]</a></sup><sup><a href="#SkCanvas_drawImageRect_5">[5]</a></sup><sup><a href="#SkCanvas_drawImageRect_6">[6]</a></sup> <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawBitmapLattice">drawBitmapLattice</a> <a href="#SkCanvas_drawBitmapNine">drawBitmapNine</a>
   4276 
   4277 ---
   4278 
   4279 <a name="SkCanvas_drawBitmapRect_2"></a>
   4280 
   4281 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4282 void drawBitmapRect(const SkBitmap& bitmap, const SkIRect& isrc, const SkRect& dst,
   4283                     const SkPaint* paint, SrcRectConstraint constraint = kStrict_SrcRectConstraint)
   4284 </pre>
   4285 
   4286 Draw <a href="SkIRect_Reference#IRect">IRect</a> <a href="#SkCanvas_drawBitmapRect_2_isrc">isrc</a> of <a href="SkBitmap_Reference#Bitmap">Bitmap</a> <a href="#SkCanvas_drawBitmapRect_2_bitmap">bitmap</a>, scaled and translated to fill <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawBitmapRect_2_dst">dst</a>.
   4287 <a href="#SkCanvas_drawBitmapRect_2_isrc">isrc</a> is on integer pixel boundaries; <a href="#SkCanvas_drawBitmapRect_2_dst">dst</a> may include fractional boundaries.
   4288 Additionally transform draw using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawBitmapRect_2_paint">paint</a>.
   4289 
   4290 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawBitmapRect_2_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4291 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawBitmapRect_2_bitmap">bitmap</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   4292 If <a href="#SkCanvas_drawBitmapRect_2_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawBitmapRect_2_bitmap">bitmap</a> bounds.
   4293 
   4294 If generated mask extends beyond <a href="#SkCanvas_drawBitmapRect_2_bitmap">bitmap</a> bounds, replicate <a href="#SkCanvas_drawBitmapRect_2_bitmap">bitmap</a> edge colors,
   4295 just as <a href="undocumented#Shader">Shader</a> made from <a href="#SkShader_MakeBitmapShader">SkShader::MakeBitmapShader</a> with
   4296 <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set replicates the <a href="#SkCanvas_drawBitmapRect_2_bitmap">bitmap</a> edge color when it samples
   4297 outside of its bounds.
   4298 
   4299 <a href="#SkCanvas_drawBitmapRect_2_constraint">constraint</a> set to <a href="#SkCanvas_kStrict_SrcRectConstraint">kStrict SrcRectConstraint</a> limits <a href="SkPaint_Reference#Paint">Paint</a> <a href="undocumented#Filter_Quality">Filter Quality</a> to
   4300 sample within <a href="#SkCanvas_drawBitmapRect_2_isrc">isrc</a>; set to <a href="#SkCanvas_kFast_SrcRectConstraint">kFast SrcRectConstraint</a> allows sampling outside to
   4301 improve performance.
   4302 
   4303 ### Parameters
   4304 
   4305 <table>  <tr>    <td><a name="SkCanvas_drawBitmapRect_2_bitmap"> <code><strong>bitmap </strong></code> </a></td> <td>
   4306 <a href="SkBitmap_Reference#Bitmap">Bitmap</a> containing pixels, dimensions, and format</td>
   4307   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapRect_2_isrc"> <code><strong>isrc </strong></code> </a></td> <td>
   4308 source <a href="SkIRect_Reference#IRect">IRect</a> of image to draw from</td>
   4309   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapRect_2_dst"> <code><strong>dst </strong></code> </a></td> <td>
   4310 destination <a href="SkRect_Reference#Rect">Rect</a> of image to draw to</td>
   4311   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapRect_2_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4312 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4313 and so on; or nullptr</td>
   4314   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapRect_2_constraint"> <code><strong>constraint </strong></code> </a></td> <td>
   4315 sample strictly within <a href="#SkCanvas_drawBitmapRect_2_isrc">isrc</a>, or draw faster</td>
   4316   </tr>
   4317 </table>
   4318 
   4319 ### Example
   4320 
   4321 <div><fiddle-embed name="69b028ef1f95c355672fbdcbf47550f2"></fiddle-embed></div>
   4322 
   4323 ### See Also
   4324 
   4325 <a href="#SkCanvas_drawImageRect">drawImageRect</a><sup><a href="#SkCanvas_drawImageRect_2">[2]</a></sup><sup><a href="#SkCanvas_drawImageRect_3">[3]</a></sup><sup><a href="#SkCanvas_drawImageRect_4">[4]</a></sup><sup><a href="#SkCanvas_drawImageRect_5">[5]</a></sup><sup><a href="#SkCanvas_drawImageRect_6">[6]</a></sup> <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawBitmapLattice">drawBitmapLattice</a> <a href="#SkCanvas_drawBitmapNine">drawBitmapNine</a>
   4326 
   4327 ---
   4328 
   4329 <a name="SkCanvas_drawBitmapRect_3"></a>
   4330 
   4331 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4332 void drawBitmapRect(const SkBitmap& bitmap, const SkRect& dst, const SkPaint* paint,
   4333                     SrcRectConstraint constraint = kStrict_SrcRectConstraint)
   4334 </pre>
   4335 
   4336 Draw <a href="SkBitmap_Reference#Bitmap">Bitmap</a> <a href="#SkCanvas_drawBitmapRect_3_bitmap">bitmap</a>, scaled and translated to fill <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawBitmapRect_3_dst">dst</a>.
   4337 <a href="#SkCanvas_drawBitmapRect_3_bitmap">bitmap</a> bounds is on integer pixel boundaries; <a href="#SkCanvas_drawBitmapRect_3_dst">dst</a> may include fractional boundaries.
   4338 Additionally transform draw using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawBitmapRect_3_paint">paint</a>.
   4339 
   4340 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawBitmapRect_3_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4341 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawBitmapRect_3_bitmap">bitmap</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   4342 If <a href="#SkCanvas_drawBitmapRect_3_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawBitmapRect_3_bitmap">bitmap</a> bounds.
   4343 
   4344 If generated mask extends beyond <a href="#SkCanvas_drawBitmapRect_3_bitmap">bitmap</a> bounds, replicate <a href="#SkCanvas_drawBitmapRect_3_bitmap">bitmap</a> edge colors,
   4345 just as <a href="undocumented#Shader">Shader</a> made from <a href="#SkShader_MakeBitmapShader">SkShader::MakeBitmapShader</a> with
   4346 <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set replicates the <a href="#SkCanvas_drawBitmapRect_3_bitmap">bitmap</a> edge color when it samples
   4347 outside of its bounds.
   4348 
   4349 <a href="#SkCanvas_drawBitmapRect_3_constraint">constraint</a> set to <a href="#SkCanvas_kStrict_SrcRectConstraint">kStrict SrcRectConstraint</a> limits <a href="SkPaint_Reference#Paint">Paint</a> <a href="undocumented#Filter_Quality">Filter Quality</a> to
   4350 sample within <a href="#SkCanvas_drawBitmapRect_3_bitmap">bitmap</a>; set to <a href="#SkCanvas_kFast_SrcRectConstraint">kFast SrcRectConstraint</a> allows sampling outside to
   4351 improve performance.
   4352 
   4353 ### Parameters
   4354 
   4355 <table>  <tr>    <td><a name="SkCanvas_drawBitmapRect_3_bitmap"> <code><strong>bitmap </strong></code> </a></td> <td>
   4356 <a href="SkBitmap_Reference#Bitmap">Bitmap</a> containing pixels, dimensions, and format</td>
   4357   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapRect_3_dst"> <code><strong>dst </strong></code> </a></td> <td>
   4358 destination <a href="SkRect_Reference#Rect">Rect</a> of image to draw to</td>
   4359   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapRect_3_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4360 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4361 and so on; or nullptr</td>
   4362   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapRect_3_constraint"> <code><strong>constraint </strong></code> </a></td> <td>
   4363 filter strictly within <a href="#SkCanvas_drawBitmapRect_3_bitmap">bitmap</a> or draw faster</td>
   4364   </tr>
   4365 </table>
   4366 
   4367 ### Example
   4368 
   4369 <div><fiddle-embed name="76b74b826e43b4a595d18115564e88c7"></fiddle-embed></div>
   4370 
   4371 ### See Also
   4372 
   4373 <a href="#SkCanvas_drawImageRect">drawImageRect</a><sup><a href="#SkCanvas_drawImageRect_2">[2]</a></sup><sup><a href="#SkCanvas_drawImageRect_3">[3]</a></sup><sup><a href="#SkCanvas_drawImageRect_4">[4]</a></sup><sup><a href="#SkCanvas_drawImageRect_5">[5]</a></sup><sup><a href="#SkCanvas_drawImageRect_6">[6]</a></sup> <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawBitmapLattice">drawBitmapLattice</a> <a href="#SkCanvas_drawBitmapNine">drawBitmapNine</a>
   4374 
   4375 ---
   4376 
   4377 <a name="SkCanvas_drawBitmapNine"></a>
   4378 ## drawBitmapNine
   4379 
   4380 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4381 void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst,
   4382                     const SkPaint* paint = nullptr)
   4383 </pre>
   4384 
   4385 Draw <a href="SkBitmap_Reference#Bitmap">Bitmap</a> <a href="#SkCanvas_drawBitmapNine_bitmap">bitmap</a> stretched proportionally to fit into <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawBitmapNine_dst">dst</a>.
   4386 <a href="SkIRect_Reference#IRect">IRect</a> <a href="#SkCanvas_drawBitmapNine_center">center</a> divides the <a href="#SkCanvas_drawBitmapNine_bitmap">bitmap</a> into nine sections: four sides, four corners,
   4387 and the <a href="#SkCanvas_drawBitmapNine_center">center</a>. Corners are not scaled, or scaled down proportionately if their
   4388 sides are larger than <a href="#SkCanvas_drawBitmapNine_dst">dst</a>; <a href="#SkCanvas_drawBitmapNine_center">center</a> and four sides are scaled to fit remaining
   4389 space, if any.
   4390 
   4391 Additionally transform draw using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawBitmapNine_paint">paint</a>.
   4392 
   4393 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawBitmapNine_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4394 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawBitmapNine_bitmap">bitmap</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   4395 If <a href="#SkCanvas_drawBitmapNine_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawBitmapNine_bitmap">bitmap</a> bounds.
   4396 
   4397 If generated mask extends beyond <a href="#SkCanvas_drawBitmapNine_bitmap">bitmap</a> bounds, replicate <a href="#SkCanvas_drawBitmapNine_bitmap">bitmap</a> edge colors,
   4398 just as <a href="undocumented#Shader">Shader</a> made from <a href="#SkShader_MakeBitmapShader">SkShader::MakeBitmapShader</a> with
   4399 <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set replicates the <a href="#SkCanvas_drawBitmapNine_bitmap">bitmap</a> edge color when it samples
   4400 outside of its bounds.
   4401 
   4402 ### Parameters
   4403 
   4404 <table>  <tr>    <td><a name="SkCanvas_drawBitmapNine_bitmap"> <code><strong>bitmap </strong></code> </a></td> <td>
   4405 <a href="SkBitmap_Reference#Bitmap">Bitmap</a> containing pixels, dimensions, and format</td>
   4406   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapNine_center"> <code><strong>center </strong></code> </a></td> <td>
   4407 <a href="SkIRect_Reference#IRect">IRect</a> edge of image corners and sides</td>
   4408   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapNine_dst"> <code><strong>dst </strong></code> </a></td> <td>
   4409 destination <a href="SkRect_Reference#Rect">Rect</a> of image to draw to</td>
   4410   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapNine_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4411 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4412 and so on; or nullptr</td>
   4413   </tr>
   4414 </table>
   4415 
   4416 ### Example
   4417 
   4418 <div><fiddle-embed name="a4a30aa10e566a85fe6f6cad2ff9935b"><div>The two leftmost <a href="#SkCanvas_drawBitmapNine_bitmap">bitmap</a> draws has four corners and sides to the left and right of <a href="#SkCanvas_drawBitmapNine_center">center</a>.
   4419 The leftmost <a href="#SkCanvas_drawBitmapNine_bitmap">bitmap</a> draw scales the width of corners proportionately to fit.
   4420 The third and fourth draw corners are not scaled; the sides and <a href="#SkCanvas_drawBitmapNine_center">center</a> are scaled to
   4421 fill the remaining space.
   4422 The rightmost <a href="#SkCanvas_drawBitmapNine_bitmap">bitmap</a> draw has four corners scaled vertically to fit, and uses sides above
   4423 and below <a href="#SkCanvas_drawBitmapNine_center">center</a> to fill the remaining space.</div></fiddle-embed></div>
   4424 
   4425 ### See Also
   4426 
   4427 <a href="#SkCanvas_drawImageNine">drawImageNine</a><sup><a href="#SkCanvas_drawImageNine_2">[2]</a></sup> <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawBitmapLattice">drawBitmapLattice</a> <a href="#SkCanvas_drawBitmapRect">drawBitmapRect</a><sup><a href="#SkCanvas_drawBitmapRect_2">[2]</a></sup><sup><a href="#SkCanvas_drawBitmapRect_3">[3]</a></sup>
   4428 
   4429 ---
   4430 
   4431 # <a name="SkCanvas_Lattice"></a> Struct SkCanvas::Lattice
   4432 
   4433 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4434 struct <a href="#SkCanvas_Lattice">Lattice</a> {
   4435 enum <a href="#SkCanvas_Lattice_RectType">RectType</a> ...
   4436 
   4437 const int*      <a href="#SkCanvas_Lattice_fXDivs">fXDivs</a>;
   4438 const int*      <a href="#SkCanvas_Lattice_fYDivs">fYDivs</a>;
   4439 const <a href="#SkCanvas_Lattice_RectType">RectType</a>* <a href="#SkCanvas_Lattice_fRectTypes">fRectTypes</a>;
   4440 int             <a href="#SkCanvas_Lattice_fXCount">fXCount</a>;
   4441 int             <a href="#SkCanvas_Lattice_fYCount">fYCount</a>;
   4442 const <a href="SkIRect_Reference#SkIRect">SkIRect</a>*  <a href="#SkCanvas_Lattice_fBounds">fBounds</a>;
   4443 const <a href="undocumented#SkColor">SkColor</a>*  <a href="#SkCanvas_Lattice_fColors">fColors</a>;
   4444 };</pre>
   4445 
   4446 <a href="#SkCanvas_Lattice">Lattice</a> divides <a href="SkBitmap_Reference#Bitmap">Bitmap</a> or <a href="SkImage_Reference#Image">Image</a> into a rectangular grid.
   4447 Grid entries on even columns and even rows are fixed; these entries are
   4448 always drawn at their original size if the destination is large enough.
   4449 If the destination side is too small to hold the fixed entries, all fixed
   4450 entries are proportionately scaled down to fit.
   4451 The grid entries not on even columns and rows are scaled to fit the
   4452 remaining space, if any.
   4453 
   4454 ## <a name="SkCanvas_Lattice_RectType"></a> Enum SkCanvas::Lattice::RectType
   4455 
   4456 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4457 enum <a href="#SkCanvas_Lattice_RectType">RectType</a> : uint8_t {
   4458 <a href="#SkCanvas_Lattice_kDefault">kDefault</a> = 0,
   4459 <a href="#SkCanvas_Lattice_kTransparent">kTransparent</a>,
   4460 <a href="#SkCanvas_Lattice_kFixedColor">kFixedColor</a>,
   4461 };</pre>
   4462 
   4463 Optional setting per rectangular grid entry to make it transparent,
   4464 or to fill the grid entry with a color.
   4465 
   4466 ### Constants
   4467 
   4468 <table>
   4469   <tr>
   4470     <td><a name="SkCanvas_Lattice_kDefault"> <code><strong>SkCanvas::Lattice::kDefault </strong></code> </a></td><td>0</td><td>Draws <a href="SkBitmap_Reference#Bitmap">Bitmap</a> into lattice rectangle.</td>
   4471   </tr>
   4472   <tr>
   4473     <td><a name="SkCanvas_Lattice_kTransparent"> <code><strong>SkCanvas::Lattice::kTransparent </strong></code> </a></td><td>1</td><td>Skips lattice rectangle by making it transparent.</td>
   4474   </tr>
   4475   <tr>
   4476     <td><a name="SkCanvas_Lattice_kFixedColor"> <code><strong>SkCanvas::Lattice::kFixedColor </strong></code> </a></td><td>2</td><td>Draws one of <a href="#SkCanvas_Lattice_fColors">fColors</a> into lattice rectangle.</td>
   4477   </tr>
   4478 
   4479 </table>
   4480 
   4481 <a name="SkCanvas_Lattice_fXDivs"> <code><strong>const int*   fXDivs</strong></code> </a>
   4482 
   4483 Array of x-coordinates that divide the bitmap vertically.
   4484 Array entries must be unique, increasing, greater than or equal to
   4485 <a href="#SkCanvas_Lattice_fBounds">fBounds</a> left edge, and less than <a href="#SkCanvas_Lattice_fBounds">fBounds</a> right edge.
   4486 Set the first element to <a href="#SkCanvas_Lattice_fBounds">fBounds</a> left to collapse the left column of
   4487 fixed grid entries.
   4488 
   4489 <a name="SkCanvas_Lattice_fYDivs"> <code><strong>const int*   fYDivs</strong></code> </a>
   4490 
   4491 Array of y-coordinates that divide the bitmap horizontally.
   4492 Array entries must be unique, increasing, greater than or equal to
   4493 <a href="#SkCanvas_Lattice_fBounds">fBounds</a> top edge, and less than <a href="#SkCanvas_Lattice_fBounds">fBounds</a> bottom edge.
   4494 Set the first element to <a href="#SkCanvas_Lattice_fBounds">fBounds</a> top to collapse the top row of fixed
   4495 grid entries.
   4496 
   4497 <a name="SkCanvas_Lattice_fRectTypes"> <code><strong>const RectType* fRectTypes</strong></code> </a>
   4498 
   4499 Optional array of fill types, one per rectangular grid entry:
   4500 array length must be(        <a href="#SkCanvas_Lattice_fXCount">fXCount</a> + 1) * (<a href="#SkCanvas_Lattice_fYCount">fYCount</a> + 1).
   4501 
   4502 Each <a href="#SkCanvas_Lattice_RectType">RectType</a> is one of: <a href="#SkCanvas_Lattice_kDefault">kDefault</a>, <a href="#SkCanvas_Lattice_kTransparent">kTransparent</a>, <a href="#SkCanvas_Lattice_kFixedColor">kFixedColor</a>.
   4503 
   4504 Array entries correspond to the rectangular grid entries, ascending
   4505 left to right and then top to bottom.
   4506 
   4507 <a name="SkCanvas_Lattice_fXCount"> <code><strong>int   fXCount</strong></code> </a>
   4508 
   4509 Number of entries in <a href="#SkCanvas_Lattice_fXDivs">fXDivs</a> array; one less than the number of
   4510 horizontal divisions.
   4511 
   4512 <a name="SkCanvas_Lattice_fYCount"> <code><strong>int   fYCount</strong></code> </a>
   4513 
   4514 Number of entries in <a href="#SkCanvas_Lattice_fYDivs">fYDivs</a> array; one less than the number of vertical
   4515 divisions.
   4516 
   4517 <a name="SkCanvas_Lattice_fBounds"> <code><strong>const SkIRect*   fBounds</strong></code> </a>
   4518 
   4519 Optional subset <a href="SkIRect_Reference#IRect">IRect</a> source to draw from.
   4520 If nullptr, source bounds is dimensions of <a href="SkBitmap_Reference#Bitmap">Bitmap</a> or <a href="SkImage_Reference#Image">Image</a>.
   4521 
   4522 <a name="SkCanvas_Lattice_fColors"> <code><strong>const SkColor*   fColors</strong></code> </a>
   4523 
   4524 Optional array of colors, one per rectangular grid entry.
   4525 Array length must be(       <a href="#SkCanvas_Lattice_fXCount">fXCount</a> + 1) * (<a href="#SkCanvas_Lattice_fYCount">fYCount</a> + 1).
   4526 
   4527 Array entries correspond to the rectangular grid entries, ascending
   4528 left to right, then top to bottom.
   4529 
   4530 <a name="SkCanvas_drawBitmapLattice"></a>
   4531 ## drawBitmapLattice
   4532 
   4533 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4534 void drawBitmapLattice(const SkBitmap& bitmap, const Lattice& lattice, const SkRect& dst,
   4535                        const SkPaint* paint = nullptr)
   4536 </pre>
   4537 
   4538 Draw <a href="SkBitmap_Reference#Bitmap">Bitmap</a> <a href="#SkCanvas_drawBitmapLattice_bitmap">bitmap</a> stretched proportionally to fit into <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawBitmapLattice_dst">dst</a>.
   4539 
   4540 <a href="#SkCanvas_Lattice">Lattice</a> <a href="#SkCanvas_drawBitmapLattice_lattice">lattice</a> divides <a href="#SkCanvas_drawBitmapLattice_bitmap">bitmap</a> into a rectangular grid.
   4541 Each intersection of an even-numbered row and column is fixed; like the corners
   4542 of <a href="#SkCanvas_drawBitmapNine">drawBitmapNine</a>, fixed <a href="#SkCanvas_drawBitmapLattice_lattice">lattice</a> elements never scale larger than their initial
   4543 size and shrink proportionately when all fixed elements exceed the <a href="#SkCanvas_drawBitmapLattice_bitmap">bitmap</a>
   4544 dimension. All other grid elements scale to fill the available space, if any.
   4545 
   4546 Additionally transform draw using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawBitmapLattice_paint">paint</a>.
   4547 
   4548 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawBitmapLattice_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4549 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If <a href="#SkCanvas_drawBitmapLattice_bitmap">bitmap</a> is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   4550 If <a href="#SkCanvas_drawBitmapLattice_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from <a href="#SkCanvas_drawBitmapLattice_bitmap">bitmap</a> bounds.
   4551 
   4552 If generated mask extends beyond <a href="#SkCanvas_drawBitmapLattice_bitmap">bitmap</a> bounds, replicate <a href="#SkCanvas_drawBitmapLattice_bitmap">bitmap</a> edge colors,
   4553 just as <a href="undocumented#Shader">Shader</a> made from <a href="#SkShader_MakeBitmapShader">SkShader::MakeBitmapShader</a> with
   4554 <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set replicates the <a href="#SkCanvas_drawBitmapLattice_bitmap">bitmap</a> edge color when it samples
   4555 outside of its bounds.
   4556 
   4557 ### Parameters
   4558 
   4559 <table>  <tr>    <td><a name="SkCanvas_drawBitmapLattice_bitmap"> <code><strong>bitmap </strong></code> </a></td> <td>
   4560 <a href="SkBitmap_Reference#Bitmap">Bitmap</a> containing pixels, dimensions, and format</td>
   4561   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapLattice_lattice"> <code><strong>lattice </strong></code> </a></td> <td>
   4562 division of <a href="#SkCanvas_drawBitmapLattice_bitmap">bitmap</a> into fixed and variable rectangles</td>
   4563   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapLattice_dst"> <code><strong>dst </strong></code> </a></td> <td>
   4564 destination <a href="SkRect_Reference#Rect">Rect</a> of image to draw to</td>
   4565   </tr>  <tr>    <td><a name="SkCanvas_drawBitmapLattice_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4566 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4567 and so on; or nullptr</td>
   4568   </tr>
   4569 </table>
   4570 
   4571 ### Example
   4572 
   4573 <div><fiddle-embed name="7a02b16a4cc8158d88858a76907c9d89"><div>The two leftmost <a href="#SkCanvas_drawBitmapLattice_bitmap">bitmap</a> draws has four corners and sides to the left and right of center.
   4574 The leftmost <a href="#SkCanvas_drawBitmapLattice_bitmap">bitmap</a> draw scales the width of corners proportionately to fit.
   4575 The third and fourth draw corners are not scaled; the sides are scaled to
   4576 fill the remaining space; the center is transparent.
   4577 The rightmost <a href="#SkCanvas_drawBitmapLattice_bitmap">bitmap</a> draw has four corners scaled vertically to fit, and uses sides above
   4578 and below center to fill the remaining space.</div></fiddle-embed></div>
   4579 
   4580 ### See Also
   4581 
   4582 <a href="#SkCanvas_drawImageLattice">drawImageLattice</a> <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawBitmapNine">drawBitmapNine</a> <a href="#SkCanvas_Lattice">Lattice</a>
   4583 
   4584 ---
   4585 
   4586 <a name="SkCanvas_drawImageLattice"></a>
   4587 ## drawImageLattice
   4588 
   4589 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4590 void drawImageLattice(const SkImage* image, const Lattice& lattice, const SkRect& dst,
   4591                       const SkPaint* paint = nullptr)
   4592 </pre>
   4593 
   4594 Draw <a href="SkImage_Reference#Image">Image</a> <a href="#SkCanvas_drawImageLattice_image">image</a> stretched proportionally to fit into <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawImageLattice_dst">dst</a>.
   4595 
   4596 <a href="#SkCanvas_Lattice">Lattice</a> <a href="#SkCanvas_drawImageLattice_lattice">lattice</a> divides <a href="#SkCanvas_drawImageLattice_image">image</a> into a rectangular grid.
   4597 Each intersection of an even-numbered row and column is fixed; like the corners
   4598 of <a href="#SkCanvas_drawBitmapNine">drawBitmapNine</a>, fixed <a href="#SkCanvas_drawImageLattice_lattice">lattice</a> elements never scale larger than their initial
   4599 size and shrink proportionately when all fixed elements exceed the bitmap
   4600 dimension. All other grid elements scale to fill the available space, if any.
   4601 
   4602 Additionally transform draw using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageLattice_paint">paint</a>.
   4603 
   4604 If <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawImageLattice_paint">paint</a> is supplied, apply <a href="undocumented#Color_Filter">Color Filter</a>, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4605 <a href="undocumented#Blend_Mode">Blend Mode</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>. If bitmap is <a href="SkImageInfo_Reference#SkColorType">kAlpha 8 SkColorType</a>, apply <a href="undocumented#Shader">Shader</a>.
   4606 If <a href="#SkCanvas_drawImageLattice_paint">paint</a> contains <a href="undocumented#Mask_Filter">Mask Filter</a>, generate mask from bitmap bounds.
   4607 
   4608 If generated mask extends beyond bitmap bounds, replicate bitmap edge colors,
   4609 just as <a href="undocumented#Shader">Shader</a> made from <a href="#SkShader_MakeBitmapShader">SkShader::MakeBitmapShader</a> with
   4610 <a href="#SkShader_kClamp_TileMode">SkShader::kClamp TileMode</a> set replicates the bitmap edge color when it samples
   4611 outside of its bounds.
   4612 
   4613 ### Parameters
   4614 
   4615 <table>  <tr>    <td><a name="SkCanvas_drawImageLattice_image"> <code><strong>image </strong></code> </a></td> <td>
   4616 <a href="SkImage_Reference#Image">Image</a> containing pixels, dimensions, and format</td>
   4617   </tr>  <tr>    <td><a name="SkCanvas_drawImageLattice_lattice"> <code><strong>lattice </strong></code> </a></td> <td>
   4618 division of bitmap into fixed and variable rectangles</td>
   4619   </tr>  <tr>    <td><a name="SkCanvas_drawImageLattice_dst"> <code><strong>dst </strong></code> </a></td> <td>
   4620 destination <a href="SkRect_Reference#Rect">Rect</a> of <a href="#SkCanvas_drawImageLattice_image">image</a> to draw to</td>
   4621   </tr>  <tr>    <td><a name="SkCanvas_drawImageLattice_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4622 <a href="SkPaint_Reference#Paint">Paint</a> containing <a href="undocumented#Blend_Mode">Blend Mode</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>,
   4623 and so on; or nullptr</td>
   4624   </tr>
   4625 </table>
   4626 
   4627 ### Example
   4628 
   4629 <div><fiddle-embed name="75f43f11c6bd58175071b8b54ebec676"><div>The leftmost <a href="#SkCanvas_drawImageLattice_image">image</a> is smaller than center; only corners are drawn, all scaled to fit.
   4630 The second <a href="#SkCanvas_drawImageLattice_image">image</a> equals the size of center; only corners are drawn without scaling.
   4631 The remaining images are larger than center. All corners draw without scaling. The sides
   4632 are scaled if needed to take up the remaining space; the center is transparent.</div></fiddle-embed></div>
   4633 
   4634 ### See Also
   4635 
   4636 <a href="#SkCanvas_drawBitmapLattice">drawBitmapLattice</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup> <a href="#SkCanvas_drawImageNine">drawImageNine</a><sup><a href="#SkCanvas_drawImageNine_2">[2]</a></sup> <a href="#SkCanvas_Lattice">Lattice</a>
   4637 
   4638 ---
   4639 
   4640 <a name="SkCanvas_drawText"></a>
   4641 ## drawText
   4642 
   4643 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4644 void drawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, const SkPaint& paint)
   4645 </pre>
   4646 
   4647 Draw <a href="#SkCanvas_drawText_text">text</a>, with origin at (<a href="#SkCanvas_drawText_x">x</a>, <a href="#SkCanvas_drawText_y">y</a>), using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawText_paint">paint</a>.
   4648 
   4649 <a href="#SkCanvas_drawText_text">text</a> meaning depends on <a href="#Text_Encoding">Paint Text Encoding</a>; by default, <a href="#SkCanvas_drawText_text">text</a> is encoded as
   4650 UTF-8.
   4651 
   4652 <a href="#SkCanvas_drawText_x">x</a> and <a href="#SkCanvas_drawText_y">y</a> meaning depends on <a href="#Text_Align">Paint Text Align</a> and <a href="#Vertical_Text">Paint Vertical Text</a>; by default
   4653 <a href="#SkCanvas_drawText_text">text</a> draws left to right, positioning the first glyph left side bearing at <a href="#SkCanvas_drawText_x">x</a>
   4654 and its baseline at <a href="#SkCanvas_drawText_y">y</a>. <a href="undocumented#Text">Text</a> size is affected by <a href="#Matrix">Matrix</a> and <a href="#Text_Size">Paint Text Size</a>.
   4655 
   4656 All elements of <a href="#SkCanvas_drawText_paint">paint</a>: <a href="undocumented#Path_Effect">Path Effect</a>, <a href="undocumented#Mask_Filter">Mask Filter</a>, <a href="undocumented#Shader">Shader</a>,
   4657 <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>; apply to <a href="#SkCanvas_drawText_text">text</a>. By default, draws
   4658 filled 12 point black <a href="#Glyph">Glyphs</a>.
   4659 
   4660 ### Parameters
   4661 
   4662 <table>  <tr>    <td><a name="SkCanvas_drawText_text"> <code><strong>text </strong></code> </a></td> <td>
   4663 character code points or <a href="#Glyph">Glyphs</a> drawn</td>
   4664   </tr>  <tr>    <td><a name="SkCanvas_drawText_byteLength"> <code><strong>byteLength </strong></code> </a></td> <td>
   4665 byte length of <a href="#SkCanvas_drawText_text">text</a> array</td>
   4666   </tr>  <tr>    <td><a name="SkCanvas_drawText_x"> <code><strong>x </strong></code> </a></td> <td>
   4667 start of <a href="#SkCanvas_drawText_text">text</a> on <a href="#SkCanvas_drawText_x">x</a>-axis</td>
   4668   </tr>  <tr>    <td><a name="SkCanvas_drawText_y"> <code><strong>y </strong></code> </a></td> <td>
   4669 start of <a href="#SkCanvas_drawText_text">text</a> on <a href="#SkCanvas_drawText_y">y</a>-axis</td>
   4670   </tr>  <tr>    <td><a name="SkCanvas_drawText_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4671 <a href="#SkCanvas_drawText_text">text</a> size, blend, color, and so on, used to draw</td>
   4672   </tr>
   4673 </table>
   4674 
   4675 ### Example
   4676 
   4677 <div><fiddle-embed name="a3365bd3044b13e8e0318ee8aefbdf91"><div>The same <a href="#SkCanvas_drawText_text">text</a> is drawn varying <a href="#Text_Size">Paint Text Size</a> and varying
   4678 <a href="#Matrix">Matrix</a>.</div></fiddle-embed></div>
   4679 
   4680 ### See Also
   4681 
   4682 <a href="#SkCanvas_drawString">drawString</a><sup><a href="#SkCanvas_drawString_2">[2]</a></sup> <a href="#SkCanvas_drawPosText">drawPosText</a> <a href="#SkCanvas_drawPosTextH">drawPosTextH</a> <a href="#SkCanvas_drawTextBlob">drawTextBlob</a><sup><a href="#SkCanvas_drawTextBlob_2">[2]</a></sup> <a href="#SkCanvas_drawTextOnPath">drawTextOnPath</a> <a href="#SkCanvas_drawTextRSXform">drawTextRSXform</a>
   4683 
   4684 ---
   4685 
   4686 <a name="SkCanvas_drawString"></a>
   4687 ## drawString
   4688 
   4689 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4690 void drawString(const char* string, SkScalar x, SkScalar y, const SkPaint& paint)
   4691 </pre>
   4692 
   4693 Draw null terminated <a href="#SkCanvas_drawString_string">string</a>, with origin at (<a href="#SkCanvas_drawString_x">x</a>, <a href="#SkCanvas_drawString_y">y</a>), using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and
   4694 <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawString_paint">paint</a>.
   4695 
   4696 <a href="#SkCanvas_drawString_string">string</a> meaning depends on <a href="#Text_Encoding">Paint Text Encoding</a>; by default, strings are encoded
   4697 as UTF-8. Other values of <a href="#Text_Encoding">Paint Text Encoding</a> are unlikely to produce the desired
   4698 results, since zero bytes may be embedded in the <a href="#SkCanvas_drawString_string">string</a>.
   4699 
   4700 <a href="#SkCanvas_drawString_x">x</a> and <a href="#SkCanvas_drawString_y">y</a> meaning depends on <a href="#Text_Align">Paint Text Align</a> and <a href="#Vertical_Text">Paint Vertical Text</a>; by default
   4701 <a href="#SkCanvas_drawString_string">string</a> draws left to right, positioning the first glyph left side bearing at <a href="#SkCanvas_drawString_x">x</a>
   4702 and its baseline at <a href="#SkCanvas_drawString_y">y</a>. <a href="undocumented#Text">Text</a> size is affected by <a href="#Matrix">Matrix</a> and <a href="#Text_Size">Paint Text Size</a>.
   4703 
   4704 All elements of <a href="#SkCanvas_drawString_paint">paint</a>: <a href="undocumented#Path_Effect">Path Effect</a>, <a href="undocumented#Mask_Filter">Mask Filter</a>, <a href="undocumented#Shader">Shader</a>,
   4705 <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>; apply to text. By default, draws
   4706 filled 12 point black <a href="#Glyph">Glyphs</a>.
   4707 
   4708 ### Parameters
   4709 
   4710 <table>  <tr>    <td><a name="SkCanvas_drawString_string"> <code><strong>string </strong></code> </a></td> <td>
   4711 character code points or <a href="#Glyph">Glyphs</a> drawn,
   4712 ending with a char value of zero</td>
   4713   </tr>  <tr>    <td><a name="SkCanvas_drawString_x"> <code><strong>x </strong></code> </a></td> <td>
   4714 start of <a href="#SkCanvas_drawString_string">string</a> on <a href="#SkCanvas_drawString_x">x</a>-axis</td>
   4715   </tr>  <tr>    <td><a name="SkCanvas_drawString_y"> <code><strong>y </strong></code> </a></td> <td>
   4716 start of <a href="#SkCanvas_drawString_string">string</a> on <a href="#SkCanvas_drawString_y">y</a>-axis</td>
   4717   </tr>  <tr>    <td><a name="SkCanvas_drawString_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4718 text size, blend, color, and so on, used to draw</td>
   4719   </tr>
   4720 </table>
   4721 
   4722 ### Example
   4723 
   4724 <div><fiddle-embed name="65cc4b15cd1a8d067eb1dbfd7e2c17dd"></fiddle-embed></div>
   4725 
   4726 ### See Also
   4727 
   4728 <a href="#SkCanvas_drawText">drawText</a> <a href="#SkCanvas_drawPosText">drawPosText</a> <a href="#SkCanvas_drawPosTextH">drawPosTextH</a> <a href="#SkCanvas_drawTextBlob">drawTextBlob</a><sup><a href="#SkCanvas_drawTextBlob_2">[2]</a></sup> <a href="#SkCanvas_drawTextOnPath">drawTextOnPath</a> <a href="#SkCanvas_drawTextRSXform">drawTextRSXform</a>
   4729 
   4730 ---
   4731 
   4732 <a name="SkCanvas_drawString_2"></a>
   4733 
   4734 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4735 void drawString(const SkString& string, SkScalar x, SkScalar y, const SkPaint& paint)
   4736 </pre>
   4737 
   4738 Draw null terminated <a href="#SkCanvas_drawString_2_string">string</a>, with origin at (<a href="#SkCanvas_drawString_2_x">x</a>, <a href="#SkCanvas_drawString_2_y">y</a>), using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and
   4739 <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawString_2_paint">paint</a>.
   4740 
   4741 <a href="#SkCanvas_drawString_2_string">string</a> meaning depends on <a href="#Text_Encoding">Paint Text Encoding</a>; by default, strings are encoded
   4742 as UTF-8. Other values of <a href="#Text_Encoding">Paint Text Encoding</a> are unlikely to produce the desired
   4743 results, since zero bytes may be embedded in the <a href="#SkCanvas_drawString_2_string">string</a>.
   4744 
   4745 <a href="#SkCanvas_drawString_2_x">x</a> and <a href="#SkCanvas_drawString_2_y">y</a> meaning depends on <a href="#Text_Align">Paint Text Align</a> and <a href="#Vertical_Text">Paint Vertical Text</a>; by default
   4746 <a href="#SkCanvas_drawString_2_string">string</a> draws left to right, positioning the first glyph left side bearing at <a href="#SkCanvas_drawString_2_x">x</a>
   4747 and its baseline at <a href="#SkCanvas_drawString_2_y">y</a>. <a href="undocumented#Text">Text</a> size is affected by <a href="#Matrix">Matrix</a> and <a href="#Text_Size">Paint Text Size</a>.
   4748 
   4749 All elements of <a href="#SkCanvas_drawString_2_paint">paint</a>: <a href="undocumented#Path_Effect">Path Effect</a>, <a href="undocumented#Mask_Filter">Mask Filter</a>, <a href="undocumented#Shader">Shader</a>,
   4750 <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>; apply to text. By default, draws
   4751 filled 12 point black <a href="#Glyph">Glyphs</a>.
   4752 
   4753 ### Parameters
   4754 
   4755 <table>  <tr>    <td><a name="SkCanvas_drawString_2_string"> <code><strong>string </strong></code> </a></td> <td>
   4756 character code points or <a href="#Glyph">Glyphs</a> drawn,
   4757 ending with a char value of zero</td>
   4758   </tr>  <tr>    <td><a name="SkCanvas_drawString_2_x"> <code><strong>x </strong></code> </a></td> <td>
   4759 start of <a href="#SkCanvas_drawString_2_string">string</a> on <a href="#SkCanvas_drawString_2_x">x</a>-axis</td>
   4760   </tr>  <tr>    <td><a name="SkCanvas_drawString_2_y"> <code><strong>y </strong></code> </a></td> <td>
   4761 start of <a href="#SkCanvas_drawString_2_string">string</a> on <a href="#SkCanvas_drawString_2_y">y</a>-axis</td>
   4762   </tr>  <tr>    <td><a name="SkCanvas_drawString_2_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4763 text size, blend, color, and so on, used to draw</td>
   4764   </tr>
   4765 </table>
   4766 
   4767 ### Example
   4768 
   4769 <div><fiddle-embed name="435178c09feb3bfec5e35d983609a013"></fiddle-embed></div>
   4770 
   4771 ### See Also
   4772 
   4773 <a href="#SkCanvas_drawText">drawText</a> <a href="#SkCanvas_drawPosText">drawPosText</a> <a href="#SkCanvas_drawPosTextH">drawPosTextH</a> <a href="#SkCanvas_drawTextBlob">drawTextBlob</a><sup><a href="#SkCanvas_drawTextBlob_2">[2]</a></sup> <a href="#SkCanvas_drawTextOnPath">drawTextOnPath</a> <a href="#SkCanvas_drawTextRSXform">drawTextRSXform</a>
   4774 
   4775 ---
   4776 
   4777 <a name="SkCanvas_drawPosText"></a>
   4778 ## drawPosText
   4779 
   4780 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4781 void drawPosText(const void* text, size_t byteLength, const SkPoint pos[], const SkPaint& paint)
   4782 </pre>
   4783 
   4784 Draw each glyph in <a href="#SkCanvas_drawPosText_text">text</a> with the origin in <a href="#SkCanvas_drawPosText_pos">pos</a> array, using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and
   4785 <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawPosText_paint">paint</a>. The number of entries in <a href="#SkCanvas_drawPosText_pos">pos</a> array must match the number of <a href="#Glyph">Glyphs</a>
   4786 described by <a href="#SkCanvas_drawPosText_byteLength">byteLength</a> of <a href="#SkCanvas_drawPosText_text">text</a>.
   4787 
   4788 <a href="#SkCanvas_drawPosText_text">text</a> meaning depends on <a href="#Text_Encoding">Paint Text Encoding</a>; by default, <a href="#SkCanvas_drawPosText_text">text</a> is encoded as
   4789 UTF-8. <a href="#SkCanvas_drawPosText_pos">pos</a> elements' meaning depends on <a href="#Text_Align">Paint Text Align</a> and <a href="#Vertical_Text">Paint Vertical Text</a>;
   4790 by default each glyph left side bearing is positioned at x and its
   4791 baseline is positioned at y. <a href="undocumented#Text">Text</a> size is affected by <a href="#Matrix">Matrix</a> and
   4792 <a href="#Text_Size">Paint Text Size</a>.
   4793 
   4794 All elements of <a href="#SkCanvas_drawPosText_paint">paint</a>: <a href="undocumented#Path_Effect">Path Effect</a>, <a href="undocumented#Mask_Filter">Mask Filter</a>, <a href="undocumented#Shader">Shader</a>,
   4795 <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>; apply to <a href="#SkCanvas_drawPosText_text">text</a>. By default, draws
   4796 filled 12 point black <a href="#Glyph">Glyphs</a>.
   4797 
   4798 Layout engines such as Harfbuzz typically position each glyph
   4799 rather than using the font advance widths.
   4800 
   4801 ### Parameters
   4802 
   4803 <table>  <tr>    <td><a name="SkCanvas_drawPosText_text"> <code><strong>text </strong></code> </a></td> <td>
   4804 character code points or <a href="#Glyph">Glyphs</a> drawn</td>
   4805   </tr>  <tr>    <td><a name="SkCanvas_drawPosText_byteLength"> <code><strong>byteLength </strong></code> </a></td> <td>
   4806 byte length of <a href="#SkCanvas_drawPosText_text">text</a> array</td>
   4807   </tr>  <tr>    <td><a name="SkCanvas_drawPosText_pos"> <code><strong>pos </strong></code> </a></td> <td>
   4808 array of glyph origins</td>
   4809   </tr>  <tr>    <td><a name="SkCanvas_drawPosText_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4810 <a href="#SkCanvas_drawPosText_text">text</a> size, blend, color, and so on, used to draw</td>
   4811   </tr>
   4812 </table>
   4813 
   4814 ### Example
   4815 
   4816 <div><fiddle-embed name="bf0b2402533a23b6392e0676b7a8414c"></fiddle-embed></div>
   4817 
   4818 ### See Also
   4819 
   4820 <a href="#SkCanvas_drawText">drawText</a> <a href="#SkCanvas_drawPosTextH">drawPosTextH</a> <a href="#SkCanvas_drawTextBlob">drawTextBlob</a><sup><a href="#SkCanvas_drawTextBlob_2">[2]</a></sup> <a href="#SkCanvas_drawTextOnPath">drawTextOnPath</a> <a href="#SkCanvas_drawTextRSXform">drawTextRSXform</a>
   4821 
   4822 ---
   4823 
   4824 <a name="SkCanvas_drawPosTextH"></a>
   4825 ## drawPosTextH
   4826 
   4827 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4828 void drawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], SkScalar constY,
   4829                   const SkPaint& paint)
   4830 </pre>
   4831 
   4832 Draw each glyph in <a href="#SkCanvas_drawPosTextH_text">text</a> with its (x, y) origin composed from <a href="#SkCanvas_drawPosTextH_xpos">xpos</a> array and
   4833 <a href="#SkCanvas_drawPosTextH_constY">constY</a>, using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawPosTextH_paint">paint</a>. The number of entries in <a href="#SkCanvas_drawPosTextH_xpos">xpos</a> array
   4834 must match the number of <a href="#Glyph">Glyphs</a> described by <a href="#SkCanvas_drawPosTextH_byteLength">byteLength</a> of <a href="#SkCanvas_drawPosTextH_text">text</a>.
   4835 
   4836 <a href="#SkCanvas_drawPosTextH_text">text</a> meaning depends on <a href="#Text_Encoding">Paint Text Encoding</a>; by default, <a href="#SkCanvas_drawPosTextH_text">text</a> is encoded as
   4837 UTF-8. <a href="#SkCanvas_drawPosTextH_xpos">xpos</a> elements' meaning depends on <a href="#Text_Align">Paint Text Align</a> and <a href="#Vertical_Text">Paint Vertical Text</a>;
   4838 by default each glyph left side bearing is positioned at an <a href="#SkCanvas_drawPosTextH_xpos">xpos</a> element and
   4839 its baseline is positioned at <a href="#SkCanvas_drawPosTextH_constY">constY</a>. <a href="undocumented#Text">Text</a> size is affected by <a href="#Matrix">Matrix</a> and
   4840 <a href="#Text_Size">Paint Text Size</a>.
   4841 
   4842 All elements of <a href="#SkCanvas_drawPosTextH_paint">paint</a>: <a href="undocumented#Path_Effect">Path Effect</a>, <a href="undocumented#Mask_Filter">Mask Filter</a>, <a href="undocumented#Shader">Shader</a>,
   4843 <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>; apply to <a href="#SkCanvas_drawPosTextH_text">text</a>. By default, draws
   4844 filled 12 point black <a href="#Glyph">Glyphs</a>.
   4845 
   4846 Layout engines such as Harfbuzz typically position each glyph
   4847 rather than using the font advance widths if all <a href="#Glyph">Glyphs</a> share the same
   4848 baseline.
   4849 
   4850 ### Parameters
   4851 
   4852 <table>  <tr>    <td><a name="SkCanvas_drawPosTextH_text"> <code><strong>text </strong></code> </a></td> <td>
   4853 character code points or <a href="#Glyph">Glyphs</a> drawn</td>
   4854   </tr>  <tr>    <td><a name="SkCanvas_drawPosTextH_byteLength"> <code><strong>byteLength </strong></code> </a></td> <td>
   4855 byte length of <a href="#SkCanvas_drawPosTextH_text">text</a> array</td>
   4856   </tr>  <tr>    <td><a name="SkCanvas_drawPosTextH_xpos"> <code><strong>xpos </strong></code> </a></td> <td>
   4857 array of x positions, used to position each glyph</td>
   4858   </tr>  <tr>    <td><a name="SkCanvas_drawPosTextH_constY"> <code><strong>constY </strong></code> </a></td> <td>
   4859 shared y coordinate for all of x positions</td>
   4860   </tr>  <tr>    <td><a name="SkCanvas_drawPosTextH_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4861 <a href="#SkCanvas_drawPosTextH_text">text</a> size, blend, color, and so on, used to draw</td>
   4862   </tr>
   4863 </table>
   4864 
   4865 ### Example
   4866 
   4867 <div><fiddle-embed name="95c6a7ef82993a8d2add676080e9438a"></fiddle-embed></div>
   4868 
   4869 ### See Also
   4870 
   4871 <a href="#SkCanvas_drawText">drawText</a> <a href="#SkCanvas_drawPosText">drawPosText</a> <a href="#SkCanvas_drawTextBlob">drawTextBlob</a><sup><a href="#SkCanvas_drawTextBlob_2">[2]</a></sup> <a href="#SkCanvas_drawTextOnPath">drawTextOnPath</a> <a href="#SkCanvas_drawTextRSXform">drawTextRSXform</a>
   4872 
   4873 ---
   4874 
   4875 <a name="SkCanvas_drawTextOnPathHV"></a>
   4876 ## drawTextOnPathHV
   4877 
   4878 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4879 void drawTextOnPathHV(const void* text, size_t byteLength, const SkPath& path, SkScalar hOffset,
   4880                       SkScalar vOffset, const SkPaint& paint)
   4881 </pre>
   4882 
   4883 Draw <a href="#SkCanvas_drawTextOnPathHV_text">text</a> on <a href="SkPath_Reference#Path">Path</a> <a href="#SkCanvas_drawTextOnPathHV_path">path</a>, using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawTextOnPathHV_paint">paint</a>.
   4884 
   4885 Origin of <a href="#SkCanvas_drawTextOnPathHV_text">text</a> is at distance <a href="#SkCanvas_drawTextOnPathHV_hOffset">hOffset</a> along the <a href="#SkCanvas_drawTextOnPathHV_path">path</a>, offset by a perpendicular
   4886 vector of length <a href="#SkCanvas_drawTextOnPathHV_vOffset">vOffset</a>. If the <a href="#SkCanvas_drawTextOnPathHV_path">path</a> section corresponding the glyph advance is
   4887 curved, the glyph is drawn curved to match; control points in the glyph are
   4888 mapped to projected points parallel to the <a href="#SkCanvas_drawTextOnPathHV_path">path</a>. If the <a href="#SkCanvas_drawTextOnPathHV_text">text</a> advance is larger
   4889 than the <a href="#SkCanvas_drawTextOnPathHV_path">path</a> length, the excess <a href="#SkCanvas_drawTextOnPathHV_text">text</a> is clipped.
   4890 
   4891 <a href="#SkCanvas_drawTextOnPathHV_text">text</a> meaning depends on <a href="#Text_Encoding">Paint Text Encoding</a>; by default, <a href="#SkCanvas_drawTextOnPathHV_text">text</a> is encoded as
   4892 UTF-8. Origin meaning depends on <a href="#Text_Align">Paint Text Align</a> and <a href="#Vertical_Text">Paint Vertical Text</a>; by
   4893 default <a href="#SkCanvas_drawTextOnPathHV_text">text</a> positions the first glyph left side bearing at origin x and its
   4894 baseline at origin y. <a href="undocumented#Text">Text</a> size is affected by <a href="#Matrix">Matrix</a> and <a href="#Text_Size">Paint Text Size</a>.
   4895 
   4896 All elements of <a href="#SkCanvas_drawTextOnPathHV_paint">paint</a>: <a href="undocumented#Path_Effect">Path Effect</a>, <a href="undocumented#Mask_Filter">Mask Filter</a>, <a href="undocumented#Shader">Shader</a>,
   4897 <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>; apply to <a href="#SkCanvas_drawTextOnPathHV_text">text</a>. By default, draws
   4898 filled 12 point black <a href="#Glyph">Glyphs</a>.
   4899 
   4900 ### Parameters
   4901 
   4902 <table>  <tr>    <td><a name="SkCanvas_drawTextOnPathHV_text"> <code><strong>text </strong></code> </a></td> <td>
   4903 character code points or <a href="#Glyph">Glyphs</a> drawn</td>
   4904   </tr>  <tr>    <td><a name="SkCanvas_drawTextOnPathHV_byteLength"> <code><strong>byteLength </strong></code> </a></td> <td>
   4905 byte length of <a href="#SkCanvas_drawTextOnPathHV_text">text</a> array</td>
   4906   </tr>  <tr>    <td><a name="SkCanvas_drawTextOnPathHV_path"> <code><strong>path </strong></code> </a></td> <td>
   4907 <a href="SkPath_Reference#Path">Path</a> providing <a href="#SkCanvas_drawTextOnPathHV_text">text</a> baseline</td>
   4908   </tr>  <tr>    <td><a name="SkCanvas_drawTextOnPathHV_hOffset"> <code><strong>hOffset </strong></code> </a></td> <td>
   4909 distance along <a href="#SkCanvas_drawTextOnPathHV_path">path</a> to offset origin</td>
   4910   </tr>  <tr>    <td><a name="SkCanvas_drawTextOnPathHV_vOffset"> <code><strong>vOffset </strong></code> </a></td> <td>
   4911 offset of <a href="#SkCanvas_drawTextOnPathHV_text">text</a> above (if negative) or below (if positive) the <a href="#SkCanvas_drawTextOnPathHV_path">path</a></td>
   4912   </tr>  <tr>    <td><a name="SkCanvas_drawTextOnPathHV_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4913 <a href="#SkCanvas_drawTextOnPathHV_text">text</a> size, blend, color, and so on, used to draw</td>
   4914   </tr>
   4915 </table>
   4916 
   4917 ### Example
   4918 
   4919 <div><fiddle-embed name="25cc5452156d7f06e85f514913d46b5c"></fiddle-embed></div>
   4920 
   4921 ### See Also
   4922 
   4923 <a href="#SkCanvas_drawTextOnPath">drawTextOnPath</a> <a href="#SkCanvas_drawText">drawText</a> <a href="#SkCanvas_drawPosTextH">drawPosTextH</a> <a href="#SkCanvas_drawTextBlob">drawTextBlob</a><sup><a href="#SkCanvas_drawTextBlob_2">[2]</a></sup> <a href="#SkCanvas_drawTextRSXform">drawTextRSXform</a>
   4924 
   4925 ---
   4926 
   4927 <a name="SkCanvas_drawTextOnPath"></a>
   4928 ## drawTextOnPath
   4929 
   4930 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4931 void drawTextOnPath(const void* text, size_t byteLength, const SkPath& path, const SkMatrix* matrix,
   4932                     const SkPaint& paint)
   4933 </pre>
   4934 
   4935 Draw <a href="#SkCanvas_drawTextOnPath_text">text</a> on <a href="SkPath_Reference#Path">Path</a> <a href="#SkCanvas_drawTextOnPath_path">path</a>, using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawTextOnPath_paint">paint</a>.
   4936 
   4937 Origin of <a href="#SkCanvas_drawTextOnPath_text">text</a> is at beginning of <a href="#SkCanvas_drawTextOnPath_path">path</a> offset by <a href="#SkCanvas_drawTextOnPath_matrix">matrix</a>, if provided, before it
   4938 is mapped to <a href="#SkCanvas_drawTextOnPath_path">path</a>. If the <a href="#SkCanvas_drawTextOnPath_path">path</a> section corresponding the glyph advance is
   4939 curved, the glyph is drawn curved to match; control points in the glyph are
   4940 mapped to projected points parallel to the <a href="#SkCanvas_drawTextOnPath_path">path</a>. If the <a href="#SkCanvas_drawTextOnPath_text">text</a> advance is larger
   4941 than the <a href="#SkCanvas_drawTextOnPath_path">path</a> length, the excess <a href="#SkCanvas_drawTextOnPath_text">text</a> is clipped.
   4942 
   4943 <a href="#SkCanvas_drawTextOnPath_text">text</a> meaning depends on <a href="#Text_Encoding">Paint Text Encoding</a>; by default, <a href="#SkCanvas_drawTextOnPath_text">text</a> is encoded as
   4944 UTF-8. Origin meaning depends on <a href="#Text_Align">Paint Text Align</a> and <a href="#Vertical_Text">Paint Vertical Text</a>; by
   4945 default <a href="#SkCanvas_drawTextOnPath_text">text</a> positions the first glyph left side bearing at origin x and its
   4946 baseline at origin y. <a href="undocumented#Text">Text</a> size is affected by <a href="#Matrix">Matrix</a> and <a href="#Text_Size">Paint Text Size</a>.
   4947 
   4948 All elements of <a href="#SkCanvas_drawTextOnPath_paint">paint</a>: <a href="undocumented#Path_Effect">Path Effect</a>, <a href="undocumented#Mask_Filter">Mask Filter</a>, <a href="undocumented#Shader">Shader</a>,
   4949 <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>; apply to <a href="#SkCanvas_drawTextOnPath_text">text</a>. By default, draws
   4950 filled 12 point black <a href="#Glyph">Glyphs</a>.
   4951 
   4952 ### Parameters
   4953 
   4954 <table>  <tr>    <td><a name="SkCanvas_drawTextOnPath_text"> <code><strong>text </strong></code> </a></td> <td>
   4955 character code points or <a href="#Glyph">Glyphs</a> drawn</td>
   4956   </tr>  <tr>    <td><a name="SkCanvas_drawTextOnPath_byteLength"> <code><strong>byteLength </strong></code> </a></td> <td>
   4957 byte length of <a href="#SkCanvas_drawTextOnPath_text">text</a> array</td>
   4958   </tr>  <tr>    <td><a name="SkCanvas_drawTextOnPath_path"> <code><strong>path </strong></code> </a></td> <td>
   4959 <a href="SkPath_Reference#Path">Path</a> providing <a href="#SkCanvas_drawTextOnPath_text">text</a> baseline</td>
   4960   </tr>  <tr>    <td><a name="SkCanvas_drawTextOnPath_matrix"> <code><strong>matrix </strong></code> </a></td> <td>
   4961 transform of <a href="#Glyph">Glyphs</a> before mapping to <a href="#SkCanvas_drawTextOnPath_path">path</a>; may be nullptr
   4962 to use identity <a href="#Matrix">Matrix</a></td>
   4963   </tr>  <tr>    <td><a name="SkCanvas_drawTextOnPath_paint"> <code><strong>paint </strong></code> </a></td> <td>
   4964 <a href="#SkCanvas_drawTextOnPath_text">text</a> size, blend, color, and so on, used to draw</td>
   4965   </tr>
   4966 </table>
   4967 
   4968 ### Example
   4969 
   4970 <div><fiddle-embed name="0f60797fbdce3d3c71c46b800e6bd6f8"></fiddle-embed></div>
   4971 
   4972 ### See Also
   4973 
   4974 <a href="#SkCanvas_drawTextOnPathHV">drawTextOnPathHV</a> <a href="#SkCanvas_drawText">drawText</a> <a href="#SkCanvas_drawPosTextH">drawPosTextH</a> <a href="#SkCanvas_drawTextBlob">drawTextBlob</a><sup><a href="#SkCanvas_drawTextBlob_2">[2]</a></sup> <a href="#SkCanvas_drawTextRSXform">drawTextRSXform</a>
   4975 
   4976 ---
   4977 
   4978 <a name="SkCanvas_drawTextRSXform"></a>
   4979 ## drawTextRSXform
   4980 
   4981 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   4982 void drawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[],
   4983                      const SkRect* cullRect, const SkPaint& paint)
   4984 </pre>
   4985 
   4986 Draw <a href="#SkCanvas_drawTextRSXform_text">text</a>, transforming each glyph by the corresponding <a href="undocumented#SkRSXform">SkRSXform</a>,
   4987 using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawTextRSXform_paint">paint</a>.
   4988 
   4989 <a href="undocumented#RSXform">RSXform</a> array specifies a separate square scale, rotation, and translation for
   4990 each glyph.
   4991 
   4992 Optional <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawTextRSXform_cullRect">cullRect</a> is a conservative bounds of <a href="#SkCanvas_drawTextRSXform_text">text</a>, taking into account
   4993 <a href="undocumented#RSXform">RSXform</a> and <a href="#SkCanvas_drawTextRSXform_paint">paint</a>. If <a href="#SkCanvas_drawTextRSXform_cullRect">cullRect</a> is outside of <a href="#Clip">Clip</a>, canvas can skip drawing.
   4994 
   4995 All elements of <a href="#SkCanvas_drawTextRSXform_paint">paint</a>: <a href="undocumented#Path_Effect">Path Effect</a>, <a href="undocumented#Mask_Filter">Mask Filter</a>, <a href="undocumented#Shader">Shader</a>,
   4996 <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>; apply to <a href="#SkCanvas_drawTextRSXform_text">text</a>. By default, draws
   4997 filled 12 point black <a href="#Glyph">Glyphs</a>.
   4998 
   4999 ### Parameters
   5000 
   5001 <table>  <tr>    <td><a name="SkCanvas_drawTextRSXform_text"> <code><strong>text </strong></code> </a></td> <td>
   5002 character code points or <a href="#Glyph">Glyphs</a> drawn</td>
   5003   </tr>  <tr>    <td><a name="SkCanvas_drawTextRSXform_byteLength"> <code><strong>byteLength </strong></code> </a></td> <td>
   5004 byte length of <a href="#SkCanvas_drawTextRSXform_text">text</a> array</td>
   5005   </tr>  <tr>    <td><a name="SkCanvas_drawTextRSXform_xform"> <code><strong>xform </strong></code> </a></td> <td>
   5006 <a href="undocumented#RSXform">RSXform</a> rotates, scales, and translates each glyph individually</td>
   5007   </tr>  <tr>    <td><a name="SkCanvas_drawTextRSXform_cullRect"> <code><strong>cullRect </strong></code> </a></td> <td>
   5008 <a href="SkRect_Reference#Rect">Rect</a> bounds of <a href="#SkCanvas_drawTextRSXform_text">text</a> for efficient clipping; or nullptr</td>
   5009   </tr>  <tr>    <td><a name="SkCanvas_drawTextRSXform_paint"> <code><strong>paint </strong></code> </a></td> <td>
   5010 <a href="#SkCanvas_drawTextRSXform_text">text</a> size, blend, color, and so on, used to draw</td>
   5011   </tr>
   5012 </table>
   5013 
   5014 ### Example
   5015 
   5016 <div><fiddle-embed name="55c84c39890c7516f7c835c46b1b8fc9"></fiddle-embed></div>
   5017 
   5018 ### See Also
   5019 
   5020 <a href="#SkCanvas_drawTextOnPath">drawTextOnPath</a> <a href="#SkCanvas_drawTextOnPathHV">drawTextOnPathHV</a> <a href="#SkCanvas_drawText">drawText</a> <a href="#SkCanvas_drawPosText">drawPosText</a> <a href="#SkCanvas_drawTextBlob">drawTextBlob</a><sup><a href="#SkCanvas_drawTextBlob_2">[2]</a></sup>
   5021 
   5022 ---
   5023 
   5024 <a name="SkCanvas_drawTextBlob"></a>
   5025 ## drawTextBlob
   5026 
   5027 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5028 void drawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, const SkPaint& paint)
   5029 </pre>
   5030 
   5031 Draw <a href="undocumented#Text_Blob">Text Blob</a> <a href="#SkCanvas_drawTextBlob_blob">blob</a> at (<a href="#SkCanvas_drawTextBlob_x">x</a>, <a href="#SkCanvas_drawTextBlob_y">y</a>), using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawTextBlob_paint">paint</a>.
   5032 
   5033 <a href="#SkCanvas_drawTextBlob_blob">blob</a> contains <a href="#Glyph">Glyphs</a>, their positions, and <a href="#SkCanvas_drawTextBlob_paint">paint</a> attributes specific to text:
   5034 <a href="undocumented#Typeface">Typeface</a>, <a href="#Text_Size">Paint Text Size</a>, <a href="#Text_Scale_X">Paint Text Scale X</a>, <a href="#Text_Skew_X">Paint Text Skew X</a>,
   5035 <a href="#Text_Align">Paint Text Align</a>, <a href="#Hinting">Paint Hinting</a>, Anti-alias, <a href="#Fake_Bold">Paint Fake Bold</a>,
   5036 <a href="SkPaint_Reference#Font_Embedded_Bitmaps">Font Embedded Bitmaps</a>, <a href="SkPaint_Reference#Full_Hinting_Spacing">Full Hinting Spacing</a>, <a href="SkPaint_Reference#LCD_Text">LCD Text</a>, <a href="SkPaint_Reference#Linear_Text">Linear Text</a>,
   5037 <a href="SkPaint_Reference#Subpixel_Text">Subpixel Text</a>, and <a href="#Vertical_Text">Paint Vertical Text</a>.
   5038 
   5039 <a href="#Text_Encoding">Paint Text Encoding</a> must be set to <a href="#SkPaint_kGlyphID_TextEncoding">SkPaint::kGlyphID TextEncoding</a>.
   5040 
   5041 Elements of <a href="#SkCanvas_drawTextBlob_paint">paint</a>: <a href="undocumented#Path_Effect">Path Effect</a>, <a href="undocumented#Mask_Filter">Mask Filter</a>, <a href="undocumented#Shader">Shader</a>, <a href="undocumented#Color_Filter">Color Filter</a>,
   5042 <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>; apply to <a href="#SkCanvas_drawTextBlob_blob">blob</a>.
   5043 
   5044 ### Parameters
   5045 
   5046 <table>  <tr>    <td><a name="SkCanvas_drawTextBlob_blob"> <code><strong>blob </strong></code> </a></td> <td>
   5047 <a href="#Glyph">Glyphs</a>, positions, and their paints' text size, typeface, and so on</td>
   5048   </tr>  <tr>    <td><a name="SkCanvas_drawTextBlob_x"> <code><strong>x </strong></code> </a></td> <td>
   5049 horizontal offset applied to <a href="#SkCanvas_drawTextBlob_blob">blob</a></td>
   5050   </tr>  <tr>    <td><a name="SkCanvas_drawTextBlob_y"> <code><strong>y </strong></code> </a></td> <td>
   5051 vertical offset applied to <a href="#SkCanvas_drawTextBlob_blob">blob</a></td>
   5052   </tr>  <tr>    <td><a name="SkCanvas_drawTextBlob_paint"> <code><strong>paint </strong></code> </a></td> <td>
   5053 blend, color, stroking, and so on, used to draw</td>
   5054   </tr>
   5055 </table>
   5056 
   5057 ### Example
   5058 
   5059 <div><fiddle-embed name="2254beaa675e3b329dccddca4eeea735"></fiddle-embed></div>
   5060 
   5061 ### See Also
   5062 
   5063 <a href="#SkCanvas_drawText">drawText</a> <a href="#SkCanvas_drawPosText">drawPosText</a> <a href="#SkCanvas_drawPosTextH">drawPosTextH</a>
   5064 
   5065 ---
   5066 
   5067 <a name="SkCanvas_drawTextBlob_2"></a>
   5068 
   5069 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5070 void drawTextBlob(const sk_sp&lt;SkTextBlob&gt;& blob, SkScalar x, SkScalar y, const SkPaint& paint)
   5071 </pre>
   5072 
   5073 Draw <a href="undocumented#Text_Blob">Text Blob</a> <a href="#SkCanvas_drawTextBlob_2_blob">blob</a> at (<a href="#SkCanvas_drawTextBlob_2_x">x</a>, <a href="#SkCanvas_drawTextBlob_2_y">y</a>), using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawTextBlob_2_paint">paint</a>.
   5074 
   5075 <a href="#SkCanvas_drawTextBlob_2_blob">blob</a> contains <a href="#Glyph">Glyphs</a>, their positions, and <a href="#SkCanvas_drawTextBlob_2_paint">paint</a> attributes specific to text:
   5076 <a href="undocumented#Typeface">Typeface</a>, <a href="#Text_Size">Paint Text Size</a>, <a href="#Text_Scale_X">Paint Text Scale X</a>, <a href="#Text_Skew_X">Paint Text Skew X</a>,
   5077 <a href="#Text_Align">Paint Text Align</a>, <a href="#Hinting">Paint Hinting</a>, Anti-alias, <a href="#Fake_Bold">Paint Fake Bold</a>,
   5078 <a href="SkPaint_Reference#Font_Embedded_Bitmaps">Font Embedded Bitmaps</a>, <a href="SkPaint_Reference#Full_Hinting_Spacing">Full Hinting Spacing</a>, <a href="SkPaint_Reference#LCD_Text">LCD Text</a>, <a href="SkPaint_Reference#Linear_Text">Linear Text</a>,
   5079 <a href="SkPaint_Reference#Subpixel_Text">Subpixel Text</a>, and <a href="#Vertical_Text">Paint Vertical Text</a>.
   5080 
   5081 <a href="#Text_Encoding">Paint Text Encoding</a> must be set to <a href="#SkPaint_kGlyphID_TextEncoding">SkPaint::kGlyphID TextEncoding</a>.
   5082 
   5083 Elements of <a href="#SkCanvas_drawTextBlob_2_paint">paint</a>: <a href="undocumented#Path_Effect">Path Effect</a>, <a href="undocumented#Mask_Filter">Mask Filter</a>, <a href="undocumented#Shader">Shader</a>, <a href="undocumented#Color_Filter">Color Filter</a>,
   5084 <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Draw_Looper">Draw Looper</a>; apply to <a href="#SkCanvas_drawTextBlob_2_blob">blob</a>.
   5085 
   5086 ### Parameters
   5087 
   5088 <table>  <tr>    <td><a name="SkCanvas_drawTextBlob_2_blob"> <code><strong>blob </strong></code> </a></td> <td>
   5089 <a href="#Glyph">Glyphs</a>, positions, and their paints' text size, typeface, and so on</td>
   5090   </tr>  <tr>    <td><a name="SkCanvas_drawTextBlob_2_x"> <code><strong>x </strong></code> </a></td> <td>
   5091 horizontal offset applied to <a href="#SkCanvas_drawTextBlob_2_blob">blob</a></td>
   5092   </tr>  <tr>    <td><a name="SkCanvas_drawTextBlob_2_y"> <code><strong>y </strong></code> </a></td> <td>
   5093 vertical offset applied to <a href="#SkCanvas_drawTextBlob_2_blob">blob</a></td>
   5094   </tr>  <tr>    <td><a name="SkCanvas_drawTextBlob_2_paint"> <code><strong>paint </strong></code> </a></td> <td>
   5095 blend, color, stroking, and so on, used to draw</td>
   5096   </tr>
   5097 </table>
   5098 
   5099 ### Example
   5100 
   5101 <div><fiddle-embed name="d88b17d85fa68c56b3c1ad02b69068bf"><div><a href="SkPaint_Reference#Paint">Paint</a> attributes unrelated to text, like color, have no effect on <a href="#SkCanvas_drawTextBlob_2_paint">paint</a> in allocated <a href="undocumented#Text_Blob">Text Blob</a>.
   5102 <a href="SkPaint_Reference#Paint">Paint</a> attributes related to text, like text size, have no effect on <a href="#SkCanvas_drawTextBlob_2_paint">paint</a> passed to <a href="#SkCanvas_drawTextBlob">drawTextBlob</a>.</div></fiddle-embed></div>
   5103 
   5104 ### See Also
   5105 
   5106 <a href="#SkCanvas_drawText">drawText</a> <a href="#SkCanvas_drawPosText">drawPosText</a> <a href="#SkCanvas_drawPosTextH">drawPosTextH</a>
   5107 
   5108 ---
   5109 
   5110 <a name="SkCanvas_drawPicture"></a>
   5111 ## drawPicture
   5112 
   5113 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5114 void drawPicture(const SkPicture* picture)
   5115 </pre>
   5116 
   5117 Draw <a href="undocumented#Picture">Picture</a> <a href="#SkCanvas_drawPicture_picture">picture</a>, using <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a>.
   5118 <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a> are unchanged by <a href="#SkCanvas_drawPicture_picture">picture</a> contents, as if
   5119 <a href="#SkCanvas_save">save</a> was called before and <a href="#SkCanvas_restore">restore</a> was called after <a href="#SkCanvas_drawPicture">drawPicture</a>.
   5120 
   5121 <a href="undocumented#Picture">Picture</a> records a series of draw commands for later playback.
   5122 
   5123 ### Parameters
   5124 
   5125 <table>  <tr>    <td><a name="SkCanvas_drawPicture_picture"> <code><strong>picture </strong></code> </a></td> <td>
   5126 recorded drawing commands to play</td>
   5127   </tr>
   5128 </table>
   5129 
   5130 ### Example
   5131 
   5132 <div><fiddle-embed name="fde216281ff93d612768a49f2cf309ae"></fiddle-embed></div>
   5133 
   5134 ### See Also
   5135 
   5136 <a href="#SkCanvas_drawDrawable">drawDrawable</a><sup><a href="#SkCanvas_drawDrawable_2">[2]</a></sup> <a href="undocumented#SkPicture">SkPicture</a> <a href="#SkPicture_playback">SkPicture::playback</a>
   5137 
   5138 ---
   5139 
   5140 <a name="SkCanvas_drawPicture_2"></a>
   5141 
   5142 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5143 void drawPicture(const sk_sp&lt;SkPicture&gt;& picture)
   5144 </pre>
   5145 
   5146 Draw <a href="undocumented#Picture">Picture</a> <a href="#SkCanvas_drawPicture_2_picture">picture</a>, using <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a>.
   5147 <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a> are unchanged by <a href="#SkCanvas_drawPicture_2_picture">picture</a> contents, as if
   5148 <a href="#SkCanvas_save">save</a> was called before and <a href="#SkCanvas_restore">restore</a> was called after <a href="#SkCanvas_drawPicture">drawPicture</a>.
   5149 
   5150 <a href="undocumented#Picture">Picture</a> records a series of draw commands for later playback.
   5151 
   5152 ### Parameters
   5153 
   5154 <table>  <tr>    <td><a name="SkCanvas_drawPicture_2_picture"> <code><strong>picture </strong></code> </a></td> <td>
   5155 recorded drawing commands to play</td>
   5156   </tr>
   5157 </table>
   5158 
   5159 ### Example
   5160 
   5161 <div><fiddle-embed name="a7373b01354dda73dafe8718f4fd0cfc"></fiddle-embed></div>
   5162 
   5163 ### See Also
   5164 
   5165 <a href="#SkCanvas_drawDrawable">drawDrawable</a><sup><a href="#SkCanvas_drawDrawable_2">[2]</a></sup> <a href="undocumented#SkPicture">SkPicture</a> <a href="#SkPicture_playback">SkPicture::playback</a>
   5166 
   5167 ---
   5168 
   5169 <a name="SkCanvas_drawPicture_3"></a>
   5170 
   5171 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5172 void drawPicture(const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint)
   5173 </pre>
   5174 
   5175 Draw <a href="undocumented#Picture">Picture</a> <a href="#SkCanvas_drawPicture_3_picture">picture</a>, using <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a>; transforming <a href="#SkCanvas_drawPicture_3_picture">picture</a> with
   5176 <a href="#Matrix">Matrix</a> <a href="#SkCanvas_drawPicture_3_matrix">matrix</a>, if provided; and use <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawPicture_3_paint">paint</a> <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Color_Filter">Color Filter</a>,
   5177 <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Blend_Mode">Blend Mode</a>, if provided.
   5178 
   5179 <a href="#SkCanvas_drawPicture_3_matrix">matrix</a> transformation is equivalent to: <a href="#SkCanvas_save">save</a>, <a href="#SkCanvas_concat">concat</a>, <a href="#SkCanvas_drawPicture">drawPicture</a>, <a href="#SkCanvas_restore">restore</a>.
   5180 <a href="#SkCanvas_drawPicture_3_paint">paint</a> use is equivalent to: <a href="#SkCanvas_saveLayer">saveLayer</a>, <a href="#SkCanvas_drawPicture">drawPicture</a>, <a href="#SkCanvas_restore">restore</a>.
   5181 
   5182 ### Parameters
   5183 
   5184 <table>  <tr>    <td><a name="SkCanvas_drawPicture_3_picture"> <code><strong>picture </strong></code> </a></td> <td>
   5185 recorded drawing commands to play</td>
   5186   </tr>  <tr>    <td><a name="SkCanvas_drawPicture_3_matrix"> <code><strong>matrix </strong></code> </a></td> <td>
   5187 <a href="#Matrix">Matrix</a> to rotate, scale, translate, and so on; may be nullptr</td>
   5188   </tr>  <tr>    <td><a name="SkCanvas_drawPicture_3_paint"> <code><strong>paint </strong></code> </a></td> <td>
   5189 <a href="SkPaint_Reference#Paint">Paint</a> to apply transparency, filtering, and so on; may be nullptr</td>
   5190   </tr>
   5191 </table>
   5192 
   5193 ### Example
   5194 
   5195 <div><fiddle-embed name="4ec028d8ffa0a6ae1a99ff8d094b02bc"></fiddle-embed></div>
   5196 
   5197 ### See Also
   5198 
   5199 <a href="#SkCanvas_drawDrawable">drawDrawable</a><sup><a href="#SkCanvas_drawDrawable_2">[2]</a></sup> <a href="undocumented#SkPicture">SkPicture</a> <a href="#SkPicture_playback">SkPicture::playback</a>
   5200 
   5201 ---
   5202 
   5203 <a name="SkCanvas_drawPicture_4"></a>
   5204 
   5205 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5206 void drawPicture(const sk_sp&lt;SkPicture&gt;& picture, const SkMatrix* matrix, const SkPaint* paint)
   5207 </pre>
   5208 
   5209 Draw <a href="undocumented#Picture">Picture</a> <a href="#SkCanvas_drawPicture_4_picture">picture</a>, using <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a>; transforming <a href="#SkCanvas_drawPicture_4_picture">picture</a> with
   5210 <a href="#Matrix">Matrix</a> <a href="#SkCanvas_drawPicture_4_matrix">matrix</a>, if provided; and use <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawPicture_4_paint">paint</a> <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Color_Filter">Color Filter</a>,
   5211 <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Blend_Mode">Blend Mode</a>, if provided.
   5212 
   5213 <a href="#SkCanvas_drawPicture_4_matrix">matrix</a> transformation is equivalent to: <a href="#SkCanvas_save">save</a>, <a href="#SkCanvas_concat">concat</a>, <a href="#SkCanvas_drawPicture">drawPicture</a>, <a href="#SkCanvas_restore">restore</a>.
   5214 <a href="#SkCanvas_drawPicture_4_paint">paint</a> use is equivalent to: <a href="#SkCanvas_saveLayer">saveLayer</a>, <a href="#SkCanvas_drawPicture">drawPicture</a>, <a href="#SkCanvas_restore">restore</a>.
   5215 
   5216 ### Parameters
   5217 
   5218 <table>  <tr>    <td><a name="SkCanvas_drawPicture_4_picture"> <code><strong>picture </strong></code> </a></td> <td>
   5219 recorded drawing commands to play</td>
   5220   </tr>  <tr>    <td><a name="SkCanvas_drawPicture_4_matrix"> <code><strong>matrix </strong></code> </a></td> <td>
   5221 <a href="#Matrix">Matrix</a> to rotate, scale, translate, and so on; may be nullptr</td>
   5222   </tr>  <tr>    <td><a name="SkCanvas_drawPicture_4_paint"> <code><strong>paint </strong></code> </a></td> <td>
   5223 <a href="SkPaint_Reference#Paint">Paint</a> to apply transparency, filtering, and so on; may be nullptr</td>
   5224   </tr>
   5225 </table>
   5226 
   5227 ### Example
   5228 
   5229 <div><fiddle-embed name="7295eb14091e98565cec0353661a6a7d"></fiddle-embed></div>
   5230 
   5231 ### See Also
   5232 
   5233 <a href="#SkCanvas_drawDrawable">drawDrawable</a><sup><a href="#SkCanvas_drawDrawable_2">[2]</a></sup> <a href="undocumented#SkPicture">SkPicture</a> <a href="#SkPicture_playback">SkPicture::playback</a>
   5234 
   5235 ---
   5236 
   5237 <a name="SkCanvas_drawVertices"></a>
   5238 ## drawVertices
   5239 
   5240 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5241 void drawVertices(const SkVertices* vertices, SkBlendMode mode, const SkPaint& paint)
   5242 </pre>
   5243 
   5244 Draw <a href="undocumented#Vertices">Vertices</a> <a href="#SkCanvas_drawVertices_vertices">vertices</a>, a triangle mesh, using <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a>.
   5245 If <a href="#Texs">Vertices Texs</a> and <a href="#Colors">Vertices Colors</a> are defined in <a href="#SkCanvas_drawVertices_vertices">vertices</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawVertices_paint">paint</a>
   5246 contains <a href="undocumented#Shader">Shader</a>, <a href="undocumented#Blend_Mode">Blend Mode</a> <a href="#SkCanvas_drawVertices_mode">mode</a> combines <a href="#Colors">Vertices Colors</a> with <a href="undocumented#Shader">Shader</a>.
   5247 
   5248 ### Parameters
   5249 
   5250 <table>  <tr>    <td><a name="SkCanvas_drawVertices_vertices"> <code><strong>vertices </strong></code> </a></td> <td>
   5251 triangle mesh to draw</td>
   5252   </tr>  <tr>    <td><a name="SkCanvas_drawVertices_mode"> <code><strong>mode </strong></code> </a></td> <td>
   5253 combines <a href="#Colors">Vertices Colors</a> with <a href="undocumented#Shader">Shader</a>, if both are present</td>
   5254   </tr>  <tr>    <td><a name="SkCanvas_drawVertices_paint"> <code><strong>paint </strong></code> </a></td> <td>
   5255 specifies the <a href="undocumented#Shader">Shader</a>, used as <a href="undocumented#Vertices">Vertices</a> texture; may be nullptr</td>
   5256   </tr>
   5257 </table>
   5258 
   5259 ### Example
   5260 
   5261 <div><fiddle-embed name="f48b22eaad1bb7adcc3faaa321754af6"></fiddle-embed></div>
   5262 
   5263 ### See Also
   5264 
   5265 <a href="#SkCanvas_drawPatch">drawPatch</a><sup><a href="#SkCanvas_drawPatch_2">[2]</a></sup> <a href="#SkCanvas_drawPicture">drawPicture</a><sup><a href="#SkCanvas_drawPicture_2">[2]</a></sup><sup><a href="#SkCanvas_drawPicture_3">[3]</a></sup><sup><a href="#SkCanvas_drawPicture_4">[4]</a></sup>
   5266 
   5267 ---
   5268 
   5269 <a name="SkCanvas_drawVertices_2"></a>
   5270 
   5271 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5272 void drawVertices(const sk_sp&lt;SkVertices&gt;& vertices, SkBlendMode mode, const SkPaint& paint)
   5273 </pre>
   5274 
   5275 Draw <a href="undocumented#Vertices">Vertices</a> <a href="#SkCanvas_drawVertices_2_vertices">vertices</a>, a triangle mesh, using <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a>.
   5276 If <a href="#Texs">Vertices Texs</a> and <a href="#Colors">Vertices Colors</a> are defined in <a href="#SkCanvas_drawVertices_2_vertices">vertices</a>, and <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawVertices_2_paint">paint</a>
   5277 contains <a href="undocumented#Shader">Shader</a>, <a href="undocumented#Blend_Mode">Blend Mode</a> <a href="#SkCanvas_drawVertices_2_mode">mode</a> combines <a href="#Colors">Vertices Colors</a> with <a href="undocumented#Shader">Shader</a>.
   5278 
   5279 ### Parameters
   5280 
   5281 <table>  <tr>    <td><a name="SkCanvas_drawVertices_2_vertices"> <code><strong>vertices </strong></code> </a></td> <td>
   5282 triangle mesh to draw</td>
   5283   </tr>  <tr>    <td><a name="SkCanvas_drawVertices_2_mode"> <code><strong>mode </strong></code> </a></td> <td>
   5284 combines <a href="#Colors">Vertices Colors</a> with <a href="undocumented#Shader">Shader</a>, if both are present</td>
   5285   </tr>  <tr>    <td><a name="SkCanvas_drawVertices_2_paint"> <code><strong>paint </strong></code> </a></td> <td>
   5286 specifies the <a href="undocumented#Shader">Shader</a>, used as <a href="undocumented#Vertices">Vertices</a> texture, may be nullptr</td>
   5287   </tr>
   5288 </table>
   5289 
   5290 ### Example
   5291 
   5292 <div><fiddle-embed name="94e32538646d5f1299c427e473f9ec87"></fiddle-embed></div>
   5293 
   5294 ### See Also
   5295 
   5296 <a href="#SkCanvas_drawPatch">drawPatch</a><sup><a href="#SkCanvas_drawPatch_2">[2]</a></sup> <a href="#SkCanvas_drawPicture">drawPicture</a><sup><a href="#SkCanvas_drawPicture_2">[2]</a></sup><sup><a href="#SkCanvas_drawPicture_3">[3]</a></sup><sup><a href="#SkCanvas_drawPicture_4">[4]</a></sup>
   5297 
   5298 ---
   5299 
   5300 <a name="SkCanvas_drawPatch"></a>
   5301 ## drawPatch
   5302 
   5303 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5304 void drawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4],
   5305                SkBlendMode mode, const SkPaint& paint)
   5306 </pre>
   5307 
   5308 Draws a Coons_Patch: the interpolation of four <a href="#SkCanvas_drawPatch_cubics">cubics</a> with shared corners,
   5309 associating a color, and optionally a texture coordinate, with each corner.
   5310 
   5311 Coons_Patch uses <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a>, <a href="#SkCanvas_drawPatch_paint">paint</a> <a href="undocumented#Shader">Shader</a>, <a href="undocumented#Color_Filter">Color Filter</a>,
   5312 <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Blend_Mode">Blend Mode</a>. If <a href="undocumented#Shader">Shader</a> is provided it is treated
   5313 as Coons_Patch texture; <a href="undocumented#Blend_Mode">Blend Mode</a> <a href="#SkCanvas_drawPatch_mode">mode</a> combines <a href="undocumented#Color">Color</a> <a href="#SkCanvas_drawPatch_colors">colors</a> and <a href="undocumented#Shader">Shader</a> if
   5314 both are provided.
   5315 
   5316 <a href="SkPoint_Reference#Point">Point</a> array <a href="#SkCanvas_drawPatch_cubics">cubics</a> specifies four <a href="#Cubic">Cubics</a> starting at the top-left corner,
   5317 in clockwise order, sharing every fourth point. The last <a href="#Cubic">Cubic</a> ends at the
   5318 first point.
   5319 
   5320 <a href="undocumented#Color">Color</a> array color associates <a href="#SkCanvas_drawPatch_colors">colors</a> with corners in top-left, top-right,
   5321 bottom-right, bottom-left order.
   5322 
   5323 If <a href="#SkCanvas_drawPatch_paint">paint</a> contains <a href="undocumented#Shader">Shader</a>, <a href="SkPoint_Reference#Point">Point</a> array <a href="#SkCanvas_drawPatch_texCoords">texCoords</a> maps <a href="undocumented#Shader">Shader</a> as texture to
   5324 corners in top-left, top-right, bottom-right, bottom-left order.
   5325 
   5326 ### Parameters
   5327 
   5328 <table>  <tr>    <td><a name="SkCanvas_drawPatch_cubics"> <code><strong>cubics </strong></code> </a></td> <td>
   5329 <a href="#Cubic">Path Cubic</a> array, sharing common points</td>
   5330   </tr>  <tr>    <td><a name="SkCanvas_drawPatch_colors"> <code><strong>colors </strong></code> </a></td> <td>
   5331 <a href="undocumented#Color">Color</a> array, one for each corner</td>
   5332   </tr>  <tr>    <td><a name="SkCanvas_drawPatch_texCoords"> <code><strong>texCoords </strong></code> </a></td> <td>
   5333 <a href="SkPoint_Reference#Point">Point</a> array of texture coordinates, mapping <a href="undocumented#Shader">Shader</a> to corners;
   5334 may be nullptr</td>
   5335   </tr>
   5336 #  <tr>    <td><a name="SkCanvas_drawPatch_mode"> <code><strong>mode </strong></code> </a></td> <td>
   5337 <a href="undocumented#Blend_Mode">Blend Mode</a> for <a href="#SkCanvas_drawPatch_colors">colors</a>, and for <a href="undocumented#Shader">Shader</a> if <a href="#SkCanvas_drawPatch_paint">paint</a> has one</td>
   5338   </tr>  <tr>    <td><a name="SkCanvas_drawPatch_paint"> <code><strong>paint </strong></code> </a></td> <td>
   5339 <a href="undocumented#Shader">Shader</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Blend_Mode">Blend Mode</a>, used to draw</td>
   5340   </tr>
   5341 </table>
   5342 
   5343 ### Example
   5344 
   5345 <div><fiddle-embed name="accb545d67984ced168f5be6ab824795"></fiddle-embed></div>
   5346 
   5347 ### See Also
   5348 
   5349 SeeAlso <a href="#SkCanvas_drawVertices">drawVertices</a><sup><a href="#SkCanvas_drawVertices_2">[2]</a></sup> <a href="#SkCanvas_drawPicture">drawPicture</a><sup><a href="#SkCanvas_drawPicture_2">[2]</a></sup><sup><a href="#SkCanvas_drawPicture_3">[3]</a></sup><sup><a href="#SkCanvas_drawPicture_4">[4]</a></sup>
   5350 
   5351 ---
   5352 
   5353 <a name="SkCanvas_drawPatch_2"></a>
   5354 
   5355 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5356 void drawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4],
   5357                const SkPaint& paint)
   5358 </pre>
   5359 
   5360 Draws <a href="#Cubic">Cubic</a> Coons_Patch: the interpolation of four <a href="#SkCanvas_drawPatch_2_cubics">cubics</a> with shared corners,
   5361 associating a color, and optionally a texture coordinate, with each corner.
   5362 
   5363 Coons_Patch uses <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a>, <a href="#SkCanvas_drawPatch_2_paint">paint</a> <a href="undocumented#Shader">Shader</a>, <a href="undocumented#Color_Filter">Color Filter</a>,
   5364 <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Blend_Mode">Blend Mode</a>. If <a href="undocumented#Shader">Shader</a> is provided it is treated
   5365 as Coons_Patch texture; <a href="undocumented#Blend_Mode">Blend Mode</a> mode combines <a href="undocumented#Color">Color</a> <a href="#SkCanvas_drawPatch_2_colors">colors</a> and <a href="undocumented#Shader">Shader</a> if
   5366 both are provided.
   5367 
   5368 <a href="SkPoint_Reference#Point">Point</a> array <a href="#SkCanvas_drawPatch_2_cubics">cubics</a> specifies four <a href="#Cubic">Cubics</a> starting at the top-left corner,
   5369 in clockwise order, sharing every fourth point. The last <a href="#Cubic">Cubic</a> ends at the
   5370 first point.
   5371 
   5372 <a href="undocumented#Color">Color</a> array color associates <a href="#SkCanvas_drawPatch_2_colors">colors</a> with corners in top-left, top-right,
   5373 bottom-right, bottom-left order.
   5374 
   5375 If <a href="#SkCanvas_drawPatch_2_paint">paint</a> contains <a href="undocumented#Shader">Shader</a>, <a href="SkPoint_Reference#Point">Point</a> array <a href="#SkCanvas_drawPatch_2_texCoords">texCoords</a> maps <a href="undocumented#Shader">Shader</a> as texture to
   5376 corners in top-left, top-right, bottom-right, bottom-left order.
   5377 
   5378 ### Parameters
   5379 
   5380 <table>  <tr>    <td><a name="SkCanvas_drawPatch_2_cubics"> <code><strong>cubics </strong></code> </a></td> <td>
   5381 <a href="#Cubic">Path Cubic</a> array, sharing common points</td>
   5382   </tr>  <tr>    <td><a name="SkCanvas_drawPatch_2_colors"> <code><strong>colors </strong></code> </a></td> <td>
   5383 <a href="undocumented#Color">Color</a> array, one for each corner</td>
   5384   </tr>  <tr>    <td><a name="SkCanvas_drawPatch_2_texCoords"> <code><strong>texCoords </strong></code> </a></td> <td>
   5385 <a href="SkPoint_Reference#Point">Point</a> array of texture coordinates, mapping <a href="undocumented#Shader">Shader</a> to corners;
   5386 may be nullptr</td>
   5387   </tr>
   5388 #  <tr>    <td><a name="SkCanvas_drawPatch_2_paint"> <code><strong>paint </strong></code> </a></td> <td>
   5389 <a href="undocumented#Shader">Shader</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Blend_Mode">Blend Mode</a>, used to draw</td>
   5390   </tr>
   5391 </table>
   5392 
   5393 ### Example
   5394 
   5395 <div><fiddle-embed name="4cf70f8d194867d053d7e177e5088445"></fiddle-embed></div>
   5396 
   5397 ### Example
   5398 
   5399 <div><fiddle-embed name="3412c2a16cb529af0e04878d264451f2"></fiddle-embed></div>
   5400 
   5401 ### See Also
   5402 
   5403 SeeAlso <a href="#SkCanvas_drawVertices">drawVertices</a><sup><a href="#SkCanvas_drawVertices_2">[2]</a></sup> <a href="#SkCanvas_drawPicture">drawPicture</a><sup><a href="#SkCanvas_drawPicture_2">[2]</a></sup><sup><a href="#SkCanvas_drawPicture_3">[3]</a></sup><sup><a href="#SkCanvas_drawPicture_4">[4]</a></sup>
   5404 
   5405 ---
   5406 
   5407 <a name="SkCanvas_drawAtlas"></a>
   5408 ## drawAtlas
   5409 
   5410 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5411 void drawAtlas(const SkImage* atlas, const SkRSXform xform[], const SkRect tex[],
   5412                const SkColor colors[], int count, SkBlendMode mode, const SkRect* cullRect,
   5413                const SkPaint* paint)
   5414 </pre>
   5415 
   5416 Draw a set of sprites from <a href="#SkCanvas_drawAtlas_atlas">atlas</a>, using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawAtlas_paint">paint</a>.
   5417 <a href="#SkCanvas_drawAtlas_paint">paint</a> uses Anti-alias, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Blend_Mode">Blend Mode</a>
   5418 to draw, if present. For each entry in the array, <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawAtlas_tex">tex</a> locates sprite in
   5419 <a href="#SkCanvas_drawAtlas_atlas">atlas</a>, and <a href="undocumented#RSXform">RSXform</a> <a href="#SkCanvas_drawAtlas_xform">xform</a> transforms it into destination space.
   5420 
   5421 <a href="#SkCanvas_drawAtlas_xform">xform</a>, text, and <a href="#SkCanvas_drawAtlas_colors">colors</a> if present, must contain <a href="#SkCanvas_drawAtlas_count">count</a> entries.
   5422 Optional <a href="#SkCanvas_drawAtlas_colors">colors</a> are applied for each sprite using <a href="undocumented#Blend_Mode">Blend Mode</a>.
   5423 Optional <a href="#SkCanvas_drawAtlas_cullRect">cullRect</a> is a conservative bounds of all transformed sprites.
   5424 If <a href="#SkCanvas_drawAtlas_cullRect">cullRect</a> is outside of <a href="#Clip">Clip</a>, canvas can skip drawing.
   5425 
   5426 ### Parameters
   5427 
   5428 <table>  <tr>    <td><a name="SkCanvas_drawAtlas_atlas"> <code><strong>atlas </strong></code> </a></td> <td>
   5429 <a href="SkImage_Reference#Image">Image</a> containing sprites</td>
   5430   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_xform"> <code><strong>xform </strong></code> </a></td> <td>
   5431 <a href="undocumented#RSXform">RSXform</a> mappings for sprites in <a href="#SkCanvas_drawAtlas_atlas">atlas</a></td>
   5432   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_tex"> <code><strong>tex </strong></code> </a></td> <td>
   5433 <a href="SkRect_Reference#Rect">Rect</a> locations of sprites in <a href="#SkCanvas_drawAtlas_atlas">atlas</a></td>
   5434   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_colors"> <code><strong>colors </strong></code> </a></td> <td>
   5435 one per sprite, blended with sprite using <a href="undocumented#Blend_Mode">Blend Mode</a>; may be nullptr</td>
   5436   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_count"> <code><strong>count </strong></code> </a></td> <td>
   5437 number of sprites to draw</td>
   5438   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_mode"> <code><strong>mode </strong></code> </a></td> <td>
   5439 <a href="undocumented#Blend_Mode">Blend Mode</a> combining <a href="#SkCanvas_drawAtlas_colors">colors</a> and sprites</td>
   5440   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_cullRect"> <code><strong>cullRect </strong></code> </a></td> <td>
   5441 bounds of transformed sprites for efficient clipping; may be nullptr</td>
   5442   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_paint"> <code><strong>paint </strong></code> </a></td> <td>
   5443 <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, <a href="undocumented#Blend_Mode">Blend Mode</a>, and so on; may be nullptr</td>
   5444   </tr>
   5445 </table>
   5446 
   5447 ### Example
   5448 
   5449 <div><fiddle-embed name="1df575f9b8132306ce0552a2554ed132"></fiddle-embed></div>
   5450 
   5451 ### See Also
   5452 
   5453 <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup>
   5454 
   5455 ---
   5456 
   5457 <a name="SkCanvas_drawAtlas_2"></a>
   5458 
   5459 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5460 void drawAtlas(const sk_sp&lt;SkImage&gt;& atlas, const SkRSXform xform[], const SkRect tex[],
   5461                const SkColor colors[], int count, SkBlendMode mode, const SkRect* cullRect,
   5462                const SkPaint* paint)
   5463 </pre>
   5464 
   5465 Draw a set of sprites from <a href="#SkCanvas_drawAtlas_2_atlas">atlas</a>, using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawAtlas_2_paint">paint</a>.
   5466 <a href="#SkCanvas_drawAtlas_2_paint">paint</a> uses Anti-alias, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Blend_Mode">Blend Mode</a>
   5467 to draw, if present. For each entry in the array, <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawAtlas_2_tex">tex</a> locates sprite in
   5468 <a href="#SkCanvas_drawAtlas_2_atlas">atlas</a>, and <a href="undocumented#RSXform">RSXform</a> <a href="#SkCanvas_drawAtlas_2_xform">xform</a> transforms it into destination space.
   5469 
   5470 <a href="#SkCanvas_drawAtlas_2_xform">xform</a>, text, and <a href="#SkCanvas_drawAtlas_2_colors">colors</a> if present, must contain <a href="#SkCanvas_drawAtlas_2_count">count</a> entries.
   5471 Optional <a href="#SkCanvas_drawAtlas_2_colors">colors</a> is applied for each sprite using <a href="undocumented#Blend_Mode">Blend Mode</a>.
   5472 Optional <a href="#SkCanvas_drawAtlas_2_cullRect">cullRect</a> is a conservative bounds of all transformed sprites.
   5473 If <a href="#SkCanvas_drawAtlas_2_cullRect">cullRect</a> is outside of <a href="#Clip">Clip</a>, canvas can skip drawing.
   5474 
   5475 ### Parameters
   5476 
   5477 <table>  <tr>    <td><a name="SkCanvas_drawAtlas_2_atlas"> <code><strong>atlas </strong></code> </a></td> <td>
   5478 <a href="SkImage_Reference#Image">Image</a> containing sprites</td>
   5479   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_2_xform"> <code><strong>xform </strong></code> </a></td> <td>
   5480 <a href="undocumented#RSXform">RSXform</a> mappings for sprites in <a href="#SkCanvas_drawAtlas_2_atlas">atlas</a></td>
   5481   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_2_tex"> <code><strong>tex </strong></code> </a></td> <td>
   5482 <a href="SkRect_Reference#Rect">Rect</a> locations of sprites in <a href="#SkCanvas_drawAtlas_2_atlas">atlas</a></td>
   5483   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_2_colors"> <code><strong>colors </strong></code> </a></td> <td>
   5484 one per sprite, blended with sprite using <a href="undocumented#Blend_Mode">Blend Mode</a>; may be nullptr</td>
   5485   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_2_count"> <code><strong>count </strong></code> </a></td> <td>
   5486 number of sprites to draw</td>
   5487   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_2_mode"> <code><strong>mode </strong></code> </a></td> <td>
   5488 <a href="undocumented#Blend_Mode">Blend Mode</a> combining <a href="#SkCanvas_drawAtlas_2_colors">colors</a> and sprites</td>
   5489   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_2_cullRect"> <code><strong>cullRect </strong></code> </a></td> <td>
   5490 bounds of transformed sprites for efficient clipping; may be nullptr</td>
   5491   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_2_paint"> <code><strong>paint </strong></code> </a></td> <td>
   5492 <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, <a href="undocumented#Blend_Mode">Blend Mode</a>, and so on; may be nullptr</td>
   5493   </tr>
   5494 </table>
   5495 
   5496 ### Example
   5497 
   5498 <div><fiddle-embed name="0e66a8f230a8d531bcef9f5ebdc5aac1"></fiddle-embed></div>
   5499 
   5500 ### See Also
   5501 
   5502 <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup>
   5503 
   5504 ---
   5505 
   5506 <a name="SkCanvas_drawAtlas_3"></a>
   5507 
   5508 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5509 void drawAtlas(const SkImage* atlas, const SkRSXform xform[], const SkRect tex[], int count,
   5510                const SkRect* cullRect, const SkPaint* paint)
   5511 </pre>
   5512 
   5513 Draw a set of sprites from <a href="#SkCanvas_drawAtlas_3_atlas">atlas</a>, using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawAtlas_3_paint">paint</a>.
   5514 <a href="#SkCanvas_drawAtlas_3_paint">paint</a> uses Anti-alias, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Blend_Mode">Blend Mode</a>
   5515 to draw, if present. For each entry in the array, <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawAtlas_3_tex">tex</a> locates sprite in
   5516 <a href="#SkCanvas_drawAtlas_3_atlas">atlas</a>, and <a href="undocumented#RSXform">RSXform</a> <a href="#SkCanvas_drawAtlas_3_xform">xform</a> transforms it into destination space.
   5517 
   5518 <a href="#SkCanvas_drawAtlas_3_xform">xform</a> and text must contain <a href="#SkCanvas_drawAtlas_3_count">count</a> entries.
   5519 Optional <a href="#SkCanvas_drawAtlas_3_cullRect">cullRect</a> is a conservative bounds of all transformed sprites.
   5520 If <a href="#SkCanvas_drawAtlas_3_cullRect">cullRect</a> is outside of <a href="#Clip">Clip</a>, canvas can skip drawing.
   5521 
   5522 ### Parameters
   5523 
   5524 <table>  <tr>    <td><a name="SkCanvas_drawAtlas_3_atlas"> <code><strong>atlas </strong></code> </a></td> <td>
   5525 <a href="SkImage_Reference#Image">Image</a> containing sprites</td>
   5526   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_3_xform"> <code><strong>xform </strong></code> </a></td> <td>
   5527 <a href="undocumented#RSXform">RSXform</a> mappings for sprites in <a href="#SkCanvas_drawAtlas_3_atlas">atlas</a></td>
   5528   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_3_tex"> <code><strong>tex </strong></code> </a></td> <td>
   5529 <a href="SkRect_Reference#Rect">Rect</a> locations of sprites in <a href="#SkCanvas_drawAtlas_3_atlas">atlas</a></td>
   5530   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_3_count"> <code><strong>count </strong></code> </a></td> <td>
   5531 number of sprites to draw</td>
   5532   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_3_cullRect"> <code><strong>cullRect </strong></code> </a></td> <td>
   5533 bounds of transformed sprites for efficient clipping; may be nullptr</td>
   5534   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_3_paint"> <code><strong>paint </strong></code> </a></td> <td>
   5535 <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, <a href="undocumented#Blend_Mode">Blend Mode</a>, and so on; may be nullptr</td>
   5536   </tr>
   5537 </table>
   5538 
   5539 ### Example
   5540 
   5541 <div><fiddle-embed name="8dc0d0fdeab20bbc21cac6874ddbefcd"></fiddle-embed></div>
   5542 
   5543 ### See Also
   5544 
   5545 <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup>
   5546 
   5547 ---
   5548 
   5549 <a name="SkCanvas_drawAtlas_4"></a>
   5550 
   5551 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5552 void drawAtlas(const sk_sp&lt;SkImage&gt;& atlas, const SkRSXform xform[], const SkRect tex[], int count,
   5553                const SkRect* cullRect, const SkPaint* paint)
   5554 </pre>
   5555 
   5556 Draw a set of sprites from <a href="#SkCanvas_drawAtlas_4_atlas">atlas</a>, using <a href="#Clip">Clip</a>, <a href="#Matrix">Matrix</a>, and optional <a href="SkPaint_Reference#Paint">Paint</a> <a href="#SkCanvas_drawAtlas_4_paint">paint</a>.
   5557 <a href="#SkCanvas_drawAtlas_4_paint">paint</a> uses Anti-alias, <a href="#Alpha">Color Alpha</a>, <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, and <a href="undocumented#Blend_Mode">Blend Mode</a>
   5558 to draw, if present. For each entry in the array, <a href="SkRect_Reference#Rect">Rect</a> <a href="#SkCanvas_drawAtlas_4_tex">tex</a> locates sprite in
   5559 <a href="#SkCanvas_drawAtlas_4_atlas">atlas</a>, and <a href="undocumented#RSXform">RSXform</a> <a href="#SkCanvas_drawAtlas_4_xform">xform</a> transforms it into destination space.
   5560 
   5561 <a href="#SkCanvas_drawAtlas_4_xform">xform</a> and text must contain <a href="#SkCanvas_drawAtlas_4_count">count</a> entries.
   5562 Optional <a href="#SkCanvas_drawAtlas_4_cullRect">cullRect</a> is a conservative bounds of all transformed sprites.
   5563 If <a href="#SkCanvas_drawAtlas_4_cullRect">cullRect</a> is outside of <a href="#Clip">Clip</a>, canvas can skip drawing.
   5564 
   5565 ### Parameters
   5566 
   5567 <table>  <tr>    <td><a name="SkCanvas_drawAtlas_4_atlas"> <code><strong>atlas </strong></code> </a></td> <td>
   5568 <a href="SkImage_Reference#Image">Image</a> containing sprites</td>
   5569   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_4_xform"> <code><strong>xform </strong></code> </a></td> <td>
   5570 <a href="undocumented#RSXform">RSXform</a> mappings for sprites in <a href="#SkCanvas_drawAtlas_4_atlas">atlas</a></td>
   5571   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_4_tex"> <code><strong>tex </strong></code> </a></td> <td>
   5572 <a href="SkRect_Reference#Rect">Rect</a> locations of sprites in <a href="#SkCanvas_drawAtlas_4_atlas">atlas</a></td>
   5573   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_4_count"> <code><strong>count </strong></code> </a></td> <td>
   5574 number of sprites to draw</td>
   5575   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_4_cullRect"> <code><strong>cullRect </strong></code> </a></td> <td>
   5576 bounds of transformed sprites for efficient clipping; may be nullptr</td>
   5577   </tr>  <tr>    <td><a name="SkCanvas_drawAtlas_4_paint"> <code><strong>paint </strong></code> </a></td> <td>
   5578 <a href="undocumented#Color_Filter">Color Filter</a>, <a href="undocumented#Image_Filter">Image Filter</a>, <a href="undocumented#Blend_Mode">Blend Mode</a>, and so on; may be nullptr</td>
   5579   </tr>
   5580 </table>
   5581 
   5582 ### Example
   5583 
   5584 <div><fiddle-embed name="c093c2b14bd3e6171ede7cd4049d9b57"></fiddle-embed></div>
   5585 
   5586 ### See Also
   5587 
   5588 <a href="#SkCanvas_drawBitmap">drawBitmap</a> <a href="#SkCanvas_drawImage">drawImage</a><sup><a href="#SkCanvas_drawImage_2">[2]</a></sup>
   5589 
   5590 ---
   5591 
   5592 <a name="SkCanvas_drawDrawable"></a>
   5593 ## drawDrawable
   5594 
   5595 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5596 void drawDrawable(SkDrawable* drawable, const SkMatrix* matrix = nullptr)
   5597 </pre>
   5598 
   5599 Draw <a href="undocumented#Drawable">Drawable</a> <a href="#SkCanvas_drawDrawable_drawable">drawable</a> using <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a>, concatenated with
   5600 optional <a href="#SkCanvas_drawDrawable_matrix">matrix</a>.
   5601 
   5602 If <a href="#Canvas">Canvas</a> has an asynchronous implementation, as is the case
   5603 when it is recording into <a href="undocumented#Picture">Picture</a>, then <a href="#SkCanvas_drawDrawable_drawable">drawable</a> will be referenced,
   5604 so that <a href="#SkDrawable_draw">SkDrawable::draw()</a> can be called when the operation is finalized. To force
   5605 immediate drawing, call <a href="#SkDrawable_draw">SkDrawable::draw()</a> instead.
   5606 
   5607 ### Parameters
   5608 
   5609 <table>  <tr>    <td><a name="SkCanvas_drawDrawable_drawable"> <code><strong>drawable </strong></code> </a></td> <td>
   5610 custom struct encapsulating drawing commands</td>
   5611   </tr>  <tr>    <td><a name="SkCanvas_drawDrawable_matrix"> <code><strong>matrix </strong></code> </a></td> <td>
   5612 transformation applied to drawing; may be nullptr</td>
   5613   </tr>
   5614 </table>
   5615 
   5616 ### Example
   5617 
   5618 <div><fiddle-embed name="3a4dfcd08838866b5cfc0d82489195ba"></fiddle-embed></div>
   5619 
   5620 ### See Also
   5621 
   5622 <a href="undocumented#SkDrawable">SkDrawable</a> <a href="#SkCanvas_drawPicture">drawPicture</a><sup><a href="#SkCanvas_drawPicture_2">[2]</a></sup><sup><a href="#SkCanvas_drawPicture_3">[3]</a></sup><sup><a href="#SkCanvas_drawPicture_4">[4]</a></sup>
   5623 
   5624 ---
   5625 
   5626 <a name="SkCanvas_drawDrawable_2"></a>
   5627 
   5628 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5629 void drawDrawable(SkDrawable* drawable, SkScalar x, SkScalar y)
   5630 </pre>
   5631 
   5632 Draw <a href="undocumented#Drawable">Drawable</a> <a href="#SkCanvas_drawDrawable_2_drawable">drawable</a> using <a href="#Clip">Clip</a> and <a href="#Matrix">Matrix</a>, offset by (<a href="#SkCanvas_drawDrawable_2_x">x</a>, <a href="#SkCanvas_drawDrawable_2_y">y</a>).
   5633 
   5634 If <a href="#Canvas">Canvas</a> has an asynchronous implementation, as is the case
   5635 when it is recording into <a href="undocumented#Picture">Picture</a>, then <a href="#SkCanvas_drawDrawable_2_drawable">drawable</a> will be referenced,
   5636 so that <a href="#SkDrawable_draw">SkDrawable::draw()</a> can be called when the operation is finalized. To force
   5637 immediate drawing, call <a href="#SkDrawable_draw">SkDrawable::draw()</a> instead.
   5638 
   5639 ### Parameters
   5640 
   5641 <table>  <tr>    <td><a name="SkCanvas_drawDrawable_2_drawable"> <code><strong>drawable </strong></code> </a></td> <td>
   5642 custom struct encapsulating drawing commands</td>
   5643   </tr>  <tr>    <td><a name="SkCanvas_drawDrawable_2_x"> <code><strong>x </strong></code> </a></td> <td>
   5644 offset into <a href="#Canvas">Canvas</a> writable pixels in <a href="#SkCanvas_drawDrawable_2_x">x</a></td>
   5645   </tr>  <tr>    <td><a name="SkCanvas_drawDrawable_2_y"> <code><strong>y </strong></code> </a></td> <td>
   5646 offset into <a href="#Canvas">Canvas</a> writable pixels in <a href="#SkCanvas_drawDrawable_2_y">y</a></td>
   5647   </tr>
   5648 </table>
   5649 
   5650 ### Example
   5651 
   5652 <div><fiddle-embed name="1bdc07ad3b154c89b771722c2fcaee3f"></fiddle-embed></div>
   5653 
   5654 ### See Also
   5655 
   5656 <a href="undocumented#SkDrawable">SkDrawable</a> <a href="#SkCanvas_drawPicture">drawPicture</a><sup><a href="#SkCanvas_drawPicture_2">[2]</a></sup><sup><a href="#SkCanvas_drawPicture_3">[3]</a></sup><sup><a href="#SkCanvas_drawPicture_4">[4]</a></sup>
   5657 
   5658 ---
   5659 
   5660 <a name="SkCanvas_drawAnnotation"></a>
   5661 ## drawAnnotation
   5662 
   5663 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5664 void drawAnnotation(const SkRect& rect, const char key[], SkData* value)
   5665 </pre>
   5666 
   5667 Associate <a href="SkRect_Reference#Rect">Rect</a> on <a href="#Canvas">Canvas</a> when an annotation; a <a href="#SkCanvas_drawAnnotation_key">key</a>-<a href="#SkCanvas_drawAnnotation_value">value</a> pair, where the <a href="#SkCanvas_drawAnnotation_key">key</a> is
   5668 a null-terminated utf8 string, and optional <a href="#SkCanvas_drawAnnotation_value">value</a> is stored as <a href="undocumented#Data">Data</a>.
   5669 
   5670 Only some canvas implementations, such as recording to <a href="undocumented#Picture">Picture</a>, or drawing to
   5671 <a href="#PDF">Document PDF</a>, use annotations.
   5672 
   5673 ### Parameters
   5674 
   5675 <table>  <tr>    <td><a name="SkCanvas_drawAnnotation_rect"> <code><strong>rect </strong></code> </a></td> <td>
   5676 <a href="SkRect_Reference#Rect">Rect</a> extent of canvas to annotate</td>
   5677   </tr>  <tr>    <td><a name="SkCanvas_drawAnnotation_key"> <code><strong>key </strong></code> </a></td> <td>
   5678 string used for lookup</td>
   5679   </tr>  <tr>    <td><a name="SkCanvas_drawAnnotation_value"> <code><strong>value </strong></code> </a></td> <td>
   5680 data holding <a href="#SkCanvas_drawAnnotation_value">value</a> stored in annotation</td>
   5681   </tr>
   5682 </table>
   5683 
   5684 ### Example
   5685 
   5686 <div><fiddle-embed name="00b430bd80d740e19c6d020a940f56d5"></fiddle-embed></div>
   5687 
   5688 ### See Also
   5689 
   5690 <a href="undocumented#SkPicture">SkPicture</a> <a href="undocumented#SkDocument">SkDocument</a>
   5691 
   5692 ---
   5693 
   5694 <a name="SkCanvas_drawAnnotation_2"></a>
   5695 
   5696 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5697 void drawAnnotation(const SkRect& rect, const char key[], const sk_sp&lt;SkData&gt;& value)
   5698 </pre>
   5699 
   5700 Associate <a href="SkRect_Reference#Rect">Rect</a> on <a href="#Canvas">Canvas</a> when an annotation; a <a href="#SkCanvas_drawAnnotation_2_key">key</a>-<a href="#SkCanvas_drawAnnotation_2_value">value</a> pair, where the <a href="#SkCanvas_drawAnnotation_2_key">key</a> is
   5701 a null-terminated utf8 string, and optional <a href="#SkCanvas_drawAnnotation_2_value">value</a> is stored as <a href="undocumented#Data">Data</a>.
   5702 
   5703 Only some canvas implementations, such as recording to <a href="undocumented#Picture">Picture</a>, or drawing to
   5704 <a href="#PDF">Document PDF</a>, use annotations.
   5705 
   5706 ### Parameters
   5707 
   5708 <table>  <tr>    <td><a name="SkCanvas_drawAnnotation_2_rect"> <code><strong>rect </strong></code> </a></td> <td>
   5709 <a href="SkRect_Reference#Rect">Rect</a> extent of canvas to annotate</td>
   5710   </tr>  <tr>    <td><a name="SkCanvas_drawAnnotation_2_key"> <code><strong>key </strong></code> </a></td> <td>
   5711 string used for lookup</td>
   5712   </tr>  <tr>    <td><a name="SkCanvas_drawAnnotation_2_value"> <code><strong>value </strong></code> </a></td> <td>
   5713 data holding <a href="#SkCanvas_drawAnnotation_2_value">value</a> stored in annotation</td>
   5714   </tr>
   5715 </table>
   5716 
   5717 ### Example
   5718 
   5719 <div><fiddle-embed name="00b430bd80d740e19c6d020a940f56d5"></fiddle-embed></div>
   5720 
   5721 ### See Also
   5722 
   5723 <a href="undocumented#SkPicture">SkPicture</a> <a href="undocumented#SkDocument">SkDocument</a>
   5724 
   5725 ---
   5726 
   5727 <a name="SkCanvas_getDrawFilter"></a>
   5728 ## getDrawFilter
   5729 
   5730 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5731 SkDrawFilter* getDrawFilter() const
   5732 </pre>
   5733 
   5734 Legacy call to be deprecated.
   5735 
   5736 ---
   5737 
   5738 <a name="SkCanvas_setDrawFilter"></a>
   5739 ## setDrawFilter
   5740 
   5741 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5742 virtual SkDrawFilter* setDrawFilter(SkDrawFilter* filter)
   5743 </pre>
   5744 
   5745 Legacy call to be deprecated.
   5746 
   5747 ---
   5748 
   5749 <a name="SkCanvas_isClipEmpty"></a>
   5750 ## isClipEmpty
   5751 
   5752 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5753 virtual bool isClipEmpty() const
   5754 </pre>
   5755 
   5756 Returns true if <a href="#Clip">Clip</a> is empty; that is, nothing will draw.
   5757 
   5758 May do work when called; it should not be called
   5759 more often than needed. However, once called, subsequent calls perform no
   5760 work until <a href="#Clip">Clip</a> changes.
   5761 
   5762 ### Return Value
   5763 
   5764 true if <a href="#Clip">Clip</a> is empty
   5765 
   5766 ### Example
   5767 
   5768 <div><fiddle-embed name="f106f146a58c8604308d4d8d7086d2f5">
   5769 
   5770 #### Example Output
   5771 
   5772 ~~~~
   5773 clip is not empty
   5774 clip is empty
   5775 ~~~~
   5776 
   5777 </fiddle-embed></div>
   5778 
   5779 ### See Also
   5780 
   5781 <a href="#SkCanvas_isClipRect">isClipRect</a> <a href="#SkCanvas_getLocalClipBounds">getLocalClipBounds</a><sup><a href="#SkCanvas_getLocalClipBounds_2">[2]</a></sup> <a href="#SkCanvas_getDeviceClipBounds">getDeviceClipBounds</a><sup><a href="#SkCanvas_getDeviceClipBounds_2">[2]</a></sup>
   5782 
   5783 ---
   5784 
   5785 <a name="SkCanvas_isClipRect"></a>
   5786 ## isClipRect
   5787 
   5788 <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0">
   5789 virtual bool isClipRect() const
   5790 </pre>
   5791 
   5792 Returns true if <a href="#Clip">Clip</a> is <a href="SkRect_Reference#Rect">Rect</a> and not empty.
   5793 Returns false if the clip is empty, or if it is not <a href="SkRect_Reference#Rect">Rect</a>.
   5794 
   5795 ### Return Value
   5796 
   5797 true if <a href="#Clip">Clip</a> is <a href="SkRect_Reference#Rect">Rect</a> and not empty
   5798 
   5799 ### Example
   5800 
   5801 <div><fiddle-embed name="9894bfb476c78a8f6c8f49fbbca3d50d">
   5802 
   5803 #### Example Output
   5804 
   5805 ~~~~
   5806 clip is rect
   5807 clip is not rect
   5808 ~~~~
   5809 
   5810 </fiddle-embed></div>
   5811 
   5812 ### See Also
   5813 
   5814 <a href="#SkCanvas_isClipEmpty">isClipEmpty</a> <a href="#SkCanvas_getLocalClipBounds">getLocalClipBounds</a><sup><a href="#SkCanvas_getLocalClipBounds_2">[2]</a></sup> <a href="#SkCanvas_getDeviceClipBounds">getDeviceClipBounds</a><sup><a href="#SkCanvas_getDeviceClipBounds_2">[2]</a></sup>
   5815 
   5816 ---
   5817 
   5818