11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef Sk2DPathEffect_DEFINED
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define Sk2DPathEffect_DEFINED
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkPath.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPathEffect.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMatrix.h"
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass Sk2DPathEffect : public SkPathEffect {
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Sk2DPathEffect(const SkMatrix& mat);
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // overrides
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool filterPath(SkPath*, const SkPath&, SkScalar* width) SK_OVERRIDE;
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // overrides from SkFlattenable
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual Factory getFactory() SK_OVERRIDE;
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** New virtual, to be overridden by subclasses.
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        This is called once from filterPath, and provides the
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        uv parameter bounds for the path. Subsequent calls to
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        next() will receive u and v values within these bounds,
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        and then a call to end() will signal the end of processing.
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void begin(const SkIRect& uvBounds, SkPath* dst);
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void next(const SkPoint& loc, int u, int v, SkPath* dst);
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void end(SkPath* dst);
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Low-level virtual called per span of locations in the u-direction.
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        The default implementation calls next() repeatedly with each
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        location.
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void nextSpan(int u, int v, int ucount, SkPath* dst);
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkMatrix& getMatrix() const { return fMatrix; }
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // protected so that subclasses can call this during unflattening
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Sk2DPathEffect(SkFlattenableReadBuffer&);
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SK_DECLARE_FLATTENABLE_REGISTRAR()
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkMatrix    fMatrix, fInverse;
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // illegal
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Sk2DPathEffect(const Sk2DPathEffect&);
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Sk2DPathEffect& operator=(const Sk2DPathEffect&);
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static SkFlattenable* CreateProc(SkFlattenableReadBuffer&);
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    friend class Sk2DPathEffectBlitter;
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkPathEffect INHERITED;
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkPath2DPathEffect : public Sk2DPathEffect {
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Stamp the specified path to fill the shape, using the matrix to define
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the latice.
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPath2DPathEffect(const SkMatrix&, const SkPath&);
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static SkFlattenable* CreateProc(SkFlattenableReadBuffer&);
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SK_DECLARE_FLATTENABLE_REGISTRAR()
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPath2DPathEffect(SkFlattenableReadBuffer& buffer);
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual Factory getFactory() SK_OVERRIDE;
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void next(const SkPoint&, int u, int v, SkPath* dst) SK_OVERRIDE;
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPath  fPath;
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef Sk2DPathEffect INHERITED;
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
91