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);