package com.compuedit.effect { import com.compuedit.utils.MathUtil; import flash.display.BitmapData; import flash.display.IBitmapDrawable; import flash.events.MouseEvent; import flash.geom.ColorTransform; import flash.geom.Matrix; import flash.geom.Point; import flash.geom.Rectangle; public class EscherBitmapData extends BitmapData { private var _alpha:Number; private var _f:Number; private var _r1:Number; private var _r2:Number; private var _logR2R1:Number; private var _center:Point = new Point(); private var _scale:Number = 1.0; private var _rotale:Number = 0.0; private var _src:BitmapData; public function get r1() : Number { return _r1; } public function set r1(value:Number) : void { _r1 = value; } public function get r2() : Number { return _r2; } public function set r2(value:Number) : void { _r2 = value; } public function get center() : Point { return _center; } public function set center(value:Point) : void { _center.x = this.width/2 - value.x; _center.y = value.y - this.height/2; } public function get scale() : Number { return _scale; } public function set scale(value:Number) : void { _scale = value; } public function get rotale() : Number { return _rotale; } public function set rotale(value:Number) : void { _rotale = value; } public function EscherBitmapData(width:int, height:int, r1:Number, r2:Number) { super(width, height); _r1 = r1; _r2 = r2; } public override function draw(source:IBitmapDrawable, matrix:Matrix=null, colorTransform:ColorTransform=null, blendMode:String=null, clipRect:Rectangle=null, smoothing:Boolean=false):void { _src = new BitmapData(this.width, this.height); _src.draw(source); update(); } public function update() : void { _alpha = Math.atan( Math.log(r2 / r1) / (2.0 * Math.PI) ); _f = Math.cos( _alpha ); _logR2R1 = Math.log( r2 / r1 ); var cosTheta:Number = Math.cos(rotale); var sinTheta:Number = Math.sin(rotale); var vecX:Point = new Point(cosTheta * scale, sinTheta * scale); var vecY:Point = new Point(sinTheta * scale, -cosTheta * scale); var w_half:Number = _src.width/2; var h_half:Number = _src.height/2; var startX:Number = center.x - (w_half * cosTheta + h_half * sinTheta) * scale; var startY:Number = center.y + (-w_half * sinTheta + h_half * cosTheta) * scale; var i:int; var j:int; for(i=0; i