Subversion Repositories Applications.papyrus

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2150 mathias 1
if(!dojo._hasResource["dojox.color.Generator"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
2
dojo._hasResource["dojox.color.Generator"] = true;
3
dojo.provide("dojox.color.Generator");
4
 
5
dojox.color.Generator = new (function(){
6
	var dxc=dojox.color;
7
 
8
	//	common helper functions
9
	var prep=function(obj, fnName){
10
		if(!obj){
11
			console.warn("dojox.color.Generator::", fnName, ": no base color was passed. ", obj);
12
			return null;
13
		}
14
		if(!obj.toHsv){
15
			//	either a raw string or object, return a Color.
16
			obj=new dxc.Color(obj);
17
		}
18
		return obj;
19
	};
20
 
21
	var factors=function(n, high, low){
22
		var ret=[];
23
		var i, step=(high-low)/n, cur=high;
24
		for(i=0; i<n; i++,cur-=step){ ret.push(cur); }
25
		return ret;
26
	};
27
 
28
	var fill=function(color, num, factors){
29
		var c=factors.length-1, a=[], r, g, b;
30
		for(var i=0; i<num; i++){
31
			if(i<factors.length){
32
				 r=color.r+(255-color.r)*factors[i],
33
				 g=color.g+(255-color.g)*factors[i],
34
				 b=color.b+(255-color.b)*factors[i];
35
				 a.push(new dxc.Color({ r:r, g:g, b:b }));
36
			}
37
			else if(i==factors.length){
38
				a.push(color);
39
			}
40
			else {
41
				if(c<0){ c=factors.length-1; }	//	just in case.
42
				r=color.r*(1-factors[c]),
43
				g=color.g*(1-factors[c]),
44
				b=color.b*(1-factors[c--]);
45
				a.push(new dxc.Color({ r:r, g:g, b:b }));
46
			}
47
		}
48
		return a;
49
	};
50
 
51
	var flatten=function(matrix, limit, ord){
52
		//	todo: set up the ordering thing.
53
		var ret=[];
54
		for(var i=0; i<matrix[0].length; i++){
55
			for(var j=0; j<matrix.length; j++){
56
				ret.push(matrix[j][i]);
57
			}
58
		}
59
		ret.length=limit;
60
		return ret;
61
	};
62
 
63
	//	the color generator
64
	this.analogous= function(kwArgs){
65
		//	summary
66
		//	generates n colors based on a base color, based on a fixed hue angle delta
67
		//	(relative to the base hue) with slight variations in saturation.
68
		kwArgs=dojo.mixin({
69
			series:4,				//	number of analogous lines to generate
70
			num:32,					//	number of colors to derive
71
			order:"bottom up",		//	the order of the returned color array
72
			angle:30,				//	the angle of difference to use
73
			high:0.5,				//	high part of range to generate tints and shades
74
			low:0.15				//	low part of range to generate tints and shades
75
		}, kwArgs||{});
76
 
77
		var base=prep(kwArgs.base, "analogous");
78
		if(!base){ return []; }
79
 
80
		//	let start the generation.  We use series to move further away from the center.
81
		var num=kwArgs.num, hsv=base.toHsv();
82
		var rows=kwArgs.series+1, cols=Math.ceil(num/rows);
83
		var fs=factors(Math.floor(cols/2), kwArgs.high, kwArgs.low);
84
 
85
		var m=[], cur=hsv.h-(kwArgs.angle*(kwArgs.series/2));
86
		for(var i=0; i<rows; i++,cur+=kwArgs.angle){
87
			if(cur<0) { cur+=360 ; }
88
			if(cur>=360){ cur-=360; }
89
			m.push(fill(dxc.fromHsv({ h: cur, s:hsv.s, v:hsv.v }), cols, fs));
90
		}
91
		return flatten(m, num, kwArgs.order);	//	Array
92
	};
93
 
94
	this.monochromatic = function(kwArgs){
95
		//	summary
96
		//	generates n colors based on a base color, using alterations to the RGB model only.
97
		kwArgs=dojo.mixin({
98
			num:32,					//	number of colors to derive
99
			high:0.5,				//	high factor to generate tints and shades
100
			low:0.15				//	low factor to generate tints and shades
101
		}, kwArgs||{});
102
 
103
		var base=prep(kwArgs.base, "monochromatic");
104
		if(!base){ return []; }
105
 
106
		var fs=factors(Math.floor(kwArgs.num/2), kwArgs.high, kwArgs.low);
107
		var a=fill(base, kwArgs.num, fs);
108
		return a;	// Array
109
	};
110
 
111
	this.triadic = function(kwArgs){
112
		//	summary
113
		//	generates n colors from a base color, using the triadic rules, rough
114
		//	approximation from kuler.adobe.com.
115
		kwArgs=dojo.mixin({
116
			num:32,					//	number of colors to derive
117
			order:"bottom up",		//	the order of the returned color array
118
			high:0.5,				//	high factor to generate tints and shades
119
			low:0.15				//	low factor to generate tints and shades
120
		}, kwArgs||{});
121
 
122
		var base=prep(kwArgs.base, "triadic");
123
		if(!base){ return []; }
124
 
125
		var num=kwArgs.num, rows=3, cols=Math.ceil(num/rows), fs=factors(Math.floor(cols/2), kwArgs.high, kwArgs.low);
126
		var m=[], hsv=base.toHsv();
127
 
128
		//	hue calculations
129
		var h1=hsv.h+57, h2=hsv.h-157;
130
		if(h1>360){ h1-=360; }
131
		if(h2<0){ h2+=360; }
132
 
133
		//	sat calculations
134
		var s1=(hsv.s>=20) ? hsv.s-10 : hsv.s+10;
135
		var s2=(hsv.s>=95) ? hsv.s-5 : hsv.s+5;
136
 
137
		//	value calcs
138
		var v2=(hsv.v>=70) ? hsv.v-30 : hsv.v+30;
139
 
140
		m.push(fill(dojox.color.fromHsv({ h:h1, s:s1, v:hsv.v }), cols, fs));
141
		m.push(fill(base, cols, fs));
142
		m.push(fill(dojox.color.fromHsv({ h:h2, s:s2, v:v2 }), cols, fs));
143
		return flatten(m, num, kwArgs.order);	//	Array
144
	};
145
 
146
	this.complementary = function(kwArgs){
147
		//	summary
148
		//	generates n colors from a base color, using complimentary rules.
149
		kwArgs=dojo.mixin({
150
			num:32,					//	number of colors to derive
151
			order:"bottom up",		//	the order of the returned color array
152
			high:0.5,				//	high factor to generate tints and shades
153
			low:0.15				//	low factor to generate tints and shades
154
		}, kwArgs||{});
155
 
156
		var base=prep(kwArgs.base, "complimentary");
157
		if(!base){ return []; }
158
 
159
		var num=kwArgs.num, rows=2, cols=Math.ceil(num/rows), fs=factors(Math.floor(cols/2), kwArgs.high, kwArgs.low);
160
		var m=[], hsv=base.toHsv();
161
		var compliment=(hsv.h+120)%360;
162
		m.push(fill(base, cols, fs));
163
		m.push(fill(dojox.color.fromHsv({ h:compliment, s:hsv.s, v:hsv.v }), cols, fs));
164
		return flatten(m, num, kwArgs.order);	//	Array
165
	};
166
 
167
	this.splitComplementary = function(kwArgs){
168
		//	summary
169
		//	generates n colors from a base color, using split complimentary rules.
170
		kwArgs=dojo.mixin({
171
			num:32,					//	number of colors to derive
172
			order:"bottom up",		//	the order of the returned color array
173
			angle:30,				//	the angle of difference to use
174
			high:0.5,				//	high factor to generate tints and shades
175
			low:0.15				//	low factor to generate tints and shades
176
		}, kwArgs||{});
177
 
178
		var base=prep(kwArgs.base, "splitComplementary");
179
		if(!base){ return []; }
180
 
181
		var num=kwArgs.num, rows=3, cols=Math.ceil(num/rows), fs=factors(Math.floor(cols/2), kwArgs.high, kwArgs.low);
182
		var m=[], hsv=base.toHsv();
183
		var compliment=(hsv.h+120)%360;
184
		var comp1=compliment-kwArgs.angle, comp2=(compliment+kwArgs.angle)%360;
185
		if(comp1<0){ comp1+=360; }
186
 
187
		m.push(fill(base, cols, fs));
188
		m.push(fill(dojox.color.fromHsv({ h:comp1, s:hsv.s, v:hsv.v }), cols, fs));
189
		m.push(fill(dojox.color.fromHsv({ h:comp2, s:hsv.s, v:hsv.v }), cols, fs));
190
		return flatten(m, num, kwArgs.order);	//	Array
191
	};
192
 
193
	this.compound = function(kwArgs){
194
		//	summary
195
		//	generates n colors from a base color, using a *very* rough approximation
196
		//	of the Compound rules at http://kuler.adobe.com
197
		kwArgs=dojo.mixin({
198
			num:32,					//	number of colors to derive
199
			order:"bottom up",		//	the order of the returned color array
200
			angle:30,				//	the angle of difference to use
201
			high:0.5,				//	high factor to generate tints and shades
202
			low:0.15				//	low factor to generate tints and shades
203
		}, kwArgs||{});
204
 
205
		var base=prep(kwArgs.base, "compound");
206
		if(!base){ return []; }
207
 
208
		var num=kwArgs.num, rows=4, cols=Math.ceil(num/rows), fs=factors(Math.floor(cols/2), kwArgs.high, kwArgs.low);
209
		var m=[], hsv=base.toHsv();
210
		var comp=(hsv.h+120)%360;		//	other base angle.
211
 
212
		//	hue calculations
213
		var h1=(hsv.h+kwArgs.angle)%360, h2=comp-kwArgs.angle, h3=comp-(kwArgs.angle/2);
214
		if(h2<0){ h2+=360; }
215
		if(h3<0){ h3+=360; }
216
 
217
		//	saturation calculations
218
		var s1=(hsv.s>=90 && hsv.s<=100)? hsv.s-10 : hsv.s+10;
219
		var s2=(hsv.s<=35) ? hsv.s+25 : hsv.s-25;
220
 
221
		//	value calculations
222
		var v1=hsv.v-20;
223
		var v2=hsv.v;
224
 
225
		m.push(fill(base, cols, fs));
226
		m.push(fill(dojox.color.fromHsv({ h:h1, s:s1, v:v1 }), cols, fs));
227
		m.push(fill(dojox.color.fromHsv({ h:h2, s:s1, v:v1 }), cols, fs));
228
		m.push(fill(dojox.color.fromHsv({ h:h3, s:s2, v:v2 }), cols, fs));
229
		return flatten(m, num, kwArgs.order);	//	Array
230
	};
231
 
232
	this.shades = function(kwArgs){
233
		//	summary
234
		//	generates n colors based on a base color using only changes
235
		//	in value.  Similar to monochromatic but a bit more linear.
236
		kwArgs=dojo.mixin({
237
			num:32,					//	number of colors to derive
238
			high:1.5,				//	high factor to generate tints and shades
239
			low:0.5					//	low factor to generate tints and shades
240
		}, kwArgs||{});
241
 
242
		var base=prep(kwArgs.base, "shades");
243
		if(!base){ return []; }
244
 
245
		var num=kwArgs.num, hsv=base.toHsv();
246
		var step=(kwArgs.high-kwArgs.low)/num, cur=kwArgs.low;
247
		var a=[];
248
		for(var i=0; i<num; i++,cur+=step){
249
			a.push(dxc.fromHsv({ h:hsv.h, s:hsv.s, v:Math.min(Math.round(hsv.v*cur),100) }));
250
		}
251
 
252
		console.log("generated color list from shades: ", a);
253
		return a;	// Array
254
	};
255
})();
256
 
257
}