Coverage Report

Created: 2024-05-20 07:14

/src/skia/modules/sksg/include/SkSGGradient.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2018 Google Inc.
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 SkSGGradient_DEFINED
9
#define SkSGGradient_DEFINED
10
11
#include "include/core/SkColor.h"
12
#include "include/core/SkPoint.h"
13
#include "include/core/SkRefCnt.h"
14
#include "include/core/SkScalar.h"
15
#include "include/core/SkTileMode.h"
16
#include "modules/sksg/include/SkSGNode.h"
17
#include "modules/sksg/include/SkSGRenderEffect.h"
18
19
#include <vector>
20
21
class SkShader;
22
23
namespace sksg {
24
25
/**
26
 * Gradient base class.
27
 */
28
class Gradient : public Shader {
29
public:
30
    struct ColorStop {
31
        SkScalar  fPosition;
32
        SkColor4f fColor;
33
34
0
        bool operator==(const ColorStop& other) const {
35
0
            return fPosition == other.fPosition && fColor == other.fColor;
36
0
        }
37
    };
38
39
    SG_ATTRIBUTE(ColorStops, std::vector<ColorStop>, fColorStops)
40
    SG_ATTRIBUTE(TileMode  , SkTileMode            , fTileMode  )
41
42
protected:
43
    sk_sp<SkShader> onRevalidateShader() final;
44
45
    virtual sk_sp<SkShader> onMakeShader(const std::vector<SkColor4f>& colors,
46
                                         const std::vector<SkScalar >& positions) const = 0;
47
48
protected:
49
18.2k
    Gradient() = default;
50
51
private:
52
    std::vector<ColorStop> fColorStops;
53
    SkTileMode             fTileMode = SkTileMode::kClamp;
54
55
    using INHERITED = Shader;
56
};
57
58
class LinearGradient final : public Gradient {
59
public:
60
10.8k
    static sk_sp<LinearGradient> Make() {
61
10.8k
        return sk_sp<LinearGradient>(new LinearGradient());
62
10.8k
    }
63
64
    SG_ATTRIBUTE(StartPoint, SkPoint, fStartPoint)
65
    SG_ATTRIBUTE(EndPoint  , SkPoint, fEndPoint  )
66
67
protected:
68
    sk_sp<SkShader> onMakeShader(const std::vector<SkColor4f>&,
69
                                 const std::vector<SkScalar >&) const override;
70
71
private:
72
10.8k
    LinearGradient() = default;
73
74
    SkPoint fStartPoint = SkPoint::Make(0, 0),
75
            fEndPoint   = SkPoint::Make(0, 0);
76
77
    using INHERITED = Gradient;
78
};
79
80
class RadialGradient final : public Gradient {
81
public:
82
7.32k
    static sk_sp<RadialGradient> Make() {
83
7.32k
        return sk_sp<RadialGradient>(new RadialGradient());
84
7.32k
    }
85
86
    SG_ATTRIBUTE(StartCenter, SkPoint , fStartCenter)
87
    SG_ATTRIBUTE(EndCenter  , SkPoint , fEndCenter  )
88
    SG_ATTRIBUTE(StartRadius, SkScalar, fStartRadius)
89
    SG_ATTRIBUTE(EndRadius  , SkScalar, fEndRadius  )
90
91
protected:
92
    sk_sp<SkShader> onMakeShader(const std::vector<SkColor4f>&,
93
                                 const std::vector<SkScalar >&) const override;
94
95
private:
96
7.32k
    RadialGradient() = default;
97
98
    SkPoint  fStartCenter = SkPoint::Make(0, 0),
99
             fEndCenter   = SkPoint::Make(0, 0);
100
    SkScalar fStartRadius = 0,
101
             fEndRadius   = 0;
102
103
    using INHERITED = Gradient;
104
};
105
106
} // namespace sksg
107
108
#endif // SkSGGradient_DEFINED