FastLED 3.9.15
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
83
92
95struct RgbwwDefault : public Rgbww {
97 static Rgbww value() FL_NOEXCEPT { return RgbwwDefault(); }
98};
99
100// ===== rgb_2_rgbww dispatch surface (#2558) =================================
101//
102// Mirror of the rgb_2_rgbw dispatch family. Real-path implementations run
103// when FASTLED_RGBW_COLORIMETRIC=1 is set at library build time; without it,
104// the library ships stubs that emit FL_WARN_ONCE and output zeros.
105//
106// Signature note: unlike rgb_2_rgbw_function (scalar fields), the RGBWW
107// signature takes the Rgbww config struct by-ref to carry the two CCTs and
108// the optional profile pointer in one parameter.
109
110typedef void (*rgb_2_rgbww_function)(const Rgbww& cfg,
111 fl::u8 r, fl::u8 g, fl::u8 b,
112 fl::u8 r_scale, fl::u8 g_scale, fl::u8 b_scale,
113 fl::u8 *out_r, fl::u8 *out_g, fl::u8 *out_b,
114 fl::u8 *out_ww, fl::u8 *out_wc);
115
119void rgb_2_rgbww_colorimetric(const Rgbww& cfg,
120 fl::u8 r, fl::u8 g, fl::u8 b,
121 fl::u8 r_scale, fl::u8 g_scale, fl::u8 b_scale,
122 fl::u8 *out_r, fl::u8 *out_g, fl::u8 *out_b,
123 fl::u8 *out_ww, fl::u8 *out_wc) FL_NOEXCEPT;
124
128 fl::u8 r, fl::u8 g, fl::u8 b,
129 fl::u8 r_scale, fl::u8 g_scale, fl::u8 b_scale,
130 fl::u8 *out_r, fl::u8 *out_g, fl::u8 *out_b,
131 fl::u8 *out_ww, fl::u8 *out_wc) FL_NOEXCEPT;
132
135void rgb_2_rgbww_user_function(const Rgbww& cfg,
136 fl::u8 r, fl::u8 g, fl::u8 b,
137 fl::u8 r_scale, fl::u8 g_scale, fl::u8 b_scale,
138 fl::u8 *out_r, fl::u8 *out_g, fl::u8 *out_b,
139 fl::u8 *out_ww, fl::u8 *out_wc) FL_NOEXCEPT;
140
142
143// ===== Default RGBCCT profile + active-profile API (Phase D of #2558) =======
144//
145// Ships the default warm-W (2700K) + cool-W (6500K) profile used when an
146// Rgbww config carries `profile = nullptr`. Users with a colorimeter or
147// custom RGBWW chipset install their own via set_rgbww_colorimetric_profile().
148// Pointer is borrowed — caller keeps the profile alive for the lifetime of
149// any controller referencing it. Pass nullptr to revert to the default.
150
152
155
166void rgbww_partial_reorder(EOrderWW ww_placement,
167 fl::u8 b0, fl::u8 b1, fl::u8 b2,
168 fl::u8 ww, fl::u8 wc,
169 fl::u8 *out_b0, fl::u8 *out_b1, fl::u8 *out_b2,
170 fl::u8 *out_b3, fl::u8 *out_b4) FL_NOEXCEPT;
171
174 fl::u8 r, fl::u8 g, fl::u8 b,
175 fl::u8 r_scale, fl::u8 g_scale, fl::u8 b_scale,
176 fl::u8 *out_r, fl::u8 *out_g, fl::u8 *out_b,
177 fl::u8 *out_ww, fl::u8 *out_wc) FL_NOEXCEPT {
178 switch (cfg.rgbww_mode) {
179 case RGBWW_MODE::kRGBWWInvalid:
180 // Inactive: emit zeros across all five channels.
181 *out_r = *out_g = *out_b = *out_ww = *out_wc = 0;
182 return;
183 case RGBWW_MODE::kRGBWWColorimetric:
184 rgb_2_rgbww_colorimetric(cfg, r, g, b, r_scale, g_scale, b_scale,
185 out_r, out_g, out_b, out_ww, out_wc);
186 return;
187 case RGBWW_MODE::kRGBWWColorimetricBoosted:
188 rgb_2_rgbww_colorimetric_boosted(cfg, r, g, b, r_scale, g_scale, b_scale,
189 out_r, out_g, out_b, out_ww, out_wc);
190 return;
191 case RGBWW_MODE::kRGBWWUserFunction:
192 rgb_2_rgbww_user_function(cfg, r, g, b, r_scale, g_scale, b_scale,
193 out_r, out_g, out_b, out_ww, out_wc);
194 return;
195 }
196 *out_r = *out_g = *out_b = *out_ww = *out_wc = 0;
197}
198
199} // namespace fl
unsigned char u8
Definition s16x16x4.h:132
unsigned char u8
Definition stdint.h:131
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_NOEXCEPT
Colorimetric white-overdrive solver for RGBWW (wx_lp_legacy + RGBCCT layered blend).
const colorimetric_detail::RgbcctProfile kRgbwwDefaultProfile
Definition rgbww.cpp.hpp:53
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 set_rgb_2_rgbww_function(rgb_2_rgbww_function func) FL_NOEXCEPT
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_NOEXCEPT
User-installable RGB->RGBWW function.
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_NOEXCEPT
Colorimetric strict sub-gamut solver for RGBWW (gist sec 5 + sec 11-12, using solve_rgbcct from rgbw_...
@ kRGBWWDefaultWarmCct
Definition rgbww.h:54
@ kRGBWWDefaultCoolCct
Definition rgbww.h:55
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_NOEXCEPT
Definition rgbww.h:173
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:110
void set_rgbww_colorimetric_profile(const colorimetric_detail::RgbcctProfile *profile) FL_NOEXCEPT
Definition rgbww.cpp.hpp:98
const colorimetric_detail::RgbcctProfile * get_rgbww_colorimetric_profile() FL_NOEXCEPT
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_NOEXCEPT
Dispatch RGB->RGBWW for a given mode.
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
Base definition for an LED controller.
Definition crgb.hpp:179
#define FASTLED_FORCE_INLINE
#define FL_NOEXCEPT
FASTLED_FORCE_INLINE bool active() const FL_NOEXCEPT
Definition rgbww.h:79
RGBWW_MODE rgbww_mode
Definition rgbww.h:71
Rgbww(fl::u16 warm=kRGBWWDefaultWarmCct, fl::u16 cool=kRGBWWDefaultCoolCct, RGBWW_MODE mode=RGBWW_MODE::kRGBWWColorimetric, EOrderWW placement=EOrderWW::WWDefault) FL_NOEXCEPT
Definition rgbww.h:61
const colorimetric_detail::RgbcctProfile * profile
Optional override for the diode profile (warm + cool W chromaticity + luminance).
Definition rgbww.h:77
fl::u16 warm_cct
Definition rgbww.h:69
EOrderWW w_placement
Definition rgbww.h:72
fl::u16 cool_cct
Definition rgbww.h:70
RgbwwDefault() FL_NOEXCEPT
Definition rgbww.h:96
static Rgbww value() FL_NOEXCEPT
Definition rgbww.h:97
Per-strip RGBWW configuration.
Definition rgbww.h:60
RgbwwInvalid() FL_NOEXCEPT
Definition rgbww.h:87
static Rgbww value() FL_NOEXCEPT
Definition rgbww.h:90