package
{
import flash.utils.*;
import flash.display.*;
import flash.system.LoaderContext;
import flash.events.*;
import by.blooddy.crypto.*;
import flash.system.SecurityDomain;
public class GraphicExportDef
{
public const TYPE_SPRITES = 1;
public const TYPE_SKELETAL = 2;
private var _exportType:int = 1;
public function get exportType():int { return _exportType; }
private var _name:String = null;
public function get name():String { return _name; }
private var _valid:Boolean = false;
public function get valid():Boolean { return _valid; }
private var _padding:int = 0;
public function get padding():int { return _padding; }
private var _scale:Number = 0;
public function get scale():Number { return _scale; }
private var input:ByteArray;
private var inputLoader:Loader = null;
private var parentJob:Job = null;
private var callback = null;
private var index:int = 0;
public function GraphicExportDef(parentJob:Job, details, index:int)
{
this.parentJob = parentJob;
this.index = index;
if (!details.hasOwnProperty("type") || !details.hasOwnProperty("name") || !details.hasOwnProperty("input"))
{
Fail("graphic export is missing a required name, type, or input");
return;
}
_exportType = parseInt(details.type);
_name = "" + details.name;
input = Base64.decode("" + details.input);
_padding = details.hasOwnProperty("padding") ? parseInt(details.padding) : 0;
_scale = details.hasOwnProperty("scale") ? parseFloat(details.scale) : 1;
_valid = true;
}
public function Fail(err:String)
{
parentJob.FailMessage("(" + index + ")" + err);
_valid = false;
if (callback != null) callback();
}
public function Go(callback)
{
this.callback = callback;
inputLoader = new Loader();
inputLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, LoaderComplete);
inputLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, LoaderError);
var context:LoaderContext = new LoaderContext();
context.allowCodeImport = true;
inputLoader.loadBytes(input, context);
}
private var frames:IFramesSource = null;
private function LoaderComplete(e)
{
try
{
var classDef = e.target.applicationDomain.getDefinition(name);
if (classDef == null)
{
Fail("didn't contain a definition for " + name);
return;
}
var clip = new classDef();
if (!(clip is MovieClip))
{
Fail(name + " wasn't a movieclip");
}
Utils.RecursivelyStop(clip);
frames = null;
switch (exportType)
{
case TYPE_SPRITES:
frames = new AnimatedSpriteGenerator(clip, this);
break;
case TYPE_SKELETAL:
frames = new AnimatedSkeletonGenerator(clip, this);
break;
}
if (frames == null)
{
Fail("invalid export type: " + exportType);
return;
}
frames.Go(FramesDone);
} catch (e)
{
Exporter.Instance.Print(e.getStackTrace());
}
}
private function FramesDone(success)
{
if (!success)
{
Fail("couldn't get source frames");
return;
}
Done();
}
private function LoaderError(e)
{
Fail("couldn't load input: " + e.toString());
}
public function Done()
{
this.callback();
}
public function GetFrames():Array
{
return frames.GetFrames();
}
public function GetData()
{
return frames.GetData();
}
}
}