1/*
2 * Copyright 2006 The Android Open Source Project
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef Sk1DPathEffect_DEFINED
9#define Sk1DPathEffect_DEFINED
10
11#include "include/core/SkFlattenable.h"
12#include "include/core/SkPath.h"
13#include "include/core/SkPathEffect.h"
14
15class SkPathMeasure;
16
17// This class is not exported to java.
18class SK_API Sk1DPathEffect : public SkPathEffect {
19public:
20protected:
21 bool onFilterPath(SkPath* dst, const SkPath& src, SkStrokeRec*, const SkRect*) const override;
22
23 /** Called at the start of each contour, returns the initial offset
24 into that contour.
25 */
26 virtual SkScalar begin(SkScalar contourLength) const = 0;
27 /** Called with the current distance along the path, with the current matrix
28 for the point/tangent at the specified distance.
29 Return the distance to travel for the next call. If return <= 0, then that
30 contour is done.
31 */
32 virtual SkScalar next(SkPath* dst, SkScalar dist, SkPathMeasure&) const = 0;
33
34private:
35 typedef SkPathEffect INHERITED;
36};
37
38class SK_API SkPath1DPathEffect : public Sk1DPathEffect {
39public:
40 enum Style {
41 kTranslate_Style, // translate the shape to each position
42 kRotate_Style, // rotate the shape about its center
43 kMorph_Style, // transform each point, and turn lines into curves
44
45 kLastEnum_Style = kMorph_Style,
46 };
47
48 /** Dash by replicating the specified path.
49 @param path The path to replicate (dash)
50 @param advance The space between instances of path
51 @param phase distance (mod advance) along path for its initial position
52 @param style how to transform path at each point (based on the current
53 position and tangent)
54 */
55 static sk_sp<SkPathEffect> Make(const SkPath& path, SkScalar advance, SkScalar phase, Style);
56
57protected:
58 SkPath1DPathEffect(const SkPath& path, SkScalar advance, SkScalar phase, Style);
59 void flatten(SkWriteBuffer&) const override;
60 bool onFilterPath(SkPath*, const SkPath&, SkStrokeRec*, const SkRect*) const override;
61
62 // overrides from Sk1DPathEffect
63 SkScalar begin(SkScalar contourLength) const override;
64 SkScalar next(SkPath*, SkScalar, SkPathMeasure&) const override;
65
66private:
67 SK_FLATTENABLE_HOOKS(SkPath1DPathEffect)
68
69 SkPath fPath; // copied from constructor
70 SkScalar fAdvance; // copied from constructor
71 SkScalar fInitialOffset; // computed from phase
72 Style fStyle; // copied from constructor
73
74 typedef Sk1DPathEffect INHERITED;
75};
76
77#endif
78