package {
import flash.display.MovieClip;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Matrix;
import flash.geom.Rectangle;
import djarts.core.CacheManager;
public class ChunkedGraphic extends MovieClip
{
public function ChunkedGraphic(clip:MovieClip, chunkSize:int = 512)
{
this.name = clip.name;
var r:Rectangle = clip.getBounds(clip);
//assuming for very large graphics that the bounds will work...
if (r.width < 2048) r = CacheManager.Instance().GetAccurateBounds(clip, 2048);
var rect = new Rectangle(0,0,chunkSize, chunkSize);
var xChunks = Math.ceil(clip.width / chunkSize);
var yChunks = Math.ceil(clip.height / chunkSize);
var finalChunkWidth = clip.width - chunkSize * Math.floor(clip.width / chunkSize);
var finalChunkHeight = clip.height - chunkSize * Math.floor(clip.height / chunkSize);
if (finalChunkWidth == 0) finalChunkWidth = chunkSize;
if (finalChunkHeight == 0) finalChunkHeight = chunkSize;
for (var y = 0; y < yChunks; y++)
{
for (var x = 0; x < xChunks; x++)
{
var chunkWidth = chunkSize;
var chunkHeight = chunkSize;
if (y == yChunks - 1) chunkHeight = finalChunkHeight;
if (x == xChunks - 1) chunkWidth = finalChunkWidth;
var chunk:MovieClip = new MovieClip();
var trans:Matrix = new Matrix();
trans.tx = -x * chunkSize - r.left;
trans.ty = -y * chunkSize - r.top;
var chunkBitmapData:BitmapData = new BitmapData(chunkWidth, chunkHeight, true, 0);
var chunkBitmap:Bitmap = new Bitmap(chunkBitmapData);
chunkBitmapData.draw(clip, trans);
chunk.addChild(chunkBitmap);
chunk.x = -trans.tx;
chunk.y = -trans.ty;
this.addChild(chunk);
}
}
this.x = clip.x;
this.y = clip.y;
}
}
}