aboutsummaryrefslogtreecommitdiffhomepage
path: root/site
diff options
context:
space:
mode:
authorGravatar halcanary <halcanary@google.com>2015-08-03 06:55:20 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-08-03 06:55:20 -0700
commitf948b85a56f80b0c7e400b256d52c150ba925489 (patch)
tree6fcb9899605a1e7f0f25ee8daab5766ed215e386 /site
parentd8ea6b4f8763c031111435faf483838d4d751a77 (diff)
Documentation: SkPathEffect
Diffstat (limited to 'site')
-rw-r--r--site/user/api/skpaint.md230
1 files changed, 230 insertions, 0 deletions
diff --git a/site/user/api/skpaint.md b/site/user/api/skpaint.md
index 4c9793dc12..8f34df30d3 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>
+-->
+