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

◆ ColorFromPalette() [1/8]

CHSV fl::ColorFromPalette ( const CHSVPalette16 & pal,
fl::u8 index,
fl::u8 brightness,
TBlendType blendType )

Definition at line 772 of file colorutils.cpp.

773 {
774 if (blendType == LINEARBLEND_NOWRAP) {
775 index = map8(index, 0, 239); // Blend range is affected by lo4 blend of
776 // values, remap to avoid wrapping
777 }
778
779 // hi4 = index >> 4;
780 fl::u8 hi4 = lsrX4(index);
781 fl::u8 lo4 = index & 0x0F;
782
783 // CRGB rgb1 = pal[ hi4];
784 const CHSV *entry = &(pal[0]) + hi4;
785
786 fl::u8 hue1 = entry->hue;
787 fl::u8 sat1 = entry->sat;
788 fl::u8 val1 = entry->val;
789
790 fl::u8 blend = lo4 && (blendType != NOBLEND);
791
792 if (blend) {
793
794 if (hi4 == 15) {
795 entry = &(pal[0]);
796 } else {
797 ++entry;
798 }
799
800 fl::u8 f2 = lo4 << 4;
801 fl::u8 f1 = 255 - f2;
802
803 fl::u8 hue2 = entry->hue;
804 fl::u8 sat2 = entry->sat;
805 fl::u8 val2 = entry->val;
806
807 // Now some special casing for blending to or from
808 // either black or white. Black and white don't have
809 // proper 'hue' of their own, so when ramping from
810 // something else to/from black/white, we set the 'hue'
811 // of the black/white color to be the same as the hue
812 // of the other color, so that you get the expected
813 // brightness or saturation ramp, with hue staying
814 // constant:
815
816 // If we are starting from white (sat=0)
817 // or black (val=0), adopt the target hue.
818 if (sat1 == 0 || val1 == 0) {
819 hue1 = hue2;
820 }
821
822 // If we are ending at white (sat=0)
823 // or black (val=0), adopt the starting hue.
824 if (sat2 == 0 || val2 == 0) {
825 hue2 = hue1;
826 }
827
828 sat1 = scale8_LEAVING_R1_DIRTY(sat1, f1);
829 val1 = scale8_LEAVING_R1_DIRTY(val1, f1);
830
831 sat2 = scale8_LEAVING_R1_DIRTY(sat2, f2);
832 val2 = scale8_LEAVING_R1_DIRTY(val2, f2);
833
834 // cleanup_R1();
835
836 // These sums can't overflow, so no qadd8 needed.
837 sat1 += sat2;
838 val1 += val2;
839
840 fl::u8 deltaHue = (fl::u8)(hue2 - hue1);
841 if (deltaHue & 0x80) {
842 // go backwards
843 hue1 -= scale8(256 - deltaHue, f2);
844 } else {
845 // go forwards
846 hue1 += scale8(deltaHue, f2);
847 }
848
849 cleanup_R1();
850 }
851
852 if (brightness != 255) {
853 val1 = scale8_video(val1, brightness);
854 }
855
856 return CHSV(hue1, sat1, val1);
857}
UISlider brightness("Brightness", 128, 0, 255, 1)
CRGB blend(const CRGB &p1, const CRGB &p2, fract8 amountOfP2)
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:397
LIB8STATIC_ALWAYS_INLINE void cleanup_R1()
Clean up the r1 register after a series of *LEAVING_R1_DIRTY calls.
Definition scale8.h:343
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:180
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:127
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
unsigned char u8
Definition int.h:17
fl::u8 lsrX4(fl::u8 dividend)
Helper function to divide a number by 16, aka four logical shift right (LSR)'s.
Representation of an HSV pixel (hue, saturation, value (aka brightness)).
Definition hsv.h:15

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

+ Here is the call graph for this function: