package
{
import flash.filters.ColorMatrixFilter;
import flash.geom.Vector3D;
import flash.geom.Matrix3D;
public class ColorCorrectionFilter
{
protected var c:Vector3D;
protected var g:Vector3D;
public var filter:ColorMatrixFilter;
static protected const radToDeg:Number = 180.0/Math.PI;
public function ColorCorrectionFilter(_oldColor:uint = 0xF0E0D0, _newColor:uint = 0xFFFFFF) {
c = new Vector3D();
g = new Vector3D();
filter = new ColorMatrixFilter();
oldColor = _oldColor;
newColor = _newColor;
}
public function set oldColor (value:uint) :void {
c = ColorCorrectionFilter.uintToVector3D(value);
updateFilter();
}
public function get oldColor () :uint {
return int(c.z) | (int(c.y)<<8) | (int(c.x)<<16);
}
public function set newColor (value:uint) :void {
g = ColorCorrectionFilter.uintToVector3D(value);
updateFilter();
}
public function get newColor () :uint {
return int(g.z) | (int(g.y)<<8) | (int(g.x)<<16);
}
protected function updateFilter() :void {
var normal:Vector3D = c.crossProduct(g);
normal.normalize();
var theta:Number = Vector3D.angleBetween(c,g) *ColorCorrectionFilter.radToDeg;
var mtrx:Matrix3D = new Matrix3D();
mtrx.prependRotation(-theta, normal);
filter = new ColorMatrixFilter( [
mtrx.rawData[0],mtrx.rawData[1],mtrx.rawData[2], 0.0, mtrx.rawData[3],
mtrx.rawData[4],mtrx.rawData[5],mtrx.rawData[6], 0.0, mtrx.rawData[7],
mtrx.rawData[8],mtrx.rawData[9],mtrx.rawData[10], 0.0, mtrx.rawData[11],
0.0, 0.0, 0.0, 1.0, 0.0
] );
}
protected static function uintToVector3D(value:uint):Vector3D {
return new Vector3D(
(value>>16) &0xFF, (value>>8)&0xFF, value&0xFF );
}
}
}