blob: 51a5a786867aec4e901807fa177a8d02461cbd74 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@android.com8a1c16f2008-12-17 15:59:43 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2006 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
reed@android.com8a1c16f2008-12-17 15:59:43 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
reed@android.com8a1c16f2008-12-17 15:59:43 +000010#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
mike@reedtribe.org259210c2011-11-23 02:08:50 +000060 virtual bool filterPath(SkPath*, const SkPath&, SkScalar* width) SK_OVERRIDE;
reed@android.com8a1c16f2008-12-17 15:59:43 +000061
reed@google.come28b9172011-08-09 18:14:31 +000062 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
63 return SkNEW_ARGS(SkPath1DPathEffect, (buffer));
64 }
65
reed@android.com8a1c16f2008-12-17 15:59:43 +000066protected:
67 SkPath1DPathEffect(SkFlattenableReadBuffer& buffer);
68
69 // overrides from Sk1DPathEffect
mike@reedtribe.org259210c2011-11-23 02:08:50 +000070 virtual SkScalar begin(SkScalar contourLength) SK_OVERRIDE;
71 virtual SkScalar next(SkPath*, SkScalar distance, SkPathMeasure&) SK_OVERRIDE;
reed@android.com8a1c16f2008-12-17 15:59:43 +000072 // overrides from SkFlattenable
mike@reedtribe.org259210c2011-11-23 02:08:50 +000073 virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
74 virtual Factory getFactory() SK_OVERRIDE { return CreateProc; }
reed@android.com8a1c16f2008-12-17 15:59:43 +000075
76private:
77 SkPath fPath; // copied from constructor
78 SkScalar fAdvance; // copied from constructor
79 SkScalar fInitialOffset; // computed from phase
80 Style fStyle; // copied from constructor
reed@android.com8a1c16f2008-12-17 15:59:43 +000081
82 typedef Sk1DPathEffect INHERITED;
83};
84
85
86#endif