| |
| |
| #include "trop.h" |
| #include "hsvutil.h" |
| |
| void OLDRGB2HSV(double r, double g, double b, |
| double *h, double *s, double *v) |
| { |
| double max, min; |
| double delta; |
| |
| max = std::max({r, g, b}); |
| min = std::min({r, g, b}); |
| |
| *v = max; |
| |
| if (max != 0) |
| *s = (max - min) / max; |
| else |
| *s = 0; |
| |
| if (*s == 0) |
| *h = 0; |
| else { |
| delta = max - min; |
| |
| if (r == max) |
| *h = (g - b) / delta; |
| else if (g == max) |
| *h = 2 + (b - r) / delta; |
| else if (b == max) |
| *h = 4 + (r - g) / delta; |
| *h = *h * 60; |
| if (*h < 0) |
| *h += 360; |
| } |
| } |
| |
| void OLDHSV2RGB(double hue, double sat, double value, |
| double *red, double *green, double *blue) |
| { |
| int i; |
| double p, q, t, f; |
| |
| |
| |
| if (hue > 360) |
| hue -= ((int)hue / 360) * 360; |
| |
| if (hue < 0) |
| hue += (1 - (int)hue / 360) * 360; |
| |
| if (sat < 0) |
| sat = 0; |
| if (sat > 1) |
| sat = 1; |
| if (value < 0) |
| value = 0; |
| if (value > 1) |
| value = 1; |
| if (sat == 0) { |
| *red = value; |
| *green = value; |
| *blue = value; |
| } else { |
| if (hue == 360) |
| hue = 0; |
| |
| hue = hue / 60; |
| i = (int)hue; |
| f = hue - i; |
| p = value * (1 - sat); |
| q = value * (1 - (sat * f)); |
| t = value * (1 - (sat * (1 - f))); |
| |
| switch (i) { |
| case 0: |
| *red = value; |
| *green = t; |
| *blue = p; |
| break; |
| case 1: |
| *red = q; |
| *green = value; |
| *blue = p; |
| break; |
| case 2: |
| *red = p; |
| *green = value; |
| *blue = t; |
| break; |
| case 3: |
| *red = p; |
| *green = q; |
| *blue = value; |
| break; |
| case 4: |
| *red = t; |
| *green = p; |
| *blue = value; |
| break; |
| case 5: |
| *red = value; |
| *green = p; |
| *blue = q; |
| break; |
| } |
| } |
| } |
| |