package { import flash.desktop.ClipboardFormats; import flash.desktop.NativeDragManager; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.NativeDragEvent; import flash.filesystem.File; import flash.filesystem.FileMode; import flash.filesystem.FileStream; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.utils.ByteArray; import flash.utils.getTimer; import org.libspark.swfassist.flash.display.FlashGraphics; import org.libspark.swfassist.flash.display.ShapeDrawer; import org.libspark.swfassist.flash.display.ExperimentalShapeDrawer; import org.libspark.swfassist.inprogress.swf.AnimationCollector; import org.libspark.swfassist.io.ByteArrayInputStream; import org.libspark.swfassist.swf.io.ReadingContext; import org.libspark.swfassist.swf.io.SWFReader; import org.libspark.swfassist.swf.structures.SWF; import org.libspark.swfassist.swf.tags.Tags; [SWF(backgroundColor=0xffffff)] public class SWFPlayer extends STDOUT { public function SWFPlayer() { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; _sprite = addChild(new Sprite()) as Sprite; _sprite.graphics.beginFill(0xffffff); _sprite.graphics.drawRect(0, 0, 300, 300); _sprite.graphics.endFill(); _field = addChild(new TextField()) as TextField; _field.autoSize = TextFieldAutoSize.LEFT; _field.text = 'Drop SWF file here.'; _sprite.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER, dragEnterHandler); _sprite.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP, dropHandler); } private var _input:ByteArrayInputStream; private var _context:ReadingContext; private var _reader:SWFReader; private var _swf:SWF; private var _t:uint; private var _f:uint = 0; private var _animation:AnimationCollector = new AnimationCollector(); private var _canvas:Sprite = new Sprite(); private var _drawer:ShapeDrawer = new ExperimentalShapeDrawer(new FlashGraphics()); private var _sprite:Sprite; private var _field:TextField; private function dragEnterHandler(e:NativeDragEvent):void { NativeDragManager.acceptDragDrop(_sprite); } private function dropHandler(e:NativeDragEvent):void { var fileList:Array = e.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array; if (fileList != null) { if (fileList.length >= 1) { var file:File = fileList[0] as File; if (file != null) { removeChild(_sprite); playSWF(file); } } } } private function playSWF(file:File):void { var swfBytes:ByteArray = new ByteArray(); var fileStream:FileStream = new FileStream(); fileStream.open(file, FileMode.READ); fileStream.readBytes(swfBytes); fileStream.close(); fileStream = null; _input = new ByteArrayInputStream(swfBytes); _context = new ReadingContext(); _reader = new SWFReader(); _swf = new SWF(); _reader.readSWF(_input, _context, _swf, 2000); _t = getTimer(); addEventListener(Event.ENTER_FRAME, readHandler); } private function readHandler(e:Event):void { var tags:Tags = _swf.tags; _field.text = tags.numTags.toString(); for (;;) { var l:uint = tags.numTags; _reader.readTags(_input, _context, tags, 1000); if (tags.numTags == l) { removeChild(_field); removeEventListener(Event.ENTER_FRAME, readHandler); startAnimation(); break; } if ((getTimer() - _t) > 1000) { _t = getTimer(); break; } } } private function startAnimation():void { stage.frameRate = _swf.header.frameRate; stage.nativeWindow.width = _swf.header.frameSize.xMax ; stage.nativeWindow.height = _swf.header.frameSize.yMax + 30; _swf.visit(_animation); addChild(_canvas); addEventListener(Event.ENTER_FRAME, animationHandler); } private function animationHandler(e:Event):void { _animation.drawFrame(_canvas, _drawer, ++_f); } } }