FastLED 3.9.15
Loading...
Searching...
No Matches
rgbw.cpp
Go to the documentation of this file.
1
3
4#include "fl/stdint.h"
5
6#define FASTLED_INTERNAL
7#include "FastLED.h"
8
9#include "rgbw.h"
10
11
12namespace fl {
13
14
15namespace {
16inline uint8_t min3(uint8_t a, uint8_t b, uint8_t c) {
17 if (a < b) {
18 if (a < c) {
19 return a;
20 } else {
21 return c;
22 }
23 } else {
24 if (b < c) {
25 return b;
26 } else {
27 return c;
28 }
29 }
30}
31
32inline uint8_t divide_by_3(uint8_t x) {
33 uint16_t y = (uint16_t(x) * 85) >> 8;
34 return static_cast<uint8_t>(y);
35}
36} // namespace
37
38// @brief Converts RGB to RGBW using a color transfer method
39// from color channels to 3x white.
40// @author Jonathanese
41void rgb_2_rgbw_exact(uint16_t w_color_temperature, uint8_t r, uint8_t g,
42 uint8_t b, uint8_t r_scale, uint8_t g_scale,
43 uint8_t b_scale, uint8_t *out_r, uint8_t *out_g,
44 uint8_t *out_b, uint8_t *out_w) {
45 (void)w_color_temperature;
46 r = scale8(r, r_scale);
47 g = scale8(g, g_scale);
48 b = scale8(b, b_scale);
49 uint8_t min_component = min3(r, g, b);
50 *out_r = r - min_component;
51 *out_g = g - min_component;
52 *out_b = b - min_component;
53 *out_w = min_component;
54}
55
56void rgb_2_rgbw_max_brightness(uint16_t w_color_temperature, uint8_t r,
57 uint8_t g, uint8_t b, uint8_t r_scale,
58 uint8_t g_scale, uint8_t b_scale, uint8_t *out_r,
59 uint8_t *out_g, uint8_t *out_b, uint8_t *out_w) {
60 (void)w_color_temperature;
61 *out_r = scale8(r, r_scale);
62 *out_g = scale8(g, g_scale);
63 *out_b = scale8(b, b_scale);
64 *out_w = min3(r, g, b);
65}
66
67void rgb_2_rgbw_null_white_pixel(uint16_t w_color_temperature, uint8_t r,
68 uint8_t g, uint8_t b, uint8_t r_scale,
69 uint8_t g_scale, uint8_t b_scale,
70 uint8_t *out_r, uint8_t *out_g, uint8_t *out_b,
71 uint8_t *out_w) {
72 (void)w_color_temperature;
73 *out_r = scale8(r, r_scale);
74 *out_g = scale8(g, g_scale);
75 *out_b = scale8(b, b_scale);
76 *out_w = 0;
77}
78
79void rgb_2_rgbw_white_boosted(uint16_t w_color_temperature, uint8_t r,
80 uint8_t g, uint8_t b, uint8_t r_scale,
81 uint8_t g_scale, uint8_t b_scale, uint8_t *out_r,
82 uint8_t *out_g, uint8_t *out_b, uint8_t *out_w) {
83 (void)w_color_temperature;
84 r = scale8(r, r_scale);
85 g = scale8(g, g_scale);
86 b = scale8(b, b_scale);
87 uint8_t min_component = min3(r, g, b);
88 uint8_t w;
89 bool is_min = true;
90 if (min_component <= 84) {
91 w = 3 * min_component;
92 } else {
93 w = 255;
94 is_min = false;
95 }
96 uint8_t r_prime;
97 uint8_t g_prime;
98 uint8_t b_prime;
99 if (is_min) {
100 r_prime = r - min_component;
101 g_prime = g - min_component;
102 b_prime = b - min_component;
103 } else {
104 uint8_t w3 = divide_by_3(w);
105 r_prime = r - w3;
106 g_prime = g - w3;
107 b_prime = b - w3;
108 }
109
110 *out_r = r_prime;
111 *out_g = g_prime;
112 *out_b = b_prime;
113 *out_w = w;
114}
115
117
119 if (func == nullptr) {
121 return;
122 }
123 g_user_function = func;
124}
125
126void rgb_2_rgbw_user_function(uint16_t w_color_temperature, uint8_t r,
127 uint8_t g, uint8_t b, uint8_t r_scale,
128 uint8_t g_scale, uint8_t b_scale, uint8_t *out_r,
129 uint8_t *out_g, uint8_t *out_b, uint8_t *out_w) {
130 g_user_function(w_color_temperature, r, g, b, r_scale, g_scale, b_scale,
131 out_r, out_g, out_b, out_w);
132}
133
134void rgbw_partial_reorder(EOrderW w_placement, uint8_t b0, uint8_t b1,
135 uint8_t b2, uint8_t w, uint8_t *out_b0,
136 uint8_t *out_b1, uint8_t *out_b2, uint8_t *out_b3) {
137
138 uint8_t out[4] = {b0, b1, b2, 0};
139 switch (w_placement) {
140 // unrolled loop for speed.
141 case W3:
142 out[3] = w;
143 break;
144 case W2:
145 out[3] = out[2]; // memmove and copy.
146 out[2] = w;
147 break;
148 case W1:
149 out[3] = out[2];
150 out[2] = out[1];
151 out[1] = w;
152 break;
153 case W0:
154 out[3] = out[2];
155 out[2] = out[1];
156 out[1] = out[0];
157 out[0] = w;
158 break;
159 }
160 *out_b0 = out[0];
161 *out_b1 = out[1];
162 *out_b2 = out[2];
163 *out_b3 = out[3];
164}
165
166} // namespace fl
int y
Definition simple.h:93
int x
Definition simple.h:92
central include file for FastLED, defines the CFastLED class/object
Functions for red, green, blue, white (RGBW) output.
LIB8STATIC_ALWAYS_INLINE uint8_t scale8(uint8_t i, fract8 scale)
Scale one byte by a second one, which is treated as the numerator of a fraction whose denominator is ...
Definition scale8.h:44
uint8_t min3(uint8_t a, uint8_t b, uint8_t c)
Definition rgbw.cpp:16
uint8_t divide_by_3(uint8_t x)
Definition rgbw.cpp:32
rgb_2_rgbw_function g_user_function
Definition rgbw.cpp:116
void(* rgb_2_rgbw_function)(uint16_t w_color_temperature, uint8_t r, uint8_t g, uint8_t b, uint8_t r_scale, uint8_t g_scale, uint8_t b_scale, uint8_t *out_r, uint8_t *out_g, uint8_t *out_b, uint8_t *out_w)
Definition rgbw.h:84
void rgb_2_rgbw_user_function(uint16_t w_color_temperature, uint8_t r, uint8_t g, uint8_t b, uint8_t r_scale, uint8_t g_scale, uint8_t b_scale, uint8_t *out_r, uint8_t *out_g, uint8_t *out_b, uint8_t *out_w)
Definition rgbw.cpp:126
void rgb_2_rgbw_exact(uint16_t w_color_temperature, uint8_t r, uint8_t g, uint8_t b, uint8_t r_scale, uint8_t g_scale, uint8_t b_scale, uint8_t *out_r, uint8_t *out_g, uint8_t *out_b, uint8_t *out_w)
Converts RGB to RGBW using a color transfer method from saturated color channels to white.
Definition rgbw.cpp:41
void rgb_2_rgbw_null_white_pixel(uint16_t w_color_temperature, uint8_t r, uint8_t g, uint8_t b, uint8_t r_scale, uint8_t g_scale, uint8_t b_scale, uint8_t *out_r, uint8_t *out_g, uint8_t *out_b, uint8_t *out_w)
Converts RGB to RGBW with the W channel set to black, always.
Definition rgbw.cpp:67
void rgb_2_rgbw_max_brightness(uint16_t w_color_temperature, uint8_t r, uint8_t g, uint8_t b, uint8_t r_scale, uint8_t g_scale, uint8_t b_scale, uint8_t *out_r, uint8_t *out_g, uint8_t *out_b, uint8_t *out_w)
The minimum brigthness of the RGB channels is used to set the W channel.
Definition rgbw.cpp:56
void rgb_2_rgbw_white_boosted(uint16_t w_color_temperature, uint8_t r, uint8_t g, uint8_t b, uint8_t r_scale, uint8_t g_scale, uint8_t b_scale, uint8_t *out_r, uint8_t *out_g, uint8_t *out_b, uint8_t *out_w)
Converts RGB to RGBW with a boosted white channel.
Definition rgbw.cpp:79
void rgbw_partial_reorder(EOrderW w_placement, uint8_t b0, uint8_t b1, uint8_t b2, uint8_t w, uint8_t *out_b0, uint8_t *out_b1, uint8_t *out_b2, uint8_t *out_b3)
Definition rgbw.cpp:134
EOrderW
Definition eorder.h:23
@ W2
White is third.
Definition eorder.h:25
@ W3
White is fourth.
Definition eorder.h:24
@ W0
White is first.
Definition eorder.h:27
@ W1
White is second.
Definition eorder.h:26
void set_rgb_2_rgbw_function(rgb_2_rgbw_function func)
Definition rgbw.cpp:118
IMPORTANT!
Definition crgb.h:20