skia2/include/effects/SkDiscretePathEffect.h
reed 9fa60daad4 Simplify flattening to just write enough to call the factory/public-constructor for the class. We want to *not* rely on private constructors, and not rely on calling through the inheritance hierarchy for either flattening or unflattening(CreateProc).
Refactoring pattern:

1. guard the existing constructor(readbuffer) with the legacy build-flag
2. If you are a instancable subclass, implement CreateProc(readbuffer) to create a new instances from the buffer params (or return NULL).

If you're a shader subclass
1. You must read/write the local matrix if your class accepts that in its factory/constructor, else ignore it.

R=robertphillips@google.com, mtklein@google.com, senorblanco@google.com, senorblanco@chromium.org, sugoi@chromium.org

Author: reed@google.com

Review URL: https://codereview.chromium.org/395603002
2014-08-21 07:59:51 -07:00

63 lines
2.2 KiB
C++

/*
* Copyright 2006 The Android Open Source Project
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkDiscretePathEffect_DEFINED
#define SkDiscretePathEffect_DEFINED
#include "SkPathEffect.h"
/** \class SkDiscretePathEffect
This path effect chops a path into discrete segments, and randomly displaces them.
*/
class SK_API SkDiscretePathEffect : public SkPathEffect {
public:
/** Break the path into segments of segLength length, and randomly move the endpoints
away from the original path by a maximum of deviation.
Note: works on filled or framed paths
@param seedAssist This is a caller-supplied seedAssist that modifies
the seed value that is used to randomize the path
segments' endpoints. If not supplied it defaults to 0,
in which case filtering a path multiple times will
result in the same set of segments (this is useful for
testing). If a caller does not want this behaviour
they can pass in a different seedAssist to get a
different set of path segments.
*/
static SkDiscretePathEffect* Create(SkScalar segLength,
SkScalar deviation,
uint32_t seedAssist=0) {
return SkNEW_ARGS(SkDiscretePathEffect,
(segLength, deviation, seedAssist));
}
virtual bool filterPath(SkPath* dst, const SkPath& src,
SkStrokeRec*, const SkRect*) const SK_OVERRIDE;
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDiscretePathEffect)
protected:
SkDiscretePathEffect(SkScalar segLength,
SkScalar deviation,
uint32_t seedAssist);
#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
explicit SkDiscretePathEffect(SkReadBuffer&);
#endif
virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
private:
SkScalar fSegLength, fPerterb;
/* Caller-supplied 32 bit seed assist */
uint32_t fSeedAssist;
typedef SkPathEffect INHERITED;
};
#endif