g) ? r : g;
if (b > cmax) {
cmax = b;
}
var cmin:Number = (r < g) ? r : g;
if (b < cmin) {
cmin = b;
}
B = cmax;
if (cmax != 0) {
S = (cmax - cmin)/cmax;
} else {
S = 0;
}
if (S == 0) {
H = 0;
} else {
var redc:Number = (cmax - r)/(cmax - cmin);
var greenc:Number = (cmax - g)/(cmax - cmin);
var bluec:Number = (cmax - b)/(cmax - cmin);
if (r == cmax) {
H = bluec - greenc;
} else if (g == cmax) {
H = 2.0 + redc - bluec;
} else {
H = 4.0 + greenc - redc;
}
H = H / 6.0;
if (H < 0) {
H = H + 1.0;
}
}
return [ H, S, B ];
}
private static function hsl2rgb(H:Number, S:Number, B:Number):Array
{
var r:Number = 0;
var g:Number = 0;
var b:Number = 0;
if (S == 0) {
r = B;
g = r;
b = r;
} else {
var h:Number = (H - Math.floor(H)) * 6.0;
var f:Number = h - Math.floor(h);
var p:Number = B * (1.0 - S);
var q:Number = B * (1.0 - S * f);
var t:Number = B * (1.0 - (S * (1.0 - f)));
switch(Math.floor(h)) {
case 0:
r = B; g = t; b = p;
break;
case 1:
r = q; g = B; b = p;
break;
case 2:
r = p; g = B; b = t;
break;
case 3:
r = p; g = q; b = B;
break;
case 4:
r = t; g = p; b = B;
break;
case 5:
r = B; g = p; b = q;
break;
}
}
return [r,g,b];
}
private var updateColorSpace:Function = drawHueColorspace;
private var updateColorSpace2:Function = drawHueColorspace2;
private var colorArea:Sprite = new Sprite();
private var blackArea:Sprite = new Sprite();
private var whiteArea:Sprite = new Sprite();
private var colorArea2:Sprite = new Sprite();
private var pickerHandle:Sprite;
private var pickerHandleLeft:UIComponent;
private var pickerHandleRight:UIComponent;
private var draggingPickerHandle:Boolean = false;
private var draggingPickers2:Boolean = false;
private var hue:Number = 0;
private var saturation:Number = 1;
private var lightness:Number = 1;
private var red:Number = 1;
private var green:Number = 0;
private var blue:Number = 0;
private var ored:Number = 1;
private var ogreen:Number = 0;
private var oblue:Number = 0;
private function initPickerHandle():void
{
pickerHandle = new Sprite();
pickerHandle.graphics.lineStyle(2,0x000000,1);
pickerHandle.graphics.drawCircle(0,0,4.5);
pickerHandle.graphics.endFill();
pickerHandle.graphics.lineStyle(1,0xFFFFFF,1);
pickerHandle.graphics.drawCircle(0,0,4);
pickerHandle.graphics.lineStyle();
pickerHandle.graphics.beginFill(0xFFFFFF, 0);
pickerHandle.graphics.drawRect(-3, -3, 6, 6);
pickerHandle.graphics.endFill();
maincp.addChild(pickerHandle);
}
private function initPickerHandles():void
{
pickerHandleLeft = new UIComponent();
pickerHandleLeft.graphics.beginFill(0x000000, .2 );
pickerHandleLeft.graphics.moveTo(-1,-4);
pickerHandleLeft.graphics.lineTo( 7, 2);
pickerHandleLeft.graphics.lineTo(-1, 8);
pickerHandleLeft.graphics.endFill();
pickerHandleLeft.graphics.beginFill(0x000000, .2);
pickerHandleLeft.graphics.moveTo(-1,-5);
pickerHandleLeft.graphics.lineTo( 7, 1);
pickerHandleLeft.graphics.lineTo(-1, 7);
pickerHandleLeft.graphics.endFill();
pickerHandleLeft.graphics.beginFill(0x000000);
pickerHandleLeft.graphics.moveTo(-1,-6);
pickerHandleLeft.graphics.lineTo( 7, 0);
pickerHandleLeft.graphics.lineTo(-1, 6);
pickerHandleLeft.graphics.endFill();
pickerHandleLeft.graphics.beginFill(0xcccccc);
pickerHandleLeft.graphics.moveTo( 0,-4);
pickerHandleLeft.graphics.lineTo( 5, 0);
pickerHandleLeft.graphics.lineTo( 0, 4);
pickerHandleLeft.graphics.beginFill(0xffffff);
pickerHandleLeft.graphics.moveTo( 0,-4);
pickerHandleLeft.graphics.lineTo( 3, -2);
pickerHandleLeft.graphics.lineTo( 0, 0);
pickerHandleLeft.graphics.endFill();
pickerHandleLeft.x = subcp.parent.x+3;
pickerHandleLeft.y = subcp.parent.y + 2;
this.addChild(pickerHandleLeft);
pickerHandleRight = new UIComponent();
pickerHandleRight.graphics.beginFill(0x000000, .2);
pickerHandleRight.graphics.moveTo( 4,-4);
pickerHandleRight.graphics.lineTo(-4, 2);
pickerHandleRight.graphics.lineTo( 4, 8);
pickerHandleRight.graphics.endFill();
pickerHandleRight.graphics.beginFill(0x000000, .2);
pickerHandleRight.graphics.moveTo( 4,-5);
pickerHandleRight.graphics.lineTo(-4, 1);
pickerHandleRight.graphics.lineTo( 4, 7);
pickerHandleRight.graphics.endFill();
pickerHandleRight.graphics.beginFill(0x000000);
pickerHandleRight.graphics.moveTo( 4,-6);
pickerHandleRight.graphics.lineTo(-4, 0);
pickerHandleRight.graphics.lineTo( 4, 6);
pickerHandleRight.graphics.endFill();
pickerHandleRight.graphics.beginFill(0xcccccc);
pickerHandleRight.graphics.moveTo( 3,-4);
pickerHandleRight.graphics.lineTo(-2, 0);
pickerHandleRight.graphics.lineTo( 3, 4);
pickerHandleRight.graphics.beginFill(0xffffff);
pickerHandleRight.graphics.moveTo( 3,-4);
pickerHandleRight.graphics.lineTo(0, -2);
pickerHandleRight.graphics.lineTo( 3, 0);
pickerHandleRight.graphics.endFill();
pickerHandleRight.x = subcp.parent.x+subcp.parent.width-6;
pickerHandleRight.y = subcp.parent.y + 2;
this.addChild(pickerHandleRight);
}
private function bringToFront(child:Sprite):void
{
var parent:* = child.parent;
parent.removeChild(child);
parent.addChild(child);
}
private function c(num:String, min:Number, max:Number):Number
{
var theNum:Number = Number(num);
if ( isNaN(theNum) )
return NaN;
return Math.min(Math.max(theNum, min), max);
}
/*
Getter Functions
You will notice in the getters I am checking if the textbox
is currently focused, I do this because if I return the actual
value it interferes with typing because I am clamping the value
between 0 and 255.
*/
[Bindable("colorChanged")]
private function get displayHue():*
{
if ( focusManager.getFocus() == t_hue )
{
return t_hue.text;
}
return Math.round( 360*hue );
}
[Bindable("colorChanged")]
private function get displaySaturation():*
{
if ( focusManager.getFocus() == t_saturation )
{
return t_saturation.text;
}
return Math.round( 100*saturation );
}
[Bindable("colorChanged")]
private function get displayLightness():*
{
if ( focusManager.getFocus() == t_saturation )
{
return t_lightness.text;
}
return Math.round( 100*lightness );
}
[Bindable("colorChanged")]
private function get displayRed():*
{
if ( focusManager.getFocus() == t_red )
{
return t_red.text;
}
return Math.round( 255*red );
}
[Bindable("colorChanged")]
private function get displayGreen():*
{
if ( focusManager.getFocus() == t_green )
{
return t_green.text;
}
return Math.round( 255*green );
}
[Bindable("colorChanged")]
private function get displayBlue():*
{
if ( focusManager.getFocus() == t_blue )
{
return t_blue.text;
}
return Math.round( 255*blue );
}
[Bindable("colorChanged")]
public function get hex():String
{
if ( focusManager.getFocus() == t_hex )
{
return t_hex.text;
}
else
{
var hex:String = toHex(displayRed) + toHex(displayGreen) + toHex(displayBlue);
return hex;
}
}
[Bindable("prevColorChanged")]
public function get prevhex():String
{
var hex:String = toHex(Math.round(255*ored)) + toHex(Math.round(255*ogreen)) + toHex(Math.round(255*oblue));
return hex;
}
[Bindable("colorChanged")]
private function get currentColor():uint
{
return rgb2int(red, green, blue);
}
[Bindable("colorChanged")]
private function get previousColor():uint
{
return rgb2int(ored, ogreen, oblue);
}
//just for reverse compatibility
public function get lastColor():Number
{
return rgb2int(ored, ogreen, oblue);
}
public function set lastColor(color:Number):void
{
ored = ((color>>16)&0xFF)/255;
ogreen = ((color>>8)&0xFF)/255;
oblue = ((color)&0xFF)/255;
var hsl:Array = rgb2hsl(ored, ogreen, oblue);
hue = hsl[0];
saturation = hsl[1];
lightness = hsl[2];
dispatchEvent(new Event("colorChanged"));
}
/*
Setter Functions
*/
private function set displayHue(value:Number):void
{
if ( isNaN(value) )
return;
hue = value/360;
var rgb:Array = hsl2rgb(hue, saturation, lightness);
red = rgb[0];
green = rgb[1];
blue = rgb[2];
dispatchEvent(new Event("colorChanged"));
}
private function set displaySaturation(value:Number):void
{
if ( isNaN(value) )
return;
saturation = value/100;
var rgb:Array = hsl2rgb(hue, saturation, lightness);
red = rgb[0];
green = rgb[1];
blue = rgb[2];
dispatchEvent(new Event("colorChanged"));
}
private function set displayLightness(value:Number):void
{
if ( isNaN(value) )
return;
lightness = value/100;
var rgb:Array = hsl2rgb(hue, saturation, lightness);
red = rgb[0];
green = rgb[1];
blue = rgb[2];
dispatchEvent(new Event("colorChanged"));
}
private function set displayRed(value:Number):void
{
if ( isNaN(value) )
return;
red = value/255;
var hsl:Array = rgb2hsl(red, green, blue);
hue = hsl[0];
saturation = hsl[1];
lightness = hsl[2];
dispatchEvent(new Event("colorChanged"));
}
private function set displayGreen(value:Number):void
{
if ( isNaN(value) )
return;
green = value/255;
var hsl:Array = rgb2hsl(red, green, blue);
hue = hsl[0];
saturation = hsl[1];
lightness = hsl[2];
dispatchEvent(new Event("colorChanged"));
}
private function set displayBlue(value:Number):void
{
if ( isNaN(value) )
return;
blue = value/255;
var hsl:Array = rgb2hsl(red, green, blue);
hue = hsl[0];
saturation = hsl[1];
lightness = hsl[2];
dispatchEvent(new Event("colorChanged"));
}
public function set hex(value:String):void
{
fromHex(value);
dispatchEvent(new Event("colorChanged"));
}
private function fromHex(value:String):void
{
if ( value.indexOf("#") == 0 )
value = value.substr(1);
while ( value.length < 6 )
value = "0"+value;
if ( value.length > 6 )
value = value.substr(0,6);
red = parseInt( value.substr(0,2), 16 ) / 255;
green = parseInt( value.substr(2,2), 16 ) / 255;
blue = parseInt( value.substr(4,2), 16 ) / 255;
var hsb:Array = rgb2hsl(red, green, blue);
hue = hsb[0];
saturation = hsb[1];
lightness = hsb[2];
}
private function handleHexChange():void
{
hex = t_hex.text;
}
private function toHex(value:Number):String
{
if ( isNaN(value) )
return "00";
value = Math.round(Math.max(Math.min(value, 255), 0));
var mask:String = "0123456789ABCDEF";
var pos1:Number = (value-(value%16))/16;
var pos2:Number = value%16;
return mask.charAt(pos1) + mask.charAt(pos2);
}
private function updatePickerLocation():void
{
switch ( whatColorSpace )
{
case CS_HUE:
pickerHandleLeft.y = subcp.parent.y+(subcp.height*hue) + 2;
pickerHandleRight.y = subcp.parent.y+(subcp.height*hue) + 2;
pickerHandle.x = Math.round(maincp.width*saturation);
pickerHandle.y = Math.round(maincp.height - (maincp.height*lightness));
break;
case CS_SATURATION:
pickerHandleLeft.y = subcp.parent.y+(subcp.height-(subcp.height*saturation)) + 2;
pickerHandleRight.y = subcp.parent.y+(subcp.height-(subcp.height*saturation)) + 2;
pickerHandle.x = Math.round(maincp.width*hue);
pickerHandle.y = Math.round(maincp.height - (maincp.height*lightness));
break;
case CS_LIGHTNESS:
pickerHandleLeft.y = subcp.parent.y+(subcp.height-(subcp.height*lightness)) + 2;
pickerHandleRight.y = subcp.parent.y+(subcp.height-(subcp.height*lightness)) + 2;
pickerHandle.x = Math.round(maincp.width*hue);
pickerHandle.y = Math.round(maincp.height - (maincp.height*saturation));
break;
case CS_RED:
pickerHandleLeft.y = subcp.parent.y+(subcp.height-(subcp.height*red)) + 2;
pickerHandleRight.y = subcp.parent.y+(subcp.height-(subcp.height*red)) + 2;
pickerHandle.x = Math.round(maincp.width*blue);
pickerHandle.y = Math.round(maincp.height - (maincp.height*green));
break;
case CS_GREEN:
pickerHandleLeft.y = subcp.parent.y+(subcp.height-(subcp.height*green)) + 2;
pickerHandleRight.y = subcp.parent.y+(subcp.height-(subcp.height*green)) + 2;
pickerHandle.x = Math.round(maincp.width*blue);
pickerHandle.y = Math.round(maincp.height - (maincp.height*red));
break;
case CS_BLUE:
pickerHandleLeft.y = subcp.parent.y+(subcp.height-(subcp.height*blue)) + 2;
pickerHandleRight.y = subcp.parent.y+(subcp.height-(subcp.height*blue)) + 2;
pickerHandle.x = Math.round(maincp.width*red);
pickerHandle.y = Math.round(maincp.height - (maincp.height*green));
break;
}
}
private function changeColorSpace(what:String):void
{
whatColorSpace = what;
switch ( what )
{
case CS_HUE:
updateColorSpace = drawHueColorspace;
updateColorSpace2 = drawHueColorspace2;
break;
case CS_SATURATION:
updateColorSpace = drawSaturationColorspace;
updateColorSpace2 = drawSaturationColorspace2;
break;
case CS_LIGHTNESS:
updateColorSpace = drawLightnessColorspace;
updateColorSpace2 = drawLightnessColorspace2;
break;
case CS_RED:
updateColorSpace = drawRedColorspace;
updateColorSpace2 = drawRedColorspace2;
break;
case CS_GREEN:
updateColorSpace = drawGreenColorspace;
updateColorSpace2 = drawGreenColorspace2;
break;
case CS_BLUE:
updateColorSpace = drawBlueColorspace;
updateColorSpace2 = drawBlueColorspace2;
break;
}
updatePickerLocation();
updateColorSpace();
updateColorSpace2();
bringToFront(pickerHandle);
}
private function drawHueColorspace():void
{
if ( !maincp.contains(whiteArea) )
{
if ( maincp.contains(blackArea) )
maincp.removeChild(blackArea);
maincp.addChild(whiteArea);
}
if ( !maincp.contains(blackArea) )
maincp.addChild(blackArea);
var w:Number = maincp.width;
var h:Number = maincp.height;
var rgb:Array = hsl2rgb(hue, 1, 1);
colorArea.graphics.clear();
colorArea.graphics.beginFill(rgb2int(rgb[0], rgb[1], rgb[2]));
colorArea.graphics.drawRect(0, 0, w, h);
var matrix:Matrix = new Matrix();
matrix.createGradientBox(w, h, 0, 0, 0);
whiteArea.graphics.clear();
whiteArea.graphics.beginGradientFill(GradientType.LINEAR, [0xFFFFFF, 0x000000], [1, 1], [0, 255], matrix);
whiteArea.graphics.drawRect(0, 0, w, h);
whiteArea.blendMode = "screen";
matrix.createGradientBox(w, h, Math.PI/2, 0, 0);
blackArea.graphics.clear();
blackArea.graphics.beginGradientFill(GradientType.LINEAR, [0xFFFFFF, 0x000000], [1, 1], [0, 255], matrix);
blackArea.graphics.drawRect(0, 0, w, h);
blackArea.blendMode = "multiply";
}
private function drawHueColorspace2():void
{
var w:Number = subcp.width;
var h:Number = subcp.height;
colorArea2.graphics.clear();
for ( var y:int=0; y maincp.width )
removePickerCursor(null);
if ( maincp.mouseY < 0 || maincp.mouseY > maincp.height )
removePickerCursor(null);
}
private function stopPickers2Drag(e:MouseEvent):void
{
draggingPickers2 = false;
}
public function getColorRGB():uint
{
return rgb2int(red, green, blue);
}
public function setColorRGB(color:uint):void
{
ored = red = ((color>>16)&0xFF)/255;
ogreen = green = ((color>>8)&0xFF)/255;
oblue = blue = ((color)&0xFF)/255;
var hsl:Array = rgb2hsl(red, green, blue);
hue = hsl[0];
saturation = hsl[1];
lightness = hsl[2];
dispatchEvent(new Event("colorChanged"));
}
private function cancelMe():void
{
setColorRGB(rgb2int(ored, ogreen, oblue));
PopUpManager.removePopUp(this);
}
private function closeMe():void
{
PopUpManager.removePopUp(this);
}
private function addSwatch():void {
mx.core.Application.application.globalColors.push(getColorRGB());
}
]]>
changeColorSpace(CS_HUE);changeColorSpace(CS_LIGHTNESS);