• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 class SkPathMeasure;
17 
18 //  This class is not exported to java.
19 class Sk1DPathEffect : public SkPathEffect {
20 public:
21     //  override from SkPathEffect
22     virtual bool filterPath(SkPath* dst, const SkPath& src, SkScalar* width);
23 
24 protected:
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 
36 private:
37     typedef SkPathEffect INHERITED;
38 };
39 
40 class SkPath1DPathEffect : public Sk1DPathEffect {
41 public:
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 
CreateProc(SkFlattenableReadBuffer & buffer)62     static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
63         return SkNEW_ARGS(SkPath1DPathEffect, (buffer));
64     }
65 
66     SK_DECLARE_FLATTENABLE_REGISTRAR()
67 
68 protected:
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;
getFactory()76     virtual Factory getFactory() SK_OVERRIDE { return CreateProc; }
77 
78 private:
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