| 493 | } |
| 494 | |
| 495 | void hsv2rgb_fullspectrum( const CHSV& hsv, CRGB& rgb) { |
| 496 | const auto f = [](const int n, const fl::u8 h) -> fl::u32 { |
| 497 | constexpr int kZero = 0 << 8; |
| 498 | constexpr int kOne = 1 << 8; |
| 499 | constexpr int kFour = 4 << 8; |
| 500 | constexpr int kSix = 6 << 8; |
| 501 | |
| 502 | const int k = ((n << 8) + 6*h) % kSix; |
| 503 | const int k2 = kFour - k; |
| 504 | return fl::max(kZero, fl::min(kOne, fl::min(k, k2))); |
| 505 | }; |
| 506 | |
| 507 | const fl::u32 chroma = hsv.v * hsv.s / 255; |
| 508 | rgb.r = hsv.v - ((chroma * f(5, hsv.h)) >> 8); |
| 509 | rgb.g = hsv.v - ((chroma * f(3, hsv.h)) >> 8); |
| 510 | rgb.b = hsv.v - ((chroma * f(1, hsv.h)) >> 8); |
| 511 | } |
| 512 | |
| 513 | /// Inline version of hsv2rgb_fullspectrum which returns a CRGB object. |
| 514 | CRGB hsv2rgb_fullspectrum( const CHSV& hsv) { |