Color class
@author mr.doob / http://mrdoob.com/
Ported to Dart from JS by: @author rob silverton / http://www.unwrong.com/
class Color { double _r; double _g; double _b; set r(num r) { _r = r.toDouble();} get r => _r; set g(num g) { _g = g.toDouble();} get g => _g; set b(num b) { _b = b.toDouble();} get b => _b; int get _rr => (r*255).floor(); int get _gg => (g*255).floor(); int get _bb => (b*255).floor(); Color( [num hex] ) : _r = 1.0, _g = 1.0, _b = 1.0 { if ( hex is num ) setHex( hex ); } Color copy( Color color ) { r = color.r; g = color.g; b = color.b; return this; } Color copyGammaToLinear( Color color ) { r = color.r * color.r; g = color.g * color.g; b = color.b * color.b; return this; } Color copyLinearToGamma( Color color ) { num x = Math.sqrt( color.r ); r = Math.sqrt( color.r ); g = Math.sqrt( color.g ); b = Math.sqrt( color.b ); return this; } Color convertGammaToLinear() { var _r = r, _g = g, _b = b; r = _r * _r; g = _g * _g; b = _b * _b; return this; } Color convertLinearToGamma() { r = Math.sqrt( r ); g = Math.sqrt( g ); b = Math.sqrt( b ); return this; } Color setRGB( num newR, num newG, num newB ) { r = newR.toDouble(); g = newG.toDouble(); b = newB.toDouble(); return this; } Color setHSV( num h, num s, num v ) { // based on MochiKit implementation by Bob Ippolito // h,s,v ranges are < 0.0 - 1.0 > num i, f, p, q, t; if ( v == 0 ) { r = g = b = 0.0; } else { i = ( h * 6 ).floor(); f = ( h * 6 ) - i; p = v * ( 1 - s ); q = v * ( 1 - ( s * f ) ); t = v * ( 1 - ( s * ( 1 - f ) ) ); switch ( i ) { case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; case 5: r = v; g = p; b = q; break; case 6: // fall through case 0: r = v; g = t; b = p; break; } } return this; } Color setHSL( h, s, l ) { // h,s,l ranges are in 0.0 - 1.0 if ( s == 0 ) { r = g = b = l; } else { var hue2rgb = ( p, q, t ) { if ( t < 0 ) t += 1; if ( t > 1 ) t -= 1; if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; if ( t < 1 / 2 ) return q; if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); return p; }; var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); var q = ( 2 * l ) - p; this.r = hue2rgb( q, p, h + 1 / 3 ); this.g = hue2rgb( q, p, h ); this.b = hue2rgb( q, p, h - 1 / 3 ); } return this; } get HSL { // h,s,l ranges are in 0.0 - 1.0 var r = this.r, g = this.g, b = this.b; var max = Math.max(Math.max( r, g), b ); var min = Math.min(Math.min( r, g), b ); var hue, saturation; var lightness = ( min + max ) / 2.0; if ( min == max ) { hue = 0; saturation = 0; } else { var delta = max - min; saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); if (max == r) { hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); } else if (max == g) { hue = ( b - r ) / delta + 2; } else if (max == b) { hue = ( r - g ) / delta + 4; } hue /= 6; } return [hue, saturation, lightness]; } Color offsetHSL( h, s, l ) { var hsl = this.HSL; hsl[0] += h; hsl[1] += s; hsl[2] += l; setHSL( hsl[0], hsl[1], hsl[2] ); return this; } Color setHex( num hex ) { var h = hex.floor().toInt(); r = ( (h&0xFF0000)>>16 ) / 255; g = ( (h&0x00FF00)>>8 ) / 255; b = (h&0x0000FF) / 255; return this; } num getHex() { num h = (_rr<<16)^(_gg<<8)^(_bb); return h; } String getContextStyle() { // TODO: this is a little bit of a mess. We should stay consistent between // how r,g,b is set. Something in CanvasRender is setting them to doubles // when they should be int's. We could add setter/getter's to handle this return 'rgb(${_rr},${_gg},${_bb})'; } Color clone() { return new Color().setRGB( r, g, b); } }
Constructors
Properties
var b #
get b => _b;
set b(num b) { _b = b.toDouble();}
var g #
get g => _g;
set g(num g) { _g = g.toDouble();}
final HSL #
get HSL { // h,s,l ranges are in 0.0 - 1.0 var r = this.r, g = this.g, b = this.b; var max = Math.max(Math.max( r, g), b ); var min = Math.min(Math.min( r, g), b ); var hue, saturation; var lightness = ( min + max ) / 2.0; if ( min == max ) { hue = 0; saturation = 0; } else { var delta = max - min; saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); if (max == r) { hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); } else if (max == g) { hue = ( b - r ) / delta + 2; } else if (max == b) { hue = ( r - g ) / delta + 4; } hue /= 6; } return [hue, saturation, lightness]; }
var r #
get r => _r;
set r(num r) { _r = r.toDouble();}
Methods
Color convertGammaToLinear() #
Color convertGammaToLinear() { var _r = r, _g = g, _b = b; r = _r * _r; g = _g * _g; b = _b * _b; return this; }
Color convertLinearToGamma() #
Color convertLinearToGamma() { r = Math.sqrt( r ); g = Math.sqrt( g ); b = Math.sqrt( b ); return this; }
Color copy(Color color) #
Color copy( Color color ) { r = color.r; g = color.g; b = color.b; return this; }
Color copyGammaToLinear(Color color) #
Color copyGammaToLinear( Color color ) { r = color.r * color.r; g = color.g * color.g; b = color.b * color.b; return this; }
Color copyLinearToGamma(Color color) #
Color copyLinearToGamma( Color color ) { num x = Math.sqrt( color.r ); r = Math.sqrt( color.r ); g = Math.sqrt( color.g ); b = Math.sqrt( color.b ); return this; }
String getContextStyle() #
String getContextStyle() { // TODO: this is a little bit of a mess. We should stay consistent between // how r,g,b is set. Something in CanvasRender is setting them to doubles // when they should be int's. We could add setter/getter's to handle this return 'rgb(${_rr},${_gg},${_bb})'; }
Color offsetHSL(h, s, l) #
Color offsetHSL( h, s, l ) { var hsl = this.HSL; hsl[0] += h; hsl[1] += s; hsl[2] += l; setHSL( hsl[0], hsl[1], hsl[2] ); return this; }
Color setHex(num hex) #
Color setHex( num hex ) { var h = hex.floor().toInt(); r = ( (h&0xFF0000)>>16 ) / 255; g = ( (h&0x00FF00)>>8 ) / 255; b = (h&0x0000FF) / 255; return this; }
Color setHSL(h, s, l) #
Color setHSL( h, s, l ) { // h,s,l ranges are in 0.0 - 1.0 if ( s == 0 ) { r = g = b = l; } else { var hue2rgb = ( p, q, t ) { if ( t < 0 ) t += 1; if ( t > 1 ) t -= 1; if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; if ( t < 1 / 2 ) return q; if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); return p; }; var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); var q = ( 2 * l ) - p; this.r = hue2rgb( q, p, h + 1 / 3 ); this.g = hue2rgb( q, p, h ); this.b = hue2rgb( q, p, h - 1 / 3 ); } return this; }
Color setHSV(num h, num s, num v) #
Color setHSV( num h, num s, num v ) { // based on MochiKit implementation by Bob Ippolito // h,s,v ranges are < 0.0 - 1.0 > num i, f, p, q, t; if ( v == 0 ) { r = g = b = 0.0; } else { i = ( h * 6 ).floor(); f = ( h * 6 ) - i; p = v * ( 1 - s ); q = v * ( 1 - ( s * f ) ); t = v * ( 1 - ( s * ( 1 - f ) ) ); switch ( i ) { case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; case 5: r = v; g = p; b = q; break; case 6: // fall through case 0: r = v; g = t; b = p; break; } } return this; }