Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/eXene/graph-util/color-space.sml
ViewVC logotype

Annotation of /sml/trunk/src/eXene/graph-util/color-space.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2 - (view) (download)

1 : monnier 2 (* color-space.sml
2 :     *
3 :     * COPYRIGHT (c) 1994 by AT&T Bell Laboratories
4 :     *
5 :     * Code of various color space utilities.
6 :     *
7 :     *)
8 :    
9 :     structure ColorSpace : COLOR_SPACE =
10 :     struct
11 :     structure EXB = EXeneBase
12 :    
13 :     val maxrgb = 65535.0
14 :    
15 :     datatype hsv = HSV of {hue : real, sat : real, value : real}
16 :     datatype yiq = YIQ of {y : real, i : real, q : real}
17 :    
18 :     fun max (a : real, b) = if a >= b then a else b
19 :     fun min (a : real, b) = if a <= b then a else b
20 :     fun sc r = Word.fromInt(Real.trunc(maxrgb*r))
21 :     fun w2r w = real(Word.toIntX w)
22 :    
23 :     fun rgbToHsv (EXB.RGB{red,green,blue}) = let
24 :     val realr = (w2r red)/maxrgb
25 :     val realg = (w2r green)/maxrgb
26 :     val realb = (w2r blue)/maxrgb
27 :     val MaxV = max(realr, max(realg,realb))
28 :     val MinV = min(realr, min(realg,realb))
29 :     val delta = MaxV - MinV
30 :     in
31 :     if Real.==(delta, 0.0) then HSV{hue=0.0, sat=0.0, value=MaxV}
32 :     else let
33 :     val sat = delta / MaxV
34 :     val rc = (MaxV - realr)/delta
35 :     val gc = (MaxV - realg)/delta
36 :     val bc = (MaxV - realb)/delta
37 :     val h1 = if Real.==(realr, MaxV) then bc - gc
38 :     else if Real.==(realg, MaxV) then 2.0 + rc - bc
39 :     else 4.0 + gc - rc
40 :     val h2 = 60.0 * h1 (* convert to degrees *)
41 :     val hue = if h2 < 0.0 then h2 + 360.0 (* make nonnegative *)
42 :     else h2
43 :     in HSV{hue=hue, sat=sat, value=MaxV} end
44 :     end
45 :    
46 :     fun getHSVvalues (HSV v) = v
47 :    
48 :     fun hsbToRgb (HSV{sat,value,hue}) =
49 :     if (Real.==(sat, 0.0))
50 :     then let val v = sc value in EXB.RGB{red=v,green=v,blue=v} end
51 :     else let
52 :     val h = if Real.==(hue, 360.0) then 0.0 else hue/60.0
53 :     val i = floor h
54 :     val ri = real i
55 :     val f = h - ri
56 :     val p = value*(1.0 - sat)
57 :     val q = value*(1.0 - (sat*f))
58 :     val t = value*(1.0 - (sat*(1.0 - f)))
59 :     fun mkrgb (r,g,b) = EXB.RGB{red=sc r, green=sc g, blue=sc b}
60 :     in
61 :     case i
62 :     of 0 => mkrgb(value, t, p)
63 :     | 1 => mkrgb(q, value, p)
64 :     | 2 => mkrgb(p, value, t)
65 :     | 3 => mkrgb(p, q, value)
66 :     | 4 => mkrgb(t, p, value)
67 :     | _ => mkrgb(value, p, q)
68 :     (* end case *)
69 :     end
70 :    
71 :     fun get_y (EXB.RGB{red,green,blue}) =
72 :     (0.3*(w2r red) + 0.59*(w2r green) + 0.11*(w2r blue))/maxrgb
73 :     fun get_i (EXB.RGB{red,green,blue}) =
74 :     (0.6*(w2r red) - 0.28*(w2r green) - 0.32*(w2r blue))/maxrgb
75 :     fun get_q (EXB.RGB{red,green,blue}) =
76 :     (0.21*(w2r red) - 0.52*(w2r green) + 0.31*(w2r blue))/maxrgb
77 :    
78 :     fun get getf color = let
79 :     val rgb = EXB.rgbOfColor color
80 :     in
81 :     getf rgb
82 :     end
83 :     val getY = get get_y
84 :     val getI = get get_i
85 :     val getQ = get get_q
86 :    
87 :     fun rgbToYiq color = let
88 :     val rgb = EXB.rgbOfColor color
89 :     in
90 :     YIQ{y=get_y rgb, i=get_i rgb, q=get_q rgb}
91 :     end
92 :    
93 :     end

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0