package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.filters.BlurFilter;
    import flash.filters.DropShadowFilter;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;

    [SWF(width=640, height=480, backgroundColor=0xf0f0e0, frameRate=30)]
    public class SprayPaint extends Sprite
    {
        private var canvas:BitmapData;
        private var color:uint;
        private var size:Number = 20;
        private var density:Number = 100; // –§“x

        public function SprayPaint()
        {
            this.addEventListener( Event.ADDED_TO_STAGE, init );
        }

        private function init( ev:Event ):void
        {
            this.removeEventListener( Event.ADDED_TO_STAGE, init );
            stage.scaleMode = StageScaleMode.NO_SCALE;
            if( stage.stageWidth == 0 || stage.stageHeight == 0 )
            {
                // error.
                var tf:TextField = new TextField();
                tf.text = 'error! stageWidth == ' + stage.stageWidth.toString() + ', stageHeight == ' + stage.stageHeight.toString();
                tf.autoSize = TextFieldAutoSize.LEFT;
                addChild(tf);
                return;
            }

            canvas = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0x00000000);
            var bmp:Bitmap = new Bitmap(canvas);
            bmp.filters = [new BlurFilter(2, 2, 3), new DropShadowFilter()];
            addChild(bmp);

            stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
            stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
        }

        private function onMouseDown(event:MouseEvent):void
        {
            color = Math.random() * 0xffffff + 0xff000000;
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private function onMouseUp(event:MouseEvent):void
        {
            removeEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private function onEnterFrame(event:Event):void
        {
            for(var i:int = 0; i < density; i++)
            {
                var angle:Number = Math.random() * Math.PI * 2;
                var radius:Number = Math.random() * size;
                var xpos:Number = mouseX + Math.cos(angle) * radius;
                var ypos:Number = mouseY + Math.sin(angle) * radius;
                canvas.setPixel32(xpos, ypos, color);
            }
        }
    }
}