1  /*
     2   Copyright aswing.org, see the LICENCE.txt.
     3  */
     4  
     5  /**
     6   * ASColor object to set color and alpha for a movieclip.
     7   * @author firdosh
     8   */
     9  class org.aswing.ASColor{
    10  	
    11  	private static var FACTOR:Number = 0.7;
    12  	
    13  	private var rgb:Number;
    14  	private var alpha:Number;
    15  	
    16  	public function ASColor (color:Number, alpha:Number){
    17  		setRGB(color);
    18  		setAlpha(alpha);
    19  	}
    20  	
    21  	private function setRGB(rgb:Number):Void{
    22  		if(rgb == null){
    23  			this.rgb = black.getRGB();
    24  		}else{
    25  			this.rgb = rgb;		
    26  		}
    27  	}
    28  	
    29  	private function setAlpha(alpha:Number):Void{
    30  		if(alpha == null){
    31  			this.alpha = 100;
    32  		}else{
    33  			this.alpha = Math.min(100, Math.max(0, alpha));
    34  		}
    35  	}
    36  	
    37  	/**
    38  	 * Returns the alpha component in the range 0-100.
    39  	 */
    40  	public function getAlpha():Number{
    41  		return alpha;	
    42  	}
    43  	
    44  	/**
    45  	 * Returns the RGB value representing the color.
    46  	 */
    47  	public function getRGB():Number{
    48  		return rgb;	
    49  	}
    50  	
    51  	/**
    52       * Returns the red component in the range 0-255.
    53       * @return the red component.
    54       * @see #getColor()
    55       */
    56  	public function getRed():Number{
    57  		return (rgb & 0x00FF0000) >> 16;
    58  	}
    59  	
    60  	/**
    61       * Returns the green component in the range 0-255.
    62       * @return the green component.
    63       * @see #getColor()
    64       */	
    65  	public function getGreen():Number{
    66  		return (rgb & 0x0000FF00) >> 8;
    67  	}
    68  	
    69  	/**
    70       * Returns the blue component in the range 0-255.
    71       * @return the blue component.
    72       * @see #getColor()
    73       */	
    74  	public function getBlue():Number{
    75  		return (rgb & 0x000000FF);
    76  	}
    77  	
    78      /**
    79       * darker(factor:Number)<br>
    80       * darker() default factor to 0.7
    81       * <p>
    82       * Creates a new <code>Color</code> that is a darker version of this
    83       * <code>Color</code>.
    84       * @param factor the darker factor(0, 1), default is 0.7
    85       * @return     a new <code>Color</code> object that is  
    86       *                 a darker version of this <code>Color</code>.
    87       * @see        #brighter()
    88       */		
    89  	public function darker(factor:Number):ASColor{
    90  		if(factor == undefined){
    91  			factor = FACTOR;
    92  		}
    93          var r:Number = getRed();
    94          var g:Number = getGreen();
    95          var b:Number = getBlue();
    96  		return getASColor(r*factor, g*factor, b*factor, alpha);
    97  	}
    98  	
    99      /**
   100       * brighter(factor:Number)<br>
   101       * brighter() default factor to 0.7
   102       * <p>
   103       * Creates a new <code>Color</code> that is a brighter version of this
   104       * <code>Color</code>.
   105       * @param factor the birghter factor(0, 1), default is 0.7
   106       * @return     a new <code>Color</code> object that is  
   107       *                 a brighter version of this <code>Color</code>.
   108       * @see        #darker()
   109       */	
   110  	public function brighter(factor:Number):ASColor{
   111  		if(factor == undefined){
   112  			factor = FACTOR;
   113  		}
   114          var r:Number = getRed();
   115          var g:Number = getGreen();
   116          var b:Number = getBlue();
   117  
   118          /* From 2D group:
   119           * 1. black.brighter() should return grey
   120           * 2. applying brighter to blue will always return blue, brighter
   121           * 3. non pure color (non zero rgb) will eventually return white
   122           */
   123          var i:Number = Math.floor(1.0/(1.0-factor));
   124          if ( r == 0 && g == 0 && b == 0) {
   125             return getASColor(i, i, i, alpha);
   126          }
   127          if ( r > 0 && r < i ) r = i;
   128          if ( g > 0 && g < i ) g = i;
   129          if ( b > 0 && b < i ) b = i;
   130          
   131          return getASColor(r/factor, g/factor, b/factor, alpha);
   132  	}
   133  	
   134  	/**
   135  	 * Returns a ASColor with with the specified red, green, blue values in the range (0 - 255) 
   136  	 * and alpha value in range(0-100). 
   137  	 * <p>
   138  	 * getASColor(r:Number, g:Number, b:Number, a:Number)<br>
   139  	 * getASColor(r:Number, g:Number, b:Number)<br> alpha default to 100
   140  	 */
   141  	public static function getASColor(r:Number, g:Number, b:Number, a:Number):ASColor{
   142  		return new ASColor(getRGBWith(r, g, b), a);
   143  	}
   144  		
   145  	/**
   146  	 * Returns the RGB value representing the red, green, and blue values. 
   147  	 */
   148  	public static function getRGBWith(rr:Number, gg:Number, bb:Number):Number {
   149  		var r:Number = Math.round(rr);
   150  		var g:Number = Math.round(gg);
   151  		var b:Number = Math.round(bb);
   152  		if(r < 0){
   153  			r = 0;
   154  		}
   155  		if(r > 255){
   156  			r = 255;
   157  		}
   158  		if(g < 0){
   159  			g = 0;
   160  		}
   161  		if(g > 255){
   162  			g = 255;
   163  		}
   164  		if(b < 0){
   165  			b = 0;
   166  		}
   167  		if(b > 255){
   168  			b = 255;
   169  		}
   170  		var color_n:Number = (r<<16) + (g<<8) +b;
   171  		return color_n;
   172  	}
   173  	
   174  	public function toString():String{
   175  		return "ASColor(rgb:"+rgb.toString(16)+", alpha:"+alpha+")";
   176  	}
   177  	
   178  	public function equals(o:Object):Boolean{
   179  		var c:ASColor = ASColor(o);
   180  		if(c!=null){
   181  			return c.alpha === alpha && c.rgb === rgb;
   182  		}else{
   183  			return false;
   184  		}
   185  	}
   186  	
   187  	private static var white:ASColor = new ASColor(0xffffff);
   188  	public static function get WHITE():ASColor{
   189  		return white;
   190  	}
   191  	
   192  	private static var lightGray:ASColor = new ASColor(0xc0c0c0);
   193  	public static function get LIGHT_GRAY():ASColor{
   194  		return lightGray;
   195  	}
   196  	
   197  	private static var gray:ASColor = new ASColor(0x808080);
   198  	public static function get GRAY():ASColor{
   199  		return gray;
   200  	}
   201  	
   202  	private static var darkGray:ASColor = new ASColor(0x404040);
   203  	public static function get DARK_GRAY():ASColor{
   204  		return darkGray;
   205  	}
   206  	
   207  	private static var black:ASColor = new ASColor(0x000000);
   208  	public static function get BLACK():ASColor{
   209  		return black;
   210  	}
   211  	
   212  	private static var red:ASColor = new ASColor(0xff0000);
   213  	public static function get RED():ASColor{
   214  		return red;
   215  	}
   216  	
   217  	private static var pink:ASColor = new ASColor(0xffafaf);
   218  	public static function get PINK():ASColor{
   219  		return pink;
   220  	}
   221  	
   222  	private static var orange:ASColor = new ASColor(0xffc800);
   223  	public static function get ORANGE():ASColor{
   224  		return orange;
   225  	}
   226  	
   227  	private static var haloOrange:ASColor = new ASColor(0xFFC200);
   228  	public static function get HALO_ORANGE():ASColor{
   229  		return haloOrange;
   230  	}
   231  	
   232  	private static var yellow:ASColor = new ASColor(0xffff00);
   233  	public static function get YELLOW():ASColor{
   234  		return yellow;
   235  	}
   236  	
   237  	private static var green:ASColor = new ASColor(0x00ff00);
   238  	public static function get GREEN():ASColor{
   239  		return green;
   240  	}
   241  	
   242  	private static var haloGreen:ASColor = new ASColor(0x80FF4D);
   243  	public static function get HALO_GREEN():ASColor{
   244  		return haloGreen;
   245  	}
   246  	
   247  	private static var magenta:ASColor = new ASColor(0xff00ff);
   248  	public static function get MAGENTA():ASColor{
   249  		return magenta;
   250  	}
   251  	
   252  	private static var cyan:ASColor = new ASColor(0x00ffff);
   253  	public static function get CYAN():ASColor{
   254  		return cyan;
   255  	}
   256  	
   257  	private static var blue:ASColor = new ASColor(0x0000ff);
   258  	public static function get BLUE():ASColor{
   259  		return blue;
   260  	}
   261  	
   262  	private static var haloBlue:ASColor = new ASColor(0x2BF5F5);
   263  	public static function get HALO_BLUE():ASColor{
   264  		return haloBlue;
   265  	}
   266  	
   267  		
   268  }
   269