/* * 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