diff --git a/src/java/com/threerings/media/tile/ObjectTileSet.java b/src/java/com/threerings/media/tile/ObjectTileSet.java index 84d43de33..a6af4c01a 100644 --- a/src/java/com/threerings/media/tile/ObjectTileSet.java +++ b/src/java/com/threerings/media/tile/ObjectTileSet.java @@ -1,11 +1,12 @@ // -// $Id: ObjectTileSet.java,v 1.14 2003/02/06 06:23:05 mdb Exp $ +// $Id: ObjectTileSet.java,v 1.15 2003/04/01 02:16:28 mdb Exp $ package com.threerings.media.tile; import com.samskivert.util.StringUtil; import com.threerings.media.image.Mirage; +import com.threerings.media.image.Colorization; /** * The object tileset supports the specification of object information for @@ -145,6 +146,19 @@ public class ObjectTileSet extends SwissArmyTileSet buf.append(", sorients=").append(StringUtil.toString(_sorients)); } + // documentation inherited + protected Colorization[] getColorizations (int tileIndex, Colorizer rizer) + { + Colorization[] zations = null; + if (rizer != null && _zations != null) { + zations = new Colorization[_zations.length]; + for (int ii = 0; ii < _zations.length; ii++) { + zations[ii] = rizer.getColorization(_zations[ii]); + } + } + return zations; + } + /** * Creates instances of {@link ObjectTile}, which can span more than a * single tile's space in a display. diff --git a/src/java/com/threerings/media/tile/TileManager.java b/src/java/com/threerings/media/tile/TileManager.java index 7845dee1e..92068dfbc 100644 --- a/src/java/com/threerings/media/tile/TileManager.java +++ b/src/java/com/threerings/media/tile/TileManager.java @@ -1,5 +1,5 @@ // -// $Id: TileManager.java,v 1.30 2003/02/28 02:03:43 mdb Exp $ +// $Id: TileManager.java,v 1.31 2003/04/01 02:16:28 mdb Exp $ package com.threerings.media.tile; @@ -198,7 +198,20 @@ public class TileManager throws NoSuchTileSetException, NoSuchTileException { return getTile(TileUtil.getTileSetId(fqTileId), - TileUtil.getTileIndex(fqTileId)); + TileUtil.getTileIndex(fqTileId), null); + } + + /** + * Returns the {@link Tile} object with the specified fully qualified + * tile id. The supplied colorizer will be used to recolor the tile. + * + * @see TileUtil#getFQTileId + */ + public Tile getTile (int fqTileId, TileSet.Colorizer rizer) + throws NoSuchTileSetException, NoSuchTileException + { + return getTile(TileUtil.getTileSetId(fqTileId), + TileUtil.getTileIndex(fqTileId), rizer); } /** @@ -210,28 +223,11 @@ public class TileManager * * @return the tile object. */ - public Tile getTile (int tileSetId, int tileIndex) + public Tile getTile (int tileSetId, int tileIndex, TileSet.Colorizer rizer) throws NoSuchTileSetException, NoSuchTileException { TileSet set = getTileSet(tileSetId); - return set.getTile(tileIndex); - } - - /** - * Returns the {@link Tile} object from the specified tileset at the - * specified index with the specified colorizations applied to it. - * - * @param tileSetId the tileset id. - * @param tileIndex the index of the tile to be retrieved. - * @param zations colorizations to be applied to the tile image. - * - * @return the tile object. - */ - public Tile getTile (int tileSetId, int tileIndex, Colorization[] zations) - throws NoSuchTileSetException, NoSuchTileException - { - TileSet set = getTileSet(tileSetId); - return set.getTile(tileIndex); + return set.getTile(tileIndex, rizer); } /** The entity through which we decode and cache images. */ diff --git a/src/java/com/threerings/media/tile/TileSet.java b/src/java/com/threerings/media/tile/TileSet.java index 88b09b49f..044f4e8e7 100644 --- a/src/java/com/threerings/media/tile/TileSet.java +++ b/src/java/com/threerings/media/tile/TileSet.java @@ -1,5 +1,5 @@ // -// $Id: TileSet.java,v 1.43 2003/02/04 21:38:46 mdb Exp $ +// $Id: TileSet.java,v 1.44 2003/04/01 02:16:28 mdb Exp $ package com.threerings.media.tile; @@ -7,6 +7,7 @@ import java.awt.Color; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.Serializable; +import java.util.Arrays; import com.samskivert.util.LRUHashMap; import com.samskivert.util.RuntimeAdjust; @@ -37,6 +38,16 @@ import com.threerings.media.image.Mirage; public abstract class TileSet implements Cloneable, Serializable { + /** Used to assign colorizations to tiles that require them. */ + public static interface Colorizer + { + /** + * Returns the colorization to be used for the specified named + * colorization class. + */ + public Colorization getColorization (String zation); + } + /** * Configures this tileset with an image provider that it can use to * load its tileset image. This will be called automatically when the @@ -45,12 +56,6 @@ public abstract class TileSet public void setImageProvider (ImageProvider improv) { _improv = improv; - - // HACKOLA: if we're a vessel tileset, colorize ourselves - if (_name != null && (this instanceof TrimmedObjectTileSet) && - _name.indexOf("Vessel") != -1) { - _zations = ZATIONS; - } } /** @@ -125,6 +130,16 @@ public abstract class TileSet return dup; } + /** + * Equivalent to {@link# getTile(int,Colorizer)} with a null + * Colorizer argument. + */ + public Tile getTile (int tileIndex) + throws NoSuchTileException + { + return getTile(tileIndex, null); + } + /** * Creates a {@link Tile} object from this tileset corresponding to * the specified tile id and returns that tile. A null tile will never @@ -134,13 +149,16 @@ public abstract class TileSet * @param tileIndex the index of the tile in the tileset. Tile indexes * start with zero as the upper left tile and increase by one as the * tiles move left to right and top to bottom over the source image. + * @param rizer an entity that will be used to obtain colorizations + * for tilesets that are recolorizable. Passing null if the tileset is + * known not to be recolorizable is valid. * * @return the tile object. * * @exception NoSuchTileException thrown if the specified tile index * is out of range for this tileset. */ - public Tile getTile (int tileIndex) + public Tile getTile (int tileIndex, Colorizer rizer) throws NoSuchTileException { checkTileIndex(tileIndex); @@ -156,12 +174,11 @@ public abstract class TileSet }); } - // fetch and cache the tile - Tuple key = new Tuple(this, new Integer(tileIndex)); + Colorization[] zations = getColorizations(tileIndex, rizer); + TileKey key = new TileKey(this, tileIndex, zations); Tile tile = (Tile)_tiles.get(key); if (tile == null) { - // create and initialize the tile object - tile = createTile(tileIndex, getTileMirage(tileIndex)); + tile = createTile(tileIndex, getTileMirage(tileIndex, zations)); initTile(tile); _tiles.put(key, tile); } @@ -169,6 +186,18 @@ public abstract class TileSet return tile; } + /** + * Returns colorizations for the specified tile image. The default is + * to return any colorizations associated with the tileset via a call + * to {@link #clone(Colorization[])}, however derived classes may have + * dynamic colorization policies that look up colorization assignments + * from the supplied colorizer. + */ + protected Colorization[] getColorizations (int tileIndex, Colorizer rizer) + { + return _zations; + } + /** * Returns the entire, raw, uncut, unprepared tileset source image. */ @@ -200,6 +229,19 @@ public abstract class TileSet */ public Mirage getTileMirage (int tileIndex) throws NoSuchTileException + { + return getTileMirage(tileIndex, getColorizations(tileIndex, null)); + } + + /** + * Returns a prepared version of the image that would be used by the + * tile at the specified index. Because tilesets are often used simply + * to provide access to a collection of uniform images, this method is + * provided to bypass the creation of a {@link Tile} object when all + * that is desired is access to the underlying image. + */ + public Mirage getTileMirage (int tileIndex, Colorization[] zations) + throws NoSuchTileException { checkTileIndex(tileIndex); Rectangle bounds = computeTileBounds(tileIndex); @@ -207,7 +249,7 @@ public abstract class TileSet Log.warning("Aiya! Tile set missing image provider " + "[path=" + _imagePath + "]."); } - return _improv.getTileImage(_imagePath, bounds, _zations); + return _improv.getTileImage(_imagePath, bounds, zations); } /** @@ -282,6 +324,49 @@ public abstract class TileSet buf.append(", tileCount=").append(getTileCount()); } + /** Used when caching tiles. */ + protected static class TileKey + { + /** + * Creates a new tile key. + */ + public TileKey (TileSet tileSet, int tileIndex, Colorization[] zations) + { + _tset = tileSet; + _tidx = tileIndex; + _zations = zations; + } + + // documentation inherited + public boolean equals (Object other) + { + if (other instanceof TileKey) { + TileKey okey = (TileKey)other; + return (_tset == okey._tset && _tidx == okey._tidx && + Arrays.equals(_zations, okey._zations)); + } else { + return false; + } + } + + // documentation inherited + public int hashCode () + { + int code = _tset.hashCode() ^ _tidx; + int zcount = (_zations == null) ? 0 : _zations.length; + for (int ii = 0; ii < zcount; ii++) { + if (_zations[ii] != null) { + code ^= _zations[ii].hashCode(); + } + } + return code; + } + + protected TileSet _tset; + protected int _tidx; + protected Colorization[] _zations; + } + /** The path to the file containing the tile images. */ protected String _imagePath; @@ -298,16 +383,6 @@ public abstract class TileSet * a class change (modification of fields, inheritance). */ private static final long serialVersionUID = 1; - /** Temporary HACKOLA. */ - protected static Colorization[] ZATIONS = new Colorization[] { - new Colorization(-1, new Color(0x8A1A76), - new float[] { .1f, .3f, 0.6f }, - new float[] { -.85f, .3f, 0f }), - new Colorization(-1, new Color(0x2A864E), - new float[] { .1f, .3f, 0.6f }, - new float[] { .71f, 0f, .07f }), - }; - /** A weak cache of our tiles. */ protected static LRUHashMap _tiles; diff --git a/src/java/com/threerings/media/tile/TrimmedObjectTileSet.java b/src/java/com/threerings/media/tile/TrimmedObjectTileSet.java index 7a2331792..cbb51a3a4 100644 --- a/src/java/com/threerings/media/tile/TrimmedObjectTileSet.java +++ b/src/java/com/threerings/media/tile/TrimmedObjectTileSet.java @@ -1,5 +1,5 @@ // -// $Id: TrimmedObjectTileSet.java,v 1.9 2003/03/26 00:18:55 mdb Exp $ +// $Id: TrimmedObjectTileSet.java,v 1.10 2003/04/01 02:16:28 mdb Exp $ package com.threerings.media.tile; @@ -14,6 +14,7 @@ import com.samskivert.util.StringUtil; import com.threerings.media.Log; import com.threerings.media.image.Mirage; import com.threerings.media.tile.util.TileSetTrimmer; +import com.threerings.media.image.Colorization; /** * An object tileset in which the objects have been trimmed to the @@ -80,6 +81,19 @@ public class TrimmedObjectTileSet extends TileSet return _bounds[tileIndex]; } + // documentation inherited + protected Colorization[] getColorizations (int tileIndex, Colorizer rizer) + { + Colorization[] zations = null; + if (rizer != null && _zations != null) { + zations = new Colorization[_zations.length]; + for (int ii = 0; ii < _zations.length; ii++) { + zations[ii] = rizer.getColorization(_zations[ii]); + } + } + return zations; + } + // documentation inherited protected Tile createTile (int tileIndex, Mirage tileImage) {