1SkCanvas 2======== 3 4*The drawing context* 5 6<!-- Updated Mar 4, 2011 --> 7 8Preview 9------- 10 11Here is an example of a set of drawing commands to draw a filled 12heptagram. This function can be cut and pasted into 13[fiddle.skia.org](https://fiddle.skia.org/). 14 15<!--?prettify lang=cc?--> 16 17 void draw(SkCanvas* canvas) { 18 const SkScalar scale = 256.0f; 19 const SkScalar R = 0.45f * scale; 20 const SkScalar TAU = 6.2831853f; 21 SkPath path; 22 path.moveTo(R, 0.0f); 23 for (int i = 1; i < 7; ++i) { 24 SkScalar theta = 3 * i * TAU / 7; 25 path.lineTo(R * cos(theta), R * sin(theta)); 26 } 27 path.close(); 28 SkPaint p; 29 p.setAntiAlias(true); 30 canvas->clear(SK_ColorWHITE); 31 canvas->translate(0.5f * scale, 0.5f * scale); 32 canvas->drawPath(path, p); 33 } 34 35<a href="https://fiddle.skia.org/c/d7b4ccb6d6281b68a274a72b187fc450"> 36<img src="https://fiddle.skia.org/i/d7b4ccb6d6281b68a274a72b187fc450_raster.png"></a> 37 38Details 39------- 40 41SkCanvas is the drawing context for Skia. It knows where to direct the 42drawing (i.e. where the screen of offscreen pixels are), and maintains 43a stack of matrices and clips. Note however, that unlike similar 44contexts in other APIs like postscript, cairo, or awt, Skia does not 45store any other drawing attributes in the context (e.g. color, pen 46size). Rather, these are specified explicitly in each draw call, via a 47SkPaint. 48 49<!--?prettify lang=cc?--> 50 51 void draw(SkCanvas* canvas) { 52 canvas->save(); 53 canvas->translate(SkIntToScalar(128), SkIntToScalar(128)); 54 canvas->rotate(SkIntToScalar(45)); 55 SkRect rect = SkRect::MakeXYWH(-90.5f, -90.5f, 181.0f, 181.0f); 56 SkPaint paint; 57 paint.setColor(SK_ColorBLUE); 58 canvas->drawRect(rect, paint); 59 canvas->restore(); 60 } 61 62<a href="https://fiddle.skia.org/c/6af99894b40ea1331f6a79d55a4cbfd7"> 63<img src="https://fiddle.skia.org/i/6af99894b40ea1331f6a79d55a4cbfd7_raster.png"></a> 64 65The code above will draw a rectangle rotated by 45 degrees. Exactly 66what color and style the rect will be drawn in is described by the 67paint, not the canvas. 68 69Check out more detailed info on [creating a SkCanvas object](canvas). 70 71To begin with, we might want to erase the entire canvas. We can do 72this by drawing an enormous rectangle, but there are easier ways to do 73it. 74 75<!--?prettify lang=cc?--> 76 77 void draw(SkCanvas* canvas) { 78 SkPaint paint; 79 paint.setColor(SK_ColorWHITE); 80 canvas->drawPaint(paint); 81 } 82 83This fills the entire canvas (though respecting the current clip of 84course) with whatever color or shader (and xfermode) is specified by 85the paint. If there is a shader in the paint, then it will respect the 86current matrix on the canvas as well (see SkShader). If you just want 87to draw a color (with an optional xfermode), you can just call 88drawColor(), and save yourself having to allocate a paint. 89 90<!--?prettify lang=cc?--> 91 92 void draw(SkCanvas* canvas) { 93 canvas->drawColor(SK_ColorWHITE); 94 } 95 96All of the other draw APIs are similar, each one ending with a paint 97parameter. 98 99<!--?prettify lang=cc?--> 100 101 SkBitmap source; 102 103 void draw(SkCanvas* canvas) { 104 canvas->drawColor(SK_ColorWHITE); 105 106 SkPaint paint; 107 paint.setStyle(SkPaint::kStroke_Style); 108 paint.setStrokeWidth(4); 109 paint.setColor(SK_ColorRED); 110 111 SkRect rect = SkRect::MakeXYWH(50, 50, 40, 60); 112 canvas->drawRect(rect, paint); 113 114 SkRRect oval; 115 oval.setOval(rect); 116 oval.offset(40, 60); 117 paint.setColor(SK_ColorBLUE); 118 canvas->drawRRect(oval, paint); 119 120 paint.setColor(SK_ColorCYAN); 121 canvas->drawCircle(180, 50, 25, paint); 122 123 rect.offset(80, 0); 124 paint.setColor(SK_ColorYELLOW); 125 canvas->drawRoundRect(rect, 10, 10, paint); 126 127 SkPath path; 128 path.cubicTo(768, 0, -512, 256, 256, 256); 129 paint.setColor(SK_ColorGREEN); 130 canvas->drawPath(path, paint); 131 132 canvas->drawBitmap(source, 128, 128, &paint); 133 134 SkRect rect2 = SkRect::MakeXYWH(0, 0, 40, 60); 135 canvas->drawBitmapRect(source, rect2); 136 137 SkPaint paint2; 138 const char text[] = "Hello, Skia!"; 139 canvas->drawText(text, strlen(text), 50, 25, paint2); 140 } 141 142<a href="https://fiddle.skia.org/c/35b614d41e60289461d658a9d509e28d"> 143<img src="https://fiddle.skia.org/i/35b614d41e60289461d658a9d509e28d_raster.png"></a> 144 145In some of the calls, we pass a pointer, rather than a reference, to 146the paint. In those instances, the paint parameter may be null. In all 147other cases the paint parameter is required. 148 149Next: [SkPaint](/user/api/skpaint) 150