1 /**
2   This module defines RGB <-> HSV conversions.
3 */
4 module gfm.image.hsv;
5 
6 import std.algorithm,
7        std.math;
8 
9 import gfm.math.vector;
10 
11 // RGB <-> HSV conversions.
12 
13 /// Converts a RGB triplet to HSV.
14 /// Authors: Sam Hocevar 
15 /// See_also: $(WEB http://lolengine.net/blog/2013/01/13/fast-rgb-to-hsv)
16 deprecated("Use ae.utils.graphics.hls instead")
17 vec3f rgb2hsv(vec3f rgb) pure nothrow
18 {
19     float K = 0.0f;
20 
21     if (rgb.y < rgb.z)
22     {
23         swap(rgb.y, rgb.z);
24         K = -1.0f;
25     }
26 
27     if (rgb.x < rgb.y)
28     {
29         swap(rgb.x, rgb.y);
30         K = -2.0f / 6.0f - K;
31     }
32 
33     float chroma = rgb.x - (rgb.y < rgb.z ? rgb.y : rgb.z);
34     float h = abs(K + (rgb.y - rgb.z) / (6.0f * chroma + 1e-20f));
35     float s = chroma / (rgb.x + 1e-20f);
36     float v = rgb.x;
37 
38     return vec3f(h, s, v);
39 }
40 
41 /// Convert a HSV triplet to RGB.
42 /// Authors: Sam Hocevar.
43 /// See_also: $(WEB http://lolengine.net/blog/2013/01/13/fast-rgb-to-hsv).
44 deprecated("Use ae.utils.graphics.hls instead")
45 vec3f hsv2rgb(vec3f hsv) pure nothrow
46 {
47     float S = hsv.y;
48     float H = hsv.x;
49     float V = hsv.z;
50 
51     vec3f rgb;
52 
53     if ( S == 0.0 ) 
54     {
55         rgb.x = V;
56         rgb.y = V;
57         rgb.z = V;
58     } 
59     else 
60     {        
61         if (H >= 1.0) 
62         {
63             H = 0.0;
64         } 
65         else 
66         {
67             H = H * 6;
68         }
69         int I = cast(int)H;
70         assert(I >= 0 && I < 6);
71         float F = H - I;     /* fractional part */
72 
73         float M = V * (1 - S);
74         float N = V * (1 - S * F);
75         float K = V * (1 - S * (1 - F));
76 
77         if (I == 0) { rgb.x = V; rgb.y = K; rgb.z = M; }
78         if (I == 1) { rgb.x = N; rgb.y = V; rgb.z = M; }
79         if (I == 2) { rgb.x = M; rgb.y = V; rgb.z = K; }
80         if (I == 3) { rgb.x = M; rgb.y = N; rgb.z = V; }
81         if (I == 4) { rgb.x = K; rgb.y = M; rgb.z = V; }
82         if (I == 5) { rgb.x = V; rgb.y = M; rgb.z = N; }
83     }
84     return rgb;
85 }