| /* | |
| * 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 Sk2DPathEffect_DEFINED | |
| #define Sk2DPathEffect_DEFINED | |
| #include "SkPath.h" | |
| #include "SkPathEffect.h" | |
| #include "SkMatrix.h" | |
| class SK_API Sk2DPathEffect : public SkPathEffect { | |
| public: | |
| bool filterPath(SkPath*, const SkPath&, SkStrokeRec*, const SkRect*) const override; | |
| protected: | |
| /** New virtual, to be overridden by subclasses. | |
| This is called once from filterPath, and provides the | |
| uv parameter bounds for the path. Subsequent calls to | |
| next() will receive u and v values within these bounds, | |
| and then a call to end() will signal the end of processing. | |
| */ | |
| virtual void begin(const SkIRect& uvBounds, SkPath* dst) const; | |
| virtual void next(const SkPoint& loc, int u, int v, SkPath* dst) const; | |
| virtual void end(SkPath* dst) const; | |
| /** Low-level virtual called per span of locations in the u-direction. | |
| The default implementation calls next() repeatedly with each | |
| location. | |
| */ | |
| virtual void nextSpan(int u, int v, int ucount, SkPath* dst) const; | |
| const SkMatrix& getMatrix() const { return fMatrix; } | |
| // protected so that subclasses can call this during unflattening | |
| explicit Sk2DPathEffect(const SkMatrix& mat); | |
| void flatten(SkWriteBuffer&) const override; | |
| SK_TO_STRING_OVERRIDE() | |
| private: | |
| SkMatrix fMatrix, fInverse; | |
| bool fMatrixIsInvertible; | |
| // illegal | |
| Sk2DPathEffect(const Sk2DPathEffect&); | |
| Sk2DPathEffect& operator=(const Sk2DPathEffect&); | |
| friend class Sk2DPathEffectBlitter; | |
| typedef SkPathEffect INHERITED; | |
| }; | |
| class SK_API SkLine2DPathEffect : public Sk2DPathEffect { | |
| public: | |
| static sk_sp<SkPathEffect> Make(SkScalar width, const SkMatrix& matrix) { | |
| return sk_sp<SkPathEffect>(new SkLine2DPathEffect(width, matrix)); | |
| } | |
| virtual bool filterPath(SkPath* dst, const SkPath& src, | |
| SkStrokeRec*, const SkRect*) const override; | |
| SK_TO_STRING_OVERRIDE() | |
| SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLine2DPathEffect) | |
| protected: | |
| SkLine2DPathEffect(SkScalar width, const SkMatrix& matrix) | |
| : Sk2DPathEffect(matrix), fWidth(width) {} | |
| void flatten(SkWriteBuffer&) const override; | |
| void nextSpan(int u, int v, int ucount, SkPath*) const override; | |
| private: | |
| SkScalar fWidth; | |
| typedef Sk2DPathEffect INHERITED; | |
| }; | |
| class SK_API SkPath2DPathEffect : public Sk2DPathEffect { | |
| public: | |
| /** | |
| * Stamp the specified path to fill the shape, using the matrix to define | |
| * the latice. | |
| */ | |
| static sk_sp<SkPathEffect> Make(const SkMatrix& matrix, const SkPath& path) { | |
| return sk_sp<SkPathEffect>(new SkPath2DPathEffect(matrix, path)); | |
| } | |
| SK_TO_STRING_OVERRIDE() | |
| SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPath2DPathEffect) | |
| protected: | |
| SkPath2DPathEffect(const SkMatrix&, const SkPath&); | |
| void flatten(SkWriteBuffer&) const override; | |
| void next(const SkPoint&, int u, int v, SkPath*) const override; | |
| private: | |
| SkPath fPath; | |
| typedef Sk2DPathEffect INHERITED; | |
| }; | |
| #endif |