package { import flash.display.*; import flash.geom.Point; import flash.utils.*; public class PieceLibrary { protected var pieces:Array = []; public function Reset() { pieces.splice(0); } private function GetArtistGivenName(clipName:String):String { if (clipName.match(/instance\d+/)) { return null; } return clipName; } private function GetNextAvailableName(artistName:String):String { if (artistName == null) return null; if (artistName.match("^instance\\d+$")) return null; var maxNameCount = 0; for (var i in pieces) { if (pieces[i].Name != null) { var m = pieces[i].Name.match(new RegExp("^" + artistName + "(\\d+)?$")); if (m) { maxNameCount = Math.max(maxNameCount, m[1] == undefined ? 1 : (Number(m[1]) + 1)); } } } return artistName + (maxNameCount == 0 ? "" : maxNameCount); } public function GetPieceFromClip(clip:DisplayObject, outCenterPoint:Point, upscale:Number = 1) { var piece:Piece = GetExistingPiece(Piece.GenerateCompareData(clip), clip.name); if (piece != null) return piece; piece = new Piece(); var center:Point = piece.InitFromClip(clip, upscale); if (piece.Valid) { piece.Name = GetNextAvailableName(clip.name); pieces.push(piece); outCenterPoint.x = center.x; outCenterPoint.y = center.y; return piece; } return null; } private function GetExistingPiece(compareData:BitmapData, artistName:String) { if (compareData == null) return null; for (var i in pieces) { if (pieces[i].Matches(compareData, artistName)) { if (pieces[i].Name == null) { pieces[i].Name = GetNextAvailableName(artistName); } return pieces[i]; } } return null; } public function GetPieceFromBitmapData(bd:BitmapData, pieceName:String, centerPoint:Point = null) { if (centerPoint == null) centerPoint = new Point(0, 0); var piece:Piece = GetExistingPiece(bd, pieceName); if (piece != null) return piece; piece = new Piece(); piece.InitFromBitmapData(bd, centerPoint); if (piece.Valid) { piece.Name = GetNextAvailableName(pieceName); pieces.push(piece); return piece; } return null; } public function Debug() { var nextX = 0; for (var i = 0; i < pieces.length; i++) { if (pieces[i].TotalUses > 0) { var b:Bitmap = new Bitmap(pieces[i].FullData); b.scaleX = b.scaleY = 1; b.x = nextX; nextX += b.width; } } } public function get NumUsedPieces() { var count = 0; for (var i in this.pieces) { if (pieces[i].TotalUses > 0) { count++; } } return count; } public function GetAllUsedPieces():Array { var ret:Array = []; for (var i in this.pieces) { if (pieces[i].TotalUses > 0) { ret.push(pieces[i]); } } return ret; } public function EnsureAllUsedPiecesHaveNames() { var index = 0; var used:Array = GetAllUsedPieces(); for (var i in used) { if (used[i].Name == null) used[i].Name = "UnknownPiece" + (index++); } } } }