Skip to content

Instantly share code, notes, and snippets.

@gunn
Created February 10, 2012 12:08
Show Gist options
  • Save gunn/1789120 to your computer and use it in GitHub Desktop.
Save gunn/1789120 to your computer and use it in GitHub Desktop.
Custom colour library for actionscript, used in gunnmap and astrotour amongst other projects
//Arthur Gunn 2007, [email protected]
package nz.co.gunn.colour {
public class Colour {
public function Colour () {};
public static function getColourString (colour:uint):String {
var string:String = colour.toString(16);
while (string.length < 6) string = 0+string;
return string;
};
public static function colourFromRGB (rgb:RGB):uint {
rgb.r = (rgb.r>0xFF)? 0xFF : rgb.r;
rgb.g = (rgb.g>0xFF)? 0xFF : rgb.g;
rgb.b = (rgb.b>0xFF)? 0xFF : rgb.b;
return (rgb.r) << 16 | (rgb.g) << 8 | (rgb.b);
};
public static function rgbFromColour (col:uint):RGB {
return new RGB( (col >> 16) & 0xFF,
(col >> 8) & 0xFF,
(col & 0xFF));
};
public static function hsvFromRGB(rgb:RGB):HSV {
var h:Number, s:Number, v:Number;
var min:Number, max:Number, delta:Number;
min = Math.min( rgb.r, rgb.g, rgb.b );
max = Math.max( rgb.r, rgb.g, rgb.b );
v = max;
delta = max - min;
if( max != 0 )
s = delta / max;
else {
s = 0;
h = -1;
return new HSV(h, s, v);
}
if( rgb.r == max ) h = ( rgb.g - rgb.b ) / delta; // between yellow & magenta
else if( rgb.g == max ) h = 2 + ( rgb.b - rgb.r ) / delta; // between cyan & yellow
else h = 4 + ( rgb.r - rgb.g ) / delta; // between magenta & cyan
h *= 60;
if( h < 0 ) h += 360;
return new HSV(h, s, v);
};
public static function rgbFromHSV(hsv:HSV):RGB {
var i:Number;
var r:Number, g:Number, b:Number;
var f:Number, p:Number, q:Number, t:Number;
if( hsv.s == 0 ) {
return new RGB(hsv.v, hsv.v, hsv.v);
}
hsv.h /= 60; // sector 0 to 5
i = Math.floor( hsv.h );
f = hsv.h - i; // factorial part of h
p = hsv.v * ( 1 - hsv.s );
q = hsv.v * ( 1 - hsv.s * f );
t = hsv.v * ( 1 - hsv.s * ( 1 - f ) );
switch( i ) {
case 0:
r = hsv.v;
g = t;
b = p;
break;
case 1:
r = q;
g = hsv.v;
b = p;
break;
case 2:
r = p;
g = hsv.v;
b = t;
break;
case 3:
r = p;
g = q;
b = hsv.v;
break;
case 4:
r = t;
g = p;
b = hsv.v;
break;
default: // case 5:
r = hsv.v;
g = p;
b = q;
break;
}
return new RGB(r, g, b);
}
public static function combine (col1:uint, col2:uint, ratio:Number, clockwise:Boolean=true):uint {
var hsv1:HSV = hsvFromRGB(rgbFromColour(col1));
var hsv2:HSV = hsvFromRGB(rgbFromColour(col2));
if (hsv1.s == 0) hsv1.h = hsv2.h;
else if (hsv2.s == 0) hsv2.h = hsv1.h;
if (clockwise && hsv1.h > hsv2.h) hsv2.h += 360;
else if (!clockwise && hsv2.h > hsv1.h) hsv1.h += 360;
var h:Number = (hsv1.h*ratio + hsv2.h*(1-ratio)) % 360;
var s:Number = hsv1.s*ratio + hsv2.s*(1-ratio);
var v:Number = hsv1.v*ratio + hsv2.v*(1-ratio);
return colourFromRGB(rgbFromHSV(new HSV(h, s, v)));
};
public static function mix (colour1:uint, colour2:uint, ratio:Number):uint {
var rgb1:RGB = rgbFromColour(colour1);
var rgb2:RGB = rgbFromColour(colour2);
var red:uint = Math.round(rgb1.r*ratio + rgb2.r*(1-ratio));
var green:uint = Math.round(rgb1.g*ratio + rgb2.g*(1-ratio));
var blue:uint = Math.round(rgb1.b*ratio + rgb2.b*(1-ratio));
red = (red>0xFF)? 0xFF : red;
green = (green>0xFF)? 0xFF : green;
blue = (blue>0xFF)? 0xFF : blue;
return colourFromRGB(new RGB(red, green, blue));
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment