• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef SkPathEffect_DEFINED
18 #define SkPathEffect_DEFINED
19 
20 #include "SkFlattenable.h"
21 
22 class SkPath;
23 
24 /** \class SkPathEffect
25 
26     SkPathEffect is the base class for objects in the SkPaint that affect
27     the geometry of a drawing primitive before it is transformed by the
28     canvas' matrix and drawn.
29 
30     Dashing is implemented as a subclass of SkPathEffect.
31 */
32 class SkPathEffect : public SkFlattenable {
33 public:
34     //  This method is not exported to java.
SkPathEffect()35     SkPathEffect() {}
36 
37     /** Given a src path and a width value, return true if the patheffect
38         has produced a new path (dst) and a new width value. If false is returned,
39         ignore dst and width.
40         On input, width >= 0 means the src should be stroked
41         On output, width >= 0 means the dst should be stroked
42     */
43     virtual bool filterPath(SkPath* dst, const SkPath& src, SkScalar* width) = 0;
44 
45 private:
46     // illegal
47     SkPathEffect(const SkPathEffect&);
48     SkPathEffect& operator=(const SkPathEffect&);
49 };
50 
51 /** \class SkPairPathEffect
52 
53     Common baseclass for Compose and Sum. This subclass manages two pathEffects,
54     including flattening them. It does nothing in filterPath, and is only useful
55     for managing the lifetimes of its two arguments.
56 */
57 class SkPairPathEffect : public SkPathEffect {
58 public:
59     SkPairPathEffect(SkPathEffect* pe0, SkPathEffect* pe1);
60     virtual ~SkPairPathEffect();
61 
62 protected:
63     SkPairPathEffect(SkFlattenableReadBuffer&);
64     virtual void flatten(SkFlattenableWriteBuffer&);
65     // these are visible to our subclasses
66     SkPathEffect* fPE0, *fPE1;
67 
68 private:
69     typedef SkPathEffect INHERITED;
70 };
71 
72 /** \class SkComposePathEffect
73 
74     This subclass of SkPathEffect composes its two arguments, to create
75     a compound pathEffect.
76 */
77 class SkComposePathEffect : public SkPairPathEffect {
78 public:
79     /** Construct a pathEffect whose effect is to apply first the inner pathEffect
80         and the the outer pathEffect (e.g. outer(inner(path)))
81         The reference counts for outer and inner are both incremented in the constructor,
82         and decremented in the destructor.
83     */
SkComposePathEffect(SkPathEffect * outer,SkPathEffect * inner)84     SkComposePathEffect(SkPathEffect* outer, SkPathEffect* inner)
85         : INHERITED(outer, inner) {}
86 
87     // overrides
88 
89     //  This method is not exported to java.
90     virtual bool filterPath(SkPath* dst, const SkPath& src, SkScalar* width);
91 
92 protected:
getFactory()93     virtual Factory getFactory() { return CreateProc; }
94 
95 private:
CreateProc(SkFlattenableReadBuffer & buffer)96     static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
97         return SkNEW_ARGS(SkComposePathEffect, (buffer));
98     }
SkComposePathEffect(SkFlattenableReadBuffer & buffer)99     SkComposePathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
100 
101     // illegal
102     SkComposePathEffect(const SkComposePathEffect&);
103     SkComposePathEffect& operator=(const SkComposePathEffect&);
104 
105     typedef SkPairPathEffect INHERITED;
106 };
107 
108 /** \class SkSumPathEffect
109 
110     This subclass of SkPathEffect applies two pathEffects, one after the other.
111     Its filterPath() returns true if either of the effects succeeded.
112 */
113 class SkSumPathEffect : public SkPairPathEffect {
114 public:
115     /** Construct a pathEffect whose effect is to apply two effects, in sequence.
116         (e.g. first(path) + second(path))
117         The reference counts for first and second are both incremented in the constructor,
118         and decremented in the destructor.
119     */
SkSumPathEffect(SkPathEffect * first,SkPathEffect * second)120     SkSumPathEffect(SkPathEffect* first, SkPathEffect* second)
121         : INHERITED(first, second) {}
122 
123     // overrides
124     //  This method is not exported to java.
125     virtual bool filterPath(SkPath* dst, const SkPath& src, SkScalar* width);
126 
127 protected:
getFactory()128     virtual Factory getFactory() { return CreateProc; }
129 
130 private:
CreateProc(SkFlattenableReadBuffer & buffer)131     static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer)  {
132         return SkNEW_ARGS(SkSumPathEffect, (buffer));
133     }
SkSumPathEffect(SkFlattenableReadBuffer & buffer)134     SkSumPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
135 
136     // illegal
137     SkSumPathEffect(const SkSumPathEffect&);
138     SkSumPathEffect& operator=(const SkSumPathEffect&);
139 
140     typedef SkPairPathEffect INHERITED;
141 };
142 
143 #endif
144 
145