RGBtoHSV(Func in)1 Halide::Func RGBtoHSV(Func in)
2 {
3   Func out;
4   Var x,y,c;
5   Func minC,maxC,delta;
6   Func h,s,v;
7   minC(x,y) = min(in(x,y,0),min(in(x,y,1),in(x,y,2)));
8   maxC(x,y) = max(in(x,y,0),max(in(x,y,1),in(x,y,2)));
9   v(x,y) = maxC(x,y);
10   delta(x,y) = maxC(x,y) - minC(x,y);
11   s(x,y) = select(maxC(x,y) != 0, delta(x,y)/maxC(x,y), 0);//S
12   h(x,y) = select(maxC(x,y) == in(0,x,y), //R is highest
13                (in(1,x,y) - in(2,x,y))/delta(x,y),
14                select(maxC(x,y) == in(1,x,y), //G is highest
15                  2 + (in(2,x,y) - in(0,x,y))/delta(x,y),
16                  4 + (in(0,x,y) - in(1,x,y))/delta(x,y)));//B is highest
17   Func hNorm;
18   hNorm(x,y) = select(h(x,y) < 0, 60.0f*h(x,y) + 360.0f, 60.0f*h(x,y));
19   out(x,y,c) = select(c == 0, hNorm(x,y),
20                       c == 1, s(x,y),
21                               v(x,y));
22   return out;
23 }
24 
25