Sk1DPathEffect.h revision 8b0e8ac5f582de80356019406e2975079bf0829d
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright 2006 The Android Open Source Project
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * found in the LICENSE file.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef Sk1DPathEffect_DEFINED
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define Sk1DPathEffect_DEFINED
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SkPathEffect.h"
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SkPath.h"
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SkPathMeasure;
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This class is not exported to java.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SK_API Sk1DPathEffect : public SkPathEffect {
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool filterPath(SkPath* dst, const SkPath& src,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            SkStrokeRec*, const SkRect*) const SK_OVERRIDE;
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /** Called at the start of each contour, returns the initial offset
24591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        into that contour.
2509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    */
26591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    virtual SkScalar begin(SkScalar contourLength) const = 0;
27591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /** Called with the current distance along the path, with the current matrix
28591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        for the point/tangent at the specified distance.
29591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        Return the distance to travel for the next call. If return <= 0, then that
30591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        contour is done.
31bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    */
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual SkScalar next(SkPath* dst, SkScalar dist, SkPathMeasure&) const = 0;
339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef SkPathEffect INHERITED;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
37197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
383c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochclass SK_API SkPath1DPathEffect : public Sk1DPathEffect {
393c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochpublic:
408abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    enum Style {
418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        kTranslate_Style,   // translate the shape to each position
428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        kRotate_Style,      // rotate the shape about its center
438abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        kMorph_Style,       // transform each point, and turn lines into curves
443c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
453c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        kStyleCount
46f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    };
47f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
48f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    /** Dash by replicating the specified path.
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        @param path The path to replicate (dash)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        @param advance The space between instances of path
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        @param phase distance (mod advance) along path for its initial position
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        @param style how to transform path at each point (based on the current
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     position and tangent)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    */
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkPath1DPathEffect(const SkPath& path, SkScalar advance, SkScalar phase, Style);
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool filterPath(SkPath*, const SkPath&,
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            SkStrokeRec*, const SkRect*) const SK_OVERRIDE;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPath1DPathEffect)
6102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkPath1DPathEffect(SkReadBuffer& buffer);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // overrides from Sk1DPathEffect
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual SkScalar begin(SkScalar contourLength) const SK_OVERRIDE;
6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual SkScalar next(SkPath*, SkScalar, SkPathMeasure&) const SK_OVERRIDE;
6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)private:
7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    SkPath      fPath;          // copied from constructor
7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    SkScalar    fAdvance;       // copied from constructor
7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    SkScalar    fInitialOffset; // computed from phase
7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Style       fStyle;         // copied from constructor
7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    typedef Sk1DPathEffect INHERITED;
7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)};
7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#endif
8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)