|
| 1 | +#include "color_conversions.hpp" |
| 2 | + |
| 3 | +#include <cmath> |
| 4 | + |
| 5 | +namespace fractal { |
| 6 | +std::tuple<uint16_t, uint16_t, uint16_t> |
| 7 | +hsv_to_rgb(float hue, float saturation, float value) |
| 8 | +{ |
| 9 | + float chroma = value * saturation; |
| 10 | + float hue_prime = hue / 60.0f; |
| 11 | + float uint16_termediate = |
| 12 | + chroma * (1 - static_cast<float>(std::fabs(std::fmod(hue_prime, 2) - 1))); |
| 13 | + float red_temp = 0.0f; |
| 14 | + float green_temp = 0.0f; |
| 15 | + float blue_temp = 0.0f; |
| 16 | + |
| 17 | + if (0 <= hue_prime && hue_prime < 1) { |
| 18 | + red_temp = chroma; |
| 19 | + green_temp = uint16_termediate; |
| 20 | + blue_temp = 0; |
| 21 | + } |
| 22 | + else if (1 <= hue_prime && hue_prime < 2) { |
| 23 | + red_temp = uint16_termediate; |
| 24 | + green_temp = chroma; |
| 25 | + blue_temp = 0; |
| 26 | + } |
| 27 | + else if (2 <= hue_prime && hue_prime < 3) { |
| 28 | + red_temp = 0; |
| 29 | + green_temp = chroma; |
| 30 | + blue_temp = uint16_termediate; |
| 31 | + } |
| 32 | + else if (3 <= hue_prime && hue_prime < 4) { |
| 33 | + red_temp = 0; |
| 34 | + green_temp = uint16_termediate; |
| 35 | + blue_temp = chroma; |
| 36 | + } |
| 37 | + else if (4 <= hue_prime && hue_prime < 5) { |
| 38 | + red_temp = uint16_termediate; |
| 39 | + green_temp = 0; |
| 40 | + blue_temp = chroma; |
| 41 | + } |
| 42 | + else if (5 <= hue_prime && hue_prime < 6) { |
| 43 | + red_temp = chroma; |
| 44 | + green_temp = 0; |
| 45 | + blue_temp = uint16_termediate; |
| 46 | + } |
| 47 | + |
| 48 | + float match_value = value - chroma; |
| 49 | + float red = red_temp + match_value; |
| 50 | + float green = green_temp + match_value; |
| 51 | + float blue = blue_temp + match_value; |
| 52 | + |
| 53 | + auto red_int = static_cast<uint16_t>(red * 255); |
| 54 | + auto green_int = static_cast<uint16_t>(green * 255); |
| 55 | + auto blue_int = static_cast<uint16_t>(blue * 255); |
| 56 | + |
| 57 | + return {red_int, green_int, blue_int}; |
| 58 | +} |
| 59 | + |
| 60 | +std::tuple<uint16_t, uint16_t, uint16_t> number_to_rgb(uint16_t number) |
| 61 | +{ |
| 62 | + float hue = (static_cast<float>(number) / 65535.0f) * 360.0f; |
| 63 | + float saturation = 1.0f; |
| 64 | + float value = 1.0f; |
| 65 | + |
| 66 | + return hsv_to_rgb(hue, saturation, value); |
| 67 | +} |
| 68 | +} // namespace fractal |
0 commit comments