Files
narya/src/java/com/threerings/media/tile/XMLTileSetParser.java
T
Michael Bayne feb2a2633e A bunch of intertwingled changes:
Refactored TileSet into TileSet, UniformTileSet, SwissArmyTileSet and
ObjectTileSet.

Removed dependence on the "root" system property from the
XMLSceneRepository (things either pass in full paths now or input streams
fetched via the resource manager).

Removed MisoUtil.createImageManager() because everyone does that by hand
now (which is good because some non-Miso things were using MisoUtil for
that).

I think that's it, but if there was something else, don't blame me. Blame
the monkeys.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@608 542714f4-19e9-0310-aa3c-eee0fc999fb1
2001-11-08 03:04:45 +00:00

193 lines
5.8 KiB
Java

//
// $Id: XMLTileSetParser.java,v 1.21 2001/11/08 03:04:44 mdb Exp $
package com.threerings.media.tile;
import java.awt.Point;
import java.io.*;
import org.xml.sax.*;
import com.samskivert.util.*;
import com.samskivert.xml.SimpleParser;
import com.threerings.media.Log;
import com.threerings.media.ImageManager;
/**
* Parse an XML tileset description file and construct tileset objects
* for each valid description. Does not currently perform validation
* on the input XML stream, though the parsing code assumes the XML
* document is well-formed.
*/
public class XMLTileSetParser
extends SimpleParser
implements TileSetParser
{
/**
* Constructs an xml tile set parser.
*/
public XMLTileSetParser (ImageManager imgmgr)
{
_imgmgr = imgmgr;
}
// documentation inherited
public void startElement (
String uri, String localName, String qName, Attributes attributes)
{
if (qName.equals("tileset")) {
// note whether the tile set contains object tiles
String str = attributes.getValue("layer");
_info.isObjectSet =
(str != null && str.toLowerCase().equals(LAYER_OBJECT));
// get the tile set id
_info.tsid = parseInt(attributes.getValue("tsid"));
// get the tile set name
str = attributes.getValue("name");
_info.name = (str == null) ? DEF_NAME : str;
} else if (qName.equals("object")) {
// get the object info
int tid = parseInt(attributes.getValue("tid"));
int wid = parseInt(attributes.getValue("width"));
int hei = parseInt(attributes.getValue("height"));
if (_info.objects == null) {
_info.objects = new HashIntMap();
}
_info.objects.put(tid, new int[] { wid, hei });
}
}
// documentation inherited
protected void finishElement (
String uri, String localName, String qName, String data)
{
if (qName.equals("imagefile")) {
_info.imgFile = data;
} else if (qName.equals("rowwidth")) {
_info.rowWidth = StringUtil.parseIntArray(data);
} else if (qName.equals("rowheight")) {
_info.rowHeight = StringUtil.parseIntArray(data);
} else if (qName.equals("tilecount")) {
_info.tileCount = StringUtil.parseIntArray(data);
} else if (qName.equals("offsetpos")) {
parsePoint(data, _info.offsetPos);
} else if (qName.equals("gapdist")) {
parsePoint(data, _info.gapDist);
} else if (qName.equals("tileset")) {
// construct the tile set
TileSet tset = createTileSet();
Log.info("Parsed tileset [tset=" + tset + "].");
// clear the tile set info gathered while parsing
_info = new TileSetInfo();
// add the tileset to the hashtable
_tilesets.put(tset.getId(), tset);
}
}
// documentation inherited
public void loadTileSets (String fname, HashIntMap tilesets)
throws IOException
{
// save off the tileset hashtable
_tilesets = tilesets;
try {
parseFile(fname);
} catch (IOException ioe) {
Log.warning("Exception parsing tile set descriptions " +
"[ioe=" + ioe + "].");
Log.logStackTrace(ioe);
}
}
// documentation inherited
protected InputStream getInputStream (String fname) throws IOException
{
InputStream is = ConfigUtil.getStream(fname);
if (is == null) {
String errmsg = "Can't load tileset description file from " +
"classpath [path=" + fname + "].";
throw new FileNotFoundException(errmsg);
}
return is;
}
/**
* Constructs and returns a new tile set object. Derived classes
* may override this method to create their own sub-classes of the
* <code>TileSet</code> object.
*/
protected TileSet createTileSet ()
{
if (_info.isObjectSet) {
return new ObjectTileSet(
_imgmgr, _info.imgFile, _info.name, _info.tsid,
_info.tileCount, _info.rowWidth, _info.rowHeight,
_info.offsetPos, _info.gapDist, _info.objects);
} else {
return new SwissArmyTileSet(
_imgmgr, _info.imgFile, _info.name, _info.tsid,
_info.tileCount, _info.rowWidth, _info.rowHeight,
_info.offsetPos, _info.gapDist);
}
}
/**
* Converts a string containing values as (x, y) into the
* corresponding integer values and populates the given point
* object.
*
* @param str the point values in string format.
* @param point the point object to populate.
*/
protected void parsePoint (String str, Point point)
{
int vals[] = StringUtil.parseIntArray(str);
point.setLocation(vals[0], vals[1]);
}
/**
* A class to hold the tile set information gathered while
* parsing. See the {@link TileSet} class for documentation on
* the various parameters.
*/
protected static class TileSetInfo
{
public int tsid;
public String name;
public String imgFile;
public int tileCount[], rowWidth[], rowHeight[];
public Point offsetPos = new Point();
public Point gapDist = new Point();
public boolean isObjectSet;
public HashIntMap objects;
}
/** Default tileset name. */
protected static final String DEF_NAME = "Untitled";
/** String constant denoting an object tile set. */
protected static final String LAYER_OBJECT = "object";
/** The tilesets constructed thus far. */
protected HashIntMap _tilesets;
/** The tile set info populated while parsing. */
protected TileSetInfo _info = new TileSetInfo();
/** The image manager. */
protected ImageManager _imgmgr;
}