| 75 | } |
| 76 | |
| 77 | unsigned int hsv2rgb(hsv_t* hsv) |
| 78 | { |
| 79 | unsigned char r = 0; |
| 80 | unsigned char g = 0; |
| 81 | unsigned char b = 0; |
| 82 | |
| 83 | if (hsv->saturation == 0) { |
| 84 | r = g = b = hsv->value; |
| 85 | } |
| 86 | else { |
| 87 | int h = (hsv->hue)%360; |
| 88 | int s = hsv->saturation; |
| 89 | int v = hsv->value; |
| 90 | int i = h / (60 * HUE_DEGREE); |
| 91 | int p = (256 * v - s*v) / 256; |
| 92 | |
| 93 | if (i & 1) { |
| 94 | int q = (256 * 60 * HUE_DEGREE*v - h*s*v + 60 * HUE_DEGREE*s*v*i) / (256 * 60 * HUE_DEGREE); |
| 95 | switch (i) { |
| 96 | case 1: r = q; g = v; b = p; break; |
| 97 | case 3: r = p; g = q; b = v; break; |
| 98 | case 5: r = v; g = p; b = q; break; |
| 99 | } |
| 100 | } |
| 101 | else { |
| 102 | int t = (256 * 60 * HUE_DEGREE*v + h*s*v - 60 * HUE_DEGREE*s*v*(i + 1)) / (256 * 60 * HUE_DEGREE); |
| 103 | switch (i) { |
| 104 | case 0: r = v; g = t; b = p; break; |
| 105 | case 2: r = p; g = v; b = t; break; |
| 106 | case 4: r = t; g = p; b = v; break; |
| 107 | } |
| 108 | } |
| 109 | } |
| 110 | |
| 111 | return ToRGBColor(r, g, b); |
| 112 | } |
| 113 | |
| 114 | |
| 115 | #ifdef TEST |
no outgoing calls
no test coverage detected