package flare.animate.interpolate
{    
    /**
     * Interpolator for color (<code>uint</code>) values.
     */ 
    public class ColorInterpolator extends Interpolator
    {
        private var _start:uint;
        private var _end:uint;
        
        /**
         * Creates a new ColorInterpolator.
         * @param target the object whose property is being interpolated
         * @param property the property to interpolate
         * @param start the starting color value to interpolate from
         * @param end the target color value to interpolate to
         */
        public function ColorInterpolator(target:Object, property:String,
                                          start:Object, end:Object)
        {
            super(target, property, start, end);
        }
        
        /**
         * Initializes this interpolator.
         * @param start the starting value of the interpolation
         * @param end the target value of the interpolation
         */
        protected override function init(start:Object, end:Object) : void
        {
            _start = uint(start);
            _end = uint(end);
        }
        
        /**
         * Calculate and set an interpolated property value.
         * @param f the interpolation fraction (typically between 0 and 1)
         */
        public override function interpolate(f:Number) : void
        {
            // we'll do all the work here to avoid the overhead of
            //  extra method calls (rather than call Colors.interpolate)
            var a1:uint, a2:uint, r1:uint, r2:uint, 
                g1:uint, g2:uint, b1:uint, b2:uint;
            
            // get color components
            a1 = (_start >> 24) & 0xFF; a2 = (_end >> 24) & 0xFF;
            r1 = (_start >> 16) & 0xFF; r2 = (_end >> 16) & 0xFF;
            g1 = (_start >>  8) & 0xFF; g2 = (_end >>  8) & 0xFF;
            b1 =  _start & 0xff;        b2 =  _end & 0xFF;
            
            // interpolate the color components
            a1 += f*(a2-a1); r1 += f*(r2-r1);
            g1 += f*(g2-g1); b1 += f*(b2-b1);
            
            // recombine into final color
            a1 = ((a1 & 0xFF) << 24) | ((r1 & 0xFF) << 16) |
                 ((g1 & 0xFF) <<  8) |  (b1 & 0xFF);
            
            // update the property value
            _prop.setValue(_target, a1);
        }
        
    } // end of class ColorInterpolator
}