flash on 2011-6-6

by yama3
♥0 | Line 231 | Modified 2011-06-06 13:52:02 | MIT License
play

ActionScript3 source code

/**
 * Copyright yama3 ( http://wonderfl.net/user/yama3 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/jOVN
 */

package {
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Point;
    import flash.display.Sprite;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.utils.ByteArray;
    import flash.net.FileReference;
    import flash.filters.BlurFilter;
    import frocessing.color.ColorHSV;
    import com.adobe.images.JPGEncoder;
    import com.adobe.images.PNGEncoder;
    
    import com.bit101.components.Knob;
    import com.bit101.components.Label;
    import com.bit101.components.CheckBox;
    import com.bit101.components.PushButton;
    import com.bit101.components.RadioButton;
    import com.bit101.components.NumericStepper;
    
    [SWF(width='465', height='465', frameRate='25', backgroundColor='0xffffff')]
    
    public class FlashTest extends Sprite {
        private var color:ColorHSV = new ColorHSV(225);
        private var spiral_pixels:uint = 4500;
        private var spiral_radius:uint = 1;
        private var spiral_padding:uint = 4;
        private var spiral_blurX:uint = 3;
        private var spiral_blurY:uint = 3;
        
        private var offset:Number = 0;
        
        private var export_type:String;
        private var chLock:CheckBox;
        private var onLock:Boolean;
        private var zoom:Number;
        
        private var pixels:BitmapData;
        private var spiral:Bitmap;
        private var panel:Sprite;
        
        private var stageW:Number;
        private var stageH:Number;
        private var appliX:Number;
        private var appliY:Number;
        
        
        public function FlashTest() {
            stage ? init():addEventListener(Event.ADDED_TO_STAGE, init);            
        }
        
        private function init():void
        {
            if(hasEventListener(Event.ADDED_TO_STAGE))
            {
                removeEventListener(Event.ADDED_TO_STAGE, init);
            }
            
            stageH = stage.stageHeight;
            stageW = stage.stageWidth;
            
            stage.scaleMode = 'noScale';
            stage.align = 'TL';
            
            appliX = stageW / 2;
            appliY = stageH / 2;
            
            stage.addEventListener
            (
                MouseEvent.MOUSE_WHEEL,
                onPanelDisplay
            );
            
            stage.addEventListener
            (
                MouseEvent.CLICK,
                onMouseLock
            );
            
            spiral = new Bitmap();
            addChild(spiral);
            pixels = new BitmapData
            (
                stageW, stageH, false, 0
            );
            
            onPanelBuild();
            
            stage.addEventListener(Event.ENTER_FRAME, onRender);

        }
        
        private function onRender(e:Event):void
        {
            var p1:Number = mouseX - appliX;
            var p2:Number = mouseY - appliY;
            
            zoom = Math.sqrt(p1 * p1 + p2 * p2);
            
            var cc:uint = color.value;
            color.h += 0.75;
            
            var offset_d:Number = (offset += 0.0015) + (onLock ? 0 : zoom);
            var divergence:Number = (137.50776 + offset_d) / 180 * Math.PI;
            
            pixels.lock();
            
            pixels.applyFilter(pixels, pixels.rect, new Point(), new BlurFilter(spiral_blurX, spiral_blurY));
            
            for(var i:uint=0; i<spiral_pixels; i++)
            {
                var d:Number = (spiral_radius + spiral_padding) * Math.sqrt(i) - spiral_radius * 0.3;
                var a:Number = divergence * i;
                pixels.setPixel
                (
                    appliX + Math.cos(a) * d, appliY + Math.sin(a) * d, cc
                );
            }
            
            pixels.unlock();
            
            spiral.bitmapData = pixels;
        }
        
        private function onPanelBuild():void
        {
            panel = new Sprite();
            panel.x = 10;
            panel.y = 10;
            
            var rect:Sprite = new Sprite();
            rect.graphics.lineStyle(1, 0xffffff);
            rect.graphics.beginFill(0xffffff, 0.75);
            rect.graphics.drawRect(0, 0, 292, 78);
            rect.graphics.endFill();
            
            rect.addEventListener
            (
                MouseEvent.MOUSE_DOWN, onDragStart
            );
            rect.addEventListener
            (
                MouseEvent.MOUSE_UP, onDragStop
            );
            panel.addChild(rect);
            
            chLock = new CheckBox(panel, 5, 65, '', onMouseLock);
            chLock.enabled = false;
            
            var lb_lock : Label = new Label(panel, 17, 61, 'MOUSE LOCK');
            
            var btn_clear : PushButton = new PushButton(panel, 5, 44, 'CANCEL', onDataCancel);
            btn_clear.height = 16;
            btn_clear.width = 71;
            
            var btn_capture:PushButton = new PushButton(panel, 5, 22, 'CAPTURE', onDataCapture);
            btn_capture.height = 16;
            btn_capture.width = 71;
            
            var rb_png:RadioButton = new RadioButton(panel, 5, 5, 'PNG', true, onExportType);
            var rb_jpg:RadioButton = new RadioButton(panel, 46, 5, 'JPG', false, onExportType);
            
            export_type = rb_png.label;
            
            var line:Sprite = new Sprite();
            line.graphics.lineStyle(1, 0xffffff);
            line.graphics.moveTo(85, 7);
            line.graphics.lineTo(85, 74);
            
            panel.addChild(line);
            
            var kb_pixels:Knob = new Knob(panel, 95, 1, 'PIXELS', onPixels);
            kb_pixels.labelPrecision = 0;
            kb_pixels.maximum = 27500;
            kb_pixels.minimum = 500;
            kb_pixels.value = spiral_pixels;
            
            var kb_radius:Knob = new Knob(panel, 142, 1, 'RADIUS', onRadius);
            kb_radius.labelPrecision = 0;
            kb_radius.maximum = 15;
            kb_radius.minimum = 1;
            kb_radius.value = spiral_radius;
            
            var kb_padding:Knob = new Knob(panel, 189, 1, 'PADDING', onPadding);
            kb_padding.labelPrecision = 0;
            kb_padding.maximum = 15;
            kb_padding.minimum = 1;
            kb_padding.value = spiral_padding;
            
            var lb_blurX:Label = new Label(panel, 235, 1, 'BLUR X');
            var ns_blurX:NumericStepper = new NumericStepper(panel, 238, 22, onBlurX);
            ns_blurX.width = 50;
            ns_blurX.maximum = 10;
            ns_blurX.minimum = 0;
            ns_blurX.value = spiral_blurX;
            
            var lb_blurY : Label = new Label(panel, 235, 61, 'BLUR Y');
            
            var ns_blurY:NumericStepper = new NumericStepper(panel, 238, 44, onBlurY);
            ns_blurY.width = 50;
            ns_blurY.maximum = 10;
            ns_blurY.minimum = 0;
            ns_blurY.value = spiral_blurY;
            
            addChild(panel);
        }
        
        private function onPixels(e:Event):void
        {
            spiral_pixels = e.target.value;
        }
        private function onRadius(e:Event):void
        {
            spiral_radius = e.target.value;
        }
        private function onPadding(e:Event):void
        {
            spiral_padding = e.target.value;
        }
        private function onBlurX(e:Event):void
        {
            spiral_blurX = e.target.value;
        }
        private function onBlurY(e:Event):void
        {
            spiral_blurY = e.target.value;
        }
        private function onDragStart(e:MouseEvent):void
        {
            panel.startDrag();
            onLock = true;
        }
        private function onDragStop(e:MouseEvent):void
        {
            panel.stopDrag();
            onLock = chLock.selected;
        }
        private function onMouseLock(e:MouseEvent):void
        {
            if(!panel.hitTestPoint(mouseX, mouseY))
            {
                chLock.selected = (onLock = !onLock);
                
                offset += zoom;
            }
        }
        
        private function onDataCancel(e:MouseEvent):void
        {
            pixels = new BitmapData
            (
                stageW, stageH, false, 0
            );
        }
        
        private function onExportType(e:Event):void
        {
            export_type = e.target.label;
        }
        
        private function onDataCapture(e:Event):void
        {
            var img_bytes:ByteArray;
            
            switch(export_type)
            {
                case 'PNG' : img_bytes = PNGEncoder.encode(pixels);
                break;
                case 'JPG' : var coder:JPGEncoder = JPGEncoder(100);
                img_bytes = coder.encode(pixels);
            }
            
            new FileReference().save
            (
                img_bytes, 'MANDRAKE#1.' + export_type
            );
        }
        
        private function onPanelDisplay(e:MouseEvent):void
        {
            panel.visible = !panel.visible;
        }
    }
}