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