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

◆ ColorFromPalette() [1/8]

CHSV ColorFromPalette ( const CHSVPalette16 & pal,
uint8_t index,
uint8_t brightness = 255,
TBlendType blendType = LINEARBLEND )

Get a color from a palette.

These are the main functions for getting and using palette colors. Regardless of the number of entries in the base palette, this function will interpolate between entries to turn the discrete colors into a smooth gradient.

Parameters
palthe palette to retrieve the color from
indexthe position in the palette to retrieve the color for (0-255)
brightnessoptional brightness value to scale the resulting color
blendTypewhether to take the palette entries directly (NOBLEND) or blend linearly between palette entries (LINEARBLEND)

Definition at line 1113 of file colorutils.cpp.

1114{
1115 if ( blendType == LINEARBLEND_NOWRAP) {
1116 index = map8(index, 0, 239); // Blend range is affected by lo4 blend of values, remap to avoid wrapping
1117 }
1118
1119 // hi4 = index >> 4;
1120 uint8_t hi4 = lsrX4(index);
1121 uint8_t lo4 = index & 0x0F;
1122
1123 // CRGB rgb1 = pal[ hi4];
1124 const CHSV* entry = &(pal[0]) + hi4;
1125
1126 uint8_t hue1 = entry->hue;
1127 uint8_t sat1 = entry->sat;
1128 uint8_t val1 = entry->val;
1129
1130 uint8_t blend = lo4 && (blendType != NOBLEND);
1131
1132 if( blend ) {
1133
1134 if( hi4 == 15 ) {
1135 entry = &(pal[0]);
1136 } else {
1137 ++entry;
1138 }
1139
1140 uint8_t f2 = lo4 << 4;
1141 uint8_t f1 = 255 - f2;
1142
1143 uint8_t hue2 = entry->hue;
1144 uint8_t sat2 = entry->sat;
1145 uint8_t val2 = entry->val;
1146
1147 // Now some special casing for blending to or from
1148 // either black or white. Black and white don't have
1149 // proper 'hue' of their own, so when ramping from
1150 // something else to/from black/white, we set the 'hue'
1151 // of the black/white color to be the same as the hue
1152 // of the other color, so that you get the expected
1153 // brightness or saturation ramp, with hue staying
1154 // constant:
1155
1156 // If we are starting from white (sat=0)
1157 // or black (val=0), adopt the target hue.
1158 if( sat1 == 0 || val1 == 0) {
1159 hue1 = hue2;
1160 }
1161
1162 // If we are ending at white (sat=0)
1163 // or black (val=0), adopt the starting hue.
1164 if( sat2 == 0 || val2 == 0) {
1165 hue2 = hue1;
1166 }
1167
1168
1169 sat1 = scale8_LEAVING_R1_DIRTY( sat1, f1);
1170 val1 = scale8_LEAVING_R1_DIRTY( val1, f1);
1171
1172 sat2 = scale8_LEAVING_R1_DIRTY( sat2, f2);
1173 val2 = scale8_LEAVING_R1_DIRTY( val2, f2);
1174
1175 // cleanup_R1();
1176
1177 // These sums can't overflow, so no qadd8 needed.
1178 sat1 += sat2;
1179 val1 += val2;
1180
1181 uint8_t deltaHue = (uint8_t)(hue2 - hue1);
1182 if( deltaHue & 0x80 ) {
1183 // go backwards
1184 hue1 -= scale8( 256 - deltaHue, f2);
1185 } else {
1186 // go forwards
1187 hue1 += scale8( deltaHue, f2);
1188 }
1189
1190 cleanup_R1();
1191 }
1192
1193 if( brightness != 255) {
1194 val1 = scale8_video( val1, brightness);
1195 }
1196
1197 return CHSV( hue1, sat1, val1);
1198}
UISlider brightness("Brightness", 255, 0, 255, 1)
uint8_t lsrX4(uint8_t dividend)
Helper function to divide a number by 16, aka four logical shift right (LSR)'s.
CRGB blend(const CRGB &p1, const CRGB &p2, fract8 amountOfP2)
Computes a new color blended some fraction of the way between two other colors.
LIB8STATIC uint8_t map8(uint8_t in, uint8_t rangeStart, uint8_t rangeEnd)
Map from one full-range 8-bit value into a narrower range of 8-bit values, possibly a range of hues.
Definition lib8tion.h:559
@ NOBLEND
No interpolation between palette entries.
@ LINEARBLEND_NOWRAP
Linear interpolation between palette entries, but no wrap-around.
LIB8STATIC_ALWAYS_INLINE void cleanup_R1()
Clean up the r1 register after a series of *LEAVING_R1_DIRTY calls.
Definition scale8.h:333
LIB8STATIC_ALWAYS_INLINE uint8_t scale8_LEAVING_R1_DIRTY(uint8_t i, fract8 scale)
This version of scale8() does not clean up the R1 register on AVR.
Definition scale8.h:170
LIB8STATIC_ALWAYS_INLINE uint8_t scale8_video(uint8_t i, fract8 scale)
The "video" version of scale8() guarantees that the output will be only be zero if one or both of the...
Definition scale8.h:117
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:34
Representation of an HSV pixel (hue, saturation, value (aka brightness)).
Definition chsv.h:16

References blend(), brightness, cleanup_R1(), LINEARBLEND_NOWRAP, lsrX4(), map8(), NOBLEND, scale8(), scale8_LEAVING_R1_DIRTY(), and scale8_video().

+ Here is the call graph for this function: