1+ /*
2+ ---
3+
4+ script: Color.js
5+
6+ description: Class for creating and manipulating colors in JavaScript. Supports HSB -> RGB Conversions and vice versa.
7+
8+ license: MIT-style license
9+
10+ authors:
11+ - Sam Goody
12+ - Valerio Proietti
13+
14+ requires:
15+ - core:1.2.4/Array
16+ - core:1.2.4/String
17+ - core:1.2.4/Number
18+ - core:1.2.4/Hash
19+ - core:1.2.4/Function
20+ - core:1.2.4/$util
21+
22+ provides: [Color]
23+
24+ ...
25+ */
26+
27+ var Color = new Native ( {
28+
29+ initialize : function ( color , type ) {
30+ if ( arguments . length >= 3 ) {
31+ type = 'rgb' ; color = Array . slice ( arguments , 0 , 3 ) ;
32+ } else if ( typeof color == 'string' ) {
33+ if ( color . match ( / r g b / ) ) color = color . rgbToHex ( ) . hexToRgb ( true ) ;
34+ else if ( color . match ( / h s b / ) ) color = color . hsbToRgb ( ) ;
35+ else color = color . hexToRgb ( true ) ;
36+ }
37+ type = type || 'rgb' ;
38+ switch ( type ) {
39+ case 'hsb' :
40+ var old = color ;
41+ color = color . hsbToRgb ( ) ;
42+ color . hsb = old ;
43+ break ;
44+ case 'hex' : color = color . hexToRgb ( true ) ; break ;
45+ }
46+ color . rgb = color . slice ( 0 , 3 ) ;
47+ color . hsb = color . hsb || color . rgbToHsb ( ) ;
48+ color . hex = color . rgbToHex ( ) ;
49+ return $extend ( color , this ) ;
50+ }
51+
52+ } ) ;
53+
54+ Color . implement ( {
55+
56+ mix : function ( ) {
57+ var colors = Array . slice ( arguments ) ;
58+ var alpha = ( $type ( colors . getLast ( ) ) == 'number' ) ? colors . pop ( ) : 50 ;
59+ var rgb = this . slice ( ) ;
60+ colors . each ( function ( color ) {
61+ color = new Color ( color ) ;
62+ for ( var i = 0 ; i < 3 ; i ++ ) rgb [ i ] = Math . round ( ( rgb [ i ] / 100 * ( 100 - alpha ) ) + ( color [ i ] / 100 * alpha ) ) ;
63+ } ) ;
64+ return new Color ( rgb , 'rgb' ) ;
65+ } ,
66+
67+ invert : function ( ) {
68+ return new Color ( this . map ( function ( value ) {
69+ return 255 - value ;
70+ } ) ) ;
71+ } ,
72+
73+ setHue : function ( value ) {
74+ return new Color ( [ value , this . hsb [ 1 ] , this . hsb [ 2 ] ] , 'hsb' ) ;
75+ } ,
76+
77+ setSaturation : function ( percent ) {
78+ return new Color ( [ this . hsb [ 0 ] , percent , this . hsb [ 2 ] ] , 'hsb' ) ;
79+ } ,
80+
81+ setBrightness : function ( percent ) {
82+ return new Color ( [ this . hsb [ 0 ] , this . hsb [ 1 ] , percent ] , 'hsb' ) ;
83+ }
84+
85+ } ) ;
86+
87+ var $RGB = function ( r , g , b ) {
88+ return new Color ( [ r , g , b ] , 'rgb' ) ;
89+ } ;
90+
91+ var $HSB = function ( h , s , b ) {
92+ return new Color ( [ h , s , b ] , 'hsb' ) ;
93+ } ;
94+
95+ var $HEX = function ( hex ) {
96+ return new Color ( hex , 'hex' ) ;
97+ } ;
98+
99+ Array . implement ( {
100+
101+ rgbToHsb : function ( ) {
102+ var red = this [ 0 ] ,
103+ green = this [ 1 ] ,
104+ blue = this [ 2 ] ,
105+ hue = 0 ;
106+ var max = Math . max ( red , green , blue ) ,
107+ min = Math . min ( red , green , blue ) ;
108+ var delta = max - min ;
109+ var brightness = max / 255 ,
110+ saturation = ( max != 0 ) ? delta / max : 0 ;
111+ if ( saturation != 0 ) {
112+ var rr = ( max - red ) / delta ;
113+ var gr = ( max - green ) / delta ;
114+ var br = ( max - blue ) / delta ;
115+ if ( red == max ) hue = br - gr ;
116+ else if ( green == max ) hue = 2 + rr - br ;
117+ else hue = 4 + gr - rr ;
118+ hue /= 6 ;
119+ if ( hue < 0 ) hue ++ ;
120+ }
121+ return [ Math . round ( hue * 360 ) , Math . round ( saturation * 100 ) , Math . round ( brightness * 100 ) ] ;
122+ } ,
123+
124+ hsbToRgb : function ( ) {
125+ var br = Math . round ( this [ 2 ] / 100 * 255 ) ;
126+ if ( this [ 1 ] == 0 ) {
127+ return [ br , br , br ] ;
128+ } else {
129+ var hue = this [ 0 ] % 360 ;
130+ var f = hue % 60 ;
131+ var p = Math . round ( ( this [ 2 ] * ( 100 - this [ 1 ] ) ) / 10000 * 255 ) ;
132+ var q = Math . round ( ( this [ 2 ] * ( 6000 - this [ 1 ] * f ) ) / 600000 * 255 ) ;
133+ var t = Math . round ( ( this [ 2 ] * ( 6000 - this [ 1 ] * ( 60 - f ) ) ) / 600000 * 255 ) ;
134+ switch ( Math . floor ( hue / 60 ) ) {
135+ case 0 : return [ br , t , p ] ;
136+ case 1 : return [ q , br , p ] ;
137+ case 2 : return [ p , br , t ] ;
138+ case 3 : return [ p , q , br ] ;
139+ case 4 : return [ t , p , br ] ;
140+ case 5 : return [ br , p , q ] ;
141+ }
142+ }
143+ return false ;
144+ } ,
145+
146+ fromRgb : function ( space , decimal ) {
147+ var v ,
148+ hsl = 0 ,
149+ rgb = $A ( this ) . sort ( function ( a , b ) {
150+ return res = a - b
151+ } ) ,
152+ min = rgb [ 0 ] ,
153+ max = rgb [ 2 ] ;
154+
155+ switch ( ( space || '' ) . toLowerCase ( ) . slice ( - 1 ) ) {
156+ default :
157+ v = max / 2.55 ;
158+ span = v ; break ;
159+ case 'g' :
160+ v = min / ( min - max + 255 ) * 100 ;
161+ span = 100 ; break ;
162+ case 'l' :
163+ v = ( + max + + min ) / 5.1 ;
164+ span = v * 2 ;
165+ if ( v > 50 ) {
166+ span = 200 - span ;
167+ hsl = 100 - span ;
168+ }
169+ }
170+
171+ var s = 100 * ( min / 2.55 - v ) / ( hsl - v ) ;
172+ var d = ( 100 * ( rgb [ 1 ] / 2.55 - v ) / s + v - hsl ) / span ;
173+ for ( var ind = '' , i = 0 ; i < 3 ; i ++ ) ind += rgb . indexOf ( this [ i ] ) ;
174+ var h = '210,120,021,012,102,201,110,020,011,002,101,000' . indexOf ( ind ) / 4 % 6 ;
175+ h += h % 2 ? 1 - d : d ;
176+ return [ h * 60 , s , v ] . map ( function ( i ) { return decimal ? i || 0 : Math . round ( i || 0 ) } ) ;
177+ } ,
178+
179+ toRgb : function ( space , decimal ) {
180+ var val = this [ 2 ] * 1 , hsl = 0 ;
181+ switch ( ( space || 'v' ) . slice ( - 1 ) . toLowerCase ( ) ) {
182+ default : span = val ; break ;
183+ case 'g' : span = 100 ; break ;
184+ case 'l' : span = val * 2 ;
185+ if ( val > 50 ) {
186+ span = 200 - span ;
187+ hsl = 100 - span ;
188+ }
189+ }
190+ var hue = this [ 0 ] % 360 / 60 , rad = Math . floor ( hue ) , odd = rad % 2 ;
191+ var rgb = [ ] , map = [ 0 , ( odd ? 1 + rad - hue : hue - rad ) , 1 ] ;
192+ map . each ( function ( density , i ) {
193+ var index = Math . floor ( hue / 2 + 5 + i * ( odd || - 1 ) ) % 3 ;
194+ var color = this [ 1 ] / 100 * ( density * span - val + hsl ) + val ;
195+ rgb [ index ] = decimal ? color * 2.55 : Math . round ( color * 2.55 ) ;
196+ //rgb[index] = Math.round(color * 2.55);
197+ } , this ) ;
198+ return rgb ;
199+ }
200+ } ) ;
201+
202+ String . implement ( {
203+
204+ rgbToHsb : function ( ) {
205+ var rgb = this . match ( / \d { 1 , 3 } / g) ;
206+ return ( rgb ) ? rgb . rgbToHsb ( ) : null ;
207+ } ,
208+
209+ hsbToRgb : function ( ) {
210+ var hsb = this . match ( / \d { 1 , 3 } / g) ;
211+ return ( hsb ) ? hsb . hsbToRgb ( ) : null ;
212+ } ,
213+
214+ fromRgb : function ( space ) {
215+ var rgb = this . match ( / \d { 1 , 3 } / g) ;
216+ return ( rgb ) ? rgb . fromRgb ( space ) : null ;
217+ } ,
218+
219+ toRgb : function ( space ) {
220+ var hsb = this . match ( / \d { 1 , 3 } / g) ;
221+ return ( hsb ) ? hsb . toRgb ( space ) : null ;
222+ }
223+
224+ } ) ;
225+ /*
226+ ToDo:
227+ 6,163,0 - infinity
228+ 168,4,4 - 360 / 0
229+ */
0 commit comments