1#ifndef FASTLED_INTERNAL
2#define FASTLED_INTERNAL
27 0, 0, 0, 0, 1, 1, 2, 3, 4, 6,
28 8, 10, 13, 16, 19, 24, 28, 33, 39, 46,
29 53, 60, 69, 78, 88, 98, 110, 122, 135, 149,
30 164, 179, 196, 214, 232, 252, 273, 295, 317, 341,
31 366, 393, 420, 449, 478, 510, 542, 575, 610, 647,
32 684, 723, 764, 806, 849, 894, 940, 988, 1037, 1088,
33 1140, 1194, 1250, 1307, 1366, 1427, 1489, 1553, 1619, 1686,
34 1756, 1827, 1900, 1975, 2051, 2130, 2210, 2293, 2377, 2463,
35 2552, 2642, 2734, 2829, 2925, 3024, 3124, 3227, 3332, 3439,
36 3548, 3660, 3774, 3890, 4008, 4128, 4251, 4376, 4504, 4634,
37 4766, 4901, 5038, 5177, 5319, 5464, 5611, 5760, 5912, 6067,
38 6224, 6384, 6546, 6711, 6879, 7049, 7222, 7397, 7576, 7757,
39 7941, 8128, 8317, 8509, 8704, 8902, 9103, 9307, 9514, 9723,
40 9936, 10151, 10370, 10591, 10816, 11043, 11274, 11507, 11744, 11984,
41 12227, 12473, 12722, 12975, 13230, 13489, 13751, 14017, 14285, 14557,
42 14833, 15111, 15393, 15678, 15967, 16259, 16554, 16853, 17155, 17461,
43 17770, 18083, 18399, 18719, 19042, 19369, 19700, 20034, 20372, 20713,
44 21058, 21407, 21759, 22115, 22475, 22838, 23206, 23577, 23952, 24330,
45 24713, 25099, 25489, 25884, 26282, 26683, 27089, 27499, 27913, 28330,
46 28752, 29178, 29608, 30041, 30479, 30921, 31367, 31818, 32272, 32730,
47 33193, 33660, 34131, 34606, 35085, 35569, 36057, 36549, 37046, 37547,
48 38052, 38561, 39075, 39593, 40116, 40643, 41175, 41711, 42251, 42796,
49 43346, 43899, 44458, 45021, 45588, 46161, 46737, 47319, 47905, 48495,
50 49091, 49691, 50295, 50905, 51519, 52138, 52761, 53390, 54023, 54661,
51 55303, 55951, 56604, 57261, 57923, 58590, 59262, 59939, 60621, 61308,
52 62000, 62697, 63399, 64106, 64818, 65535};
66 constexpr u16 MAX = 0xFF;
67 constexpr u16 HALF = (MAX + 1) >> 1;
68 constexpr u16 DENOM = MAX;
69 constexpr u16 ROUND = DENOM >> 1;
74 u32 num = 2 *
t *
t + ROUND;
75 return u8(num / DENOM);
80 u32 num = 2 * d * d + ROUND;
81 return u8(MAX - (num / DENOM));
86 constexpr u16 MAX = 0xFF;
87 constexpr u16 HALF = (MAX + 1) >> 1;
88 constexpr u32 DENOM = (u32)MAX * MAX;
89 constexpr u32 ROUND = DENOM >> 1;
94 u32 cube = ii * ii * ii;
95 u32 num = 4 * cube + ROUND;
96 return u8(num / DENOM);
102 u32 cube = d * d * d;
103 u32 num = 4 * cube + ROUND;
104 return u8(MAX - (num / DENOM));
111 constexpr u16 MAX = 0xFF;
113 u32 num = d * d + (MAX >> 1);
114 return u8(MAX - (num / MAX));
120 constexpr u16 MAX = 0xFF;
121 constexpr u32 DENOM = (u32)MAX * MAX;
122 constexpr u32 ROUND = DENOM >> 1;
125 u32 cube = ii * ii * ii;
126 u32 num = cube + ROUND;
127 return u8(num / DENOM);
133 constexpr u16 MAX = 0xFF;
134 constexpr u32 DENOM = (u32)MAX * MAX;
135 constexpr u32 ROUND = DENOM >> 1;
138 u32 cube = d * d * d;
139 u32 num = cube + ROUND;
140 return u8(MAX - (num / DENOM));
146 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
147 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4,
148 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8,
149 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14,
150 15, 16, 16, 17, 17, 18, 18, 19, 20, 20, 21, 21, 22, 23,
151 23, 24, 25, 25, 26, 27, 27, 28, 29, 30, 30, 31, 32, 33,
152 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 42, 43, 44,
153 45, 46, 47, 48, 49, 50, 51, 52, 52, 53, 54, 55, 56, 57,
154 58, 59, 60, 61, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72,
155 73, 74, 75, 76, 77, 79, 80, 81, 82, 83, 84, 86, 87, 88,
156 89, 90, 91, 93, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105,
157 106, 108, 109, 110, 112, 113, 114, 115, 117, 118, 119, 121, 122, 123,
158 125, 126, 127, 129, 130, 132, 133, 134, 136, 137, 139, 140, 141, 143,
159 144, 146, 147, 148, 150, 151, 153, 154, 156, 157, 159, 160, 161, 163,
160 164, 166, 167, 169, 170, 172, 173, 175, 176, 178, 179, 181, 182, 184,
161 185, 187, 188, 190, 191, 193, 194, 196, 197, 199, 200, 202, 204, 205,
162 207, 208, 210, 211, 213, 214, 216, 217, 219, 221, 222, 224, 225, 227,
163 228, 230, 231, 233, 235, 236, 238, 239, 241, 242, 244, 246, 247, 249,
193 return scale16(i, i);
198 constexpr u32 MAX = 0xFFFF;
199 constexpr u32 HALF = (MAX + 1) >> 1;
200 constexpr u32 DENOM = MAX;
201 constexpr u32 ROUND = DENOM >> 1;
206 fl::u64 num = 2 * xi * xi + ROUND;
207 return u16(num / DENOM);
211 fl::u64 num = 2 * d * d + ROUND;
212 return u16(MAX - (num / DENOM));
217 const u32 MAX = 0xFFFF;
218 const u32 HALF = (MAX + 1) >> 1;
219 const fl::u64 M2 = (fl::u64)MAX * MAX;
224 fl::u64 cube = xi * xi * xi;
226 fl::u64 num = 4 * cube + (M2 >> 1);
227 return (u16)(num / M2);
232 fl::u64 cube = d * d * d;
233 fl::u64 num = 4 * cube + (M2 >> 1);
234 return (u16)(MAX - (num / M2));
241 constexpr u32 MAX = 0xFFFF;
242 constexpr u32 ROUND = MAX >> 1;
245 fl::u64 num = d * d + ROUND;
246 return u16(MAX - (num / MAX));
252 constexpr u32 MAX = 0xFFFF;
253 constexpr fl::u64 DENOM = (fl::u64)MAX * MAX;
254 constexpr fl::u64 ROUND = DENOM >> 1;
257 fl::u64 cube = ii * ii * ii;
258 fl::u64 num = cube + ROUND;
259 return u16(num / DENOM);
265 constexpr u32 MAX = 0xFFFF;
266 constexpr fl::u64 DENOM = (fl::u64)MAX * MAX;
267 constexpr fl::u64 ROUND = DENOM >> 1;
270 fl::u64 cube = d * d * d;
271 fl::u64 num = cube + ROUND;
272 return u16(MAX - (num / DENOM));
286 u32 angle = ((fl::u64)i * 4194304ULL) / 65535ULL;
294 const fl::i64 MAX_COS32 = 2147418112LL;
297 fl::i64 adjusted = MAX_COS32 - (fl::i64)cos_result;
300 fl::u64
result = (fl::u64)adjusted * 65535ULL + (MAX_COS32 >> 1);
301 u16 final_result = (u16)(
result / (fl::u64)MAX_COS32);
318 u32 angle = ((fl::u64)i * 4194304ULL) / 65535ULL;
324 return (u16)((fl::u64)sin_result * 65535ULL / 2147418112ULL);
339 u32 angle = ((fl::u64)i * 8388608ULL) / 65535ULL;
345 fl::i64 adjusted = (2147418112LL - (fl::i64)cos_result) / 2;
346 return (u16)((fl::u64)adjusted * 65535ULL / 2147418112ULL);
389 constexpr fl::s8x24 inv_255_fp(1.0f / 255.0f);
390 for (
int i = 1; i < 256; ++i) {
391 const fl::s8x24 x =
static_cast<i32
>(i) * inv_255_fp;
397 const fl::u64 scaled =
398 (
static_cast<fl::u64
>(
static_cast<fl::u32
>(r.
raw())) * 65535ull
399 + (1ull << 23)) >> 24;
400 mLut[i] =
static_cast<u16
>(scaled > 65535u ? 65535u : scaled);
413 for (
int i = 0; i < 256; ++i) {
421 input.size() < output.size() ? input.size() : output.size();
422 for (
int i = 0; i < n; ++i) {
423 output[i] = mLut[input[i]];
430 input.size() < output.size() ? input.size() : output.size();
431 for (
int i = 0; i < n; ++i) {
440 input.size() < output.size() ? input.size() : output.size();
441 for (
int i = 0; i < n; ++i) {
442 output[i] = FP::from_raw(
lerpLut(input[i]));
449 u8 idx =
static_cast<u8>(raw >> 8);
450 u8 frac =
static_cast<u8>(raw & 0xFF);
452 u16 b = (idx < 255) ? mLut[idx + 1] : mLut[idx];
453 i32 diff =
static_cast<i32
>(b) -
static_cast<i32
>(a);
454 return static_cast<u16
>(a + ((diff * frac) >> 8));
469 constexpr float kGammaMax = 15.99975f;
470 const float gamma_clamped = (
gamma < 0.0f) ? 0.0f
471 : (
gamma > kGammaMax) ? kGammaMax
488 if (
auto existing = s28_weak.
lock()) {
503 static bool sCacheValid =
false;
505 if (sCacheValid && key == sCachedKey) {
506 if (
auto existing = sCachedPtr.
lock()) {
Alignment macros and utilities for FastLED.
static fl::shared_ptr< const Gamma8 > getOrCreate(float gamma) FL_NO_EXCEPT
Gamma8Impl(from_progmem_lut_tag, const u16 *progmem_lut) FL_NO_EXCEPT
FL_ALIGNAS(64) u16 mLut[256]
void convert(fl::span< const fl::ufixed_point< 8, 8 > > input, fl::span< fl::ufixed_point< 8, 8 > > output) const FL_NO_EXCEPT override
void convert(fl::span< const u8 > input, fl::span< u16 > output) const FL_NO_EXCEPT override
Gamma8Impl(float gamma) FL_NO_EXCEPT
u16 lerpLut(const fl::ufixed_point< 8, 8 > &fp) const FL_NO_EXCEPT
void convert(fl::span< const fl::ufixed_point< 8, 8 > > input, fl::span< u16 > output) const FL_NO_EXCEPT override
static FASTLED_FORCE_INLINE s8x24 pow(s8x24 base, s8x24 exp) FL_NO_EXCEPT
constexpr i32 raw() const FL_NO_EXCEPT
shared_ptr< T > lock() const FL_NO_EXCEPT
#define FL_ALIGN_PROGMEM(N)
Force N-byte alignment for platforms with unaligned access or cache-line optimization.
#define FL_PGM_READ_BYTE_NEAR(x)
Read a byte (8-bit) from PROGMEM memory.
#define FL_PGM_READ_WORD_ALIGNED(addr)
#define FL_PROGMEM
PROGMEM keyword for storage.
Integer mapping functions between different integer sizes.
Internal FastLED header for implementation files.
u16 map8_to_16(u8 x) FL_NO_EXCEPT
u8 map16_to_8(u16 x) FL_NO_EXCEPT
Fast, efficient 8-bit math functions specifically designed for high-performance LED programming.
shared_ptr< T > make_shared(Args &&... args) FL_NO_EXCEPT
FASTLED_FORCE_INLINE i32 sin32(u32 angle) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
constexpr int type_rank< T >::value
u16 gamma_2_8(u8 value) FL_NO_EXCEPT
u16 easeInOutCubic16(u16 x) FL_NO_EXCEPT
16-bit cubic ease-in/ease-out function Takes an input value 0-65535 and returns an eased value 0-6553...
constexpr u32 gamma(float g) FL_NO_EXCEPT
u16 easeInQuad16(u16 i) FL_NO_EXCEPT
16-bit quadratic ease-in function Takes an input value 0-65535 and returns an eased value 0-65535
u16 easeOutSine16(u16 i) FL_NO_EXCEPT
16-bit sine ease-out function Takes an input value 0-65535 and returns an eased value 0-65535
u8 easeInOutCubic8(u8 i) FL_NO_EXCEPT
8-bit cubic ease-in/ease-out function Takes an input value 0-255 and returns an eased value 0-255 Mor...
u8 easeInQuad8(u8 i) FL_NO_EXCEPT
8-bit quadratic ease-in function Takes an input value 0-255 and returns an eased value 0-255 The curv...
fl::ufixed_point< 4, 12 > GammaKey
const u16 GAMMA_2_8_LUT[256]
u8 easeInOutSine8(u8 i) FL_NO_EXCEPT
8-bit sine ease-in/ease-out function Takes an input value 0-255 and returns an eased value 0-255 Smoo...
u8 easeInSine8(u8 i) FL_NO_EXCEPT
8-bit sine ease-in function Takes an input value 0-255 and returns an eased value 0-255 Smooth sinuso...
FASTLED_FORCE_INLINE i32 cos32(u32 angle) FL_NO_EXCEPT
u16 easeInOutQuad16(u16 x) FL_NO_EXCEPT
16-bit quadratic ease-in/ease-out function Takes an input value 0-65535 and returns an eased value 0-...
expected< T, E > result
Alias for expected (Rust-style naming)
u8 easeInCubic8(u8 i) FL_NO_EXCEPT
8-bit cubic ease-in function Takes an input value 0-255 and returns an eased value 0-255 More pronoun...
u8 easeOutQuad8(u8 i) FL_NO_EXCEPT
8-bit quadratic ease-out function Takes an input value 0-255 and returns an eased value 0-255 The cur...
u16 easeInCubic16(u16 i) FL_NO_EXCEPT
16-bit cubic ease-in function Takes an input value 0-65535 and returns an eased value 0-65535
u16 easeOutCubic16(u16 i) FL_NO_EXCEPT
16-bit cubic ease-out function Takes an input value 0-65535 and returns an eased value 0-65535
u8 easeOutSine8(u8 i) FL_NO_EXCEPT
8-bit sine ease-out function Takes an input value 0-255 and returns an eased value 0-255 Smooth sinus...
u8 easeOutCubic8(u8 i) FL_NO_EXCEPT
8-bit cubic ease-out function Takes an input value 0-255 and returns an eased value 0-255 More pronou...
u16 easeInOutSine16(u16 i) FL_NO_EXCEPT
16-bit sine ease-in/ease-out function Takes an input value 0-65535 and returns an eased value 0-65535
u16 easeInSine16(u16 i) FL_NO_EXCEPT
16-bit sine ease-in function Takes an input value 0-65535 and returns an eased value 0-65535
u8 easeInOutQuad8(u8 i) FL_NO_EXCEPT
8-bit quadratic ease-in/ease-out function Takes an input value 0-255 and returns an eased value 0-255...
ufixed_integer< IntBits, FracBits > ufixed_point
u16 easeOutQuad16(u16 i) FL_NO_EXCEPT
16-bit quadratic ease-out function Takes an input value 0-65535 and returns an eased value 0-65535
Base definition for an LED controller.