From 99c4330646ed7baae83da2c8def18d284620b1b0 Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Mon, 6 May 2002 18:08:32 +0000 Subject: [PATCH] The vast and the sweeping. Modified the tile framework such that tiles no longer provide access to their underlying image (they actually still do, but not in the normal course of affairs). This will allow us to use "trimmed" tiles which are trimmed to the smallest rectangle that contains the non-transparent pixels in a tile image, which will shrink up our components and other tiles a great deal. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@1339 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../com/threerings/cast/ActionFrames.java | 11 +- .../threerings/cast/CharacterDescriptor.java | 3 +- .../com/threerings/cast/CharacterManager.java | 16 +- .../cast/CompositedActionFrames.java | 67 ++++++-- .../bundle/BundledComponentRepository.java | 57 +++--- .../com/threerings/cast/util/TileUtil.java | 65 ------- .../com/threerings/media/IconManager.java | 9 +- .../threerings/media/image/Colorization.java | 8 +- .../com/threerings/media/image/ImageUtil.java | 26 ++- .../com/threerings/media/tile/ObjectTile.java | 12 +- .../threerings/media/tile/ObjectTileSet.java | 8 +- .../media/tile/SwissArmyTileSet.java | 20 +-- src/java/com/threerings/media/tile/Tile.java | 93 ++++++++-- .../com/threerings/media/tile/TileIcon.java | 45 +++++ .../threerings/media/tile/TileManager.java | 4 +- .../com/threerings/media/tile/TileSet.java | 162 +++++++++--------- .../com/threerings/media/tile/TileUtil.java | 11 +- .../threerings/media/tile/TrimmedTile.java | 74 ++++++++ .../threerings/media/tile/TrimmedTileSet.java | 54 ++++++ .../threerings/media/tile/UniformTileSet.java | 30 ++-- .../com/threerings/miso/tile/AutoFringer.java | 8 +- .../com/threerings/miso/tile/BaseTile.java | 12 +- .../com/threerings/miso/tile/BaseTileSet.java | 16 +- .../com/threerings/miso/tile/FringeTile.java | 12 +- 24 files changed, 517 insertions(+), 306 deletions(-) delete mode 100644 src/java/com/threerings/cast/util/TileUtil.java create mode 100644 src/java/com/threerings/media/tile/TileIcon.java create mode 100644 src/java/com/threerings/media/tile/TrimmedTile.java create mode 100644 src/java/com/threerings/media/tile/TrimmedTileSet.java diff --git a/src/java/com/threerings/cast/ActionFrames.java b/src/java/com/threerings/cast/ActionFrames.java index f9ca42c38..e0fe8bac2 100644 --- a/src/java/com/threerings/cast/ActionFrames.java +++ b/src/java/com/threerings/cast/ActionFrames.java @@ -1,5 +1,5 @@ // -// $Id: ActionFrames.java,v 1.1 2002/05/04 19:38:13 mdb Exp $ +// $Id: ActionFrames.java,v 1.2 2002/05/06 18:08:31 mdb Exp $ package com.threerings.cast; @@ -7,6 +7,7 @@ import java.awt.Graphics; import java.awt.Image; import com.threerings.media.sprite.MultiFrameImage; +import com.threerings.media.util.Colorization; import com.threerings.util.DirectionCodes; /** @@ -23,10 +24,8 @@ public interface ActionFrames extends MultiFrameImage public void setOrientation (int orient); /** - * Renders the specified frame at the specified offset applying the - * supplied colorizations in the process. Note, the colorizations - * should not be applied to the source image, only the rendered copy. + * Creates a clone of these action frames which will have the supplied + * colorizations applied to the frame images. */ - public void paintColoredFrame ( - Graphics g, int index, int x, int y, Colorization[] zations); + public ActionFrames cloneColorized (Colorization[] zations); } diff --git a/src/java/com/threerings/cast/CharacterDescriptor.java b/src/java/com/threerings/cast/CharacterDescriptor.java index a141ca174..0ba51b7cd 100644 --- a/src/java/com/threerings/cast/CharacterDescriptor.java +++ b/src/java/com/threerings/cast/CharacterDescriptor.java @@ -1,10 +1,11 @@ // -// $Id: CharacterDescriptor.java,v 1.6 2002/03/10 22:31:06 mdb Exp $ +// $Id: CharacterDescriptor.java,v 1.7 2002/05/06 18:08:31 mdb Exp $ package com.threerings.cast; import java.util.Arrays; import com.samskivert.util.StringUtil; +import com.threerings.media.util.Colorization; /** * The character descriptor object details the components that are diff --git a/src/java/com/threerings/cast/CharacterManager.java b/src/java/com/threerings/cast/CharacterManager.java index 02bc8edbb..16d0e2bc5 100644 --- a/src/java/com/threerings/cast/CharacterManager.java +++ b/src/java/com/threerings/cast/CharacterManager.java @@ -1,5 +1,5 @@ // -// $Id: CharacterManager.java,v 1.19 2002/05/04 19:38:13 mdb Exp $ +// $Id: CharacterManager.java,v 1.20 2002/05/06 18:08:31 mdb Exp $ package com.threerings.cast; @@ -9,12 +9,13 @@ import java.util.HashMap; import com.samskivert.util.StringUtil; import com.samskivert.util.Tuple; + import org.apache.commons.collections.LRUMap; +import com.threerings.media.util.Colorization; import com.threerings.util.DirectionCodes; import com.threerings.cast.Log; -import com.threerings.cast.util.TileUtil; /** * The character manager provides facilities for constructing sprites that @@ -212,19 +213,20 @@ public class CharacterManager // sort them into the proper rendering order Arrays.sort(components); - // create an array with the action frames for each component + // create colorized versions of all of the source action frames ActionFrames[] sources = new ActionFrames[ccount]; - zations = new Colorization[ccount][]; for (int ii = 0; ii < ccount; ii++) { - sources[ii] = components[ii].component.getFrames(action); + ActionFrames source = components[ii].component.getFrames(action); if (zations != null) { - zations[ii] = components[ii].zations; + sources[ii] = source.cloneColorized(components[ii].zations); + } else { + sources[ii] = source; } } // use those to create an entity that will lazily composite things // together as they are needed - return new CompositedActionFrames(action, sources, zations); + return new CompositedActionFrames(sources); } /** Used when compositing component frame images. */ diff --git a/src/java/com/threerings/cast/CompositedActionFrames.java b/src/java/com/threerings/cast/CompositedActionFrames.java index 2a61f92c4..f9bd4124a 100644 --- a/src/java/com/threerings/cast/CompositedActionFrames.java +++ b/src/java/com/threerings/cast/CompositedActionFrames.java @@ -1,5 +1,5 @@ // -// $Id: CompositedActionFrames.java,v 1.2 2002/05/04 19:38:13 mdb Exp $ +// $Id: CompositedActionFrames.java,v 1.3 2002/05/06 18:08:31 mdb Exp $ package com.threerings.cast; @@ -7,8 +7,8 @@ import java.awt.Graphics; import java.awt.Image; import com.threerings.util.DirectionCodes; +import com.threerings.media.util.Colorization; import com.threerings.media.util.ImageUtil; -import com.threerings.cast.util.TileUtil; /** * An implementation of the {@link MultiFrameImage} interface that is used @@ -22,13 +22,9 @@ public class CompositedActionFrames * source frames and colorization configuration. The actual component * frame images will not be composited until they are requested. */ - public CompositedActionFrames ( - String action, ActionFrames[] sources, Colorization[][] zations) + public CompositedActionFrames (ActionFrames[] sources) { - _action = action; _sources = sources; - _zations = zations; - // the sources must all have the same frame count, so we just use // the count from the first one _frameCount = _sources[0].getFrameCount(); @@ -72,8 +68,7 @@ public class CompositedActionFrames } // documentation inherited from interface - public void paintColoredFrame ( - Graphics g, int index, int x, int y, Colorization[] zations) + public ActionFrames cloneColorized (Colorization[] zations) { throw new RuntimeException("What you talkin' about Willis?"); } @@ -86,14 +81,55 @@ public class CompositedActionFrames _images[_orient] = new Image[_frameCount]; } if (_images[_orient][index] == null) { -// Log.info("Compositing [action=" + _action + -// ", orient=" + _orient + ", index=" + index + "]."); - _images[_orient][index] = - TileUtil.compositeFrames(_orient, index, _sources, _zations); +// Log.info("Compositing [orient=" + _orient + +// ", index=" + index + "]."); + _images[_orient][index] = compositeFrames(_orient, index); } return _images[_orient][index]; } + /** + * Renders and returns the indexth image from each of the + * supplied source multi-frame images to a newly created buffered + * image. This is used to render a single frame of a composited + * character action, and accordingly, the source image array should be + * already sorted into the proper rendering order. + */ + protected Image compositeFrames (int orient, int index) + { + Image dest = null; + Graphics g = null; +// long start = System.currentTimeMillis(); + + for (int ii = 0; ii < _sources.length; ii++) { + // create the image now that we know how big it should be + if (dest == null) { + dest = ImageUtil.createImage(_sources[ii].getWidth(index), + _sources[ii].getHeight(index)); + g = dest.getGraphics(); + } + + // make sure the action frames are configured with the right + // orientation before we render + _sources[ii].setOrientation(orient); + + // render the particular action from this component into the + // target image + _sources[ii].paintFrame(g, index, 0, 0); + } + + // clean up after ourselves + if (g != null) { + g.dispose(); + } + +// long now = System.currentTimeMillis(); +// Log.info("Composited " + sources.length + " frames in " + +// (now-start) + " millis."); + + return dest; + } + /** * When fetching width and height, we can simply use the first * component's image set since they must all be the same. @@ -105,8 +141,6 @@ public class CompositedActionFrames return source; } - protected String _action; - /** The orientation we're currently using. */ protected int _orient; @@ -116,9 +150,6 @@ public class CompositedActionFrames /** Our source action frames. */ protected ActionFrames[] _sources; - /** The colorizations for our source components. */ - protected Colorization[][] _zations; - /** The frame images. */ protected Image[][] _images; } diff --git a/src/java/com/threerings/cast/bundle/BundledComponentRepository.java b/src/java/com/threerings/cast/bundle/BundledComponentRepository.java index 4957a8496..ebc52e77f 100644 --- a/src/java/com/threerings/cast/bundle/BundledComponentRepository.java +++ b/src/java/com/threerings/cast/bundle/BundledComponentRepository.java @@ -1,5 +1,5 @@ // -// $Id: BundledComponentRepository.java,v 1.10 2002/05/04 19:38:14 mdb Exp $ +// $Id: BundledComponentRepository.java,v 1.11 2002/05/06 18:08:31 mdb Exp $ package com.threerings.cast.bundle; @@ -27,17 +27,18 @@ import com.threerings.resource.ResourceBundle; import com.threerings.resource.ResourceManager; import com.threerings.media.ImageManager; +import com.threerings.media.util.Colorization; import com.threerings.media.util.ImageUtil; import com.threerings.media.tile.ImageProvider; -import com.threerings.media.tile.TileSet; import com.threerings.media.tile.NoSuchTileException; +import com.threerings.media.tile.Tile; +import com.threerings.media.tile.TileSet; import com.threerings.util.DirectionCodes; import com.threerings.cast.ActionFrames; import com.threerings.cast.CharacterComponent; -import com.threerings.cast.Colorization; import com.threerings.cast.ComponentClass; import com.threerings.cast.ComponentRepository; import com.threerings.cast.FrameProvider; @@ -311,31 +312,31 @@ public class BundledComponentRepository // documentation inherited from interface public int getWidth (int index) { - Image img = getImage(index); - return (img == null) ? 0 : img.getWidth(null); + Tile tile = getTile(index); + return (tile == null) ? 0 : tile.getWidth(); } // documentation inherited from interface public int getHeight (int index) { - Image img = getImage(index); - return (img == null) ? 0 : img.getHeight(null); + Tile tile = getTile(index); + return (tile == null) ? 0 : tile.getHeight(); } // documentation inherited from interface public void paintFrame (Graphics g, int index, int x, int y) { - Image img = getImage(index); - if (img != null) { - g.drawImage(img, x, y, null); + Tile tile = getTile(index); + if (tile != null) { + tile.paint(g, x, y); } } // documentation inherited from interface public boolean hitTest (int index, int x, int y) { - Image img = getImage(index); - return (img != null) ? ImageUtil.hitTest(img, x, y) : false; + Tile tile = getTile(index); + return (tile != null) ? tile.hitTest(x, y) : false; } // documentation inherited from interface @@ -345,38 +346,22 @@ public class BundledComponentRepository } // documentation inherited from interface - public void paintColoredFrame ( - Graphics g, int index, int x, int y, Colorization[] zations) + public ActionFrames cloneColorized (Colorization[] zations) { - BufferedImage img = (BufferedImage)getImage(index); - if (img == null) { - return; - } - - // create a recolored image with which to render - if (zations != null) { - int zcount = zations.length; - Colorization cz; - for (int zz = 0; zz < zcount; zz++) { - if ((cz = zations[zz]) == null) { - continue; - } - img = ImageUtil.recolorImage( - img, cz.rootColor, cz.range, cz.offsets); - } - } - - g.drawImage(img, x, y, null); + TileSet zset = _set.cloneColorized(zations); + TileSetFrameImage cframes = new TileSetFrameImage(zset); + cframes.setOrientation(_orient); + return cframes; } /** - * Fetches the requested tile image. + * Fetches the requested tile. */ - protected Image getImage (int index) + protected Tile getTile (int index) { int tileIndex = _orient * getFrameCount() + index; try { - return _set.getTile(tileIndex).getImage(); + return _set.getTile(tileIndex); } catch (NoSuchTileException nste) { Log.warning("Can't extract action frame [set=" + _set + ", orient=" + _orient + ", index=" + index + "]."); diff --git a/src/java/com/threerings/cast/util/TileUtil.java b/src/java/com/threerings/cast/util/TileUtil.java deleted file mode 100644 index e4816a197..000000000 --- a/src/java/com/threerings/cast/util/TileUtil.java +++ /dev/null @@ -1,65 +0,0 @@ -// -// $Id: TileUtil.java,v 1.14 2002/05/04 19:38:14 mdb Exp $ - -package com.threerings.cast.util; - -import java.awt.Graphics; -import java.awt.Image; -import java.awt.image.BufferedImage; - -import com.threerings.media.util.ImageUtil; - -import com.threerings.cast.Log; -import com.threerings.cast.ActionFrames; -import com.threerings.cast.Colorization; - -/** - * Miscellaneous tile-related utility functions. - */ -public class TileUtil -{ - /** - * Renders and returns the indexth image from each of the - * supplied source multi-frame images to a newly created buffered - * image. This is used to render a single frame of a composited - * character action, and accordingly, the source image array should be - * already sorted into the proper rendering order. - */ - public static Image compositeFrames ( - int orient, int index, ActionFrames[] sources, - Colorization[][] zations) - { - Image dest = null; - Graphics g = null; -// long start = System.currentTimeMillis(); - - for (int ii = 0; ii < sources.length; ii++) { - // create the image now that we know how big it should be - if (dest == null) { - dest = ImageUtil.createImage(sources[ii].getWidth(index), - sources[ii].getHeight(index)); - g = dest.getGraphics(); - } - - // make sure the action frames are configured with the right - // orientation before we render - sources[ii].setOrientation(orient); - - // render the particular action from this component into the - // target image - Colorization[] cz = (zations != null) ? zations[ii] : null; - sources[ii].paintColoredFrame(g, index, 0, 0, cz); - } - - // clean up after ourselves - if (g != null) { - g.dispose(); - } - -// long now = System.currentTimeMillis(); -// Log.info("Composited " + sources.length + " frames in " + -// (now-start) + " millis."); - - return dest; - } -} diff --git a/src/java/com/threerings/media/IconManager.java b/src/java/com/threerings/media/IconManager.java index dd0ac1050..b6c4e5d61 100644 --- a/src/java/com/threerings/media/IconManager.java +++ b/src/java/com/threerings/media/IconManager.java @@ -1,5 +1,5 @@ // -// $Id: IconManager.java,v 1.1 2002/02/03 22:43:54 mdb Exp $ +// $Id: IconManager.java,v 1.2 2002/05/06 18:08:32 mdb Exp $ package com.threerings.media; @@ -10,15 +10,14 @@ import java.util.Properties; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; -import java.awt.Image; import javax.swing.Icon; -import javax.swing.ImageIcon; import com.samskivert.util.ConfigUtil; import com.samskivert.util.StringUtil; import com.threerings.media.tile.NoSuchTileException; +import com.threerings.media.tile.TileIcon; import com.threerings.media.tile.TileManager; import com.threerings.media.tile.TileSet; @@ -42,7 +41,7 @@ import com.threerings.media.tile.TileSet; * A user could then request an arrows icon like so: * *
- * ImageIcon icon = iconmgr.getIcon("arrows", 2);
+ * Icon icon = iconmgr.getIcon("arrows", 2);
  * 
*/ public class IconManager @@ -113,7 +112,7 @@ public class IconManager } // fetch the appropriate image and create an image icon - return new ImageIcon(set.getTileImage(index)); + return new TileIcon(set.getTile(index)); } catch (NoSuchTileException nste) { Log.warning("Unable to load icon [iconSet=" + iconSet + diff --git a/src/java/com/threerings/media/image/Colorization.java b/src/java/com/threerings/media/image/Colorization.java index eadcb15b8..406a3efe9 100644 --- a/src/java/com/threerings/media/image/Colorization.java +++ b/src/java/com/threerings/media/image/Colorization.java @@ -1,14 +1,14 @@ // -// $Id: Colorization.java,v 1.3 2002/03/10 22:30:46 mdb Exp $ +// $Id: Colorization.java,v 1.4 2002/05/06 18:08:32 mdb Exp $ -package com.threerings.cast; +package com.threerings.media.util; import java.awt.Color; + import com.samskivert.util.StringUtil; -import com.threerings.media.util.ImageUtil; /** - * Used to support colorization of character component images. + * Used to support recoloring images. */ public class Colorization { diff --git a/src/java/com/threerings/media/image/ImageUtil.java b/src/java/com/threerings/media/image/ImageUtil.java index 62d059427..04e936e73 100644 --- a/src/java/com/threerings/media/image/ImageUtil.java +++ b/src/java/com/threerings/media/image/ImageUtil.java @@ -1,5 +1,5 @@ // -// $Id: ImageUtil.java,v 1.12 2002/05/04 21:36:32 ray Exp $ +// $Id: ImageUtil.java,v 1.13 2002/05/06 18:08:32 mdb Exp $ package com.threerings.media.util; @@ -169,6 +169,18 @@ public class ImageUtil return new BufferedImage(nicm, image.getRaster(), false, null); } + /** + * Recolors the supplied image as in {@link + * #recolorImage(BufferedImage,Color,float[],float[])} obtaining the + * recoloring parameters from the supplied {@link Colorization} + * instance. + */ + public static BufferedImage recolorImage ( + BufferedImage image, Colorization cz) + { + return recolorImage(image, cz.rootColor, cz.range, cz.offsets); + } + /** * Adjusts the supplied color by the specified offests, taking the * appropriate measures for hue (wrapping it around) and saturation @@ -245,11 +257,11 @@ public class ImageUtil } /** - * Create an image using the alpha channel from the first Image - * and the RGB values from the second. + * Create an image using the alpha channel from the first and the RGB + * values from the second. */ - public static BufferedImage composeMaskedImage (BufferedImage mask, - BufferedImage base) + public static BufferedImage composeMaskedImage ( + BufferedImage mask, BufferedImage base) { int wid = base.getWidth(null); int hei = base.getHeight(null); @@ -257,8 +269,8 @@ public class ImageUtil Raster maskdata = mask.getData(); Raster basedata = base.getData(); - WritableRaster target = basedata.createCompatibleWritableRaster( - wid, hei); + WritableRaster target = + basedata.createCompatibleWritableRaster(wid, hei); // copy the alpha from the mask image int[] adata = maskdata.getSamples(0, 0, wid, hei, 3, (int[]) null); diff --git a/src/java/com/threerings/media/tile/ObjectTile.java b/src/java/com/threerings/media/tile/ObjectTile.java index 01b326dfa..626fb2f1d 100644 --- a/src/java/com/threerings/media/tile/ObjectTile.java +++ b/src/java/com/threerings/media/tile/ObjectTile.java @@ -1,9 +1,10 @@ // -// $Id: ObjectTile.java,v 1.6 2002/01/31 02:08:52 mdb Exp $ +// $Id: ObjectTile.java,v 1.7 2002/05/06 18:08:32 mdb Exp $ package com.threerings.media.tile; import java.awt.Image; +import java.awt.Rectangle; import java.awt.image.BufferedImage; import com.threerings.media.Log; @@ -19,18 +20,19 @@ public class ObjectTile extends Tile * Constructs a new object tile with the specified image. The base * width and height should be set before using this tile. */ - public ObjectTile (Image image) + public ObjectTile (Image image, Rectangle bounds) { - super(image); + super(image, bounds); } /** * Constructs a new object tile with the specified base width and * height. */ - public ObjectTile (Image image, int baseWidth, int baseHeight) + public ObjectTile (Image image, Rectangle bounds, + int baseWidth, int baseHeight) { - super(image); + super(image, bounds); _baseWidth = baseWidth; _baseHeight = baseHeight; } diff --git a/src/java/com/threerings/media/tile/ObjectTileSet.java b/src/java/com/threerings/media/tile/ObjectTileSet.java index a756e6d17..12de8884e 100644 --- a/src/java/com/threerings/media/tile/ObjectTileSet.java +++ b/src/java/com/threerings/media/tile/ObjectTileSet.java @@ -1,9 +1,10 @@ // -// $Id: ObjectTileSet.java,v 1.6 2001/12/18 08:37:54 mdb Exp $ +// $Id: ObjectTileSet.java,v 1.7 2002/05/06 18:08:32 mdb Exp $ package com.threerings.media.tile; import java.awt.Image; +import java.awt.Rectangle; import java.util.Arrays; import com.samskivert.util.StringUtil; @@ -68,7 +69,7 @@ public class ObjectTileSet extends SwissArmyTileSet * Creates instances of {@link ObjectTile}, which can span more than a * single tile's space in a display. */ - protected Tile createTile (int tileIndex, Image image) + protected Tile createTile (int tileIndex, Image tilesetImage) { // default object dimensions to (1, 1) int wid = 1, hei = 1; @@ -79,7 +80,8 @@ public class ObjectTileSet extends SwissArmyTileSet hei = _oheights[tileIndex]; } - ObjectTile tile = new ObjectTile(image, wid, hei); + Rectangle bounds = computeTileBounds(tileIndex, tilesetImage); + ObjectTile tile = new ObjectTile(tilesetImage, bounds, wid, hei); if (_xorigins != null) { tile.setOrigin(_xorigins[tileIndex], _yorigins[tileIndex]); diff --git a/src/java/com/threerings/media/tile/SwissArmyTileSet.java b/src/java/com/threerings/media/tile/SwissArmyTileSet.java index 8478ea2f3..5e93bda73 100644 --- a/src/java/com/threerings/media/tile/SwissArmyTileSet.java +++ b/src/java/com/threerings/media/tile/SwissArmyTileSet.java @@ -1,11 +1,12 @@ // -// $Id: SwissArmyTileSet.java,v 1.7 2002/02/24 02:20:44 mdb Exp $ +// $Id: SwissArmyTileSet.java,v 1.8 2002/05/06 18:08:32 mdb Exp $ package com.threerings.media.tile; +import java.awt.Dimension; import java.awt.Image; import java.awt.Point; -import java.awt.Dimension; +import java.awt.Rectangle; import java.io.IOException; import java.io.ObjectInputStream; @@ -13,7 +14,6 @@ import java.io.ObjectInputStream; import com.samskivert.util.StringUtil; import com.threerings.media.Log; -import com.threerings.media.util.ImageUtil; /** * The swiss army tileset supports a diverse variety of tiles in the @@ -128,15 +128,8 @@ public class SwissArmyTileSet extends TileSet } // documentation inherited - protected Image extractTileImage (int tileIndex) + protected Rectangle computeTileBounds (int tileIndex, Image tilesetImage) { - Image tsimg = getTilesetImage(); - if (tsimg == null) { - // FIXME: we should really be returning a blank image of the - // appropriate width and height here rather than null - return null; - } - // find the row number containing the sought-after tile int ridx, tcount, ty, tx; ridx = tcount = 0; @@ -156,13 +149,12 @@ public class SwissArmyTileSet extends TileSet // final image x-position is based on tile width and gap distance tx += (xidx * (_widths[ridx] + _gapSize.width)); -// Log.info("Retrieving tile image [tileIndex=" + tileIndex + +// Log.info("Computed tile bounds [tileIndex=" + tileIndex + // ", ridx=" + ridx + ", xidx=" + xidx + // ", tx=" + tx + ", ty=" + ty + "]."); // crop the tile-sized image chunk from the full image - return ImageUtil.getSubimage( - tsimg, tx, ty, _widths[ridx], _heights[ridx]); + return new Rectangle(tx, ty, _widths[ridx], _heights[ridx]); } private void readObject (ObjectInputStream in) diff --git a/src/java/com/threerings/media/tile/Tile.java b/src/java/com/threerings/media/tile/Tile.java index 8135a2a15..6a854c81b 100644 --- a/src/java/com/threerings/media/tile/Tile.java +++ b/src/java/com/threerings/media/tile/Tile.java @@ -1,24 +1,35 @@ // -// $Id: Tile.java,v 1.18 2001/11/18 04:09:21 mdb Exp $ +// $Id: Tile.java,v 1.19 2002/05/06 18:08:32 mdb Exp $ package com.threerings.media.tile; +import java.awt.Graphics; import java.awt.Image; -import java.awt.Graphics2D; -import java.awt.Shape; import java.awt.Rectangle; +import java.awt.Shape; + +import java.awt.image.BufferedImage; + +import com.samskivert.util.StringUtil; +import com.threerings.media.util.ImageUtil; /** * A tile represents a single square in a single layer in a scene. */ -public class Tile +public class Tile implements Cloneable { /** - * Constructs a tile with the specified image. + * Constructs a tile with the specified tileset image. + * + * @param image the tileset image from which our tile image is + * extracted. + * @param bounds the bounds of the tile image within the greater + * tileset image. */ - public Tile (Image image) + public Tile (Image image, Rectangle bounds) { _image = image; + _bounds = bounds; } /** @@ -26,7 +37,7 @@ public class Tile */ public int getWidth () { - return _image.getWidth(null); + return _bounds.width; } /** @@ -34,25 +45,70 @@ public class Tile */ public int getHeight () { - return _image.getHeight(null); + return _bounds.height; } /** - * Returns this tile's image. + * Render the tile image at the specified position in the given + * graphics context. */ - public Image getImage () + public void paint (Graphics gfx, int x, int y) { - return _image; + Shape oclip = gfx.getClip(); + gfx.clipRect(x, y, getWidth(), getHeight()); + gfx.drawImage(_image, x - _bounds.x, y - _bounds.y, null); + gfx.setClip(oclip); } /** * Render the tile image at the top-left corner of the given shape in * the given graphics context. */ - public void paint (Graphics2D gfx, Shape dest) + public void paint (Graphics gfx, Shape dest) { Rectangle bounds = dest.getBounds(); - gfx.drawImage(_image, bounds.x, bounds.y, null); + paint(gfx, bounds.x, bounds.y); + } + + /** + * Returns true if the specified coordinates within this tile contains + * a non-transparent pixel. + */ + public boolean hitTest (int x, int y) + { + return ImageUtil.hitTest(_image, _bounds.x + x, _bounds.y + y); + } + + /** + * Returns the image used to render this tile, if access to that image + * can be obtained. The tile must have been created with a {@link + * BufferedImage} and derived classes may refuse to implement this + * function if they do special stuff that hampers their ability to + * return a single image describing the tile. + */ + public Image getImage () + { + if (_image instanceof BufferedImage) { + return ImageUtil.getSubimage(_image, _bounds.x, _bounds.y, + _bounds.width, _bounds.height); + + } else { + String errmsg = "Can't obtain tile image [tile=" + this + "]."; + throw new RuntimeException(errmsg); + } + } + + /** + * Creates a shallow copy of this tile object. + */ + public Object clone () + { + try { + return (Tile)super.clone(); + } catch (CloneNotSupportedException cnse) { + String errmsg = "All is wrong with the universe: " + cnse; + throw new RuntimeException(errmsg); + } } /** @@ -60,8 +116,7 @@ public class Tile */ public String toString () { - StringBuffer buf = new StringBuffer(); - buf.append("["); + StringBuffer buf = new StringBuffer("["); toString(buf); return buf.append("]").toString(); } @@ -71,11 +126,15 @@ public class Tile * to call super.toString()) to append the derived class * specific tile information to the string buffer. */ - public void toString (StringBuffer buf) + protected void toString (StringBuffer buf) { buf.append("image=").append(_image); + buf.append(", bounds=").append(StringUtil.toString(_bounds)); } - /** Our tile image. */ + /** Our tileset image. */ protected Image _image; + + /** The bounds of the tile image within the tileset image. */ + protected Rectangle _bounds; } diff --git a/src/java/com/threerings/media/tile/TileIcon.java b/src/java/com/threerings/media/tile/TileIcon.java new file mode 100644 index 000000000..1f018bdc6 --- /dev/null +++ b/src/java/com/threerings/media/tile/TileIcon.java @@ -0,0 +1,45 @@ +// +// $Id: TileIcon.java,v 1.1 2002/05/06 18:08:32 mdb Exp $ + +package com.threerings.media.tile; + +import java.awt.Component; +import java.awt.Graphics; + +import javax.swing.Icon; + +/** + * Implements the icon interface, using a {@link Tile} to render the icon + * image. + */ +public class TileIcon implements Icon +{ + /** + * Creates a tile icon that will use the supplied tile to render itself. + */ + public TileIcon (Tile tile) + { + _tile = tile; + } + + // documentation inherited from interface + public void paintIcon (Component c, Graphics g, int x, int y) + { + _tile.paint(g, x, y); + } + + // documentation inherited from interface + public int getIconWidth () + { + return _tile.getWidth(); + } + + // documentation inherited from interface + public int getIconHeight () + { + return _tile.getHeight(); + } + + /** The tile used to render this icon. */ + protected Tile _tile; +} diff --git a/src/java/com/threerings/media/tile/TileManager.java b/src/java/com/threerings/media/tile/TileManager.java index 01bc96e7d..8d9f6123e 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.23 2001/12/07 01:33:29 mdb Exp $ +// $Id: TileManager.java,v 1.24 2002/05/06 18:08:32 mdb Exp $ package com.threerings.media.tile; @@ -56,7 +56,7 @@ public class TileManager implements ImageProvider * Loads up a tileset from the specified image with the specified * metadata parameters. */ - public TileSet loadTileSet ( + public UniformTileSet loadTileSet ( String imgPath, int count, int width, int height) { UniformTileSet uts = new UniformTileSet(); diff --git a/src/java/com/threerings/media/tile/TileSet.java b/src/java/com/threerings/media/tile/TileSet.java index 144f797ae..5154f19a6 100644 --- a/src/java/com/threerings/media/tile/TileSet.java +++ b/src/java/com/threerings/media/tile/TileSet.java @@ -1,15 +1,20 @@ // -// $Id: TileSet.java,v 1.25 2002/02/24 02:20:44 mdb Exp $ +// $Id: TileSet.java,v 1.26 2002/05/06 18:08:32 mdb Exp $ package com.threerings.media.tile; import java.awt.Image; +import java.awt.Rectangle; import java.awt.Transparency; +import java.awt.image.BufferedImage; import java.io.IOException; import java.io.Serializable; +import com.samskivert.util.StringUtil; + import com.threerings.media.Log; +import com.threerings.media.util.Colorization; import com.threerings.media.util.ImageUtil; /** @@ -82,6 +87,55 @@ public abstract class TileSet */ public abstract int getTileCount (); + /** + * Creates a copy of this tileset with the supplied colorizations + * applied to its source image. + */ + public TileSet cloneColorized (Colorization[] zations) + { + TileSet tset = null; + try { + tset = (TileSet)clone(); + } catch (CloneNotSupportedException cnse) { + Log.warning("Unable to clone tileset prior to colorization " + + "[tset=" + this + + ", zations=" + StringUtil.toString(zations) + + ", error=" + cnse + "]."); + return null; + } + + // make sure the tileset was able to load its image + Image timg = tset.getTilesetImage(); + if (timg == null) { + Log.warning("Failed to load tileset image in preparation " + + "for colorization [tset=" + tset + "]."); + // return the uncolorized tileset since it has no freaking + // source image anyway + return tset; + + } else if (!(timg instanceof BufferedImage)) { + Log.warning("Can't recolor tileset with non-buffered " + + "image source [source=" + timg + "]."); + return tset; + } + + // create the recolored image + BufferedImage btimg = (BufferedImage)timg; + int zcount = zations.length; + Colorization cz; + for (int zz = 0; zz < zcount; zz++) { + if ((cz = zations[zz]) == null) { + continue; + } + btimg = ImageUtil.recolorImage(btimg, cz); + } + + // stuff the recolored image back into the new tileset + tset._tilesetImg = btimg; + + return tset; + } + /** * Returns a new tileset that is a clone of this tileset with the * image path updated to reference the given path. Useful for @@ -119,93 +173,47 @@ public abstract class TileSet throw new NoSuchTileException(tileIndex); } + // get our tileset image + Image tsimg = getTilesetImage(); + if (tsimg == null) { + // we already logged an error, so we can just freak out + throw new NoSuchTileException(tileIndex); + } + // create and initialize the tile object - Tile tile = createTile(tileIndex, checkedGet(tileIndex)); + Tile tile = createTile(tileIndex, tsimg); initTile(tile); return tile; } /** - * Returns the tile image at the specified index. In some cases, a - * tile object is not desired or required, and so this method can be - * used to fetch the image directly. A null tile image will never be - * returned, but an error image may be returned if a problem occurs - * loading the underlying tileset image. + * Computes and returns the bounds for the specified tile based on the + * mechanism used by the derived class to do such things. The width + * and height of the bounds should be the size of the tile image and + * the x and y offset should be the offset in the tileset image for + * the image data of the specified tile. * - * @param tileIndex the index of the image in the tileset. - * - * @return the tile image. - * - * @exception NoSuchTileException thrown if the specified tile index - * is out of range for this tileset. + * @param tileIndex the index of the tile whose bounds are to be + * computed. + * @param tilesetImage the tileset image that contains the imagery for + * the tile in question. */ - public Image getTileImage (int tileIndex) - throws NoSuchTileException - { - // bail if there's no such tile - if (tileIndex < 0 || tileIndex >= getTileCount()) { - throw new NoSuchTileException(tileIndex); - } - - // retrieve the tile image - return checkedGet(tileIndex); - } - - // used to ensure TileSet derivations adhere to the extractTileImage() - // policy of not returning null - private Image checkedGet (int tileIndex) - { - Image image = extractTileImage(tileIndex); - if (image == null) { - String errmsg = "TileSet implementation violated return " + - "policy for TileSet.extractTileImage()."; - throw new RuntimeException(errmsg); - } - return image; - } + protected abstract Rectangle computeTileBounds ( + int tileIndex, Image tilesetImage); /** - * Extracts the image corresponding to the specified tile from the - * tileset image. + * Creates a tile for the specified tile index. * - * @param tileIndex the index of the tile to be retrieved. + * @param tileIndex the index of the tile to be created. + * @param tilesetImage the tileset image that contains the imagery for + * the tile to be created. * - * @return the tile image. This should not return null in cases of - * failure, but should instead call {@link #createErrorImage} to - * return a valid image. + * @return a configured tile. */ - protected abstract Image extractTileImage (int tileIndex); - - /** - * Creates a blank image to be used in failure situations. If {@link - * #extractTileImage} is unable to return the actual tile image - * (because the tileset image could not be loaded or for some other - * reason), it should not return null. Instead it should return an - * error image created with this method. - * - * @param width the width of the error image in pixels. - * @param height the height of the error image in pixels. - */ - protected Image createErrorImage (int width, int height) + protected Tile createTile (int tileIndex, Image tilesetImage) { - // return a blank image for now - return ImageUtil.createImage(width, height, Transparency.OPAQUE); - } - - /** - * Construct and return a new tile object for further population with - * tile-specific information. Derived classes can override this method - * to create their own sub-class of {@link Tile}. - * - * @param tileIndex the index of the tile being created. - * @param image the tile image. - * - * @return the new tile object. - */ - protected Tile createTile (int tileIndex, Image image) - { - // construct a basic tile - return new Tile(image); + return new Tile(tilesetImage, + computeTileBounds(tileIndex, tilesetImage)); } /** @@ -269,15 +277,15 @@ public abstract class TileSet buf.append(", tileCount=").append(getTileCount()); } - /** The entity from which we obtain our tile image. */ - protected transient ImageProvider _improv; - /** The path to the file containing the tile images. */ protected String _imagePath; /** The tileset name. */ protected String _name; + /** The entity from which we obtain our tile image. */ + protected transient ImageProvider _improv; + /** The image containing all tile images for this set. This is private * because it should be accessed via {@link #getTilesetImage} even by * derived classes. */ diff --git a/src/java/com/threerings/media/tile/TileUtil.java b/src/java/com/threerings/media/tile/TileUtil.java index 65ddd17cf..e00111f3d 100644 --- a/src/java/com/threerings/media/tile/TileUtil.java +++ b/src/java/com/threerings/media/tile/TileUtil.java @@ -1,10 +1,8 @@ // -// $Id: TileUtil.java,v 1.2 2001/11/18 04:09:21 mdb Exp $ +// $Id: TileUtil.java,v 1.3 2002/05/06 18:08:32 mdb Exp $ package com.threerings.media.tile; -import java.awt.Image; - import com.threerings.media.Log; /** @@ -23,15 +21,16 @@ public class TileUtil * tile. * @param tileIndex the index of the tile to be fetched. */ - public static Image getTileImage ( + public static Tile getTile ( TileManager tilemgr, int tileSetId, int tileIndex) { try { TileSet set = tilemgr.getTileSet(tileSetId); - return set.getTileImage(tileIndex); + return set.getTile(tileIndex); } catch (TileException te) { - Log.warning("Error retrieving tile image [error=" + te + "]."); + Log.warning("Error retrieving tile [tsid=" + tileSetId + + ", tidx=" + tileIndex + ", error=" + te + "]."); return null; } } diff --git a/src/java/com/threerings/media/tile/TrimmedTile.java b/src/java/com/threerings/media/tile/TrimmedTile.java new file mode 100644 index 000000000..b2378fd9e --- /dev/null +++ b/src/java/com/threerings/media/tile/TrimmedTile.java @@ -0,0 +1,74 @@ +// +// $Id: TrimmedTile.java,v 1.1 2002/05/06 18:08:32 mdb Exp $ + +package com.threerings.media.tile; + +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Rectangle; +import java.awt.Shape; + +import com.samskivert.util.StringUtil; + +import com.threerings.media.util.ImageUtil; + +/** + * Behaves just like a regular tile, but contains a "trimmed" image which + * is one where the source image has been trimmed to the smallest + * rectangle that contains all the non-transparent pixels of the original + * image. + */ +public class TrimmedTile extends Tile +{ + /** + * Creates a trimmed tile using the supplied tileset image with the + * specified bounds and coordinates. + * + * @param tilesetSource the tileset image that contains our trimmed + * tile image. + * @param bounds contains the width and height of the + * untrimmed tile, but the x and y offset of the + * trimmed tile image in the supplied tileset source image. + * @param tbounds the bounds of the trimmed image in the coordinate + * system defined by the untrimmed image. + */ + public TrimmedTile (Image image, Rectangle bounds, Rectangle tbounds) + { + super(image, bounds); + _tbounds = tbounds; + } + + // documentation inherited + public void paint (Graphics2D gfx, int x, int y) + { + int vx = x + _tbounds.x, vy = y + _tbounds.y; + Shape oclip = gfx.getClip(); + gfx.clipRect(vx, vy, _tbounds.width, _tbounds.height); + gfx.drawImage(_image, vx - _bounds.x, vy - _bounds.y, null); + gfx.setClip(oclip); + } + + // documentation inherited + public Image getImage () + { + String errmsg = "Can't convert trimmed tile to image " + + "[tile=" + this + "]."; + throw new RuntimeException(errmsg); + } + + // documentation inherited + public boolean hitTest (int x, int y) + { + return ImageUtil.hitTest(_image, _bounds.x + x, _bounds.y + y); + } + + // documentation inherited + protected void toString (StringBuffer buf) + { + buf.append(", tbounds=").append(StringUtil.toString(_tbounds)); + } + + /** The dimensions of the trimmed image in the coordinate space + * defined by the untrimmed image. */ + protected Rectangle _tbounds; +} diff --git a/src/java/com/threerings/media/tile/TrimmedTileSet.java b/src/java/com/threerings/media/tile/TrimmedTileSet.java new file mode 100644 index 000000000..c097e0c86 --- /dev/null +++ b/src/java/com/threerings/media/tile/TrimmedTileSet.java @@ -0,0 +1,54 @@ +// +// $Id: TrimmedTileSet.java,v 1.1 2002/05/06 18:08:32 mdb Exp $ + +package com.threerings.media.tile; + +import java.awt.Image; +import java.awt.Rectangle; + +/** + * Contains the necessary information to create a set of trimmed tiles + * from a base image and the associated trim metrics. + */ +public class TrimmedTileSet extends TileSet +{ + // documentation inherited + public int getTileCount () + { + return _obounds.length; + } + + /** + * Provides this tileset with access to the trimmed tile metrics. This + * generally only is called when generating a trimmed tileset from a + * regular tileset. + */ + public void setTileMetrics (Rectangle[] obounds, Rectangle[] tbounds) + { + _obounds = obounds; + _tbounds = tbounds; + } + + // documentation inherited + protected Rectangle computeTileBounds (int tileIndex, Image tilesetImage) + { + // N/A + return null; + } + + // documentation inherited + protected Tile createTile (int tileIndex, Image tilesetImage) + { + return new TrimmedTile( + tilesetImage, _obounds[tileIndex], _tbounds[tileIndex]); + } + + /** The width and height of the untrimmed tile, and the x and y offset + * of the trimmed image within our tileset image. */ + protected Rectangle[] _obounds; + + /** The width and height of the trimmed image and the x and y offset + * within the untrimmed image at which the trimmed image should be + * rendered. */ + protected Rectangle[] _tbounds; +} diff --git a/src/java/com/threerings/media/tile/UniformTileSet.java b/src/java/com/threerings/media/tile/UniformTileSet.java index 441e3f8c4..46fce0f55 100644 --- a/src/java/com/threerings/media/tile/UniformTileSet.java +++ b/src/java/com/threerings/media/tile/UniformTileSet.java @@ -1,9 +1,10 @@ // -// $Id: UniformTileSet.java,v 1.7 2002/02/24 02:20:44 mdb Exp $ +// $Id: UniformTileSet.java,v 1.8 2002/05/06 18:08:32 mdb Exp $ package com.threerings.media.tile; import java.awt.Image; +import java.awt.Rectangle; import com.threerings.media.Log; import com.threerings.media.util.ImageUtil; @@ -64,24 +65,33 @@ public class UniformTileSet extends TileSet return _height; } - // documentation inherited - protected Image extractTileImage (int tileId) + /** + * Returns the image that would be used by the tile at the specified + * index. Because the uniform tileset is 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 Image getTileImage (int tileIndex) { Image tsimg = getTilesetImage(); if (tsimg == null) { - // FIXME: we should really be returning a blank image of the - // appropriate width and height here rather than null return null; } + Rectangle tb = computeTileBounds(tileIndex, tsimg); + return ImageUtil.getSubimage(tsimg, tb.x, tb.y, tb.width, tb.height); + } + // documentation inherited + protected Rectangle computeTileBounds (int tileIndex, Image tilesetImage) + { // figure out from whence to crop the tile - int tilesPerRow = tsimg.getWidth(null) / _width; - int row = tileId / tilesPerRow; - int col = tileId % tilesPerRow; + int tilesPerRow = tilesetImage.getWidth(null) / _width; + int row = tileIndex / tilesPerRow; + int col = tileIndex % tilesPerRow; // crop the tile-sized image chunk from the full image - return ImageUtil.getSubimage( - tsimg, _width*col, _height*row, _width, _height); + return new Rectangle(_width*col, _height*row, _width, _height); } // documentation inherited diff --git a/src/java/com/threerings/miso/tile/AutoFringer.java b/src/java/com/threerings/miso/tile/AutoFringer.java index 4d443e9fc..2227991e9 100644 --- a/src/java/com/threerings/miso/tile/AutoFringer.java +++ b/src/java/com/threerings/miso/tile/AutoFringer.java @@ -1,5 +1,5 @@ // -// $Id: AutoFringer.java,v 1.10 2002/05/03 04:12:48 mdb Exp $ +// $Id: AutoFringer.java,v 1.11 2002/05/06 18:08:32 mdb Exp $ package com.threerings.miso.tile; @@ -147,8 +147,8 @@ public class AutoFringer /** * Compose a FringeTile out of the various fringe images needed. */ - protected Tile composeFringeTile (FringerRec[] fringers, HashMap masks, - Random rando) + protected Tile composeFringeTile ( + FringerRec[] fringers, HashMap masks, Random rando) { // sort the array so that higher priority fringers get drawn first QuickSort.sort(fringers); @@ -191,7 +191,6 @@ public class AutoFringer { FringeConfiguration.FringeTileSetRecord tsr = _fringeconf.getRandomFringe(baseset, rando); - int fringeset = tsr.fringe_tsid; if (!tsr.mask) { @@ -208,7 +207,6 @@ public class AutoFringer img = ImageUtil.composeMaskedImage( (BufferedImage) _tmgr.getTile(fringeset, index).getImage(), (BufferedImage) _tmgr.getTile(baseset, 0).getImage()); - masks.put(maskkey, img); } diff --git a/src/java/com/threerings/miso/tile/BaseTile.java b/src/java/com/threerings/miso/tile/BaseTile.java index e90e2e3f4..a7990e8c7 100644 --- a/src/java/com/threerings/miso/tile/BaseTile.java +++ b/src/java/com/threerings/miso/tile/BaseTile.java @@ -1,9 +1,11 @@ // -// $Id: BaseTile.java,v 1.5 2002/02/07 02:58:46 shaper Exp $ +// $Id: BaseTile.java,v 1.6 2002/05/06 18:08:32 mdb Exp $ package com.threerings.miso.tile; import java.awt.Image; +import java.awt.Rectangle; + import com.threerings.media.tile.Tile; /** @@ -17,17 +19,17 @@ public class BaseTile extends Tile * Constructs a new base tile with the specified image. Passability * will be assumed to be true. */ - public BaseTile (Image image) + public BaseTile (Image image, Rectangle bounds) { - super(image); + this(image, bounds, true); } /** * Constructs a new base tile with the specified passability. */ - public BaseTile (Image image, boolean passable) + public BaseTile (Image image, Rectangle bounds, boolean passable) { - super(image); + super(image, bounds); _passable = passable; } diff --git a/src/java/com/threerings/miso/tile/BaseTileSet.java b/src/java/com/threerings/miso/tile/BaseTileSet.java index f26acd303..60adc28da 100644 --- a/src/java/com/threerings/miso/tile/BaseTileSet.java +++ b/src/java/com/threerings/miso/tile/BaseTileSet.java @@ -1,20 +1,22 @@ // -// $Id: BaseTileSet.java,v 1.9 2001/11/29 21:58:49 mdb Exp $ +// $Id: BaseTileSet.java,v 1.10 2002/05/06 18:08:32 mdb Exp $ package com.threerings.miso.tile; import java.awt.Image; +import java.awt.Rectangle; import com.samskivert.util.StringUtil; import com.threerings.media.tile.Tile; import com.threerings.media.tile.SwissArmyTileSet; +import com.threerings.miso.scene.Traverser; + /** * The base tileset extends the swiss army tileset to add support for tile - * passability. Passability is used to determine whether {@link - * com.threerings.miso.scene.Traverser} objects can traverse a particular - * tile in a scene. + * passability. Passability is used to determine whether {@link Traverser} + * objects can traverse a particular tile in a scene. */ public class BaseTileSet extends SwissArmyTileSet { @@ -36,9 +38,11 @@ public class BaseTileSet extends SwissArmyTileSet } // documentation inherited - protected Tile createTile (int tileIndex, Image image) + protected Tile createTile (int tileIndex, Image tilesetImage) { - return new BaseTile(image, _passable[tileIndex]); + return new BaseTile(tilesetImage, + computeTileBounds(tileIndex, tilesetImage), + _passable[tileIndex]); } // documentation inherited diff --git a/src/java/com/threerings/miso/tile/FringeTile.java b/src/java/com/threerings/miso/tile/FringeTile.java index fb7c58821..716d57166 100644 --- a/src/java/com/threerings/miso/tile/FringeTile.java +++ b/src/java/com/threerings/miso/tile/FringeTile.java @@ -1,5 +1,5 @@ // -// $Id: FringeTile.java,v 1.1 2002/04/06 03:41:58 ray Exp $ +// $Id: FringeTile.java,v 1.2 2002/05/06 18:08:32 mdb Exp $ package com.threerings.miso.tile; @@ -21,7 +21,8 @@ public class FringeTile extends Tile */ public FringeTile (Image img) { - super(img); + super(img, new Rectangle( + 0, 0, img.getWidth(null), img.getHeight(null))); } /** @@ -36,13 +37,10 @@ public class FringeTile extends Tile } // documentation inherited - public void paint (Graphics2D gfx, Shape dest) + public void paint (Graphics2D gfx, int x, int y) { - Rectangle bounds = dest.getBounds(); - int x = bounds.x; - int y = bounds.y; - gfx.drawImage(_image, x, y, null); + if (_extras != null) { int size = _extras.size(); for (int ii=0; ii < size; ii++) {