| OLD | NEW |
| 1 SkPaint | 1 SkPaint |
| 2 ======= | 2 ======= |
| 3 | 3 |
| 4 *color, stroke, font, effects* | 4 *color, stroke, font, effects* |
| 5 | 5 |
| 6 - [SkXfermode](#SkXfermode) - transfer modes | 6 - [SkXfermode](#SkXfermode) - transfer modes |
| 7 - [ShShader](#ShShader) - gradients and patterns | 7 - [ShShader](#ShShader) - gradients and patterns |
| 8 - [SkMaskFilter](#SkMaskFilter) - modifications to the alpha mask | 8 - [SkMaskFilter](#SkMaskFilter) - modifications to the alpha mask |
| 9 - [SkColorFilter](#SkColorFilter) - modify the source color before applying th
e | 9 - [SkColorFilter](#SkColorFilter) - modify the source color before applying th
e |
| 10 - [SkPathEffect](#SkPathEffect) - modify to the geometry before it | 10 - [SkPathEffect](#SkPathEffect) - modify to the geometry before it |
| 11 generates an alpha mask. | 11 generates an alpha mask. |
| 12 | 12 |
| 13 Anytime you draw something in Skia, and want to specify what color it | 13 Anytime you draw something in Skia, and want to specify what color it |
| 14 is, or how it blends with the background, or what style or font to | 14 is, or how it blends with the background, or what style or font to |
| 15 draw it in, you specify those attributes in a paint. | 15 draw it in, you specify those attributes in a paint. |
| 16 | 16 |
| 17 Unlike `SkCanvas`, paints do not maintain an internal stack of state | 17 Unlike `SkCanvas`, paints do not maintain an internal stack of state |
| 18 (i.e. there is no save/restore on a paint). However, paints are | 18 (i.e. there is no save/restore on a paint). However, paints are |
| 19 relatively light-weight, so the client may create and maintain any | 19 relatively light-weight, so the client may create and maintain any |
| 20 number of paint objects, each set up for a particular use. Factoring | 20 number of paint objects, each set up for a particular use. Factoring |
| 21 all of these color and stylistic attribute out of the canvas state, | 21 all of these color and stylistic attributes out of the canvas state, |
| 22 and into (multiple) paint objects, allows canvas' save/restore to be | 22 and into (multiple) paint objects, allows canvas' save/restore to be |
| 23 that much more efficient, as all they have to do is maintain the stack | 23 that much more efficient, as all they have to do is maintain the stack |
| 24 of matrix and clip settings. | 24 of matrix and clip settings. |
| 25 | 25 |
| 26 <!--?prettify lang=cc?--> | 26 <!--?prettify lang=cc?--> |
| 27 | 27 |
| 28 void draw(SkCanvas* canvas) { | 28 void draw(SkCanvas* canvas) { |
| 29 canvas->clear(SK_ColorWHITE); | 29 canvas->clear(SK_ColorWHITE); |
| 30 | 30 |
| 31 SkPaint paint1, paint2, paint3; | 31 SkPaint paint1, paint2, paint3; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 45 paint3.setAntiAlias(true); | 45 paint3.setAntiAlias(true); |
| 46 paint3.setColor(SkColorSetRGB(136, 136, 136)); | 46 paint3.setColor(SkColorSetRGB(136, 136, 136)); |
| 47 paint3.setTextScaleX(SkFloatToScalar(1.5f)); | 47 paint3.setTextScaleX(SkFloatToScalar(1.5f)); |
| 48 | 48 |
| 49 const char text[] = "Skia!"; | 49 const char text[] = "Skia!"; |
| 50 canvas->drawText(text, strlen(text), 20.0f, 64.0f, paint1); | 50 canvas->drawText(text, strlen(text), 20.0f, 64.0f, paint1); |
| 51 canvas->drawText(text, strlen(text), 20.0f, 144.0f, paint2); | 51 canvas->drawText(text, strlen(text), 20.0f, 144.0f, paint2); |
| 52 canvas->drawText(text, strlen(text), 20.0f, 224.0f, paint3); | 52 canvas->drawText(text, strlen(text), 20.0f, 224.0f, paint3); |
| 53 } | 53 } |
| 54 | 54 |
| 55 <a href="https://fiddle.skia.org/c/c4cfc71ed9232dac9c0d6518311b386e"> | 55 <a href='https://fiddle.skia.org/c/@skpaint_skia'><img |
| 56 <img src="https://fiddle.skia.org/i/c4cfc71ed9232dac9c0d6518311b386e_raster.png"
></a> | 56 src='https://fiddle.skia.org/c/@skpaint_skia_raster.png'></a> |
| 57 | 57 |
| 58 This shows three different paints, each set up to draw in a different | 58 This shows three different paints, each set up to draw in a different |
| 59 style. Now the caller can intermix these paints freely, either using | 59 style. Now the caller can intermix these paints freely, either using |
| 60 them as is, or modifying them as the drawing proceeds. | 60 them as is, or modifying them as the drawing proceeds. |
| 61 | 61 |
| 62 <!--?prettify lang=cc?--> | 62 <!--?prettify lang=cc?--> |
| 63 | 63 |
| 64 SkPaint paint1, paint2, paint3; | 64 SkPaint paint1, paint2, paint3; |
| 65 paint2.setStyle(SkPaint::kStroke_Style); | 65 paint2.setStyle(SkPaint::kStroke_Style); |
| 66 paint2.setStrokeWidth(3); | 66 paint2.setStrokeWidth(3); |
| 67 paint3.setAntiAlias(true); | 67 paint3.setAntiAlias(true); |
| 68 paint3.setColor(SK_ColorRED); | 68 paint3.setColor(SK_ColorRED); |
| 69 paint3.setTextSize(80); | 69 paint3.setTextSize(80); |
| 70 | 70 |
| 71 canvas->drawRect(SkRect::MakeXYWH(10,10,60,20), paint1); | 71 canvas->drawRect(SkRect::MakeXYWH(10,10,60,20), paint1); |
| 72 canvas->drawRect(SkRect::MakeXYWH(80,10,60,20), paint2); | 72 canvas->drawRect(SkRect::MakeXYWH(80,10,60,20), paint2); |
| 73 | 73 |
| 74 paint2.setStrokeWidth(SkIntToScalar(5)); | 74 paint2.setStrokeWidth(SkIntToScalar(5)); |
| 75 canvas->drawOval(SkRect::MakeXYWH(150,10,60,20), paint2); | 75 canvas->drawOval(SkRect::MakeXYWH(150,10,60,20), paint2); |
| 76 | 76 |
| 77 canvas->drawText("SKIA", 4, 20, 120, paint3); | 77 canvas->drawText("SKIA", 4, 20, 120, paint3); |
| 78 paint3.setColor(SK_ColorBLUE); | 78 paint3.setColor(SK_ColorBLUE); |
| 79 canvas->drawText("SKIA", 4, 20, 220, paint3); | 79 canvas->drawText("SKIA", 4, 20, 220, paint3); |
| 80 | 80 |
| 81 <a href="https://fiddle.skia.org/c/5203b17103f487dd33965b4211d80956"> | 81 <a href='https://fiddle.skia.org/c/@skpaint_mix'><img |
| 82 <img src="https://fiddle.skia.org/i/5203b17103f487dd33965b4211d80956_raster.png"
></a> | 82 src='https://fiddle.skia.org/c/@skpaint_mix_raster.png'></a> |
| 83 | 83 |
| 84 Beyond simple attributes such as color, strokes, and text values, | 84 Beyond simple attributes such as color, strokes, and text values, |
| 85 paints support effects. These are subclasses of different aspects of | 85 paints support effects. These are subclasses of different aspects of |
| 86 the drawing pipeline, that when referenced by a paint (each of them is | 86 the drawing pipeline, that when referenced by a paint (each of them is |
| 87 reference-counted), are called to override some part of the drawing | 87 reference-counted), are called to override some part of the drawing |
| 88 pipeline. | 88 pipeline. |
| 89 | 89 |
| 90 For example, to draw using a gradient instead of a single color, | 90 For example, to draw using a gradient instead of a single color, |
| 91 assign a SkShader to the paint. | 91 assign a SkShader to the paint. |
| 92 | 92 |
| 93 <!--?prettify lang=cc?--> | 93 <!--?prettify lang=cc?--> |
| 94 | 94 |
| 95 SkPoint points[2] = { | 95 void draw(SkCanvas* canvas) { |
| 96 SkPoint::Make(0.0f, 0.0f), | 96 SkPoint points[2] = { |
| 97 SkPoint::Make(256.0f, 256.0f) | 97 SkPoint::Make(0.0f, 0.0f), |
| 98 }; | 98 SkPoint::Make(256.0f, 256.0f) |
| 99 SkColor colors[2] = {SK_ColorBLUE, SK_ColorYELLOW}; | 99 }; |
| 100 SkShader* shader = | 100 SkColor colors[2] = {SK_ColorBLUE, SK_ColorYELLOW}; |
| 101 SkGradientShader::CreateLinear( | 101 SkPaint paint; |
| 102 points, colors, nullptr, 2, | 102 paint.setShader(SkGradientShader::MakeLinear( |
| 103 SkShader::kClamp_TileMode, 0, nullptr); | 103 points, colors, nullptr, 2, |
| 104 SkPaint paint; | 104 SkShader::kClamp_TileMode, 0, nullptr)); |
| 105 paint.setShader(shader); | 105 canvas->drawPaint(paint); |
| 106 shader->unref(); | 106 } |
| 107 canvas->drawPaint(paint); | |
| 108 | 107 |
| 109 <a href="https://fiddle.skia.org/c/f91b5310d57744a5a1475b7e47d4a172"> | 108 <a href='https://fiddle.skia.org/c/@skpaint_shader'><img |
| 110 <img src="https://fiddle.skia.org/i/f91b5310d57744a5a1475b7e47d4a172_raster.png"
></a> | 109 src='https://fiddle.skia.org/c/@skpaint_shader_raster.png'></a> |
| 111 | 110 |
| 112 Now, anything drawn with that paint will be drawn with the gradient | 111 Now, anything drawn with that paint will be drawn with the gradient |
| 113 specified in the call to `CreateLinear()`. The shader object that is | 112 specified in the call to `MakeLinear()`. The shader object that is |
| 114 returned is reference-counted. Whenever any effects object, like a | 113 returned is reference-counted. Whenever any effects object, like a |
| 115 shader, is assigned to a paint, its reference-count is increased by | 114 shader, is assigned to a paint, its reference-count is increased by |
| 116 the paint. To balance this, the caller in the above example calls | 115 the paint. To balance this, the caller in the above example calls |
| 117 `unref()` on the shader once it has assigned it to the paint. Now the | 116 `unref()` on the shader once it has assigned it to the paint. Now the |
| 118 paint is the only "owner" of that shader, and it will automatically | 117 paint is the only "owner" of that shader, and it will automatically |
| 119 call `unref()` on the shader when either the paint goes out of scope, or | 118 call `unref()` on the shader when either the paint goes out of scope, or |
| 120 if another shader (or null) is assigned to it. | 119 if another shader (or null) is assigned to it. |
| 121 | 120 |
| 122 There are 6 types of effects that can be assigned to a paint: | 121 There are 6 types of effects that can be assigned to a paint: |
| 123 | 122 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 149 SkXfermode | 148 SkXfermode |
| 150 ---------- | 149 ---------- |
| 151 | 150 |
| 152 The following example demonstrates all of the Skia's standard transfer | 151 The following example demonstrates all of the Skia's standard transfer |
| 153 modes. In this example the source is a solid magenta color with a | 152 modes. In this example the source is a solid magenta color with a |
| 154 horizontal alpha gradient and the destination is a solid cyan color | 153 horizontal alpha gradient and the destination is a solid cyan color |
| 155 with a vertical alpha gradient. | 154 with a vertical alpha gradient. |
| 156 | 155 |
| 157 <!--?prettify lang=cc?--> | 156 <!--?prettify lang=cc?--> |
| 158 | 157 |
| 159 SkXfermode::Mode modes[] = { | 158 void draw(SkCanvas* canvas) { |
| 160 SkXfermode::kClear_Mode, | 159 SkXfermode::Mode modes[] = { |
| 161 SkXfermode::kSrc_Mode, | 160 SkXfermode::kClear_Mode, |
| 162 SkXfermode::kDst_Mode, | 161 SkXfermode::kSrc_Mode, |
| 163 SkXfermode::kSrcOver_Mode, | 162 SkXfermode::kDst_Mode, |
| 164 SkXfermode::kDstOver_Mode, | 163 SkXfermode::kSrcOver_Mode, |
| 165 SkXfermode::kSrcIn_Mode, | 164 SkXfermode::kDstOver_Mode, |
| 166 SkXfermode::kDstIn_Mode, | 165 SkXfermode::kSrcIn_Mode, |
| 167 SkXfermode::kSrcOut_Mode, | 166 SkXfermode::kDstIn_Mode, |
| 168 SkXfermode::kDstOut_Mode, | 167 SkXfermode::kSrcOut_Mode, |
| 169 SkXfermode::kSrcATop_Mode, | 168 SkXfermode::kDstOut_Mode, |
| 170 SkXfermode::kDstATop_Mode, | 169 SkXfermode::kSrcATop_Mode, |
| 171 SkXfermode::kXor_Mode, | 170 SkXfermode::kDstATop_Mode, |
| 172 SkXfermode::kPlus_Mode, | 171 SkXfermode::kXor_Mode, |
| 173 SkXfermode::kModulate_Mode, | 172 SkXfermode::kPlus_Mode, |
| 174 SkXfermode::kScreen_Mode, | 173 SkXfermode::kModulate_Mode, |
| 175 SkXfermode::kOverlay_Mode, | 174 SkXfermode::kScreen_Mode, |
| 176 SkXfermode::kDarken_Mode, | 175 SkXfermode::kOverlay_Mode, |
| 177 SkXfermode::kLighten_Mode, | 176 SkXfermode::kDarken_Mode, |
| 178 SkXfermode::kColorDodge_Mode, | 177 SkXfermode::kLighten_Mode, |
| 179 SkXfermode::kColorBurn_Mode, | 178 SkXfermode::kColorDodge_Mode, |
| 180 SkXfermode::kHardLight_Mode, | 179 SkXfermode::kColorBurn_Mode, |
| 181 SkXfermode::kSoftLight_Mode, | 180 SkXfermode::kHardLight_Mode, |
| 182 SkXfermode::kDifference_Mode, | 181 SkXfermode::kSoftLight_Mode, |
| 183 SkXfermode::kExclusion_Mode, | 182 SkXfermode::kDifference_Mode, |
| 184 SkXfermode::kMultiply_Mode, | 183 SkXfermode::kExclusion_Mode, |
| 185 SkXfermode::kHue_Mode, | 184 SkXfermode::kMultiply_Mode, |
| 186 SkXfermode::kSaturation_Mode, | 185 SkXfermode::kHue_Mode, |
| 187 SkXfermode::kColor_Mode, | 186 SkXfermode::kSaturation_Mode, |
| 188 SkXfermode::kLuminosity_Mode, | 187 SkXfermode::kColor_Mode, |
| 189 }; | 188 SkXfermode::kLuminosity_Mode, |
| 190 SkRect rect = SkRect::MakeWH(64.0f, 64.0f); | 189 }; |
| 191 SkPaint text, stroke, src, dst; | 190 SkRect rect = SkRect::MakeWH(64.0f, 64.0f); |
| 192 stroke.setStyle(SkPaint::kStroke_Style); | 191 SkPaint text, stroke, src, dst; |
| 193 text.setTextSize(24.0f); | 192 stroke.setStyle(SkPaint::kStroke_Style); |
| 194 text.setAntiAlias(true); | 193 text.setTextSize(24.0f); |
| 195 SkPoint srcPoints[2] = { | 194 text.setAntiAlias(true); |
| 196 SkPoint::Make(0.0f, 0.0f), | 195 SkPoint srcPoints[2] = { |
| 197 SkPoint::Make(64.0f, 0.0f) | 196 SkPoint::Make(0.0f, 0.0f), |
| 198 }; | 197 SkPoint::Make(64.0f, 0.0f) |
| 199 SkColor srcColors[2] = { | 198 }; |
| 200 SK_ColorMAGENTA & 0x00FFFFFF, | 199 SkColor srcColors[2] = { |
| 201 SK_ColorMAGENTA}; | 200 SK_ColorMAGENTA & 0x00FFFFFF, |
| 202 SkAutoTUnref<SkShader> srcShader( | 201 SK_ColorMAGENTA}; |
| 203 SkGradientShader::CreateLinear( | 202 src.setShader(SkGradientShader::MakeLinear( |
| 204 srcPoints, srcColors, nullptr, 2, | 203 srcPoints, srcColors, nullptr, 2, |
| 205 SkShader::kClamp_TileMode, 0, nullptr)); | 204 SkShader::kClamp_TileMode, 0, nullptr)); |
| 206 src.setShader(srcShader); | |
| 207 | 205 |
| 208 SkPoint dstPoints[2] = { | 206 SkPoint dstPoints[2] = { |
| 209 SkPoint::Make(0.0f, 0.0f), | 207 SkPoint::Make(0.0f, 0.0f), |
| 210 SkPoint::Make(0.0f, 64.0f) | 208 SkPoint::Make(0.0f, 64.0f) |
| 211 }; | 209 }; |
| 212 SkColor dstColors[2] = { | 210 SkColor dstColors[2] = { |
| 213 SK_ColorCYAN & 0x00FFFFFF, | 211 SK_ColorCYAN & 0x00FFFFFF, |
| 214 SK_ColorCYAN}; | 212 SK_ColorCYAN}; |
| 215 SkAutoTUnref<SkShader> dstShader( | 213 dst.setShader(SkGradientShader::MakeLinear( |
| 216 SkGradientShader::CreateLinear( | 214 dstPoints, dstColors, nullptr, 2, |
| 217 dstPoints, dstColors, nullptr, 2, | 215 SkShader::kClamp_TileMode, 0, nullptr)); |
| 218 SkShader::kClamp_TileMode, 0, nullptr)); | 216 canvas->clear(SK_ColorWHITE); |
| 219 dst.setShader(dstShader); | 217 size_t N = sizeof(modes) / sizeof(modes[0]); |
| 220 canvas->clear(SK_ColorWHITE); | 218 size_t K = (N - 1) / 3 + 1; |
| 221 size_t N = sizeof(modes) / sizeof(modes[0]); | 219 SkASSERT(K * 64 == 640); // tall enough |
| 222 size_t K = (N - 1) / 3 + 1; | 220 for (size_t i = 0; i < N; ++i) { |
| 223 SkASSERT(K * 64 == 640); // tall enough | 221 SkAutoCanvasRestore autoCanvasRestore(canvas, true); |
| 224 for (size_t i = 0; i < N; ++i) { | 222 canvas->translate(192.0f * (i / K), 64.0f * (i % K)); |
| 225 SkAutoCanvasRestore autoCanvasRestore(canvas, true); | 223 const char* desc = SkXfermode::ModeName(modes[i]); |
| 226 canvas->translate(192.0f * (i / K), 64.0f * (i % K)); | 224 canvas->drawText(desc, strlen(desc), 68.0f, 30.0f, text); |
| 227 const char* desc = SkXfermode::ModeName(modes[i]); | 225 canvas->clipRect(SkRect::MakeWH(64.0f, 64.0f)); |
| 228 canvas->drawText(desc, strlen(desc), 68.0f, 30.0f, text); | 226 canvas->drawColor(SK_ColorLTGRAY); |
| 229 canvas->clipRect(SkRect::MakeWH(64.0f, 64.0f)); | 227 (void)canvas->saveLayer(nullptr, nullptr); |
| 230 canvas->drawColor(SK_ColorLTGRAY); | 228 canvas->clear(SK_ColorTRANSPARENT); |
| 231 (void)canvas->saveLayer(nullptr, nullptr); | 229 canvas->drawPaint(dst); |
| 232 canvas->clear(SK_ColorTRANSPARENT); | 230 src.setXfermodeMode(modes[i]); |
| 233 canvas->drawPaint(dst); | 231 canvas->drawPaint(src); |
| 234 src.setXfermodeMode(modes[i]); | 232 canvas->drawRect(rect, stroke); |
| 235 canvas->drawPaint(src); | 233 } |
| 236 canvas->drawRect(rect, stroke); | |
| 237 } | 234 } |
| 238 | 235 |
| 239 <a href="https://fiddle.skia.org/c/0a2392be5adf339ce6537799f2807f3c"><img src="h
ttps://fiddle.skia.org/i/0a2392be5adf339ce6537799f2807f3c_raster.png" alt=""></a
> | 236 <a href='https://fiddle.skia.org/c/@skpaint_xfer'><img |
| 237 src='https://fiddle.skia.org/c/@skpaint_xfer_raster.png'></a> |
| 240 | 238 |
| 241 <span id="ShShader"></span> | 239 <span id="ShShader"></span> |
| 242 | 240 |
| 243 ShShader | 241 ShShader |
| 244 -------- | 242 -------- |
| 245 | 243 |
| 246 Several shaders are defined (besides the linear gradient already mentioned): | 244 Several shaders are defined (besides the linear gradient already mentioned): |
| 247 | 245 |
| 248 * Bitmap Shader | 246 * Bitmap Shader |
| 249 | 247 |
| 250 <!--?prettify lang=cc?--> | 248 <!--?prettify lang=cc?--> |
| 251 | 249 |
| 252 canvas->clear(SK_ColorWHITE); | 250 canvas->clear(SK_ColorWHITE); |
| 253 SkMatrix matrix; | 251 SkMatrix matrix; |
| 254 matrix.setScale(0.75f, 0.75f); | 252 matrix.setScale(0.75f, 0.75f); |
| 255 matrix.preRotate(30.0f); | 253 matrix.preRotate(30.0f); |
| 256 SkShader* shader = | |
| 257 SkShader::CreateBitmapShader( | |
| 258 source, | |
| 259 SkShader::kRepeat_TileMode , | |
| 260 SkShader::kRepeat_TileMode , | |
| 261 &matrix); | |
| 262 SkPaint paint; | 254 SkPaint paint; |
| 263 paint.setShader(shader); | 255 paint.setShader(SkShader::MakeBitmapShader(source, |
| 264 shader->unref(); | 256 SkShader::kRepeat_TileMode, |
| 257 SkShader::kRepeat_TileMode, |
| 258 &matrix)); |
| 265 canvas->drawPaint(paint); | 259 canvas->drawPaint(paint); |
| 266 | 260 |
| 267 <a href="https://fiddle.skia.org/c/0e8d08e0a0b342e9e45c364d0e5cea8a"> | 261 <a href='https://fiddle.skia.org/c/@skpaint_bitmap_shader'><img |
| 268 <img src="https://fiddle.skia.org/i/0e8d08e0a0b342e9e45c364d0e5cea8a_raster.
png"></a> | 262 src='https://fiddle.skia.org/c/@skpaint_bitmap_shader_raster.png'></a> |
| 269 | 263 |
| 270 * Radial Gradient Shader | 264 * Radial Gradient Shader |
| 271 | 265 |
| 272 <!--?prettify lang=cc?--> | 266 <!--?prettify lang=cc?--> |
| 273 | 267 |
| 274 SkColor colors[2] = {SK_ColorBLUE, SK_ColorYELLOW}; | 268 SkColor colors[2] = {SK_ColorBLUE, SK_ColorYELLOW}; |
| 275 SkShader* shader = | |
| 276 SkGradientShader::CreateRadial( | |
| 277 SkPoint::Make(128.0f, 128.0f), 180.0f, | |
| 278 colors, nullptr, 2, SkShader::kClamp_TileMode, 0, nullpt
r); | |
| 279 SkPaint paint; | 269 SkPaint paint; |
| 280 paint.setShader(shader); | 270 paint.setShader(SkGradientShader::MakeRadial( |
| 281 shader->unref(); | 271 SkPoint::Make(128.0f, 128.0f), 180.0f, |
| 272 colors, nullptr, 2, SkShader::kClamp_TileMode, 0, nullptr)); |
| 282 canvas->drawPaint(paint); | 273 canvas->drawPaint(paint); |
| 283 | 274 |
| 284 <a href="https://fiddle.skia.org/c/601abd2819e38365900bf62286986024"> | 275 <a href='https://fiddle.skia.org/c/@skpaint_radial'><img |
| 285 <img src="https://fiddle.skia.org/i/601abd2819e38365900bf62286986024_raster.
png"></a> | 276 src='https://fiddle.skia.org/c/@skpaint_radial_raster.png'></a> |
| 286 | 277 |
| 287 * Two-Point Conical Gradient Shader | 278 * Two-Point Conical Gradient Shader |
| 288 | 279 |
| 289 <!--?prettify lang=cc?--> | 280 <!--?prettify lang=cc?--> |
| 290 | 281 |
| 291 SkColor colors[2] = {SK_ColorBLUE, SK_ColorYELLOW}; | 282 SkColor colors[2] = {SK_ColorBLUE, SK_ColorYELLOW}; |
| 292 SkShader* shader = | |
| 293 SkGradientShader::CreateTwoPointConical( | |
| 294 SkPoint::Make(128.0f, 128.0f), 128.0f, | |
| 295 SkPoint::Make(128.0f, 16.0f), 16.0f, | |
| 296 colors, nullptr, 2, SkShader::kClamp_TileMode, 0, nullp
tr); | |
| 297 SkPaint paint; | 283 SkPaint paint; |
| 298 paint.setShader(shader); | 284 paint.setShader(SkGradientShader::MakeTwoPointConical( |
| 299 shader->unref(); | 285 SkPoint::Make(128.0f, 128.0f), 128.0f, |
| 286 SkPoint::Make(128.0f, 16.0f), 16.0f, |
| 287 colors, nullptr, 2, SkShader::kClamp_TileMode, 0, nullptr)); |
| 300 canvas->drawPaint(paint); | 288 canvas->drawPaint(paint); |
| 301 | 289 |
| 302 <a href="https://fiddle.skia.org/c/991f7d67ff1ccebd6c2c4fab18a76edc"> | 290 <a href='https://fiddle.skia.org/c/@skpaint_2pt'><img |
| 303 <img src="https://fiddle.skia.org/i/991f7d67ff1ccebd6c2c4fab18a76edc_raster.
png"></a> | 291 src='https://fiddle.skia.org/c/@skpaint_2pt_raster.png'></a> |
| 304 | 292 |
| 305 | 293 |
| 306 * Sweep Gradient Shader | 294 * Sweep Gradient Shader |
| 307 | 295 |
| 308 <!--?prettify lang=cc?--> | 296 <!--?prettify lang=cc?--> |
| 309 | 297 |
| 310 SkColor colors[4] = { | 298 SkColor colors[4] = { |
| 311 SK_ColorCYAN, SK_ColorMAGENTA, SK_ColorYELLOW, SK_ColorCYAN}; | 299 SK_ColorCYAN, SK_ColorMAGENTA, SK_ColorYELLOW, SK_ColorCYAN}; |
| 312 SkShader* shader = | |
| 313 SkGradientShader::CreateSweep( | |
| 314 128.0f, 128.0f, colors, nullptr, 4, 0, nullptr); | |
| 315 SkPaint paint; | 300 SkPaint paint; |
| 316 paint.setShader(shader); | 301 paint.setShader(SkGradientShader::MakeSweep( |
| 317 shader->unref(); | 302 128.0f, 128.0f, colors, nullptr, 4, 0, nullptr)); |
| 318 canvas->drawPaint(paint); | 303 canvas->drawPaint(paint); |
| 319 | 304 |
| 320 <a href="https://fiddle.skia.org/c/cee9d1831f6679c3d88170f857995d12"> | 305 <a href='https://fiddle.skia.org/c/@skpaint_sweep'><img |
| 321 <img src="https://fiddle.skia.org/i/cee9d1831f6679c3d88170f857995d12_raster.
png"></a> | 306 src='https://fiddle.skia.org/c/@skpaint_sweep_raster.png'></a> |
| 322 | 307 |
| 323 * Fractal Perlin Noise Shader | 308 * Fractal Perlin Noise Shader |
| 324 | 309 |
| 325 <!--?prettify lang=cc?--> | 310 <!--?prettify lang=cc?--> |
| 326 | 311 |
| 327 canvas->clear(SK_ColorWHITE); | 312 canvas->clear(SK_ColorWHITE); |
| 328 SkShader* shader = SkPerlinNoiseShader::CreateFractalNoise( | |
| 329 0.05f, 0.05f, 4, 0.0f, nullptr); | |
| 330 SkPaint paint; | 313 SkPaint paint; |
| 331 paint.setShader(shader); | 314 paint.setShader(SkPerlinNoiseShader::MakeFractalNoise( |
| 332 shader->unref(); | 315 0.05f, 0.05f, 4, 0.0f, nullptr)); |
| 333 canvas->drawPaint(paint); | 316 canvas->drawPaint(paint); |
| 334 | 317 |
| 335 <a href="https://fiddle.skia.org/c/cc45c5349c3b31f97da7c1af7f84162a"> | 318 <a href='https://fiddle.skia.org/c/@skpaint_perlin'><img |
| 336 <img src="https://fiddle.skia.org/i/cc45c5349c3b31f97da7c1af7f84162a_raster.
png"></a> | 319 src='https://fiddle.skia.org/c/@skpaint_perlin_raster.png'></a> |
| 337 | 320 |
| 338 * Turbulence Perlin Noise Shader | 321 * Turbulence Perlin Noise Shader |
| 339 | 322 |
| 340 <!--?prettify lang=cc?--> | 323 <!--?prettify lang=cc?--> |
| 341 | 324 |
| 342 canvas->clear(SK_ColorWHITE); | 325 canvas->clear(SK_ColorWHITE); |
| 343 SkShader* shader = SkPerlinNoiseShader::CreateTurbulence( | |
| 344 0.05f, 0.05f, 4, 0.0f, nullptr); | |
| 345 SkPaint paint; | 326 SkPaint paint; |
| 346 paint.setShader(shader); | 327 paint.setShader(SkPerlinNoiseShader::MakeTurbulence( |
| 347 shader->unref(); | 328 0.05f, 0.05f, 4, 0.0f, nullptr)); |
| 348 canvas->drawPaint(paint); | 329 canvas->drawPaint(paint); |
| 349 | 330 |
| 350 <a href="https://fiddle.skia.org/c/52729ed3a71b89a6dba4f60e8eb67727"> | 331 <a href='https://fiddle.skia.org/c/@skpaint_turb'><img |
| 351 <img src="https://fiddle.skia.org/i/52729ed3a71b89a6dba4f60e8eb67727_raster.
png"></a> | 332 src='https://fiddle.skia.org/c/@skpaint_turb_raster.png'></a> |
| 352 | 333 |
| 353 * Compose Shader | 334 * Compose Shader |
| 354 | 335 |
| 355 <!--?prettify lang=cc?--> | 336 <!--?prettify lang=cc?--> |
| 356 | 337 |
| 357 SkColor colors[2] = {SK_ColorBLUE, SK_ColorYELLOW}; | 338 SkColor colors[2] = {SK_ColorBLUE, SK_ColorYELLOW}; |
| 358 SkShader* shader1 = | 339 SkPaint paint; |
| 359 SkGradientShader::CreateRadial( | 340 paint.setShader( |
| 341 SkShader::MakeComposeShader( |
| 342 SkGradientShader::MakeRadial( |
| 360 SkPoint::Make(128.0f, 128.0f), 180.0f, | 343 SkPoint::Make(128.0f, 128.0f), 180.0f, |
| 361 colors, nullptr, 2, SkShader::kClamp_TileMode, 0, nullptr); | 344 colors, nullptr, 2, SkShader::kClamp_TileMode, 0, nullptr), |
| 362 SkShader* shader2 = SkPerlinNoiseShader::CreateTurbulence( | 345 SkPerlinNoiseShader::MakeTurbulence(0.025f, 0.025f, 2, 0.0f, nul
lptr), |
| 363 0.025f, 0.025f, 2, 0.0f, nullptr); | 346 SkXfermode::kDifference_Mode) |
| 364 SkShader* shader = | 347 ); |
| 365 new SkComposeShader(shader1, shader2); | |
| 366 SkPaint paint; | |
| 367 paint.setShader(shader); | |
| 368 shader->unref(); | |
| 369 shader2->unref(); | |
| 370 shader1->unref(); | |
| 371 canvas->drawPaint(paint); | 348 canvas->drawPaint(paint); |
| 372 | 349 |
| 373 <a href="https://fiddle.skia.org/c/1209b7a29d870302edcc43dc0916e8d5"> | 350 <a href='https://fiddle.skia.org/c/@skpaint_compose_shader'><img |
| 374 <img src="https://fiddle.skia.org/i/1209b7a29d870302edcc43dc0916e8d5_raster.
png"></a> | 351 src='https://fiddle.skia.org/c/@skpaint_compose_shader_raster.png'></a> |
| 375 | 352 |
| 376 | 353 |
| 377 <span id="SkMaskFilter"></span> | 354 <span id="SkMaskFilter"></span> |
| 378 | 355 |
| 379 SkMaskFilter | 356 SkMaskFilter |
| 380 ------------ | 357 ------------ |
| 381 | 358 |
| 382 * Blur Mask Filter | 359 * Blur Mask Filter |
| 383 | 360 |
| 384 <!--?prettify lang=cc?--> | 361 <!--?prettify lang=cc?--> |
| 385 | 362 |
| 363 canvas->drawText(text, strlen(text), 0, 160, paint); |
| 386 canvas->drawColor(SK_ColorWHITE); | 364 canvas->drawColor(SK_ColorWHITE); |
| 387 SkPaint paint; | 365 SkPaint paint; |
| 388 paint.setAntiAlias(true); | 366 paint.setAntiAlias(true); |
| 389 paint.setTextSize(120); | 367 paint.setTextSize(120); |
| 390 SkMaskFilter* filter = | 368 paint.setMaskFilter(SkBlurMaskFilter::Make( |
| 391 SkBlurMaskFilter::Create( | 369 kNormal_SkBlurStyle, 5.0f, 0)); |
| 392 kNormal_SkBlurStyle, 5.0f, 0); | |
| 393 paint.setMaskFilter(filter); | |
| 394 filter->unref(); | |
| 395 const char text[] = "Skia"; | 370 const char text[] = "Skia"; |
| 396 canvas->drawText(text, strlen(text), 0, 160, paint); | 371 canvas->drawText(text, strlen(text), 0, 160, paint); |
| 397 | 372 |
| 398 <a href="https://fiddle.skia.org/c/0e004664122851691d67a291007b64d7"> | 373 <a href='https://fiddle.skia.org/c/@skpaint_blur_mask_filter'><img |
| 399 <img src="https://fiddle.skia.org/i/0e004664122851691d67a291007b64d7_raster.
png"></a> | 374 src='https://fiddle.skia.org/c/@skpaint_blur_mask_filter_raster.png'></a> |
| 400 | 375 |
| 401 * Emboss Mask Filter | 376 * Emboss Mask Filter |
| 402 | 377 |
| 403 <!--?prettify lang=cc?--> | 378 <!--?prettify lang=cc?--> |
| 404 | 379 |
| 405 canvas->drawColor(SK_ColorWHITE); | 380 canvas->drawColor(SK_ColorWHITE); |
| 406 SkPaint paint; | 381 SkPaint paint; |
| 407 paint.setAntiAlias(true); | 382 paint.setAntiAlias(true); |
| 408 paint.setTextSize(120); | 383 paint.setTextSize(120); |
| 409 SkScalar direction[3] = {1.0f, 1.0f, 1.0f}; | 384 SkScalar direction[3] = {1.0f, 1.0f, 1.0f}; |
| 410 SkMaskFilter* filter = | 385 paint.setMaskFilter(SkBlurMaskFilter::MakeEmboss( |
| 411 SkBlurMaskFilter::CreateEmboss( | 386 2.0f, direction, 0.3f, 0.1f)); |
| 412 2.0f, direction, 0.3f, 0.1f); | |
| 413 paint.setMaskFilter(filter); | |
| 414 filter->unref(); | |
| 415 const char text[] = "Skia"; | 387 const char text[] = "Skia"; |
| 416 canvas->drawText(text, strlen(text), 0, 160, paint); | 388 canvas->drawText(text, strlen(text), 0, 160, paint); |
| 417 | 389 |
| 418 <a href="https://fiddle.skia.org/c/1ef71be7fb749a2d81a55721b2d2c77d"> | 390 <a href='https://fiddle.skia.org/c/@skpaint_emboss'><img |
| 419 <img src="https://fiddle.skia.org/i/1ef71be7fb749a2d81a55721b2d2c77d_raster.
png"></a> | 391 src='https://fiddle.skia.org/c/@skpaint_emboss_raster.png'></a> |
| 420 | 392 |
| 421 | 393 |
| 422 <span id="SkColorFilter"></span> | 394 <span id="SkColorFilter"></span> |
| 423 | 395 |
| 424 SkColorFilter | 396 SkColorFilter |
| 425 ------------- | 397 ------------- |
| 426 | 398 |
| 427 * Color Matrix Color Filter | 399 * Color Matrix Color Filter |
| 428 | 400 |
| 429 <!--?prettify lang=cc?--> | 401 <!--?prettify lang=cc?--> |
| 430 | 402 |
| 431 void f(SkCanvas* c, SkScalar x, SkScalar y, SkScalar colorMatrix[20]) { | 403 void f(SkCanvas* c, SkScalar x, SkScalar y, SkScalar colorMatrix[20]) { |
| 432 SkColorFilter* cf = SkColorMatrixFilter::Create(colorMatrix); | |
| 433 SkPaint paint; | 404 SkPaint paint; |
| 434 paint.setColorFilter(cf); | 405 paint.setColorFilter(SkColorFilter::MakeMatrixFilterRowMajor255(colo
rMatrix)); |
| 435 cf->unref(); | |
| 436 c->drawBitmap(source, x, y, &paint); | 406 c->drawBitmap(source, x, y, &paint); |
| 437 } | 407 } |
| 408 |
| 438 void draw(SkCanvas* c) { | 409 void draw(SkCanvas* c) { |
| 439 c->scale(0.25, 0.25); | 410 c->scale(0.25, 0.25); |
| 440 SkScalar colorMatrix1[20] = { | 411 SkScalar colorMatrix1[20] = { |
| 441 0, 1, 0, 0, 0, | 412 0, 1, 0, 0, 0, |
| 442 0, 0, 1, 0, 0, | 413 0, 0, 1, 0, 0, |
| 443 1, 0, 0, 0, 0, | 414 1, 0, 0, 0, 0, |
| 444 0, 0, 0, 1, 0}; | 415 0, 0, 0, 1, 0}; |
| 445 f(c, 0, 0, colorMatrix1); | 416 f(c, 0, 0, colorMatrix1); |
| 446 | 417 |
| 447 SkScalar grayscale[20] = { | 418 SkScalar grayscale[20] = { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 f(c, 1536, 0, sepia); | 458 f(c, 1536, 0, sepia); |
| 488 | 459 |
| 489 SkScalar inverter[20] = { | 460 SkScalar inverter[20] = { |
| 490 -1, 0, 0, 0, 255, | 461 -1, 0, 0, 0, 255, |
| 491 0, -1, 0, 0, 255, | 462 0, -1, 0, 0, 255, |
| 492 0, 0, -1, 0, 255, | 463 0, 0, -1, 0, 255, |
| 493 0, 0, 0, 1, 0}; | 464 0, 0, 0, 1, 0}; |
| 494 f(c, 1536, 512, inverter); | 465 f(c, 1536, 512, inverter); |
| 495 } | 466 } |
| 496 | 467 |
| 497 <a href="https://fiddle.skia.org/c/91fb5341ee7903c9682df20bb3d73dbb"> | 468 <a href='https://fiddle.skia.org/c/@skpaint_matrix_color_filter'><img |
| 498 <img src="https://fiddle.skia.org/i/91fb5341ee7903c9682df20bb3d73dbb_raster.
png"></a> | 469 src='https://fiddle.skia.org/c/@skpaint_matrix_color_filter_raster.png'></a> |
| 499 | 470 |
| 500 * Color Table Color Filter | 471 * Color Table Color Filter |
| 501 | 472 |
| 502 <!--?prettify lang=cc?--> | 473 <!--?prettify lang=cc?--> |
| 503 | 474 |
| 504 canvas->scale(0.5, 0.5); | 475 void draw(SkCanvas* canvas) { |
| 505 uint8_t ct[256]; | 476 canvas->scale(0.5, 0.5); |
| 506 for (int i = 0; i < 256; ++i) { | 477 uint8_t ct[256]; |
| 507 int x = (i - 96) * 255 / 64; | 478 for (int i = 0; i < 256; ++i) { |
| 508 ct[i] = x < 0 ? 0 : x > 255 ? 255 : x; | 479 int x = (i - 96) * 255 / 64; |
| 480 ct[i] = x < 0 ? 0 : x > 255 ? 255 : x; |
| 481 } |
| 482 SkPaint paint; |
| 483 paint.setColorFilter(SkTableColorFilter::MakeARGB(nullptr, ct, ct, ct)
); |
| 484 canvas->drawBitmap(source, 0, 0, &paint); |
| 509 } | 485 } |
| 510 SkColorFilter* cf = SkTableColorFilter::CreateARGB(nullptr, ct, ct, ct); | |
| 511 SkPaint paint; | |
| 512 paint.setColorFilter(cf); | |
| 513 cf->unref(); | |
| 514 canvas->drawBitmap(source, 0, 0, &paint); | |
| 515 | 486 |
| 516 <a href="https://fiddle.skia.org/c/0d3d339543afa1b10c60f9826f264c3f"> | 487 <a href='https://fiddle.skia.org/c/@skpaint_color_table_filter'><img |
| 517 <img src="https://fiddle.skia.org/i/0d3d339543afa1b10c60f9826f264c3f_raster.
png"></a> | 488 src='https://fiddle.skia.org/c/@skpaint_color_table_filter_raster.png'></a
> |
| 518 | 489 |
| 519 | 490 |
| 520 <span id="SkPathEffect"></span> | 491 <span id="SkPathEffect"></span> |
| 521 | 492 |
| 522 SkPathEffect | 493 SkPathEffect |
| 523 ------------ | 494 ------------ |
| 524 | 495 |
| 525 * SkPath2DPathEffect: Stamp the specified path to fill the shape, | 496 * SkPath2DPathEffect: Stamp the specified path to fill the shape, |
| 526 using the matrix to define the latice. | 497 using the matrix to define the latice. |
| 527 | 498 |
| 528 <!--?prettify lang=cc?--> | 499 <!--?prettify lang=cc?--> |
| 529 | 500 |
| 530 void draw(SkCanvas* canvas) { | 501 void draw(SkCanvas* canvas) { |
| 531 SkScalar scale = 10.0f; | 502 SkScalar scale = 10.0f; |
| 532 SkPath path; | 503 SkPath path; |
| 533 static const int8_t pts[] = { 2, 2, 1, 3, 0, 3, 2, 1, 3, 1, | 504 static const int8_t pts[] = { 2, 2, 1, 3, 0, 3, 2, 1, 3, 1, |
| 534 4, 0, 4, 1, 5, 1, 4, 2, 4, 3, 2, 5, 2, 4, 3, 3, 2, 3 }; | 505 4, 0, 4, 1, 5, 1, 4, 2, 4, 3, 2, 5, 2, 4, 3, 3, 2, 3 }; |
| 535 path.moveTo(2 * scale, 3 * scale); | 506 path.moveTo(2 * scale, 3 * scale); |
| 536 for (size_t i = 0 ; i < sizeof(pts)/sizeof(pts[0]); i += 2) { | 507 for (size_t i = 0 ; i < sizeof(pts)/sizeof(pts[0]); i += 2) { |
| 537 path.lineTo(pts[i] * scale, pts[i + 1] * scale); | 508 path.lineTo(pts[i] * scale, pts[i + 1] * scale); |
| 538 } | 509 } |
| 539 path.close(); | 510 path.close(); |
| 540 SkMatrix matrix = SkMatrix::MakeScale(4 * scale); | 511 SkMatrix matrix = SkMatrix::MakeScale(4 * scale); |
| 541 SkAutoTUnref<SkPathEffect> pathEffect( | |
| 542 SkPath2DPathEffect::Create(matrix, path)); | |
| 543 SkPaint paint; | 512 SkPaint paint; |
| 544 paint.setPathEffect(pathEffect); | 513 paint.setPathEffect(SkPath2DPathEffect::Make(matrix, path)); |
| 545 paint.setAntiAlias(true); | 514 paint.setAntiAlias(true); |
| 546 canvas->clear(SK_ColorWHITE); | 515 canvas->clear(SK_ColorWHITE); |
| 547 SkRect bounds; | 516 SkRect bounds; |
| 548 (void)canvas->getClipBounds(&bounds); | 517 (void)canvas->getClipBounds(&bounds); |
| 549 bounds.outset(2 * scale, 2 * scale); | 518 bounds.outset(2 * scale, 2 * scale); |
| 550 canvas->drawRect(bounds, paint); | 519 canvas->drawRect(bounds, paint); |
| 551 } | 520 } |
| 552 | 521 |
| 553 <a href="https://fiddle.skia.org/c/aae271e4f0178455f0e128981d714d73"><img sr
c="https://fiddle.skia.org/i/aae271e4f0178455f0e128981d714d73_raster.png" alt=""
></a> | 522 <a href='https://fiddle.skia.org/c/@skpaint_path_2d_path_effect'><img |
| 523 src='https://fiddle.skia.org/c/@skpaint_path_2d_path_effect_raster.png'></
a> |
| 554 | 524 |
| 555 * SkLine2DPathEffect: a special case of SkPath2DPathEffect where the | 525 * SkLine2DPathEffect: a special case of SkPath2DPathEffect where the |
| 556 path is a straight line to be stroked, not a path to be filled. | 526 path is a straight line to be stroked, not a path to be filled. |
| 557 | 527 |
| 558 <!--?prettify lang=cc?--> | 528 <!--?prettify lang=cc?--> |
| 559 | 529 |
| 560 void draw(SkCanvas* canvas) { | 530 void draw(SkCanvas* canvas) { |
| 561 SkPaint paint; | 531 SkPaint paint; |
| 562 SkMatrix lattice; | 532 SkMatrix lattice; |
| 563 lattice.setScale(8.0f, 8.0f); | 533 lattice.setScale(8.0f, 8.0f); |
| 564 lattice.preRotate(30.0f); | 534 lattice.preRotate(30.0f); |
| 565 SkAutoTUnref<SkPathEffect> pe( | 535 paint.setPathEffect(SkLine2DPathEffect::Make(0.0f, lattice)); |
| 566 SkLine2DPathEffect::Create(0.0f, lattice)); | |
| 567 paint.setPathEffect(pe); | |
| 568 paint.setAntiAlias(true); | 536 paint.setAntiAlias(true); |
| 569 SkRect bounds; | 537 SkRect bounds; |
| 570 (void)canvas->getClipBounds(&bounds); | 538 (void)canvas->getClipBounds(&bounds); |
| 571 bounds.outset(8.0f, 8.0f); | 539 bounds.outset(8.0f, 8.0f); |
| 572 canvas->clear(SK_ColorWHITE); | 540 canvas->clear(SK_ColorWHITE); |
| 573 canvas->drawRect(bounds, paint); | 541 canvas->drawRect(bounds, paint); |
| 574 } | 542 } |
| 575 | 543 |
| 576 <a href="https://fiddle.skia.org/c/3f49502145886920f95d43912e0f550d"><img sr
c="https://fiddle.skia.org/i/3f49502145886920f95d43912e0f550d_raster.png" alt=""
></a> | 544 <a href='https://fiddle.skia.org/c/@skpaint_line_2d_path_effect'><img |
| 545 src='https://fiddle.skia.org/c/@skpaint_line_2d_path_effect_raster.png'></
a> |
| 577 | 546 |
| 578 * SkPath1DPathEffect: create dash-like effects by replicating the specified pa
th along the drawn path. | 547 * SkPath1DPathEffect: create dash-like effects by replicating the specified pa
th along the drawn path. |
| 579 | 548 |
| 580 <!--?prettify lang=cc?--> | 549 <!--?prettify lang=cc?--> |
| 581 | 550 |
| 582 void draw(SkCanvas* canvas) { | 551 void draw(SkCanvas* canvas) { |
| 583 SkPaint paint; | 552 SkPaint paint; |
| 584 SkPath path; | 553 SkPath path; |
| 585 path.addOval(SkRect::MakeWH(16.0f, 6.0f)); | 554 path.addOval(SkRect::MakeWH(16.0f, 6.0f)); |
| 586 SkAutoTUnref<SkPathEffect> pe( | 555 paint.setPathEffect(SkPath1DPathEffect::Make( |
| 587 SkPath1DPathEffect::Create( | |
| 588 path, 32.0f, 0.0f, SkPath1DPathEffect::kRotate_Style)); | 556 path, 32.0f, 0.0f, SkPath1DPathEffect::kRotate_Style)); |
| 589 paint.setPathEffect(pe); | |
| 590 paint.setAntiAlias(true); | 557 paint.setAntiAlias(true); |
| 591 canvas->clear(SK_ColorWHITE); | 558 canvas->clear(SK_ColorWHITE); |
| 592 canvas->drawCircle(128.0f, 128.0f, 122.0f, paint); | 559 canvas->drawCircle(128.0f, 128.0f, 122.0f, paint); |
| 593 } | 560 } |
| 594 | 561 |
| 595 <a href="https://fiddle.skia.org/c/756a8cdb9458c05f6c1c7c398d979dac"><img sr
c="https://fiddle.skia.org/i/756a8cdb9458c05f6c1c7c398d979dac_raster.png" alt=""
></a> | 562 <a href='https://fiddle.skia.org/c/@skpaint_path_1d_path_effect'><img |
| 563 src='https://fiddle.skia.org/c/@skpaint_path_1d_path_effect_raster.png'></
a> |
| 596 | 564 |
| 597 * SkArcToPathEffect | 565 * SkArcToPathEffect |
| 598 | 566 |
| 599 The following few examples use this function: | 567 The following few examples use this function: |
| 600 | 568 |
| 601 <!--?prettify lang=cc?--> | 569 <!--?prettify lang=cc?--> |
| 602 | 570 |
| 603 SkPath star() { | 571 SkPath star() { |
| 604 const SkScalar R = 115.2f, C = 128.0f; | 572 const SkScalar R = 115.2f, C = 128.0f; |
| 605 SkPath path; | 573 SkPath path; |
| 606 path.moveTo(C + R, C); | 574 path.moveTo(C + R, C); |
| 607 for (int i = 1; i < 7; ++i) { | 575 for (int i = 1; i < 8; ++i) { |
| 608 SkScalar a = 2.6927937f * i; | 576 SkScalar a = 2.6927937f * i; |
| 609 path.lineTo(C + R * cos(a), C + R * sin(a)); | 577 path.lineTo(C + R * cos(a), C + R * sin(a)); |
| 610 } | 578 } |
| 611 path.close(); | |
| 612 return path; | 579 return path; |
| 613 } | 580 } |
| 614 | |
| 615 <!--?prettify lang=cc?--> | |
| 616 | |
| 617 void draw(SkCanvas* canvas) { | 581 void draw(SkCanvas* canvas) { |
| 618 SkPaint paint; | 582 SkPaint paint; |
| 619 SkAutoTUnref<SkPathEffect> pe( | 583 paint.setPathEffect(SkArcToPathEffect::Make(8.0f)); |
| 620 SkArcToPathEffect::Create(8.0f)); | |
| 621 paint.setPathEffect(pe); | |
| 622 paint.setStyle(SkPaint::kStroke_Style); | 584 paint.setStyle(SkPaint::kStroke_Style); |
| 623 paint.setAntiAlias(true); | 585 paint.setAntiAlias(true); |
| 624 canvas->clear(SK_ColorWHITE); | 586 canvas->clear(SK_ColorWHITE); |
| 625 SkPath path(star()); | 587 SkPath path(star()); |
| 626 canvas->drawPath(path, paint); | 588 canvas->drawPath(path, paint); |
| 627 } | 589 } |
| 628 | 590 |
| 629 <a href="https://fiddle.skia.org/c/1cc2a1363dd0e96954e084f7ca29aa5f"><img sr
c="https://fiddle.skia.org/i/1cc2a1363dd0e96954e084f7ca29aa5f_raster.png" alt=""
></a> | 591 <a href='https://fiddle.skia.org/c/@skpaint_arc_to_path_effect'><img |
| 592 src='https://fiddle.skia.org/c/@skpaint_arc_to_path_effect_raster.png'></a
> |
| 593 |
| 630 | 594 |
| 631 * SkCornerPathEffect: a path effect that can turn sharp corners into | 595 * SkCornerPathEffect: a path effect that can turn sharp corners into |
| 632 various treatments (e.g. rounded corners). | 596 various treatments (e.g. rounded corners). |
| 633 | 597 |
| 634 <!--?prettify lang=cc?--> | 598 <!--?prettify lang=cc?--> |
| 635 | 599 |
| 636 void draw(SkCanvas* canvas) { | 600 void draw(SkCanvas* canvas) { |
| 637 SkPaint paint; | 601 SkPaint paint; |
| 638 SkAutoTUnref<SkPathEffect> pe( | 602 paint.setPathEffect(SkCornerPathEffect::Make(32.0f)); |
| 639 SkCornerPathEffect::Create(32.0f)); | |
| 640 paint.setPathEffect(pe); | |
| 641 paint.setStyle(SkPaint::kStroke_Style); | 603 paint.setStyle(SkPaint::kStroke_Style); |
| 642 paint.setAntiAlias(true); | 604 paint.setAntiAlias(true); |
| 643 canvas->clear(SK_ColorWHITE); | 605 canvas->clear(SK_ColorWHITE); |
| 644 const SkScalar R = 115.2f; | 606 const SkScalar R = 115.2f; |
| 645 SkPath path(star()); | 607 SkPath path(star()); |
| 646 canvas->drawPath(path, paint); | 608 canvas->drawPath(path, paint); |
| 647 } | 609 } |
| 648 | 610 |
| 649 <a href="https://fiddle.skia.org/c/f5361bbb33ad43c656dd40bb03ee2114"><img sr
c="https://fiddle.skia.org/i/f5361bbb33ad43c656dd40bb03ee2114_raster.png" alt=""
></a> | 611 <a href='https://fiddle.skia.org/c/@skpaint_corner_path_effects'><img src='h
ttps://fiddle.skia.org/c/@skpaint_corner_path_effects_raster.png'></a> |
| 650 | 612 |
| 651 * SkDashPathEffect: a path effect that implements dashing. | 613 * SkDashPathEffect: a path effect that implements dashing. |
| 652 | 614 |
| 653 <!--?prettify lang=cc?--> | 615 <!--?prettify lang=cc?--> |
| 654 | 616 |
| 655 void draw(SkCanvas* canvas) { | 617 void draw(SkCanvas* canvas) { |
| 656 const SkScalar intervals[] = { 10.0f, 5.0f, 2.0f, 5.0f }; | 618 const SkScalar intervals[] = { 10.0f, 5.0f, 2.0f, 5.0f }; |
| 657 size_t count = sizeof(intervals) / sizeof(intervals[0]); | 619 size_t count = sizeof(intervals) / sizeof(intervals[0]); |
| 658 SkAutoTUnref<SkPathEffect> pe( | |
| 659 SkDashPathEffect::Create(intervals, count, 0.0f)); | |
| 660 SkPaint paint; | 620 SkPaint paint; |
| 661 paint.setPathEffect(pe); | 621 paint.setPathEffect(SkDashPathEffect::Make(intervals, count, 0.0f)); |
| 662 paint.setStyle(SkPaint::kStroke_Style); | 622 paint.setStyle(SkPaint::kStroke_Style); |
| 663 paint.setStrokeWidth(2.0f); | 623 paint.setStrokeWidth(2.0f); |
| 664 paint.setAntiAlias(true); | 624 paint.setAntiAlias(true); |
| 665 canvas->clear(SK_ColorWHITE); | 625 canvas->clear(SK_ColorWHITE); |
| 666 SkPath path(star()); | 626 SkPath path(star()); |
| 667 canvas->drawPath(path, paint); | 627 canvas->drawPath(path, paint); |
| 668 } | 628 } |
| 669 | 629 |
| 670 <a href="https://fiddle.skia.org/c/d221ced999a80ac23870d0301ffeedad"><img sr
c="https://fiddle.skia.org/i/d221ced999a80ac23870d0301ffeedad_raster.png" alt=""
></a> | 630 <a href='https://fiddle.skia.org/c/@skpaint_dash_path_effect'><img src='http
s://fiddle.skia.org/c/@skpaint_dash_path_effect_raster.png'></a> |
| 671 | 631 |
| 672 * SkDiscretePathEffect: This path effect chops a path into discrete | 632 * SkDiscretePathEffect: This path effect chops a path into discrete |
| 673 segments, and randomly displaces them. | 633 segments, and randomly displaces them. |
| 674 | 634 |
| 675 <!--?prettify lang=cc?--> | 635 <!--?prettify lang=cc?--> |
| 676 | 636 |
| 677 void draw(SkCanvas* canvas) { | 637 void draw(SkCanvas* canvas) { |
| 678 SkAutoTUnref<SkPathEffect> pe( | |
| 679 SkDiscretePathEffect::Create(10.0f, 4.0f)); | |
| 680 SkPaint paint; | 638 SkPaint paint; |
| 681 paint.setPathEffect(pe); | 639 paint.setPathEffect(SkDiscretePathEffect::Make(10.0f, 4.0f)); |
| 682 paint.setStyle(SkPaint::kStroke_Style); | 640 paint.setStyle(SkPaint::kStroke_Style); |
| 683 paint.setStrokeWidth(2.0f); | 641 paint.setStrokeWidth(2.0f); |
| 684 paint.setAntiAlias(true); | 642 paint.setAntiAlias(true); |
| 685 canvas->clear(SK_ColorWHITE); | 643 canvas->clear(SK_ColorWHITE); |
| 686 SkPath path(star()); | 644 SkPath path(star()); |
| 687 canvas->drawPath(path, paint); | 645 canvas->drawPath(path, paint); |
| 688 } | 646 } |
| 689 | 647 |
| 690 <a href="https://fiddle.skia.org/c/af2f177438b376ca45cfffc29cc0177a"><img sr
c="https://fiddle.skia.org/i/af2f177438b376ca45cfffc29cc0177a_raster.png" alt=""
></a> | 648 <a href='https://fiddle.skia.org/c/@skpaint_discrete_path_effect'><img |
| 649 src='https://fiddle.skia.org/c/@skpaint_discrete_path_effect_raster.png'><
/a> |
| 691 | 650 |
| 692 * SkComposePathEffect: a pathEffect whose effect is to apply | 651 * SkComposePathEffect: a pathEffect whose effect is to apply |
| 693 first the inner pathEffect and the the outer pathEffect (i.e. | 652 first the inner pathEffect and the the outer pathEffect (i.e. |
| 694 outer(inner(path))). | 653 outer(inner(path))). |
| 695 | 654 |
| 696 <!--?prettify lang=cc?--> | 655 <!--?prettify lang=cc?--> |
| 697 | 656 |
| 698 void draw(SkCanvas* canvas) { | 657 void draw(SkCanvas* canvas) { |
| 699 SkAutoTUnref<SkPathEffect> pe0( | |
| 700 SkDiscretePathEffect::Create(10.0f, 4.0f)); | |
| 701 const SkScalar intervals[] = { 10.0f, 5.0f, 2.0f, 5.0f }; | 658 const SkScalar intervals[] = { 10.0f, 5.0f, 2.0f, 5.0f }; |
| 702 size_t count = sizeof(intervals) / sizeof(intervals[0]); | 659 size_t count = sizeof(intervals) / sizeof(intervals[0]); |
| 703 SkAutoTUnref<SkPathEffect> pe1( | |
| 704 SkDashPathEffect::Create(intervals, count, 0.0f)); | |
| 705 SkAutoTUnref<SkPathEffect> pe( | |
| 706 SkComposePathEffect::Create(pe1, pe0)); | |
| 707 SkPaint paint; | 660 SkPaint paint; |
| 708 paint.setPathEffect(pe); | 661 paint.setPathEffect(SkComposePathEffect::Make( |
| 662 SkDashPathEffect::Make(intervals, count, 0.0f), |
| 663 SkDiscretePathEffect::Make(10.0f, 4.0f) |
| 664 )); |
| 709 paint.setStyle(SkPaint::kStroke_Style); | 665 paint.setStyle(SkPaint::kStroke_Style); |
| 710 paint.setStrokeWidth(2.0f); | 666 paint.setStrokeWidth(2.0f); |
| 711 paint.setAntiAlias(true); | 667 paint.setAntiAlias(true); |
| 712 canvas->clear(SK_ColorWHITE); | 668 canvas->clear(SK_ColorWHITE); |
| 713 SkPath path(star()); | 669 SkPath path(star()); |
| 714 canvas->drawPath(path, paint); | 670 canvas->drawPath(path, paint); |
| 715 } | 671 } |
| 716 | 672 |
| 717 <a href="https://fiddle.skia.org/c/39a644161da79e8b5e49c193adac7173"><img sr
c="https://fiddle.skia.org/i/39a644161da79e8b5e49c193adac7173_raster.png" alt=""
></a> | 673 <a href='https://fiddle.skia.org/c/@skpaint_compose_path_effect'><img |
| 674 src='https://fiddle.skia.org/c/@skpaint_compose_path_effect_raster.png'></
a> |
| 718 | 675 |
| 719 * SkSumPathEffect: a pathEffect whose effect is to apply two effects, | 676 * SkSumPathEffect: a pathEffect whose effect is to apply two effects, |
| 720 in sequence (i.e. first(path) + second(path)). | 677 in sequence (i.e. first(path) + second(path)). |
| 721 | 678 |
| 722 <!--?prettify lang=cc?--> | 679 <!--?prettify lang=cc?--> |
| 723 | 680 |
| 724 void draw(SkCanvas* canvas) { | 681 void draw(SkCanvas* canvas) { |
| 725 SkAutoTUnref<SkPathEffect> pe0( | |
| 726 SkDiscretePathEffect::Create(10.0f, 4.0f)); | |
| 727 SkAutoTUnref<SkPathEffect> pe1( | |
| 728 SkDiscretePathEffect::Create(10.0f, 4.0f, 1245u)); | |
| 729 SkAutoTUnref<SkPathEffect> pe( | |
| 730 SkSumPathEffect::Create(pe1, pe0)); | |
| 731 SkPaint paint; | 682 SkPaint paint; |
| 732 paint.setPathEffect(pe); | 683 paint.setPathEffect(SkSumPathEffect::Make( |
| 684 SkDiscretePathEffect::Make(10.0f, 4.0f), |
| 685 SkDiscretePathEffect::Make(10.0f, 4.0f, 1245u) |
| 686 )); |
| 733 paint.setStyle(SkPaint::kStroke_Style); | 687 paint.setStyle(SkPaint::kStroke_Style); |
| 734 paint.setStrokeWidth(2.0f); | 688 paint.setStrokeWidth(2.0f); |
| 735 paint.setAntiAlias(true); | 689 paint.setAntiAlias(true); |
| 736 canvas->clear(SK_ColorWHITE); | 690 canvas->clear(SK_ColorWHITE); |
| 737 SkPath path(star()); | 691 SkPath path(star()); |
| 738 canvas->drawPath(path, paint); | 692 canvas->drawPath(path, paint); |
| 739 } | 693 } |
| 740 | 694 |
| 741 <a href="https://fiddle.skia.org/c/e5f7861072893bd08c305a076bf32958"><img sr
c="https://fiddle.skia.org/i/e5f7861072893bd08c305a076bf32958_raster.png" alt=""
></a> | 695 <a href='https://fiddle.skia.org/c/@skpaint_sum_path_effect'><img |
| 696 src='https://fiddle.skia.org/c/@skpaint_sum_path_effect_raster.png'></a> |
| 742 | 697 |
| 743 <!-- | |
| 744 <a href="https://fiddle.skia.org/c/"><img src="https://fiddle.skia.org/i/_ra
ster.png" alt=""></a> | |
| 745 --> | |
| 746 | |
| OLD | NEW |