FastLED 3.10.8
Loading...
Searching...
No Matches
rgbww.h
Go to the documentation of this file.
1
7
8#pragma once
9
10#include "fl/stl/stdint.h"
12#include "fl/stl/noexcept.h"
13
14namespace fl {
15
16// Forward decl — full definition in fl/gfx/rgbw_colorimetric.h. Avoiding the
17// transitive include keeps Rgbww's compile cost minimal in callers that don't
18// need the colorimetric solver.
19namespace colorimetric_detail {
20struct RgbcctProfile;
21}
22
27enum class EOrderWW : fl::u8 {
28 WwWcEnd = 0x34,
29 WcWwEnd = 0x43,
30 WwWcStart = 0x01,
31 WcWwStart = 0x10,
33};
34
42enum class RGBWW_MODE : fl::u8 {
46 // IMPORTANT: kRGBWWUserFunction MUST remain the last enumerator. New
47 // modes are added immediately above this line so the user-function
48 // ordinal stays as the dispatch max value.
50};
51
53enum {
56};
57
60struct Rgbww;
61
62namespace detail {
67using RgbwwConvertFn = void (*)(const Rgbww& rgbww, const fl::u8 (&raw)[3],
68 const fl::u8 (&premix)[3], const fl::u8 (&order)[3],
69 fl::u8* b0, fl::u8* b1, fl::u8* b2,
70 fl::u8* b3, fl::u8* b4);
72} // namespace detail
73
104
107struct RgbwwInvalid : public Rgbww {
111 static Rgbww value() FL_NO_EXCEPT { return RgbwwInvalid(); }
112};
113
116struct RgbwwDefault : public Rgbww {
118 static Rgbww value() FL_NO_EXCEPT { return RgbwwDefault(); }
119};
120
121// ===== rgb_2_rgbww dispatch surface (#2558) =================================
122//
123// Mirror of the rgb_2_rgbw dispatch family. Real-path implementations run
124// when FASTLED_RGBW_COLORIMETRIC=1 is set at library build time; without it,
125// the library ships stubs that emit FL_WARN_ONCE and output zeros.
126//
127// Signature note: unlike rgb_2_rgbw_function (scalar fields), the RGBWW
128// signature takes the Rgbww config struct by-ref to carry the two CCTs and
129// the optional profile pointer in one parameter.
130
131typedef void (*rgb_2_rgbww_function)(const Rgbww& cfg,
132 fl::u8 r, fl::u8 g, fl::u8 b,
133 fl::u8 r_scale, fl::u8 g_scale, fl::u8 b_scale,
134 fl::u8 *out_r, fl::u8 *out_g, fl::u8 *out_b,
135 fl::u8 *out_ww, fl::u8 *out_wc);
136
140void rgb_2_rgbww_colorimetric(const Rgbww& cfg,
141 fl::u8 r, fl::u8 g, fl::u8 b,
142 fl::u8 r_scale, fl::u8 g_scale, fl::u8 b_scale,
143 fl::u8 *out_r, fl::u8 *out_g, fl::u8 *out_b,
144 fl::u8 *out_ww, fl::u8 *out_wc) FL_NO_EXCEPT;
145
149 fl::u8 r, fl::u8 g, fl::u8 b,
150 fl::u8 r_scale, fl::u8 g_scale, fl::u8 b_scale,
151 fl::u8 *out_r, fl::u8 *out_g, fl::u8 *out_b,
152 fl::u8 *out_ww, fl::u8 *out_wc) FL_NO_EXCEPT;
153
156void rgb_2_rgbww_user_function(const Rgbww& cfg,
157 fl::u8 r, fl::u8 g, fl::u8 b,
158 fl::u8 r_scale, fl::u8 g_scale, fl::u8 b_scale,
159 fl::u8 *out_r, fl::u8 *out_g, fl::u8 *out_b,
160 fl::u8 *out_ww, fl::u8 *out_wc) FL_NO_EXCEPT;
161
163
164// ===== Default RGBCCT profile + active-profile API (Phase D of #2558) =======
165//
166// Ships the default warm-W (2700K) + cool-W (6500K) profile used when an
167// Rgbww config carries `profile = nullptr`. Users with a colorimeter or
168// custom RGBWW chipset install their own via set_rgbww_colorimetric_profile().
169// Pointer is borrowed — caller keeps the profile alive for the lifetime of
170// any controller referencing it. Pass nullptr to revert to the default.
171
173
176
187void rgbww_partial_reorder(EOrderWW ww_placement,
188 fl::u8 b0, fl::u8 b1, fl::u8 b2,
189 fl::u8 ww, fl::u8 wc,
190 fl::u8 *out_b0, fl::u8 *out_b1, fl::u8 *out_b2,
191 fl::u8 *out_b3, fl::u8 *out_b4) FL_NO_EXCEPT;
192
195 fl::u8 r, fl::u8 g, fl::u8 b,
196 fl::u8 r_scale, fl::u8 g_scale, fl::u8 b_scale,
197 fl::u8 *out_r, fl::u8 *out_g, fl::u8 *out_b,
198 fl::u8 *out_ww, fl::u8 *out_wc) FL_NO_EXCEPT {
199 switch (cfg.rgbww_mode) {
200 case RGBWW_MODE::kRGBWWInvalid:
201 // Inactive: emit zeros across all five channels.
202 *out_r = *out_g = *out_b = *out_ww = *out_wc = 0;
203 return;
204 case RGBWW_MODE::kRGBWWColorimetric:
205 rgb_2_rgbww_colorimetric(cfg, r, g, b, r_scale, g_scale, b_scale,
206 out_r, out_g, out_b, out_ww, out_wc);
207 return;
208 case RGBWW_MODE::kRGBWWColorimetricBoosted:
209 rgb_2_rgbww_colorimetric_boosted(cfg, r, g, b, r_scale, g_scale, b_scale,
210 out_r, out_g, out_b, out_ww, out_wc);
211 return;
212 case RGBWW_MODE::kRGBWWUserFunction:
213 rgb_2_rgbww_user_function(cfg, r, g, b, r_scale, g_scale, b_scale,
214 out_r, out_g, out_b, out_ww, out_wc);
215 return;
216 }
217 *out_r = *out_g = *out_b = *out_ww = *out_wc = 0;
218}
219
220} // namespace fl
#define FASTLED_FORCE_INLINE
void(*)(const Rgbww &rgbww, const fl::u8(&raw)[3], const fl::u8(&premix)[3], const fl::u8(&order)[3], fl::u8 *b0, fl::u8 *b1, fl::u8 *b2, fl::u8 *b3, fl::u8 *b4) RgbwwConvertFn
Definition rgbww.h:67
RgbwwConvertFn rgbww_conversion() FL_NO_EXCEPT
void enable_rgbww_conversion() FL_NO_EXCEPT
Installs the RGBWW pixel conversion (see enable_rgbw_conversion, #4795).
Compile-time linker keep-alive hook for a single fl::Bus.
Definition bus_info.h:57
Tag for constructing an inactive Rgbww without linking the RGBWW encoder.
Definition rgbww.h:64
unsigned char u8
Definition stdint.h:131
void rgbww_partial_reorder(EOrderWW ww_placement, u8 b0, u8 b1, u8 b2, u8 ww, u8 wc, u8 *out_b0, u8 *out_b1, u8 *out_b2, u8 *out_b3, u8 *out_b4) FL_NO_EXCEPT
Dispatch RGB->RGBWW for a given mode.
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
const colorimetric_detail::RgbcctProfile kRgbwwDefaultProfile
Definition rgbww.cpp.hpp:53
const colorimetric_detail::RgbcctProfile * get_rgbww_colorimetric_profile() FL_NO_EXCEPT
EOrderWW
White-byte ordering for 5-channel RGBWW output.
Definition rgbww.h:27
@ WcWwEnd
RGB followed by cool-W, warm-W.
Definition rgbww.h:29
@ WwWcEnd
RGB followed by warm-W, cool-W.
Definition rgbww.h:28
@ WcWwStart
cool-W, warm-W, then RGB
Definition rgbww.h:31
@ WwWcStart
warm-W, cool-W, then RGB
Definition rgbww.h:30
@ WWDefault
Definition rgbww.h:32
void rgb_2_rgbww_colorimetric(const Rgbww &cfg, u8 r, u8 g, u8 b, u8 r_scale, u8 g_scale, u8 b_scale, u8 *out_r, u8 *out_g, u8 *out_b, u8 *out_ww, u8 *out_wc) FL_NO_EXCEPT
Colorimetric strict sub-gamut solver for RGBWW (gist sec 5 + sec 11-12, using solve_rgbcct from rgbw_...
void set_rgbww_colorimetric_profile(const colorimetric_detail::RgbcctProfile *profile) FL_NO_EXCEPT
Definition rgbww.cpp.hpp:98
void rgb_2_rgbww_user_function(const Rgbww &cfg, u8 r, u8 g, u8 b, u8 r_scale, u8 g_scale, u8 b_scale, u8 *out_r, u8 *out_g, u8 *out_b, u8 *out_ww, u8 *out_wc) FL_NO_EXCEPT
User-installable RGB->RGBWW function.
void set_rgb_2_rgbww_function(rgb_2_rgbww_function func) FL_NO_EXCEPT
@ kRGBWWDefaultWarmCct
Definition rgbww.h:54
@ kRGBWWDefaultCoolCct
Definition rgbww.h:55
InputGamut g
Definition rgbw.h:125
void(* rgb_2_rgbww_function)(const Rgbww &cfg, fl::u8 r, fl::u8 g, fl::u8 b, fl::u8 r_scale, fl::u8 g_scale, fl::u8 b_scale, fl::u8 *out_r, fl::u8 *out_g, fl::u8 *out_b, fl::u8 *out_ww, fl::u8 *out_wc)
Definition rgbww.h:131
FASTLED_FORCE_INLINE void rgb_2_rgbww(const Rgbww &cfg, fl::u8 r, fl::u8 g, fl::u8 b, fl::u8 r_scale, fl::u8 g_scale, fl::u8 b_scale, fl::u8 *out_r, fl::u8 *out_g, fl::u8 *out_b, fl::u8 *out_ww, fl::u8 *out_wc) FL_NO_EXCEPT
Definition rgbww.h:194
RGBWW_MODE
RGB -> RGBWW conversion modes (issue #2558, Phase 3 of #2545).
Definition rgbww.h:42
@ kRGBWWUserFunction
Definition rgbww.h:49
@ kRGBWWColorimetric
Definition rgbww.h:44
@ kRGBWWInvalid
Definition rgbww.h:43
@ kRGBWWColorimetricBoosted
Definition rgbww.h:45
void rgb_2_rgbww_colorimetric_boosted(const Rgbww &cfg, u8 r, u8 g, u8 b, u8 r_scale, u8 g_scale, u8 b_scale, u8 *out_r, u8 *out_g, u8 *out_b, u8 *out_ww, u8 *out_wc) FL_NO_EXCEPT
Colorimetric white-overdrive solver for RGBWW (wx_lp_legacy + RGBCCT layered blend).
Base definition for an LED controller.
Definition crgb.hpp:179
Rgbww(fl::u16 warm=kRGBWWDefaultWarmCct, fl::u16 cool=kRGBWWDefaultCoolCct, RGBWW_MODE mode=RGBWW_MODE::kRGBWWColorimetric, EOrderWW placement=EOrderWW::WWDefault) FL_NO_EXCEPT
Definition rgbww.h:75
Rgbww(detail::RgbwwNoEncoder) FL_NO_EXCEPT
Inactive value that does not link the RGBWW encoder (RgbwwInvalid).
Definition rgbww.h:85
RGBWW_MODE rgbww_mode
Definition rgbww.h:92
FASTLED_FORCE_INLINE bool active() const FL_NO_EXCEPT
Definition rgbww.h:100
const colorimetric_detail::RgbcctProfile * profile
Optional override for the diode profile (warm + cool W chromaticity + luminance).
Definition rgbww.h:98
fl::u16 warm_cct
Definition rgbww.h:90
EOrderWW w_placement
Definition rgbww.h:93
fl::u16 cool_cct
Definition rgbww.h:91
RgbwwDefault() FL_NO_EXCEPT
Definition rgbww.h:117
static Rgbww value() FL_NO_EXCEPT
Definition rgbww.h:118
static Rgbww value() FL_NO_EXCEPT
Definition rgbww.h:111
RgbwwInvalid() FL_NO_EXCEPT
Definition rgbww.h:108