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<SkCanvas> 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<SkCanvas> 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<SkSurface> 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<SkImage>& 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<SkImage>& 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<SkImage>& 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<SkImage>& 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<SkImage>& 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<SkTextBlob>& 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<SkPicture>& 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<SkPicture>& 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<SkVertices>& 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<SkImage>& 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<SkImage>& 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<SkData>& 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