Fill a range of LEDs with a smooth HSV gradient between two HSV colors.
107 {
108
109 if (endpos < startpos) {
112 endcolor = startcolor;
113 endpos = startpos;
115 startcolor = tc;
116 }
117
118
119
120
121
122 if (endcolor.value == 0 || endcolor.saturation == 0) {
123 endcolor.hue = startcolor.hue;
124 }
125
126
127
128
129
130 if (startcolor.value == 0 || startcolor.saturation == 0) {
131 startcolor.hue = endcolor.hue;
132 }
133
137
138 satdistance87 = (endcolor.sat - startcolor.sat) << 7;
139 valdistance87 = (endcolor.val - startcolor.val) << 7;
140
141 fl::u8 huedelta8 = endcolor.hue - startcolor.hue;
142
145 if (huedelta8 > 127) {
147 }
148 }
149
152 if (huedelta8 < 128) {
154 }
155 }
156
158 huedistance87 = huedelta8 << 7;
159 } else
160 {
161 huedistance87 = (
fl::u8)(256 - huedelta8) << 7;
162 huedistance87 = -huedistance87;
163 }
164
165 u16 pixeldistance = endpos - startpos;
166 i16 divisor = pixeldistance ? pixeldistance : 1;
167
168#if FASTLED_USE_32_BIT_GRADIENT_FILL
169
170 i32 huedelta823 = (huedistance87 * 65536) / divisor;
171 i32 satdelta823 = (satdistance87 * 65536) / divisor;
172 i32 valdelta823 = (valdistance87 * 65536) / divisor;
173
174 huedelta823 *= 2;
175 satdelta823 *= 2;
176 valdelta823 *= 2;
177 u32 hue824 = static_cast<u32>(startcolor.hue) << 24;
178 u32 sat824 = static_cast<u32>(startcolor.sat) << 24;
179 u32 val824 = static_cast<u32>(startcolor.val) << 24;
180 for (u16 i = startpos; i <= endpos; ++i) {
181 targetArray[i] =
CHSV(hue824 >> 24, sat824 >> 24, val824 >> 24);
182 hue824 += huedelta823;
183 sat824 += satdelta823;
184 val824 += valdelta823;
185 }
186#else
187
188 saccum87 huedelta87 = huedistance87 / divisor;
189 saccum87 satdelta87 = satdistance87 / divisor;
190 saccum87 valdelta87 = valdistance87 / divisor;
191
192 huedelta87 *= 2;
193 satdelta87 *= 2;
194 valdelta87 *= 2;
195
196 accum88 hue88 = startcolor.hue << 8;
197 accum88 sat88 = startcolor.sat << 8;
198 accum88 val88 = startcolor.val << 8;
199 for (u16 i = startpos; i <= endpos; ++i) {
200 targetArray[i] =
CHSV(hue88 >> 8, sat88 >> 8, val88 >> 8);
201 hue88 += huedelta87;
202 sat88 += satdelta87;
203 val88 += valdelta87;
204 }
205#endif
206}
#define saccum87
ANSI: signed short _Accum.
u16 accum88
ANSI: unsigned short _Accum. 8 bits int, 8 bits fraction.
@ SHORTEST_HUES
Hue goes whichever way is shortest.
@ LONGEST_HUES
Hue goes whichever way is longest.
@ FORWARD_HUES
Hue always goes clockwise around the color wheel.
@ BACKWARD_HUES
Hue always goes counter-clockwise around the color wheel.