17 0, 2023680, 1011840, 674560, 505920, 404736, 337280, 289097,
18 252960, 224853, 202368, 183971, 168640, 155668, 144549, 134912,
19 126480, 119040, 112427, 106509, 101184, 96366, 91985, 87986,
20 84320, 80947, 77834, 74951, 72274, 69782, 67456, 65280};
32 return static_cast<u16
>((
static_cast<u32
>(i) * scale_plus_one) >> 8);
40 u16 bright_p1,
bool apply_brightness,
44 if ((r16 | g16 | b16) == 0) {
51 if (apply_brightness) {
72 u8 r8 =
static_cast<u8>((r16 * scalef + 0x808000) >> 24);
73 u8 g8 =
static_cast<u8>((g16 * scalef + 0x808000) >> 24);
74 u8 b8 =
static_cast<u8>((b16 * scalef + 0x808000) >> 24);
76 *out =
CRGB(r8, g8, b8);
77 *out_power_5bit =
static_cast<u8>(
scale);
88 u16 n =
static_cast<u16
>(colors.size());
89 if (out_colors.size() < n) n =
static_cast<u16
>(out_colors.size());
90 if (out_power_5bit.size() < n) n =
static_cast<u16
>(out_power_5bit.size());
93 if (global_brightness == 0) {
94 for (u16 i = 0; i < n; ++i) {
95 out_colors[i] =
CRGB(0, 0, 0);
96 out_power_5bit[i] = 0;
104 const bool apply_r_scale = (colors_scale.r != 0xff);
105 const bool apply_g_scale = (colors_scale.g != 0xff);
106 const bool apply_b_scale = (colors_scale.b != 0xff);
107 const u16 rscale_p1 = 1u +
static_cast<u16
>(colors_scale.r);
108 const u16 gscale_p1 = 1u +
static_cast<u16
>(colors_scale.g);
109 const u16 bscale_p1 = 1u +
static_cast<u16
>(colors_scale.b);
112 const bool apply_brightness = (global_brightness != 0xff);
113 const u16 bright_p1 = 1u +
static_cast<u16
>(global_brightness);
115 for (u16 i = 0; i < n; ++i) {
116 const CRGB &c = colors[i];
118 u16 r16 = five_bit_impl::gamma_lut_read(glut, c.r);
119 u16 g16 = five_bit_impl::gamma_lut_read(glut, c.g);
120 u16 b16 = five_bit_impl::gamma_lut_read(glut, c.b);
123 if (apply_r_scale) r16 = five_bit_impl::scale16by8_nozero(r16, rscale_p1);
124 if (apply_g_scale) g16 = five_bit_impl::scale16by8_nozero(g16, gscale_p1);
125 if (apply_b_scale) b16 = five_bit_impl::scale16by8_nozero(b16, bscale_p1);
127 five_bit_impl::five_bit_pixel(r16, g16, b16, global_brightness,
128 bright_p1, apply_brightness,
129 &out_colors[i], &out_power_5bit[i]);
138 u16 n =
static_cast<u16
>(colors.size());
139 if (out.size() < n) n =
static_cast<u16
>(out.size());
142 if (global_brightness == 0) {
143 for (u16 i = 0; i < n; ++i) {
144 out[i].color =
CRGB(0, 0, 0);
145 out[i].brightness_5bit = 0;
153 const bool apply_r_scale = (colors_scale.r != 0xff);
154 const bool apply_g_scale = (colors_scale.g != 0xff);
155 const bool apply_b_scale = (colors_scale.b != 0xff);
156 const u16 rscale_p1 = 1u +
static_cast<u16
>(colors_scale.r);
157 const u16 gscale_p1 = 1u +
static_cast<u16
>(colors_scale.g);
158 const u16 bscale_p1 = 1u +
static_cast<u16
>(colors_scale.b);
161 const bool apply_brightness = (global_brightness != 0xff);
162 const u16 bright_p1 = 1u +
static_cast<u16
>(global_brightness);
164 for (u16 i = 0; i < n; ++i) {
165 const CRGB &c = colors[i];
167 u16 r16 = five_bit_impl::gamma_lut_read(glut, c.r);
168 u16 g16 = five_bit_impl::gamma_lut_read(glut, c.g);
169 u16 b16 = five_bit_impl::gamma_lut_read(glut, c.b);
172 if (apply_r_scale) r16 = five_bit_impl::scale16by8_nozero(r16, rscale_p1);
173 if (apply_g_scale) g16 = five_bit_impl::scale16by8_nozero(g16, gscale_p1);
174 if (apply_b_scale) b16 = five_bit_impl::scale16by8_nozero(b16, bscale_p1);
176 five_bit_impl::five_bit_pixel(r16, g16, b16, global_brightness,
177 bright_p1, apply_brightness,
178 &out[i].
color, &out[i].brightness_5bit);
197 if (min_field > 31) {
200 const u16 drives[3] = {r16, g16, b16};
203 for (
int i = 0; i < 3; ++i) {
204 target[i] =
static_cast<u32
>(
205 (
static_cast<u64>(drives[i]) * 7905u * 256u) / 65535u);
206 if (target[i] > brightest) {
207 brightest = target[i];
211 u32 field = brightest / 65408u + 1u;
212 if (field < min_field) {
218 const u32 unit = field * 256u;
219 for (
int i = 0; i < 3; ++i) {
220 const u32 code = (target[i] + unit / 2u) / unit;
221 out->raw[i] =
static_cast<u8>(code > 255u ? 255u : code);
223 *out_field =
static_cast<u8>(field);
fl::UISlider brightness("Brightness", BRIGHTNESS, 0, 255)
fl::UISlider scale("Scale", 4,.1, 4,.1)
Alignment macros and utilities for FastLED.
#define FL_OPTIMIZATION_LEVEL_O3_BEGIN
#define FL_OPTIMIZATION_LEVEL_O3_END
#define FL_OPTIMIZE_FUNCTION
#define constexpr
Declares that it is possible to evaluate a value at compile time, introduced in C++11.
#define FL_ALIGN_PROGMEM(N)
Force N-byte alignment for platforms with unaligned access or cache-line optimization.
#define FL_PGM_READ_DWORD_ALIGNED(addr)
#define FL_PGM_READ_WORD_ALIGNED(addr)
#define FL_PROGMEM
PROGMEM keyword for storage.
Declares functions for five-bit gamma correction.
Internal FastLED header for implementation files.
FL_ALWAYS_INLINE u16 gamma_lut_read(aligned_ptr< const u16, 64 > lut, u8 idx) FL_NO_EXCEPT
FL_ALWAYS_INLINE u16 scale16by8_nozero(u16 i, u16 scale_plus_one) FL_NO_EXCEPT
FL_ALWAYS_INLINE void five_bit_pixel(u16 r16, u16 g16, u16 b16, u8 brightness, u16 bright_p1, bool apply_brightness, CRGB *out, u8 *out_power_5bit) FL_NO_EXCEPT
void five_bit_hd_solve16(u16 r16, u16 g16, u16 b16, u8 min_field, CRGB *out, u8 *out_field) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
const u16 GAMMA_2_8_LUT[256]
FL_OPTIMIZE_FUNCTION void five_bit_hd_gamma_bitshift(fl::span< const CRGB > colors, CRGB colors_scale, u8 global_brightness, fl::span< CRGB > out_colors, fl::span< u8 > out_power_5bit) FL_NO_EXCEPT
Base definition for an LED controller.
Representation of an 8-bit RGB pixel (Red, Green, Blue)