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