FastLED 3.9.15
Loading...
Searching...
No Matches
gradient.cpp
Go to the documentation of this file.
1
2#include "fl/gradient.h"
3#include "fl/assert.h"
4#include "fl/colorutils.h"
5
6namespace fl {
7
8namespace {
9struct Visitor {
10 Visitor(uint8_t index) : index(index) {}
11 void accept(const CRGBPalette16 *palette) {
13 return_val = c;
14 }
15
16 void accept(const CRGBPalette32 *palette) {
18 return_val = c;
19 }
20
21 void accept(const CRGBPalette256 *palette) {
23 return_val = c;
24 }
25
27 CRGB c = func(index);
28 return_val = c;
29 }
30
31 template <typename T> void accept(const T &obj) {
32 // This should never be called, but we need to provide a default
33 // implementation to avoid compilation errors.
34 accept(&obj);
35 }
36
38 uint8_t index;
39};
40
44 FASTLED_ASSERT(
45 indices.size() == output.size(),
46 "Gradient::fill: indices and output must be the same size");
47 n = MIN(indices.size(), output.size());
48 }
49 void accept(const CRGBPalette16 *palette) {
50 for (size_t i = 0; i < n; ++i) {
52 }
53 }
54
55 void accept(const CRGBPalette32 *palette) {
56 for (size_t i = 0; i < n; ++i) {
58 }
59 }
60
61 void accept(const CRGBPalette256 *palette) {
62 for (size_t i = 0; i < n; ++i) {
64 }
65 }
66
68 for (size_t i = 0; i < n; ++i) {
69 output[i] = func(indices[i]);
70 }
71 }
72
73 template <typename T> void accept(const T &obj) {
74 // This should never be called, but we need to provide a default
75 // implementation to avoid compilation errors.
76 accept(&obj);
77 }
78
81 uint8_t n = 0;
82};
83
84} // namespace
85
86CRGB Gradient::colorAt(uint8_t index) const {
87 Visitor visitor(index);
88 mVariant.visit(visitor);
89 return visitor.return_val;
90}
91
92template <typename T> Gradient::Gradient(T *palette) { set(palette); }
93
95
97 : mVariant(move(other.mVariant)) {}
98
99void Gradient::set(const CRGBPalette32 *palette) { mVariant = palette; }
100
101void Gradient::set(const CRGBPalette256 *palette) { mVariant = palette; }
102
103void Gradient::set(const CRGBPalette16 *palette) { mVariant = palette; }
104
105void Gradient::set(const GradientFunction &func) { mVariant = func; }
106
108 if (this != &other) {
109 mVariant = other.mVariant;
110 }
111 return *this;
112}
113
115 VisitorFill visitor(input, output);
116 mVariant.visit(visitor);
117}
118
119CRGB GradientInlined::colorAt(uint8_t index) const {
120 Visitor visitor(index);
121 mVariant.visit(visitor);
122 return visitor.return_val;
123}
125 Slice<CRGB> output) const {
126 VisitorFill visitor(input, output);
127 mVariant.visit(visitor);
128}
129
131 // Visitor is cumbersome but guarantees all paths are handled.
132 struct Copy {
133 Copy(Gradient &owner) : mOwner(owner) {}
134 void accept(const CRGBPalette16 &palette) { mOwner.set(&palette); }
135 void accept(const CRGBPalette32 &palette) { mOwner.set(&palette); }
136 void accept(const CRGBPalette256 &palette) { mOwner.set(&palette); }
137 void accept(const GradientFunction &func) { mOwner.set(func); }
138 Gradient &mOwner;
139 };
140 Copy copy_to_self(*this);
141 other.variant().visit(copy_to_self);
142}
143
144} // namespace fl
UINumberField palette("Palette", 0, 0, 2)
void set(const CRGBPalette16 *palette)
Definition gradient.cpp:103
GradientVariant mVariant
Definition gradient.h:41
CRGB colorAt(uint8_t index) const
Definition gradient.cpp:86
fl::function< CRGB(uint8_t index)> GradientFunction
Definition gradient.h:18
Gradient()=default
void fill(Slice< const uint8_t > input, Slice< CRGB > output) const
Definition gradient.cpp:114
Gradient & operator=(const Gradient &other)
Definition gradient.cpp:107
CRGB colorAt(uint8_t index) const
Definition gradient.cpp:119
void fill(Slice< const uint8_t > input, Slice< CRGB > output) const
Definition gradient.cpp:124
GradientVariant & variant()
Definition gradient.h:63
GradientVariant mVariant
Definition gradient.h:67
void visit(Visitor &visitor)
Definition variant.h:136
CRGB ColorFromPaletteExtended(const CRGBPalette32 &pal, uint16_t index, uint8_t brightness, TBlendType blendType)
CRGB ColorFromPalette(const CRGBPalette16 &pal, uint8_t index, uint8_t brightness, TBlendType blendType)
Utility functions for color fill, palettes, blending, and more.
#define MIN(a, b)
Definition math_macros.h:15
constexpr remove_reference< T >::type && move(T &&t) noexcept
Implements a simple red square effect for 2D LED grids.
Definition crgb.h:16
Representation of an RGB pixel (Red, Green, Blue)
Definition crgb.h:55
void accept(const CRGBPalette16 *palette)
Definition gradient.cpp:11
void accept(const Gradient::GradientFunction &func)
Definition gradient.cpp:26
void accept(const CRGBPalette256 *palette)
Definition gradient.cpp:21
void accept(const CRGBPalette32 *palette)
Definition gradient.cpp:16
void accept(const CRGBPalette256 *palette)
Definition gradient.cpp:61
VisitorFill(Slice< const uint8_t > indices, Slice< CRGB > output)
Definition gradient.cpp:42
void accept(const Gradient::GradientFunction &func)
Definition gradient.cpp:67
void accept(const CRGBPalette16 *palette)
Definition gradient.cpp:49
void accept(const CRGBPalette32 *palette)
Definition gradient.cpp:55