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 SkPathEffect* Create(const SkScalar intervals[], int count, SkScalar phase);
40
41    virtual bool filterPath(SkPath* dst, const SkPath& src,
42                            SkStrokeRec*, const SkRect*) const override;
43
44    virtual bool asPoints(PointData* results, const SkPath& src,
45                          const SkStrokeRec&, const SkMatrix&,
46                          const SkRect*) const override;
47
48    DashType asADash(DashInfo* info) const override;
49
50    SK_TO_STRING_OVERRIDE()
51    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDashPathEffect)
52
53#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
54    bool exposedInAndroidJavaAPI() const override { return true; }
55#endif
56
57protected:
58    virtual ~SkDashPathEffect();
59    SkDashPathEffect(const SkScalar intervals[], int count, SkScalar phase);
60    void flatten(SkWriteBuffer&) const override;
61
62private:
63    SkScalar*   fIntervals;
64    int32_t     fCount;
65    SkScalar    fPhase;
66    // computed from phase
67
68    SkScalar    fInitialDashLength;
69    int32_t     fInitialDashIndex;
70    SkScalar    fIntervalLength;
71
72    typedef SkPathEffect INHERITED;
73};
74
75#endif
76