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

◆ operator=() [6/6]

CRGBPalette16 & CRGBPalette16::operator= ( TProgmemRGBGradientPalette_bytes progpal)
inline

Creates a palette from a gradient palette in PROGMEM.

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 1215 of file colorutils.h.

1216 {
1217 TRGBGradientPaletteEntryUnion* progent = (TRGBGradientPaletteEntryUnion*)(progpal);
1218 TRGBGradientPaletteEntryUnion u;
1219
1220 // Count entries
1221 uint16_t count = 0;
1222 do {
1223 u.dword = FL_PGM_READ_DWORD_NEAR(progent + count);
1224 ++count;
1225 } while ( u.index != 255);
1226
1227 int8_t lastSlotUsed = -1;
1228
1229 u.dword = FL_PGM_READ_DWORD_NEAR( progent);
1230 CRGB rgbstart( u.r, u.g, u.b);
1231
1232 int indexstart = 0;
1233 uint8_t istart8 = 0;
1234 uint8_t iend8 = 0;
1235 while( indexstart < 255) {
1236 ++progent;
1237 u.dword = FL_PGM_READ_DWORD_NEAR( progent);
1238 int indexend = u.index;
1239 CRGB rgbend( u.r, u.g, u.b);
1240 istart8 = indexstart / 16;
1241 iend8 = indexend / 16;
1242 if( count < 16) {
1243 if( (istart8 <= lastSlotUsed) && (lastSlotUsed < 15)) {
1244 istart8 = lastSlotUsed + 1;
1245 if( iend8 < istart8) {
1246 iend8 = istart8;
1247 }
1248 }
1249 lastSlotUsed = iend8;
1250 }
1251 fill_gradient_RGB( &(entries[0]), istart8, rgbstart, iend8, rgbend);
1252 indexstart = indexend;
1253 rgbstart = rgbend;
1254 }
1255 return *this;
1256 }
CRGB entries[16]
the color entries that make up the palette
#define FL_PGM_READ_DWORD_NEAR(x)
Read a double word (32-bit) from PROGMEM memory.
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.
uint32_t dword
values as a packed 32-bit double word
Definition colorutils.h:684

References CRGBPalette16(), TRGBGradientPaletteEntryUnion::dword, entries, fill_gradient_RGB(), and FL_PGM_READ_DWORD_NEAR.

+ Here is the call graph for this function: