SkPathEffect.h revision ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976e
1710632d07b13609444626367bebd34c0af3acb6aMikhail Glushenkov 26091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer/* 36091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer * Copyright 2006 The Android Open Source Project 46091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer * 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner * Use of this source code is governed by a BSD-style license that can be 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner * found in the LICENSE file. 76091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer */ 86091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 96091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 100598866c052147c31b808391f58434ce3dbfb838Devang Patel#ifndef SkPathEffect_DEFINED 1122c3979fcaa7ff19c44253eb9b0b0160dfef0aa4Dale Johannesen#define SkPathEffect_DEFINED 126091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 136091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer#include "SkFlattenable.h" 146091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer 150598866c052147c31b808391f58434ce3dbfb838Devang Patelclass SkPath; 160598866c052147c31b808391f58434ce3dbfb838Devang Patel 176091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer/** \class SkPathEffect 188e635dbc78996bc18cf13b4806706cf3529ea646Bill Wendling 19f23d0d392ab47e191e1bbd17dc7487b9d461485cNick Lewycky SkPathEffect is the base class for objects in the SkPaint that affect 20d509d0b532ec2358b3f341d4a4cd1411cb8b5db2Chris Lattner the geometry of a drawing primitive before it is transformed by the 210b3c079cd59f7d0d664ddf6365e6466704c912f6Bill Wendling canvas' matrix and drawn. 2258d74910c6b82e622ecbb57d6644d48fec5a5c0fChris Lattner 236091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer Dashing is implemented as a subclass of SkPathEffect. 246091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer*/ 25d426a642a23a234547cbc7061f5bfec157673249Bill Wendlingclass SK_API SkPathEffect : public SkFlattenable { 262c79ecbd704c656178ffa43d5a58ebe3ca188b40Bill Wendlingpublic: 27ad9a9e15595bc9d5ba1ed752caf8572957f77a3dDuncan Sands SkPathEffect() {} 28ad9a9e15595bc9d5ba1ed752caf8572957f77a3dDuncan Sands 2955fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany /** Given a src path and a width value, return true if the patheffect 30d426a642a23a234547cbc7061f5bfec157673249Bill Wendling has produced a new path (dst) and a new width value. If false is returned, 31e66f3d3ba0ea9f82f65a29c47fc37e997cbf0aceBill Wendling ignore dst and width. 32e66f3d3ba0ea9f82f65a29c47fc37e997cbf0aceBill Wendling On input, width >= 0 means the src should be stroked 3355fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany On output, width >= 0 means the dst should be stroked 3455fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany */ 3555fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany virtual bool filterPath(SkPath* dst, const SkPath& src, SkScalar* width) = 0; 3655fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany 3755fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryanyprivate: 3855fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany // illegal 3955fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany SkPathEffect(const SkPathEffect&); 4055fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany SkPathEffect& operator=(const SkPathEffect&); 4155fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany}; 4255fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany 4355fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany/** \class SkPairPathEffect 4418da0720887527ed570e9703ae5f290beb491ee1Reid Spencer 45710632d07b13609444626367bebd34c0af3acb6aMikhail Glushenkov Common baseclass for Compose and Sum. This subclass manages two pathEffects, 46710632d07b13609444626367bebd34c0af3acb6aMikhail Glushenkov including flattening them. It does nothing in filterPath, and is only useful 47710632d07b13609444626367bebd34c0af3acb6aMikhail Glushenkov for managing the lifetimes of its two arguments. 480598866c052147c31b808391f58434ce3dbfb838Devang Patel*/ 490598866c052147c31b808391f58434ce3dbfb838Devang Patelclass SkPairPathEffect : public SkPathEffect { 500d51e7ec0d2dcbea9e304fd58deb05f37eb75635Dale Johannesenpublic: 51d426a642a23a234547cbc7061f5bfec157673249Bill Wendling SkPairPathEffect(SkPathEffect* pe0, SkPathEffect* pe1); 52d426a642a23a234547cbc7061f5bfec157673249Bill Wendling virtual ~SkPairPathEffect(); 53d426a642a23a234547cbc7061f5bfec157673249Bill Wendling 54d426a642a23a234547cbc7061f5bfec157673249Bill Wendlingprotected: 5555fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany SkPairPathEffect(SkFlattenableReadBuffer&); 5655fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany virtual void flatten(SkFlattenableWriteBuffer&); 5755fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany // these are visible to our subclasses 5855fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany SkPathEffect* fPE0, *fPE1; 5955fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany 6055fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryanyprivate: 6155fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany typedef SkPathEffect INHERITED; 6255fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany}; 6355fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany 6455fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany/** \class SkComposePathEffect 6555fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany 6655fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany This subclass of SkPathEffect composes its two arguments, to create 6755fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany a compound pathEffect. 6855fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany*/ 6955fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryanyclass SkComposePathEffect : public SkPairPathEffect { 7055fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryanypublic: 7155fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany /** Construct a pathEffect whose effect is to apply first the inner pathEffect 7255fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany and the the outer pathEffect (e.g. outer(inner(path))) 7355fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany The reference counts for outer and inner are both incremented in the constructor, 7455fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany and decremented in the destructor. 7555fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany */ 7655fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany SkComposePathEffect(SkPathEffect* outer, SkPathEffect* inner) 77f23d0d392ab47e191e1bbd17dc7487b9d461485cNick Lewycky : INHERITED(outer, inner) {} 78f23d0d392ab47e191e1bbd17dc7487b9d461485cNick Lewycky 7955fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany // overrides 8055fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany 8155fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany virtual bool filterPath(SkPath* dst, const SkPath& src, SkScalar* width); 8255fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany 8355fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { 8455fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany return SkNEW_ARGS(SkComposePathEffect, (buffer)); 8555fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany } 8655fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany 8755fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryanyprotected: 8855fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany virtual Factory getFactory() { return CreateProc; } 8955fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany 9055fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryanyprivate: 9155fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany SkComposePathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {} 9255fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany 9355fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany // illegal 9455fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany SkComposePathEffect(const SkComposePathEffect&); 9555fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany SkComposePathEffect& operator=(const SkComposePathEffect&); 9655fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany 9755fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany typedef SkPairPathEffect INHERITED; 9855fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany}; 9955fb5bcc62804f7696b98f9f8d987da515dac66aKostya Serebryany 100fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola/** \class SkSumPathEffect 1012039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling 1022039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling This subclass of SkPathEffect applies two pathEffects, one after the other. 1032039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling Its filterPath() returns true if either of the effects succeeded. 1042039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling*/ 1052039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendlingclass SkSumPathEffect : public SkPairPathEffect { 1062039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendlingpublic: 1072039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling /** Construct a pathEffect whose effect is to apply two effects, in sequence. 1082039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling (e.g. first(path) + second(path)) 1092039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling The reference counts for first and second are both incremented in the constructor, 1102039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling and decremented in the destructor. 1112039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling */ 1122039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling SkSumPathEffect(SkPathEffect* first, SkPathEffect* second) 1132039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling : INHERITED(first, second) {} 1142039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling 1152039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling // overrides 1162039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling virtual bool filterPath(SkPath* dst, const SkPath& src, SkScalar* width); 1172039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling 1182039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { 1192039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling return SkNEW_ARGS(SkSumPathEffect, (buffer)); 1202039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling } 1212039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling 1222039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendlingprotected: 1232039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling virtual Factory getFactory() { return CreateProc; } 1242039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling 1252039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendlingprivate: 1262039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling SkSumPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {} 1272039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling 1282039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling // illegal 1292039a8f83464e900a71f3e846c7749b2d0d8cde2Bill Wendling SkSumPathEffect(const SkSumPathEffect&); 130d426a642a23a234547cbc7061f5bfec157673249Bill Wendling SkSumPathEffect& operator=(const SkSumPathEffect&); 131d426a642a23a234547cbc7061f5bfec157673249Bill Wendling 1322c79ecbd704c656178ffa43d5a58ebe3ca188b40Bill Wendling typedef SkPairPathEffect INHERITED; 1332c79ecbd704c656178ffa43d5a58ebe3ca188b40Bill Wendling}; 1342c79ecbd704c656178ffa43d5a58ebe3ca188b40Bill Wendling 1352c79ecbd704c656178ffa43d5a58ebe3ca188b40Bill Wendling#endif 136d426a642a23a234547cbc7061f5bfec157673249Bill Wendling 137d426a642a23a234547cbc7061f5bfec157673249Bill Wendling