18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef Sk2DPathEffect_DEFINED
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define Sk2DPathEffect_DEFINED
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1118dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com#include "SkPath.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPathEffect.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMatrix.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
156806fe87e0b39e283291c1a1c7d1d864230aa2aatfarina@chromium.orgclass SK_API Sk2DPathEffect : public SkPathEffect {
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
170a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    static Sk2DPathEffect* Create(const SkMatrix& mat) {
180a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org        return SkNEW_ARGS(Sk2DPathEffect, (mat));
190a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    }
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
21548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com    virtual bool filterPath(SkPath*, const SkPath&,
224bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com                            SkStrokeRec*, const SkRect*) const SK_OVERRIDE;
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
24ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Sk2DPathEffect)
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** New virtual, to be overridden by subclasses.
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        This is called once from filterPath, and provides the
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        uv parameter bounds for the path. Subsequent calls to
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        next() will receive u and v values within these bounds,
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        and then a call to end() will signal the end of processing.
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
33548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com    virtual void begin(const SkIRect& uvBounds, SkPath* dst) const;
34548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com    virtual void next(const SkPoint& loc, int u, int v, SkPath* dst) const;
35548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com    virtual void end(SkPath* dst) const;
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Low-level virtual called per span of locations in the u-direction.
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        The default implementation calls next() repeatedly with each
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        location.
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
41548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com    virtual void nextSpan(int u, int v, int ucount, SkPath* dst) const;
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const SkMatrix& getMatrix() const { return fMatrix; }
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // protected so that subclasses can call this during unflattening
46bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    explicit Sk2DPathEffect(const SkMatrix& mat);
47bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    explicit Sk2DPathEffect(SkReadBuffer&);
488b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMatrix    fMatrix, fInverse;
5290bf427001fd4f6d9fcee88911deb015aeb4ab7cmike@reedtribe.org    bool        fMatrixIsInvertible;
5390bf427001fd4f6d9fcee88911deb015aeb4ab7cmike@reedtribe.org
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Sk2DPathEffect(const Sk2DPathEffect&);
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Sk2DPathEffect& operator=(const Sk2DPathEffect&);
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    friend class Sk2DPathEffectBlitter;
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkPathEffect INHERITED;
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
626806fe87e0b39e283291c1a1c7d1d864230aa2aatfarina@chromium.orgclass SK_API SkLine2DPathEffect : public Sk2DPathEffect {
63d8a6cc814f1a0a8faaddad05ae765ad2f6b11aacscroggo@google.compublic:
640a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    static SkLine2DPathEffect* Create(SkScalar width, const SkMatrix& matrix) {
650a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org        return SkNEW_ARGS(SkLine2DPathEffect, (width, matrix));
660a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    }
67d8a6cc814f1a0a8faaddad05ae765ad2f6b11aacscroggo@google.com
68548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com    virtual bool filterPath(SkPath* dst, const SkPath& src,
694bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com                            SkStrokeRec*, const SkRect*) const SK_OVERRIDE;
70d8a6cc814f1a0a8faaddad05ae765ad2f6b11aacscroggo@google.com
71d8a6cc814f1a0a8faaddad05ae765ad2f6b11aacscroggo@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLine2DPathEffect)
72d8a6cc814f1a0a8faaddad05ae765ad2f6b11aacscroggo@google.com
73d8a6cc814f1a0a8faaddad05ae765ad2f6b11aacscroggo@google.comprotected:
74bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    SkLine2DPathEffect(SkScalar width, const SkMatrix& matrix)
75bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org        : Sk2DPathEffect(matrix), fWidth(width) {}
76bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    explicit SkLine2DPathEffect(SkReadBuffer&);
77d8a6cc814f1a0a8faaddad05ae765ad2f6b11aacscroggo@google.com
788b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
79d8a6cc814f1a0a8faaddad05ae765ad2f6b11aacscroggo@google.com
80bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    virtual void nextSpan(int u, int v, int ucount, SkPath*) const SK_OVERRIDE;
810a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org
82d8a6cc814f1a0a8faaddad05ae765ad2f6b11aacscroggo@google.comprivate:
83d8a6cc814f1a0a8faaddad05ae765ad2f6b11aacscroggo@google.com    SkScalar fWidth;
84d8a6cc814f1a0a8faaddad05ae765ad2f6b11aacscroggo@google.com
85d8a6cc814f1a0a8faaddad05ae765ad2f6b11aacscroggo@google.com    typedef Sk2DPathEffect INHERITED;
86d8a6cc814f1a0a8faaddad05ae765ad2f6b11aacscroggo@google.com};
87d8a6cc814f1a0a8faaddad05ae765ad2f6b11aacscroggo@google.com
886806fe87e0b39e283291c1a1c7d1d864230aa2aatfarina@chromium.orgclass SK_API SkPath2DPathEffect : public Sk2DPathEffect {
8918dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.compublic:
9018dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com    /**
9118dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com     *  Stamp the specified path to fill the shape, using the matrix to define
9218dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com     *  the latice.
9318dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com     */
940a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    static SkPath2DPathEffect* Create(const SkMatrix& matrix, const SkPath& path) {
950a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org        return SkNEW_ARGS(SkPath2DPathEffect, (matrix, path));
960a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org    }
97fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
98ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPath2DPathEffect)
9918dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com
10018dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.comprotected:
101bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    SkPath2DPathEffect(const SkMatrix&, const SkPath&);
102bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    explicit SkPath2DPathEffect(SkReadBuffer& buffer);
1038b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
10418dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com
105548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com    virtual void next(const SkPoint&, int u, int v, SkPath*) const SK_OVERRIDE;
10618dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com
10718dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.comprivate:
10818dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com    SkPath  fPath;
10918dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com
11018dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com    typedef Sk2DPathEffect INHERITED;
11118dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com};
11218dc47731f4b37d8896b51f1b92ab31abd78b5a0reed@google.com
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
114