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:
@@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user