1/*
2 * Copyright 2006 The Android Open Source Project
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkDashPathEffect_DEFINED
9#define SkDashPathEffect_DEFINED
10
11#include "SkPathEffect.h"
12
13/** \class SkDashPathEffect
14
15    SkDashPathEffect is a subclass of SkPathEffect that implements dashing
16*/
17class SK_API SkDashPathEffect : public SkPathEffect {
18public:
19    /** intervals: array containing an even number of entries (>=2), with
20         the even indices specifying the length of "on" intervals, and the odd
21         indices specifying the length of "off" intervals.
22        count: number of elements in the intervals array
23        phase: offset into the intervals array (mod the sum of all of the
24         intervals).
25
26        For example: if intervals[] = {10, 20}, count = 2, and phase = 25,
27         this will set up a dashed path like so:
28         5 pixels off
29         10 pixels on
30         20 pixels off
31         10 pixels on
32         20 pixels off
33         ...
34        A phase of -5, 25, 55, 85, etc. would all result in the same path,
35         because the sum of all the intervals is 30.
36
37        Note: only affects stroked paths.
38    */
39    static SkDashPathEffect* Create(const SkScalar intervals[], int count,
40                                    SkScalar phase) {
41        return SkNEW_ARGS(SkDashPathEffect, (intervals, count, phase));
42    }
43    virtual ~SkDashPathEffect();
44
45    virtual bool filterPath(SkPath* dst, const SkPath& src,
46                            SkStrokeRec*, const SkRect*) const SK_OVERRIDE;
47
48    virtual bool asPoints(PointData* results, const SkPath& src,
49                          const SkStrokeRec&, const SkMatrix&,
50                          const SkRect*) const SK_OVERRIDE;
51
52    virtual DashType asADash(DashInfo* info) const SK_OVERRIDE;
53
54    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDashPathEffect)
55
56protected:
57    SkDashPathEffect(const SkScalar intervals[], int count, SkScalar phase);
58#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
59    explicit SkDashPathEffect(SkReadBuffer&);
60#endif
61    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
62
63private:
64    SkScalar*   fIntervals;
65    int32_t     fCount;
66    SkScalar    fPhase;
67    // computed from phase
68    SkScalar    fInitialDashLength;
69    int32_t     fInitialDashIndex;
70    SkScalar    fIntervalLength;
71
72    typedef SkPathEffect INHERITED;
73};
74
75#endif
76