MakeTiles: use gui's parser for xml image specs

This commit is contained in:
Jason Long 2015-01-11 11:31:36 -05:00
parent 455fc004de
commit 744e74267a
2 changed files with 33 additions and 68 deletions

View file

@ -523,76 +523,12 @@ public class MakeTiles
try { try {
XMLStreamReader in = XMLInputFactory.newInstance().createXMLStreamReader(inStream, "UTF-8"); XMLStreamReader in = XMLInputFactory.newInstance().createXMLStreamReader(inStream, "UTF-8");
in.nextTag(); in.nextTag(); // get document tag
if (in.getEventType() != XMLStreamConstants.START_ELEMENT) { return readTileImage(in, loaderContext);
throw new IOException("Unrecognized file format");
}
if (!in.getLocalName().equals("layered-image")) {
throw new IOException("Unrecognized file format");
}
return parseLayeredImageXml(in);
} }
catch (XMLStreamException e) { catch (XMLStreamException e) {
throw new IOException("XML Parse error", e); throw new IOException("XML Parse error", e);
} }
} }
static TileImage parseImageXml(XMLStreamReader in)
throws IOException, XMLStreamException
{
String src = in.getAttributeValue(null, "src");
TileImage img = loadAnimation(src);
String tmp = in.getAttributeValue(null, "at");
if (tmp != null) {
String [] coords = tmp.split(",");
if (coords.length == 2) {
TileImageSprite sprite = new TileImageSprite(img);
sprite.offsetX = Integer.parseInt(coords[0]);
sprite.offsetY = Integer.parseInt(coords[1]);
img = sprite;
}
else {
throw new IOException("Invalid 'at' syntax");
}
}
return img;
}
static TileImage parseLayeredImageXml(XMLStreamReader in)
throws IOException, XMLStreamException
{
TileImageLayer result = null;
while (in.nextTag() != XMLStreamConstants.END_ELEMENT) {
assert in.isStartElement();
String tagName = in.getLocalName();
if (tagName.equals("image")) {
TileImageLayer rv = new TileImageLayer(
result, //below
parseImageXml(in) //above
);
result = rv;
skipToEndElement(in);
}
else {
// unrecognized element
skipToEndElement(in);
}
}
if (result != null && result.below == null) {
return result.above;
}
else {
return result;
}
}
} }

View file

@ -120,7 +120,8 @@ public abstract class TileImage
@Override @Override
public void drawFragment(Graphics2D gr, int destX, int destY, int srcX, int srcY) { public void drawFragment(Graphics2D gr, int destX, int destY, int srcX, int srcY) {
throw new UnsupportedOperationException(); srcImage.drawFragment(gr, destX, destY,
srcX+offsetX, srcY+offsetY);
} }
} }
@ -200,6 +201,30 @@ public abstract class TileImage
return anim; return anim;
} }
static TileImage readLayeredImage(XMLStreamReader in, LoaderContext ctx)
throws XMLStreamException
{
TileImageLayer result = null;
while (in.nextTag() != XMLStreamConstants.END_ELEMENT) {
assert in.isStartElement();
TileImage newImg = readTileImage(in, ctx);
TileImageLayer rv = new TileImageLayer(
result, //below
newImg //above
);
result = rv;
}
if (result != null && result.below == null) {
return result.above;
}
else {
return result;
}
}
public static TileImage readTileImage(XMLStreamReader in, LoaderContext ctx) public static TileImage readTileImage(XMLStreamReader in, LoaderContext ctx)
throws XMLStreamException throws XMLStreamException
{ {
@ -212,6 +237,9 @@ public abstract class TileImage
else if (tagName.equals("animation")) { else if (tagName.equals("animation")) {
return readAnimation(in, ctx); return readAnimation(in, ctx);
} }
else if (tagName.equals("layered-image")) {
return readLayeredImage(in, ctx);
}
else { else {
throw new XMLStreamException("unrecognized tag: "+tagName); throw new XMLStreamException("unrecognized tag: "+tagName);
} }
@ -230,7 +258,8 @@ public abstract class TileImage
assert in.isStartElement(); assert in.isStartElement();
String tagName = in.getLocalName(); String tagName = in.getLocalName();
if (tagName.equals("image") || if (tagName.equals("image") ||
tagName.equals("animation")) tagName.equals("animation") ||
tagName.equals("layered-image"))
{ {
img = readTileImage(in, ctx); img = readTileImage(in, ctx);
} }