FastLED 3.9.15
Loading...
Searching...
No Matches

◆ loadDynamicGradientPalette()

CRGBPalette16 & CRGBPalette16::loadDynamicGradientPalette ( TDynamicRGBGradientPalette_bytes gpal)
inline

Creates a palette from a gradient palette in dynamic (heap) memory.

Gradient palettes are loaded into CRGBPalettes in such a way that, if possible, every color represented in the gradient palette is also represented in the CRGBPalette.

For example, consider a gradient palette that is all black except for a single, one-element-wide (1/256th!) spike of red in the middle:

0, 0,0,0
124, 0,0,0
125, 255,0,0 // one 1/256th-palette-wide red stripe
126, 0,0,0
255, 0,0,0

A naive conversion of this 256-element palette to a 16-element palette might accidentally completely eliminate the red spike, rendering the palette completely black.

However, the conversions provided here would attempt to include a the red stripe in the output, more-or-less as faithfully as possible. So in this case, the resulting CRGBPalette16 palette would have a red stripe in the middle which was 1/16th of a palette wide – the narrowest possible in a CRGBPalette16.

This means that the relative width of stripes in a CRGBPalette16 will be, by definition, different from the widths in the gradient palette. This code attempts to preserve "all the colors", rather than the exact stripe widths at the expense of dropping some colors.

Definition at line 1259 of file colorutils.h.

1260 {
1261 TRGBGradientPaletteEntryUnion* ent = (TRGBGradientPaletteEntryUnion*)(gpal);
1262 TRGBGradientPaletteEntryUnion u;
1263
1264 // Count entries
1265 uint16_t count = 0;
1266 do {
1267 u = *(ent + count);
1268 ++count;
1269 } while ( u.index != 255);
1270
1271 int8_t lastSlotUsed = -1;
1272
1273
1274 u = *ent;
1275 CRGB rgbstart( u.r, u.g, u.b);
1276
1277 int indexstart = 0;
1278 uint8_t istart8 = 0;
1279 uint8_t iend8 = 0;
1280 while( indexstart < 255) {
1281 ++ent;
1282 u = *ent;
1283 int indexend = u.index;
1284 CRGB rgbend( u.r, u.g, u.b);
1285 istart8 = indexstart / 16;
1286 iend8 = indexend / 16;
1287 if( count < 16) {
1288 if( (istart8 <= lastSlotUsed) && (lastSlotUsed < 15)) {
1289 istart8 = lastSlotUsed + 1;
1290 if( iend8 < istart8) {
1291 iend8 = istart8;
1292 }
1293 }
1294 lastSlotUsed = iend8;
1295 }
1296 fill_gradient_RGB( &(entries[0]), istart8, rgbstart, iend8, rgbend);
1297 indexstart = indexend;
1298 rgbstart = rgbend;
1299 }
1300 return *this;
1301 }
CRGB entries[16]
the color entries that make up the palette
void fill_gradient_RGB(CRGB *leds, uint16_t startpos, CRGB startcolor, uint16_t endpos, CRGB endcolor)
Fill a range of LEDs with a smooth RGB gradient between two RGB colors.

References CRGBPalette16(), entries, and fill_gradient_RGB().

+ Here is the call graph for this function: