180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef Sk2DPathEffect_DEFINED
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define Sk2DPathEffect_DEFINED
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPath.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPathEffect.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkMatrix.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SK_API Sk2DPathEffect : public SkPathEffect {
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    Sk2DPathEffect(const SkMatrix& mat);
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual bool filterPath(SkPath*, const SkPath&,
20d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger                            SkStrokeRec*, const SkRect*) const SK_OVERRIDE;
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Sk2DPathEffect)
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /** New virtual, to be overridden by subclasses.
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        This is called once from filterPath, and provides the
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        uv parameter bounds for the path. Subsequent calls to
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        next() will receive u and v values within these bounds,
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        and then a call to end() will signal the end of processing.
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    */
31363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void begin(const SkIRect& uvBounds, SkPath* dst) const;
32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void next(const SkPoint& loc, int u, int v, SkPath* dst) const;
33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void end(SkPath* dst) const;
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /** Low-level virtual called per span of locations in the u-direction.
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        The default implementation calls next() repeatedly with each
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        location.
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    */
39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void nextSpan(int u, int v, int ucount, SkPath* dst) const;
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkMatrix& getMatrix() const { return fMatrix; }
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // protected so that subclasses can call this during unflattening
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    Sk2DPathEffect(SkFlattenableReadBuffer&);
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMatrix    fMatrix, fInverse;
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool        fMatrixIsInvertible;
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // illegal
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    Sk2DPathEffect(const Sk2DPathEffect&);
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    Sk2DPathEffect& operator=(const Sk2DPathEffect&);
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class Sk2DPathEffectBlitter;
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkPathEffect INHERITED;
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SK_API SkLine2DPathEffect : public Sk2DPathEffect {
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkLine2DPathEffect(SkScalar width, const SkMatrix& matrix)
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    : Sk2DPathEffect(matrix), fWidth(width) {}
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual bool filterPath(SkPath* dst, const SkPath& src,
65d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger                            SkStrokeRec*, const SkRect*) const SK_OVERRIDE;
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLine2DPathEffect)
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void nextSpan(int u, int v, int ucount, SkPath*) const SK_OVERRIDE;
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkLine2DPathEffect(SkFlattenableReadBuffer&);
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar fWidth;
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef Sk2DPathEffect INHERITED;
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SK_API SkPath2DPathEffect : public Sk2DPathEffect {
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /**
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     *  Stamp the specified path to fill the shape, using the matrix to define
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     *  the latice.
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     */
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPath2DPathEffect(const SkMatrix&, const SkPath&);
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPath2DPathEffect)
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPath2DPathEffect(SkFlattenableReadBuffer& buffer);
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
96363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void next(const SkPoint&, int u, int v, SkPath*) const SK_OVERRIDE;
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPath  fPath;
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef Sk2DPathEffect INHERITED;
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
105