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
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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 <code>index</code>th 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;
|
||||
}
|
||||
|
||||
@@ -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 + "].");
|
||||
|
||||
@@ -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 <code>index</code>th 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;
|
||||
}
|
||||
}
|
||||
@@ -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 <code>arrows</code> icon like so:
|
||||
*
|
||||
* <pre>
|
||||
* ImageIcon icon = iconmgr.getIcon("arrows", 2);
|
||||
* Icon icon = iconmgr.getIcon("arrows", 2);
|
||||
* </pre>
|
||||
*/
|
||||
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 +
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 <code>super.toString()</code>) 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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
* <em>untrimmed</em> tile, but the x and y offset of the
|
||||
* <em>trimmed</em> 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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
Reference in New Issue
Block a user