Working with the callbacks to be able to translate images is way more exciting than I really appreciate. But hey, this theoretically should be happier now.

git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@950 ed5b42cb-e716-0410-a449-f6a68f950b19
This commit is contained in:
Mike Thomas
2010-07-13 23:43:41 +00:00
parent 6987d008e2
commit f7befa1fae
+52 -21
View File
@@ -182,48 +182,79 @@ public class AutoFringer
// There's no fringe with the same identifier, so we need to create the tile. // There's no fringe with the same identifier, so we need to create the tile.
var img :Bitmap = null; var img :Bitmap = null;
for each (fringer in fringers) { getTileImageHelper1(img, hashValue, masks, fringers, 0, function (result :Bitmap) {
indexes = getFringeIndexes(fringer.bits); frTile.setImage(result);
tsr = _fringeConf.getFringe(fringer.baseset, hashValue); });
for each (index in indexes) {
try {
img = getTileImage(img, tsr, fringer.baseset, index, hashValue, masks);
} catch (nstse :NoSuchTileSetError) {
log.warning("Autofringer couldn't find a needed tileset", nstse);
}
}
}
frTile.setImage(img);
fringes.put(frTile, new WeakReference(frTile)); fringes.put(frTile, new WeakReference(frTile));
return frTile; return frTile;
} }
protected function getTileImageHelper1 (img :Bitmap, hashValue :int, masks :Map,
fringers :Array, fringerIdx :int, callback :Function)
{
var fringer :FringerRec = fringers[fringerIdx];
var indexes :Array = getFringeIndexes(fringer.bits);
var tsr :FringeTileSetRecord = _fringeConf.getFringe(fringer.baseset, hashValue);
getTileImageHelper0(img, tsr, fringer.baseset, hashValue, masks, indexes, 0,
function (result :Bitmap) :void {
if (fringerIdx == fringers.size() - 1) {
callback(result);
} else {
getTileImageHelper1(img, hashValue, masks, fringers, fringerIdx + 1, callback);
}
});
}
protected function getTileImageHelper0 (img :Bitmap, tsr :FringeTileSetRecord,
baseset :int, hashValue :int, masks :Map, indexes :Array,
indexIdx :int, callback :Function) :void
{
try {
getTileImage(img, tsr, baseset, indexes[indexIdx], hashValue, masks,
function (result :Bitmap) :void {
if (indexIdx == indexes.size() - 1) {
callback(result);
} else {
getTileImageHelper0(img, tsr, baseset, hashValue, masks, indexes,
indexIdx + 1, callback);
}
});
} catch (nstse :NoSuchTileSetError) {
log.warning("Autofringer couldn't find a needed tileset", nstse);
callback(null);
}
}
/** /**
* Retrieve or compose an image for the specified fringe. * Retrieve or compose an image for the specified fringe.
*/ */
protected function getTileImage (img :Bitmap, tsr :FringeTileSetRecord , protected function getTileImage (img :Bitmap, tsr :FringeTileSetRecord ,
baseset :int, index :int, hashValue :int, masks :Map) :Bitmap baseset :int, index :int, hashValue :int, masks :Map, callback :Function) :void
{ {
var fringeset :int = tsr.fringe_tsid; var fringeset :int = tsr.fringe_tsid;
var fset :TileSet = _tMgr.getTileSet(fringeset); var fset :TileSet = _tMgr.getTileSet(fringeset);
if (!tsr.mask) { if (!tsr.mask) {
// oh good, this is easy // oh good, this is easy
var stamp :Tile = fset.getTile(index); var stamp :Tile = fset.getTile(index);
return stampTileImage(stamp, img, stamp.getWidth(), stamp.getHeight()); callback(stampTileImage(stamp, img, stamp.getWidth(), stamp.getHeight()));
return;
} }
// otherwise, it's a mask.. // otherwise, it's a mask..
var maskkey :int = (baseset << 20) + (fringeset << 8) + index; var maskkey :int = (baseset << 20) + (fringeset << 8) + index;
var mask :Bitmap = masks.get(maskkey); var mask :Bitmap = masks.get(maskkey);
if (mask == null) { if (mask == null) {
// TODO - callbacks _tMgr.getTileSet(fringeset).getTileImage(index, null, function (fsrc :Bitmap) :void {
var fsrc :Bitmap = Bitmap(_tMgr.getTileSet(fringeset).getTileImage(index, null, null)); _tMgr.getTileSet(baseset).getTileImage(0, null, function (bsrc :Bitmap) :void {
var bsrc :Bitmap = Bitmap(_tMgr.getTileSet(baseset).getTileImage(0, null, null)); mask = composeMaskedImage(fsrc, bsrc);
mask = composeMaskedImage(fsrc, bsrc); masks.put(maskkey, mask);
masks.put(maskkey, mask); callback(stampTileImage(mask, img, mask.width, mask.height));
} });
});
return stampTileImage(mask, img, mask.width, mask.height); } else {
callback(stampTileImage(mask, img, mask.width, mask.height));
}
} }