Subversion Repositories Applications.papyrus

Rev

Rev 1318 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1318 alexandre_ 1
/*
2
	Copyright (c) 2004-2006, The Dojo Foundation
3
	All Rights Reserved.
4
 
5
	Licensed under the Academic Free License version 2.1 or above OR the
6
	modified BSD license. For more information on Dojo licensing, see:
7
 
8
		http://dojotoolkit.org/community/licensing.shtml
9
*/
10
 
11
dojo.provide("dojo.gfx.color.hsv");
12
dojo.require("dojo.lang.array");
13
dojo.require("dojo.math");
14
dojo.lang.extend(dojo.gfx.color.Color, {toHsv:function () {
15
	return dojo.gfx.color.rgb2hsv(this.toRgb());
16
}});
17
dojo.gfx.color.rgb2hsv = function (r, g, b, options) {
18
	if (dojo.lang.isArray(r)) {
19
		if (g) {
20
			options = g;
21
		}
22
		b = r[2] || 0;
23
		g = r[1] || 0;
24
		r = r[0] || 0;
25
	}
26
	var opt = {inputRange:(options && options.inputRange) ? options.inputRange : 255, outputRange:(options && options.outputRange) ? options.outputRange : [255, 255, 255]};
27
	var h = null;
28
	var s = null;
29
	var v = null;
30
	switch (opt.inputRange) {
31
	  case 1:
32
		r = (r * 255);
33
		g = (g * 255);
34
		b = (b * 255);
35
		break;
36
	  case 100:
37
		r = (r / 100) * 255;
38
		g = (g / 100) * 255;
39
		b = (b / 100) * 255;
40
		break;
41
	  default:
42
		break;
43
	}
44
	var min = Math.min(r, g, b);
45
	v = Math.max(r, g, b);
46
	var delta = v - min;
47
	s = (v == 0) ? 0 : delta / v;
48
	if (s == 0) {
49
		h = 0;
50
	} else {
51
		if (r == v) {
52
			h = 60 * (g - b) / delta;
53
		} else {
54
			if (g == v) {
55
				h = 120 + 60 * (b - r) / delta;
56
			} else {
57
				if (b == v) {
58
					h = 240 + 60 * (r - g) / delta;
59
				}
60
			}
61
		}
62
		if (h <= 0) {
63
			h += 360;
64
		}
65
	}
66
	switch (opt.outputRange[0]) {
67
	  case 360:
68
		break;
69
	  case 100:
70
		h = (h / 360) * 100;
71
		break;
72
	  case 1:
73
		h = (h / 360);
74
		break;
75
	  default:
76
		h = (h / 360) * 255;
77
		break;
78
	}
79
	switch (opt.outputRange[1]) {
80
	  case 100:
81
		s = s * 100;
82
	  case 1:
83
		break;
84
	  default:
85
		s = s * 255;
86
		break;
87
	}
88
	switch (opt.outputRange[2]) {
89
	  case 100:
90
		v = (v / 255) * 100;
91
		break;
92
	  case 1:
93
		v = (v / 255);
94
		break;
95
	  default:
96
		break;
97
	}
98
	h = dojo.math.round(h);
99
	s = dojo.math.round(s);
100
	v = dojo.math.round(v);
101
	return [h, s, v];
102
};
103
dojo.gfx.color.hsv2rgb = function (h, s, v, options) {
104
	if (dojo.lang.isArray(h)) {
105
		if (s) {
106
			options = s;
107
		}
108
		v = h[2] || 0;
109
		s = h[1] || 0;
110
		h = h[0] || 0;
111
	}
112
	var opt = {inputRange:(options && options.inputRange) ? options.inputRange : [255, 255, 255], outputRange:(options && options.outputRange) ? options.outputRange : 255};
113
	switch (opt.inputRange[0]) {
114
	  case 1:
115
		h = h * 360;
116
		break;
117
	  case 100:
118
		h = (h / 100) * 360;
119
		break;
120
	  case 360:
121
		h = h;
122
		break;
123
	  default:
124
		h = (h / 255) * 360;
125
	}
126
	if (h == 360) {
127
		h = 0;
128
	}
129
	switch (opt.inputRange[1]) {
130
	  case 100:
131
		s /= 100;
132
		break;
133
	  case 255:
134
		s /= 255;
135
	}
136
	switch (opt.inputRange[2]) {
137
	  case 100:
138
		v /= 100;
139
		break;
140
	  case 255:
141
		v /= 255;
142
	}
143
	var r = null;
144
	var g = null;
145
	var b = null;
146
	if (s == 0) {
147
		r = v;
148
		g = v;
149
		b = v;
150
	} else {
151
		var hTemp = h / 60;
152
		var i = Math.floor(hTemp);
153
		var f = hTemp - i;
154
		var p = v * (1 - s);
155
		var q = v * (1 - (s * f));
156
		var t = v * (1 - (s * (1 - f)));
157
		switch (i) {
158
		  case 0:
159
			r = v;
160
			g = t;
161
			b = p;
162
			break;
163
		  case 1:
164
			r = q;
165
			g = v;
166
			b = p;
167
			break;
168
		  case 2:
169
			r = p;
170
			g = v;
171
			b = t;
172
			break;
173
		  case 3:
174
			r = p;
175
			g = q;
176
			b = v;
177
			break;
178
		  case 4:
179
			r = t;
180
			g = p;
181
			b = v;
182
			break;
183
		  case 5:
184
			r = v;
185
			g = p;
186
			b = q;
187
			break;
188
		}
189
	}
190
	switch (opt.outputRange) {
191
	  case 1:
192
		r = dojo.math.round(r, 2);
193
		g = dojo.math.round(g, 2);
194
		b = dojo.math.round(b, 2);
195
		break;
196
	  case 100:
197
		r = Math.round(r * 100);
198
		g = Math.round(g * 100);
199
		b = Math.round(b * 100);
200
		break;
201
	  default:
202
		r = Math.round(r * 255);
203
		g = Math.round(g * 255);
204
		b = Math.round(b * 255);
205
	}
206
	return [r, g, b];
207
};
208