SkPathEffect.h revision fd4be26c4202ae91f0f7cf2c03e44b5169d885eb
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkPathEffect_DEFINED
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkPathEffect_DEFINED
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkFlattenable.h"
14fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#include "SkPaint.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkPath;
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
18fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.comclass SkStrokeRec {
19fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.compublic:
20fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    enum InitStyle {
21fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        kHairline_InitStyle,
22fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        kFill_InitStyle
23fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    };
24fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    SkStrokeRec(InitStyle style);
25fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
26fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    SkStrokeRec(const SkStrokeRec&);
27fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    explicit SkStrokeRec(const SkPaint&);
28fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
29fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    enum Style {
30fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        kHairline_Style,
31fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        kFill_Style,
32fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        kStroke_Style,
33fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        kStrokeAndFill_Style
34fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    };
35fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
36fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    Style getStyle() const;
37fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    SkScalar getWidth() const { return fWidth; }
38fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    SkScalar getMiter() const { return fMiterLimit; }
39fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    SkPaint::Cap getCap() const { return fCap; }
40fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    SkPaint::Join getJoin() const { return fJoin; }
41fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
42fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    bool isHairlineStyle() const {
43fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        return kHairline_Style == this->getStyle();
44fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    }
45fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
46fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    bool isFillStyle() const {
47fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        return kFill_Style == this->getStyle();
48fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    }
49fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
50fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    void setFillStyle();
51fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    void setHairlineStyle() { fWidth = 0; }
52fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
53fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    void setStrokeStyle(SkScalar width, bool strokeAndFill = false) {
54fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        fWidth = width;
55fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        fStrokeAndFill = strokeAndFill;
56fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    }
57fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
58fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    void setStrokeParams(SkPaint::Cap cap, SkPaint::Join join, SkScalar miterLimit) {
59fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        fCap = cap;
60fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        fJoin = join;
61fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        fMiterLimit = miterLimit;
62fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    }
63fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
64fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    /**
65fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  Returns true if this specifes any thick stroking, i.e. applyToPath()
66fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  will return true.
67fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     */
68fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    bool needToApply() const {
69fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        Style style = this->getStyle();
70fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        return (kStroke_Style == style) || (kStrokeAndFill_Style == style);
71fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    }
72fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
73fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    /**
74fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  Apply these stroke parameters to the src path, returning the result
75fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  in dst.
76fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *
77fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  If there was no change (i.e. style == hairline or fill) this returns
78fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  false and dst is unchanged. Otherwise returns true and the result is
79fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  stored in dst.
80fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *
81fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  src and dst may be the same path.
82fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     */
83fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    bool applyToPath(SkPath* dst, const SkPath& src) const;
84fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
85fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.comprivate:
86fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    SkScalar        fWidth;
87fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    SkScalar        fMiterLimit;
88fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    SkPaint::Cap    fCap;
89fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    SkPaint::Join   fJoin;
90fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    bool            fStrokeAndFill;
91fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com};
92fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkPathEffect
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPathEffect is the base class for objects in the SkPaint that affect
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    the geometry of a drawing primitive before it is transformed by the
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas' matrix and drawn.
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Dashing is implemented as a subclass of SkPathEffect.
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
1017ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.orgclass SK_API SkPathEffect : public SkFlattenable {
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPathEffect() {}
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
105fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    /**
106fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  Given a src path (input) and a stroke-rec (input and output), apply
107fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  this effect to the src path, returning the new path in dst, and return
108fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  true. If this effect cannot be applied, return false and ignore dst
109fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  and stroke-rec.
110fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *
111fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  The stroke-rec specifies the initial request for stroking (if any).
112fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  The effect can treat this as input only, or it can choose to change
113fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  the rec as well. For example, the effect can decide to change the
114fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  stroke's width or join, or the effect can change the rec from stroke
115fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  to fill (or fill to stroke) in addition to returning a new (dst) path.
116fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *
117fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  If this method returns true, the caller will apply (as needed) the
118fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  resulting stroke-rec to dst and then draw.
119fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     */
120fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    virtual bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec*) = 0;
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
122e4f10a70807166484e5a6303a5cd0034e5e87abareed@google.com    /**
123e4f10a70807166484e5a6303a5cd0034e5e87abareed@google.com     *  Compute a conservative bounds for its effect, given the src bounds.
124e4f10a70807166484e5a6303a5cd0034e5e87abareed@google.com     *  The baseline implementation just assigns src to dst.
125e4f10a70807166484e5a6303a5cd0034e5e87abareed@google.com     */
126e4f10a70807166484e5a6303a5cd0034e5e87abareed@google.com    virtual void computeFastBounds(SkRect* dst, const SkRect& src);
127e4f10a70807166484e5a6303a5cd0034e5e87abareed@google.com
128ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.comprotected:
129ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SkPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
130ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPathEffect(const SkPathEffect&);
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPathEffect& operator=(const SkPathEffect&);
135ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
136ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    typedef SkFlattenable INHERITED;
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkPairPathEffect
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Common baseclass for Compose and Sum. This subclass manages two pathEffects,
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    including flattening them. It does nothing in filterPath, and is only useful
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for managing the lifetimes of its two arguments.
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkPairPathEffect : public SkPathEffect {
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPairPathEffect(SkPathEffect* pe0, SkPathEffect* pe1);
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual ~SkPairPathEffect();
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPairPathEffect(SkFlattenableReadBuffer&);
15254924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com    virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
15354924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // these are visible to our subclasses
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPathEffect* fPE0, *fPE1;
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkPathEffect INHERITED;
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkComposePathEffect
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    This subclass of SkPathEffect composes its two arguments, to create
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    a compound pathEffect.
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkComposePathEffect : public SkPairPathEffect {
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Construct a pathEffect whose effect is to apply first the inner pathEffect
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        and the the outer pathEffect (e.g. outer(inner(path)))
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        The reference counts for outer and inner are both incremented in the constructor,
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        and decremented in the destructor.
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkComposePathEffect(SkPathEffect* outer, SkPathEffect* inner)
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        : INHERITED(outer, inner) {}
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
176fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    virtual bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec*) SK_OVERRIDE;
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
178ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposePathEffect)
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
18054924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprotected:
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkComposePathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
18354924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprivate:
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkComposePathEffect(const SkComposePathEffect&);
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkComposePathEffect& operator=(const SkComposePathEffect&);
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkPairPathEffect INHERITED;
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkSumPathEffect
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    This subclass of SkPathEffect applies two pathEffects, one after the other.
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Its filterPath() returns true if either of the effects succeeded.
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkSumPathEffect : public SkPairPathEffect {
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Construct a pathEffect whose effect is to apply two effects, in sequence.
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        (e.g. first(path) + second(path))
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        The reference counts for first and second are both incremented in the constructor,
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        and decremented in the destructor.
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkSumPathEffect(SkPathEffect* first, SkPathEffect* second)
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        : INHERITED(first, second) {}
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
206fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    virtual bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec*) SK_OVERRIDE;
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
208ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSumPathEffect)
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
21054924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprotected:
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkSumPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
21354924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprivate:
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkSumPathEffect(const SkSumPathEffect&);
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkSumPathEffect& operator=(const SkSumPathEffect&);
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkPairPathEffect INHERITED;
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
223