Sk1DPathEffect.h revision ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976e
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* dst, const SkPath& src, SkScalar* width);
61
62protected:
63    SkPath1DPathEffect(SkFlattenableReadBuffer& buffer);
64
65    // overrides from Sk1DPathEffect
66    virtual SkScalar begin(SkScalar contourLength);
67    virtual SkScalar next(SkPath* dst, SkScalar distance, SkPathMeasure&);
68    // overrides from SkFlattenable
69    virtual void flatten(SkFlattenableWriteBuffer& );
70    virtual Factory getFactory() { return CreateProc; }
71
72private:
73    SkPath      fPath;          // copied from constructor
74    SkScalar    fAdvance;       // copied from constructor
75    SkScalar    fInitialOffset; // computed from phase
76    Style       fStyle;         // copied from constructor
77
78    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
79        return SkNEW_ARGS(SkPath1DPathEffect, (buffer));
80    }
81
82    typedef Sk1DPathEffect INHERITED;
83};
84
85
86#endif
87