39e58adb99
Fix for https://code.google.com/p/skia/issues/detail?id=2581. Randomizes the seed in SkDiscretePathEffect::filterPath(). Prior to this we were using the path length as a seed. Now, if we have two different paths with identical contents and we apply an SkDiscretePathEffect to each, we obtain two different random paths. Previously, we would obtain two overlapping paths (identical path contents leading to the same seed). BUG=skia: R=reed@google.com, scroggo@google.com Author: rs.prinja@samsung.com Review URL: https://codereview.chromium.org/311803002
61 lines
2.2 KiB
C++
61 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);
|
|
explicit SkDiscretePathEffect(SkReadBuffer&);
|
|
virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
|
|
|
|
private:
|
|
SkScalar fSegLength, fPerterb;
|
|
|
|
/* Caller-supplied 32 bit seed assist */
|
|
uint32_t fSeedAssist;
|
|
|
|
typedef SkPathEffect INHERITED;
|
|
};
|
|
|
|
#endif
|