| Index: site/user/api/skpaint.md
|
| diff --git a/site/user/api/skpaint.md b/site/user/api/skpaint.md
|
| index 4c9793dc12e479833b32ee61c333cf6be3604db6..8f34df30d3e90fa5b6514240fffe1ba993b8ba57 100644
|
| --- a/site/user/api/skpaint.md
|
| +++ b/site/user/api/skpaint.md
|
| @@ -7,6 +7,8 @@ SkPaint
|
| - [ShShader](#ShShader) - gradients and patterns
|
| - [SkMaskFilter](#SkMaskFilter) - modifications to the alpha mask
|
| - [SkColorFilter](#SkColorFilter) - modify the source color before applying the
|
| +- [SkPathEffect](#SkPathEffect) - modify to the geometry before it
|
| + generates an alpha mask.
|
|
|
| Anytime you draw something in Skia, and want to specify what color it
|
| is, or how it blends with the background, or what style or font to
|
| @@ -513,3 +515,231 @@ SkColorFilter
|
|
|
| <a href="https://fiddle.skia.org/c/0d3d339543afa1b10c60f9826f264c3f">
|
| <img src="https://fiddle.skia.org/i/0d3d339543afa1b10c60f9826f264c3f_raster.png"></a>
|
| +
|
| +
|
| +<span id="SkPathEffect"></span>
|
| +
|
| +SkPathEffect
|
| +------------
|
| +
|
| +* SkPath2DPathEffect: Stamp the specified path to fill the shape,
|
| + using the matrix to define the latice.
|
| +
|
| + <!--?prettify lang=cc?-->
|
| +
|
| + void draw(SkCanvas* canvas) {
|
| + SkScalar scale = 10.0f;
|
| + SkPath path;
|
| + static const int8_t pts[] = { 2, 2, 1, 3, 0, 3, 2, 1, 3, 1,
|
| + 4, 0, 4, 1, 5, 1, 4, 2, 4, 3, 2, 5, 2, 4, 3, 3, 2, 3 };
|
| + path.moveTo(2 * scale, 3 * scale);
|
| + for (size_t i = 0 ; i < sizeof(pts)/sizeof(pts[0]); i += 2) {
|
| + path.lineTo(pts[i] * scale, pts[i + 1] * scale);
|
| + }
|
| + path.close();
|
| + SkMatrix matrix = SkMatrix::MakeScale(4 * scale);
|
| + SkAutoTUnref<SkPathEffect> pathEffect(
|
| + SkPath2DPathEffect::Create(matrix, path));
|
| + SkPaint paint;
|
| + paint.setPathEffect(pathEffect);
|
| + paint.setAntiAlias(true);
|
| + canvas->clear(SK_ColorWHITE);
|
| + SkRect bounds;
|
| + (void)canvas->getClipBounds(&bounds);
|
| + bounds.outset(2 * scale, 2 * scale);
|
| + canvas->drawRect(bounds, paint);
|
| + }
|
| +
|
| + <a href="https://fiddle.skia.org/c/aae271e4f0178455f0e128981d714d73"><img src="https://fiddle.skia.org/i/aae271e4f0178455f0e128981d714d73_raster.png" alt=""></a>
|
| +
|
| +* SkLine2DPathEffect: a special case of SkPath2DPathEffect where the
|
| + path is a straight line to be stroked, not a path to be filled.
|
| +
|
| + <!--?prettify lang=cc?-->
|
| +
|
| + void draw(SkCanvas* canvas) {
|
| + SkPaint paint;
|
| + SkMatrix lattice;
|
| + lattice.setScale(8.0f, 8.0f);
|
| + lattice.preRotate(30.0f);
|
| + SkAutoTUnref<SkPathEffect> pe(
|
| + SkLine2DPathEffect::Create(0.0f, lattice));
|
| + paint.setPathEffect(pe);
|
| + paint.setAntiAlias(true);
|
| + SkRect bounds;
|
| + (void)canvas->getClipBounds(&bounds);
|
| + bounds.outset(8.0f, 8.0f);
|
| + canvas->clear(SK_ColorWHITE);
|
| + canvas->drawRect(bounds, paint);
|
| + }
|
| +
|
| + <a href="https://fiddle.skia.org/c/3f49502145886920f95d43912e0f550d"><img src="https://fiddle.skia.org/i/3f49502145886920f95d43912e0f550d_raster.png" alt=""></a>
|
| +
|
| +* SkPath1DPathEffect: create dash-like effects by replicating the specified path along the drawn path.
|
| +
|
| + <!--?prettify lang=cc?-->
|
| +
|
| + void draw(SkCanvas* canvas) {
|
| + SkPaint paint;
|
| + SkPath path;
|
| + path.addOval(SkRect::MakeWH(16.0f, 6.0f));
|
| + SkAutoTUnref<SkPathEffect> pe(
|
| + SkPath1DPathEffect::Create(
|
| + path, 32.0f, 0.0f, SkPath1DPathEffect::kRotate_Style));
|
| + paint.setPathEffect(pe);
|
| + paint.setAntiAlias(true);
|
| + canvas->clear(SK_ColorWHITE);
|
| + canvas->drawCircle(128.0f, 128.0f, 122.0f, paint);
|
| + }
|
| +
|
| + <a href="https://fiddle.skia.org/c/756a8cdb9458c05f6c1c7c398d979dac"><img src="https://fiddle.skia.org/i/756a8cdb9458c05f6c1c7c398d979dac_raster.png" alt=""></a>
|
| +
|
| +* SkArcToPathEffect
|
| +
|
| + The following few examples use this function:
|
| +
|
| + <!--?prettify lang=cc?-->
|
| +
|
| + SkPath star() {
|
| + const SkScalar R = 115.2f, C = 128.0f;
|
| + SkPath path;
|
| + path.moveTo(C + R, C);
|
| + for (int i = 1; i < 8; ++i) {
|
| + SkScalar a = 2.6927937f * i;
|
| + path.lineTo(C + R * cos(a), C + R * sin(a));
|
| + }
|
| + return path;
|
| + }
|
| +
|
| + <!--?prettify lang=cc?-->
|
| +
|
| + void draw(SkCanvas* canvas) {
|
| + SkPaint paint;
|
| + SkAutoTUnref<SkPathEffect> pe(
|
| + SkArcToPathEffect::Create(8.0f));
|
| + paint.setPathEffect(pe);
|
| + paint.setStyle(SkPaint::kStroke_Style);
|
| + paint.setAntiAlias(true);
|
| + canvas->clear(SK_ColorWHITE);
|
| + SkPath path(star());
|
| + canvas->drawPath(path, paint);
|
| + }
|
| +
|
| + <a href="https://fiddle.skia.org/c/1cc2a1363dd0e96954e084f7ca29aa5f"><img src="https://fiddle.skia.org/i/1cc2a1363dd0e96954e084f7ca29aa5f_raster.png" alt=""></a>
|
| +
|
| +* SkCornerPathEffect: a path effect that can turn sharp corners into
|
| + various treatments (e.g. rounded corners).
|
| +
|
| + <!--?prettify lang=cc?-->
|
| +
|
| + void draw(SkCanvas* canvas) {
|
| + SkPaint paint;
|
| + SkAutoTUnref<SkPathEffect> pe(
|
| + SkCornerPathEffect::Create(32.0f));
|
| + paint.setPathEffect(pe);
|
| + paint.setStyle(SkPaint::kStroke_Style);
|
| + paint.setAntiAlias(true);
|
| + canvas->clear(SK_ColorWHITE);
|
| + const SkScalar R = 115.2f;
|
| + SkPath path(star());
|
| + canvas->drawPath(path, paint);
|
| + }
|
| +
|
| + <a href="https://fiddle.skia.org/c/272c7c17e295747338200ab62e2051e7"><img src="https://fiddle.skia.org/i/272c7c17e295747338200ab62e2051e7_raster.png" alt=""></a>
|
| +
|
| +* SkDashPathEffect: a path effect that implements dashing.
|
| +
|
| + <!--?prettify lang=cc?-->
|
| +
|
| + void draw(SkCanvas* canvas) {
|
| + const SkScalar intervals[] = { 10.0f, 5.0f, 2.0f, 5.0f };
|
| + size_t count = sizeof(intervals) / sizeof(intervals[0]);
|
| + SkAutoTUnref<SkPathEffect> pe(
|
| + SkDashPathEffect::Create(intervals, count, 0.0f));
|
| + SkPaint paint;
|
| + paint.setPathEffect(pe);
|
| + paint.setStyle(SkPaint::kStroke_Style);
|
| + paint.setStrokeWidth(2.0f);
|
| + paint.setAntiAlias(true);
|
| + canvas->clear(SK_ColorWHITE);
|
| + SkPath path(star());
|
| + canvas->drawPath(path, paint);
|
| + }
|
| +
|
| + <a href="https://fiddle.skia.org/c/d221ced999a80ac23870d0301ffeedad"><img src="https://fiddle.skia.org/i/d221ced999a80ac23870d0301ffeedad_raster.png" alt=""></a>
|
| +
|
| +* SkDiscretePathEffect: This path effect chops a path into discrete
|
| + segments, and randomly displaces them.
|
| +
|
| + <!--?prettify lang=cc?-->
|
| +
|
| + void draw(SkCanvas* canvas) {
|
| + SkAutoTUnref<SkPathEffect> pe(
|
| + SkDiscretePathEffect::Create(10.0f, 4.0f));
|
| + SkPaint paint;
|
| + paint.setPathEffect(pe);
|
| + paint.setStyle(SkPaint::kStroke_Style);
|
| + paint.setStrokeWidth(2.0f);
|
| + paint.setAntiAlias(true);
|
| + canvas->clear(SK_ColorWHITE);
|
| + SkPath path(star());
|
| + canvas->drawPath(path, paint);
|
| + }
|
| +
|
| + <a href="https://fiddle.skia.org/c/af2f177438b376ca45cfffc29cc0177a"><img src="https://fiddle.skia.org/i/af2f177438b376ca45cfffc29cc0177a_raster.png" alt=""></a>
|
| +
|
| +* SkComposePathEffect: a pathEffect whose effect is to apply
|
| + first the inner pathEffect and the the outer pathEffect (i.e.
|
| + outer(inner(path))).
|
| +
|
| + <!--?prettify lang=cc?-->
|
| +
|
| + void draw(SkCanvas* canvas) {
|
| + SkAutoTUnref<SkPathEffect> pe0(
|
| + SkDiscretePathEffect::Create(10.0f, 4.0f));
|
| + const SkScalar intervals[] = { 10.0f, 5.0f, 2.0f, 5.0f };
|
| + size_t count = sizeof(intervals) / sizeof(intervals[0]);
|
| + SkAutoTUnref<SkPathEffect> pe1(
|
| + SkDashPathEffect::Create(intervals, count, 0.0f));
|
| + SkAutoTUnref<SkPathEffect> pe(
|
| + SkComposePathEffect::Create(pe1, pe0));
|
| + SkPaint paint;
|
| + paint.setPathEffect(pe);
|
| + paint.setStyle(SkPaint::kStroke_Style);
|
| + paint.setStrokeWidth(2.0f);
|
| + paint.setAntiAlias(true);
|
| + canvas->clear(SK_ColorWHITE);
|
| + SkPath path(star());
|
| + canvas->drawPath(path, paint);
|
| + }
|
| +
|
| + <a href="https://fiddle.skia.org/c/39a644161da79e8b5e49c193adac7173"><img src="https://fiddle.skia.org/i/39a644161da79e8b5e49c193adac7173_raster.png" alt=""></a>
|
| +
|
| +* SkSumPathEffect: a pathEffect whose effect is to apply two effects,
|
| + in sequence (i.e. first(path) + second(path)).
|
| +
|
| + <!--?prettify lang=cc?-->
|
| +
|
| + void draw(SkCanvas* canvas) {
|
| + SkAutoTUnref<SkPathEffect> pe0(
|
| + SkDiscretePathEffect::Create(10.0f, 4.0f));
|
| + SkAutoTUnref<SkPathEffect> pe1(
|
| + SkDiscretePathEffect::Create(10.0f, 4.0f, 1245u));
|
| + SkAutoTUnref<SkPathEffect> pe(
|
| + SkSumPathEffect::Create(pe1, pe0));
|
| + SkPaint paint;
|
| + paint.setPathEffect(pe);
|
| + paint.setStyle(SkPaint::kStroke_Style);
|
| + paint.setStrokeWidth(2.0f);
|
| + paint.setAntiAlias(true);
|
| + canvas->clear(SK_ColorWHITE);
|
| + SkPath path(star());
|
| + canvas->drawPath(path, paint);
|
| + }
|
| +
|
| + <a href="https://fiddle.skia.org/c/e5f7861072893bd08c305a076bf32958"><img src="https://fiddle.skia.org/i/e5f7861072893bd08c305a076bf32958_raster.png" alt=""></a>
|
| +
|
| +<!--
|
| + <a href="https://fiddle.skia.org/c/"><img src="https://fiddle.skia.org/i/_raster.png" alt=""></a>
|
| +-->
|
| +
|
|
|