SkPathEffect.h revision 0456e0b7b85060e9b9597ce414c4c2b19aff4f58
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
508b06f1a7ff6d5a59387a90433064550de20787eereed@google.com    void setFillStyle();
518b06f1a7ff6d5a59387a90433064550de20787eereed@google.com    void setHairlineStyle();
528b06f1a7ff6d5a59387a90433064550de20787eereed@google.com    /**
538b06f1a7ff6d5a59387a90433064550de20787eereed@google.com     *  Specify the strokewidth, and optionally if you want stroke + fill.
548b06f1a7ff6d5a59387a90433064550de20787eereed@google.com     *  Note, if width==0, then this request is taken to mean:
558b06f1a7ff6d5a59387a90433064550de20787eereed@google.com     *      strokeAndFill==true -> new style will be Fill
568b06f1a7ff6d5a59387a90433064550de20787eereed@google.com     *      strokeAndFill==false -> new style will be Hairline
578b06f1a7ff6d5a59387a90433064550de20787eereed@google.com     */
588b06f1a7ff6d5a59387a90433064550de20787eereed@google.com    void setStrokeStyle(SkScalar width, bool strokeAndFill = false);
59fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
60fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    void setStrokeParams(SkPaint::Cap cap, SkPaint::Join join, SkScalar miterLimit) {
61fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        fCap = cap;
62fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        fJoin = join;
63fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        fMiterLimit = miterLimit;
64fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    }
65fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
66fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    /**
67fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  Returns true if this specifes any thick stroking, i.e. applyToPath()
68fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  will return true.
69fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     */
70fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    bool needToApply() const {
71fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        Style style = this->getStyle();
72fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com        return (kStroke_Style == style) || (kStrokeAndFill_Style == style);
73fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    }
74fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
75fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    /**
76fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  Apply these stroke parameters to the src path, returning the result
77fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  in dst.
78fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *
79fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  If there was no change (i.e. style == hairline or fill) this returns
80fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  false and dst is unchanged. Otherwise returns true and the result is
81fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  stored in dst.
82fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *
83fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  src and dst may be the same path.
84fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     */
85fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    bool applyToPath(SkPath* dst, const SkPath& src) const;
86fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
87fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.comprivate:
88fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    SkScalar        fWidth;
89fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    SkScalar        fMiterLimit;
90fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    SkPaint::Cap    fCap;
91fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    SkPaint::Join   fJoin;
92fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    bool            fStrokeAndFill;
93fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com};
94fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkPathEffect
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPathEffect is the base class for objects in the SkPaint that affect
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    the geometry of a drawing primitive before it is transformed by the
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas' matrix and drawn.
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Dashing is implemented as a subclass of SkPathEffect.
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
1037ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.orgclass SK_API SkPathEffect : public SkFlattenable {
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1050456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com    SK_DECLARE_INST_COUNT(SkPathEffect)
1060456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPathEffect() {}
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
109fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    /**
110fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  Given a src path (input) and a stroke-rec (input and output), apply
111fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  this effect to the src path, returning the new path in dst, and return
112fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  true. If this effect cannot be applied, return false and ignore dst
113fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  and stroke-rec.
114fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *
115fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  The stroke-rec specifies the initial request for stroking (if any).
116fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  The effect can treat this as input only, or it can choose to change
117fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  the rec as well. For example, the effect can decide to change the
118fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  stroke's width or join, or the effect can change the rec from stroke
119fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  to fill (or fill to stroke) in addition to returning a new (dst) path.
120fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *
121fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  If this method returns true, the caller will apply (as needed) the
122fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     *  resulting stroke-rec to dst and then draw.
123fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com     */
124fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    virtual bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec*) = 0;
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
126e4f10a70807166484e5a6303a5cd0034e5e87abareed@google.com    /**
127e4f10a70807166484e5a6303a5cd0034e5e87abareed@google.com     *  Compute a conservative bounds for its effect, given the src bounds.
128e4f10a70807166484e5a6303a5cd0034e5e87abareed@google.com     *  The baseline implementation just assigns src to dst.
129e4f10a70807166484e5a6303a5cd0034e5e87abareed@google.com     */
130e4f10a70807166484e5a6303a5cd0034e5e87abareed@google.com    virtual void computeFastBounds(SkRect* dst, const SkRect& src);
131e4f10a70807166484e5a6303a5cd0034e5e87abareed@google.com
132ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.comprotected:
133ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SkPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
134ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPathEffect(const SkPathEffect&);
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPathEffect& operator=(const SkPathEffect&);
139ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
140ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    typedef SkFlattenable INHERITED;
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkPairPathEffect
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Common baseclass for Compose and Sum. This subclass manages two pathEffects,
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    including flattening them. It does nothing in filterPath, and is only useful
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for managing the lifetimes of its two arguments.
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkPairPathEffect : public SkPathEffect {
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPairPathEffect(SkPathEffect* pe0, SkPathEffect* pe1);
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual ~SkPairPathEffect();
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPairPathEffect(SkFlattenableReadBuffer&);
15654924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com    virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
15754924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // these are visible to our subclasses
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPathEffect* fPE0, *fPE1;
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkPathEffect INHERITED;
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkComposePathEffect
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    This subclass of SkPathEffect composes its two arguments, to create
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    a compound pathEffect.
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkComposePathEffect : public SkPairPathEffect {
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Construct a pathEffect whose effect is to apply first the inner pathEffect
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        and the the outer pathEffect (e.g. outer(inner(path)))
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        The reference counts for outer and inner are both incremented in the constructor,
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        and decremented in the destructor.
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkComposePathEffect(SkPathEffect* outer, SkPathEffect* inner)
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        : INHERITED(outer, inner) {}
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
180fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    virtual bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec*) SK_OVERRIDE;
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
182ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposePathEffect)
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
18454924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprotected:
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkComposePathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
18754924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprivate:
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkComposePathEffect(const SkComposePathEffect&);
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkComposePathEffect& operator=(const SkComposePathEffect&);
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkPairPathEffect INHERITED;
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkSumPathEffect
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    This subclass of SkPathEffect applies two pathEffects, one after the other.
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Its filterPath() returns true if either of the effects succeeded.
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkSumPathEffect : public SkPairPathEffect {
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Construct a pathEffect whose effect is to apply two effects, in sequence.
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        (e.g. first(path) + second(path))
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        The reference counts for first and second are both incremented in the constructor,
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        and decremented in the destructor.
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkSumPathEffect(SkPathEffect* first, SkPathEffect* second)
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        : INHERITED(first, second) {}
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
210fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    virtual bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec*) SK_OVERRIDE;
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
212ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSumPathEffect)
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
21454924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprotected:
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkSumPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
21754924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprivate:
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkSumPathEffect(const SkSumPathEffect&);
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkSumPathEffect& operator=(const SkSumPathEffect&);
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkPairPathEffect INHERITED;
2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
227