Sk1DPathEffect.h revision e28b917669fc4677b2f1c0a08c4711b651cbf1a1
1381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
2381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org/*
3381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org * Copyright 2006 The Android Open Source Project
4381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org *
5381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org * Use of this source code is governed by a BSD-style license that can be
6381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org * found in the LICENSE file.
7381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org */
8381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
9381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
10381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org#ifndef Sk1DPathEffect_DEFINED
11381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org#define Sk1DPathEffect_DEFINED
12381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
13381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org#include "SkPathEffect.h"
14381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org#include "SkPath.h"
15381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
16381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgclass SkPathMeasure;
17381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
18381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org//  This class is not exported to java.
19381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgclass Sk1DPathEffect : public SkPathEffect {
20381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgpublic:
21381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    //  override from SkPathEffect
22381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    virtual bool filterPath(SkPath* dst, const SkPath& src, SkScalar* width);
23381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
24381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgprotected:
25381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    /** Called at the start of each contour, returns the initial offset
26381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        into that contour.
27381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    */
28381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    virtual SkScalar begin(SkScalar contourLength) = 0;
29381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    /** Called with the current distance along the path, with the current matrix
30381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        for the point/tangent at the specified distance.
31381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        Return the distance to travel for the next call. If return <= 0, then that
32381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        contour is done.
33381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    */
34381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    virtual SkScalar next(SkPath* dst, SkScalar distance, SkPathMeasure&) = 0;
35381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
36381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgprivate:
37381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    typedef SkPathEffect INHERITED;
38381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org};
39381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
40381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgclass SkPath1DPathEffect : public Sk1DPathEffect {
41381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgpublic:
42381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    enum Style {
43381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        kTranslate_Style,   // translate the shape to each position
44381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        kRotate_Style,      // rotate the shape about its center
45381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        kMorph_Style,       // transform each point, and turn lines into curves
46381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
47381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        kStyleCount
48381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    };
49381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
50381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    /** Dash by replicating the specified path.
51381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        @param path The path to replicate (dash)
52381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        @param advance The space between instances of path
53381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        @param phase distance (mod advance) along path for its initial position
54381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        @param style how to transform path at each point (based on the current
55381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org                     position and tangent)
56381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    */
57381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    SkPath1DPathEffect(const SkPath& path, SkScalar advance, SkScalar phase, Style);
58381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
59381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    // override from SkPathEffect
60381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    virtual bool filterPath(SkPath* dst, const SkPath& src, SkScalar* width);
61381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
62    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
63        return SkNEW_ARGS(SkPath1DPathEffect, (buffer));
64    }
65
66protected:
67    SkPath1DPathEffect(SkFlattenableReadBuffer& buffer);
68
69    // overrides from Sk1DPathEffect
70    virtual SkScalar begin(SkScalar contourLength);
71    virtual SkScalar next(SkPath* dst, SkScalar distance, SkPathMeasure&);
72    // overrides from SkFlattenable
73    virtual void flatten(SkFlattenableWriteBuffer& );
74    virtual Factory getFactory() { return CreateProc; }
75
76private:
77    SkPath      fPath;          // copied from constructor
78    SkScalar    fAdvance;       // copied from constructor
79    SkScalar    fInitialOffset; // computed from phase
80    Style       fStyle;         // copied from constructor
81
82    typedef Sk1DPathEffect INHERITED;
83};
84
85
86#endif
87