aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental/sksg/geometry/SkSGTrimEffect.h
blob: 4e950a7ade98e1720912a303053bd5c7e3d2cebd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*
 * Copyright 2017 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkSGTrimEffect_DEFINED
#define SkSGTrimEffect_DEFINED

#include "SkSGGeometryNode.h"

#include "SkPath.h"

class SkCanvas;
class SkPaint;

namespace sksg {

/**
 * Concrete Geometry node, applying a trim effect to its child.
 */
class TrimEffect final : public GeometryNode {
public:
    static sk_sp<TrimEffect> Make(sk_sp<GeometryNode> child) {
        return child ? sk_sp<TrimEffect>(new TrimEffect(std::move(child))) : nullptr;
    }

    ~TrimEffect() override;

    SG_ATTRIBUTE(Start , SkScalar, fStart )
    SG_ATTRIBUTE(End   , SkScalar, fEnd   )
    SG_ATTRIBUTE(Offset, SkScalar, fOffset)

protected:
    void onClip(SkCanvas*, bool antiAlias) const override;
    void onDraw(SkCanvas*, const SkPaint&) const override;

    SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
    SkPath onAsPath() const override;

private:
    explicit TrimEffect(sk_sp<GeometryNode>);

    const sk_sp<GeometryNode> fChild;

    SkPath                    fTrimmedPath;
    SkScalar                  fStart  = 0, // starting t
                              fEnd    = 1, // ending t
                              fOffset = 0; // t offset

    using INHERITED = GeometryNode;
};

} // namespace sksg

#endif // SkSGTrimEffect_DEFINED