package
{
import flash.utils.*;
import flash.geom.*;
import flash.display.*;
import com.adobe.images.PNGEncoderWithAlpha;
public class Job
{
private var callback;
private var id:int;
private var name:String;
private var details;
private var graphics:Array = new Array();
public function GetID():int { return this.id; }
public function Job(id:int, graphicsDetails:Array)
{
this.id = id;
for (var i in graphicsDetails)
{
var graphic:GraphicExportDef = new GraphicExportDef(this, graphicsDetails[i], i);
if (graphic.valid)
{
graphics.push(graphic);
}
}
Exporter.Instance.Trace("new job: " + id);
}
public function FailMessage(err:String)
{
Exporter.Instance.Print("Failure: job " + id + ": " + err);
}
public function WarnMessage(err:String)
{
Exporter.Instance.Print("Warning: job " + id + ": " + err);
}
private function Fail(err:String)
{
FailMessage(err);
callback();
}
private var goIndex = -1;
public function Go(callback)
{
this.callback = callback;
goIndex = -1;
CheckNextGraphic();
}
private function CheckNextGraphic()
{
goIndex++;
if (goIndex < graphics.length)
{
graphics[goIndex].Go(CheckNextGraphic);
}
else
{
Pack();
}
}
private var allFrames:Array; //[FrameInfo]
private var packer:FramePacker;
private function Pack()
{
var allFrames:Array = new Array();
for (var i in graphics)
{
if (graphics[i].valid)
{
allFrames = allFrames.concat(graphics[i].GetFrames());
}
}
packer = new FramePacker(allFrames);
packer.Pack(PackDone);
}
private var sheets:Array; //[BitmapData]
private var sheetBytes:Array; //[ByteArray]
private function PackDone(success)
{
if (!success)
{
Fail("couldn't pack exported frames to sheets");
return;
}
var i;
sheets = new Array();
sheetBytes = new Array();
var sheetAllocators:Array = packer.GetSheets();
for (i in sheetAllocators)
{
var allocator:RectanglePacker = sheetAllocators[i];
var sheet:BitmapData = new BitmapData(allocator.width, allocator.height, true, 0x0);
sheets.push(sheet);
}
for (i in allFrames)
{
var frame:FrameInfo = allFrames[i];
var sheet:BitmapData = sheets[frame.sheetIndex];
sheet.copyPixels(frame.frame, frame.rect, frame.rect.topLeft);
}
for (i in sheets)
{
sheetBytes[i] = PNGEncoderWithAlpha.encode(sheets[i]);
}
Done();
}
public function Done()
{
Exporter.Instance.Trace("Job.Done() " + id);
this.callback();
}
public function GetResources():Array //[ByteArray]
{
return sheetBytes;
}
public function GetData()
{
var ret = {};
for (var i in graphics)
{
if (graphics[i].valid)
{
if (ret[graphics[i].name] !== undefined)
{
WarnMessage("two graphics with same name: " + graphics[i].name);
}
else
{
ret[graphics[i].name] = graphics[i].GetData();
}
}
}
return ret;
}
}
}