[tiled] r664 - in trunk/src/tiled: core io/xml mapeditor/dialogs mapeditor/util/cutter
svn@biggeruniverse.com
svn at biggeruniverse.com
Sat Jun 10 10:46:54 PDT 2006
Author: bjorn
Date: 2006-06-10 12:46:53 -0500 (Sat, 10 Jun 2006)
New Revision: 664
Modified:
trunk/src/tiled/core/TileSet.java
trunk/src/tiled/io/xml/XMLMapTransformer.java
trunk/src/tiled/mapeditor/dialogs/NewTilesetDialog.java
trunk/src/tiled/mapeditor/util/cutter/BasicTileCutter.java
trunk/src/tiled/mapeditor/util/cutter/BorderTileCutter.java
trunk/src/tiled/mapeditor/util/cutter/TileCutter.java
Log:
Fixed saving of the tile spacing property and cleaned up duplicate code in tileset image loading.
Speeded up drawing of maps using embedded tiles (like iso-test.tmx).
Removed non-functional preview button from new tileset dialog.
Modified: trunk/src/tiled/core/TileSet.java
===================================================================
--- trunk/src/tiled/core/TileSet.java 2006-06-07 21:55:27 UTC (rev 663)
+++ trunk/src/tiled/core/TileSet.java 2006-06-10 17:46:53 UTC (rev 664)
@@ -14,6 +14,7 @@
import java.awt.*;
import java.awt.image.BufferedImage;
+import java.awt.image.FilteredImageSource;
import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
@@ -23,6 +24,8 @@
import javax.imageio.ImageIO;
import tiled.mapeditor.util.cutter.TileCutter;
+import tiled.mapeditor.util.cutter.BasicTileCutter;
+import tiled.mapeditor.util.TransparentImageFilter;
import tiled.util.NumberedSet;
/**
@@ -44,6 +47,7 @@
private long tilebmpFileLastModified;
private TileCutter tileCutter;
private Rectangle tileDimensions;
+ private int tileSpacing;
private String externalSource;
private File tilebmpFile;
private String name;
@@ -62,27 +66,39 @@
}
/**
- * Creates a tileset from a tile bitmap file.
+ * Creates a tileset from a tileset image file.
*
* @param imgFilename
* @param cutter
- * @param createTiles
- * @throws Exception
- * @see TileSet#importTileBitmap(BufferedImage, TileCutter, boolean)
+ * @throws IOException
+ * @see TileSet#importTileBitmap(BufferedImage, TileCutter)
*/
- public void importTileBitmap(String imgFilename, TileCutter cutter,
- boolean createTiles) throws Exception
+ public void importTileBitmap(String imgFilename, TileCutter cutter)
+ throws IOException
{
- // IOException will propagate upwards when file cannot be found
- tilebmpFile = new File(imgFilename);
- tilebmpFileLastModified = tilebmpFile.lastModified();
+ setTilesetImageFilename(imgFilename);
- BufferedImage tilebmp = ImageIO.read(tilebmpFile);
- if (tilebmp == null) {
- throw new Exception("Failed to load " + tilebmpFile);
+ Image image = ImageIO.read(new File(imgFilename));
+ if (image == null) {
+ throw new IOException("Failed to load " + tilebmpFile);
}
- importTileBitmap(tilebmp, cutter, createTiles);
+ Toolkit tk = Toolkit.getDefaultToolkit();
+
+ if (transparentColor != null) {
+ int rgb = transparentColor.getRGB();
+ image = tk.createImage(
+ new FilteredImageSource(image.getSource(),
+ new TransparentImageFilter(rgb)));
+ }
+
+ BufferedImage buffered = new BufferedImage(
+ image.getWidth(null),
+ image.getHeight(null),
+ BufferedImage.TYPE_INT_ARGB);
+ buffered.getGraphics().drawImage(image, 0, 0, null);
+
+ importTileBitmap(buffered, cutter);
}
/**
@@ -91,57 +107,29 @@
*
* @param tilebmp the image to be used, must not be null
* @param cutter the tile cutter, must not be null
- * @param createTiles set to <code>true</code> to have the function create
- * Tiles
*/
- public void importTileBitmap(BufferedImage tilebmp, TileCutter cutter,
- boolean createTiles)
+ private void importTileBitmap(BufferedImage tilebmp, TileCutter cutter)
{
- assert (tilebmp != null);
- assert (cutter != null);
+ assert tilebmp != null;
+ assert cutter != null;
tileCutter = cutter;
-
- tileDimensions = new Rectangle(cutter.getDimensions());
tileSetImage = tilebmp;
- cutter.setImage(tilebmp);
-
- try {
- BufferedImage tile;
- while ((tile = (BufferedImage) cutter.getNextTile()) != null) {
- int newId = addImage(tile);
- if (createTiles) {
- Tile newTile = new Tile();
- newTile.setImage(newId);
- addNewTile(newTile);
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
+ tileDimensions = new Rectangle(cutter.getTileDimensions());
+ if (cutter instanceof BasicTileCutter) {
+ tileSpacing = ((BasicTileCutter) cutter).getTileSpacing();
}
- //FIXME: although faster, the following doesn't seem to handle alpha on some platforms...
- //GraphicsConfiguration config =
- // GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
- //Image tilesetImage = config.createCompatibleImage(tileWidth, tileHeight);
- //Graphics tg = tilesetImage.getGraphics();
+ cutter.setImage(tilebmp);
- /*if (iw > 0 && ih > 0) {
- for (int y = 0; y <= ih - tileHeight; y += tileHeight + spacing) {
- for (int x = 0; x <= iw - tileWidth; x += tileWidth + spacing) {
- BufferedImage tile = ((BufferedImage)setImage).getSubimage(
- x, y, tileWidth, tileHeight);
-
- int newId = addImage(tile);
- if (createTiles) {
- Tile newTile = new Tile();
- newTile.setImage(newId);
- addNewTile(newTile);
- }
- }
- }
- }*/
+ Image tile = cutter.getNextTile();
+ while (tile != null) {
+ Tile newTile = new Tile();
+ newTile.setImage(addImage(tile));
+ addNewTile(newTile);
+ tile = cutter.getNextTile();
+ }
}
public void checkUpdate() {
@@ -341,8 +329,7 @@
* @return the spacing in pixels between the tiles on the tileset image
*/
public int getTileSpacing() {
- // todo: make this functional
- return 0;
+ return tileSpacing;
}
/**
Modified: trunk/src/tiled/io/xml/XMLMapTransformer.java
===================================================================
--- trunk/src/tiled/io/xml/XMLMapTransformer.java 2006-06-07 21:55:27 UTC (rev 663)
+++ trunk/src/tiled/io/xml/XMLMapTransformer.java 2006-06-10 17:46:53 UTC (rev 664)
@@ -14,9 +14,6 @@
import java.awt.Color;
import java.awt.Image;
-import java.awt.Toolkit;
-import java.awt.image.BufferedImage;
-import java.awt.image.FilteredImageSource;
import java.io.*;
import java.lang.reflect.*;
import java.net.MalformedURLException;
@@ -34,7 +31,6 @@
import tiled.io.ImageHelper;
import tiled.io.MapReader;
import tiled.io.PluginLogger;
-import tiled.mapeditor.util.TransparentImageFilter;
import tiled.mapeditor.util.cutter.BasicTileCutter;
import tiled.util.*;
@@ -207,6 +203,8 @@
source = makeUrl(baseDir + source);
}
img = ImageIO.read(new URL(source));
+ // todo: check whether external images would also be faster drawn
+ // todo: from a scaled instance, see below
} else {
NodeList nl = t.getChildNodes();
@@ -219,8 +217,17 @@
"data. (empty data tag)");
} else {
String sdata = cdata.getNodeValue();
- img = ImageHelper.bytesToImage(
- Base64.decode(sdata.trim().toCharArray()));
+ char[] charArray = sdata.trim().toCharArray();
+ byte[] imageData = Base64.decode(charArray);
+ img = ImageHelper.bytesToImage(imageData);
+
+ // Deriving a scaled instance, even if it has the same
+ // size, somehow makes drawing of the tiles a lot
+ // faster on various systems (seen on Linux, Windows
+ // and MacOS X).
+ img = img.getScaledInstance(
+ img.getWidth(null), img.getHeight(null),
+ Image.SCALE_FAST);
}
break;
}
@@ -357,35 +364,13 @@
logger.info("Importing " + sourcePath + "...");
- BufferedImage tilesetImage = ImageIO.read(new File(sourcePath));
-
if (transStr != null) {
- // In this case, the tileset image needs special
- // handling for transparency
- Color color = new Color(
- Integer.parseInt(transStr, 16));
- Toolkit tk = Toolkit.getDefaultToolkit();
- Image trans = tk.createImage(
- new FilteredImageSource(tilesetImage.getSource(),
- new TransparentImageFilter(
- color.getRGB())));
- BufferedImage img = new BufferedImage(
- trans.getWidth(null),
- trans.getHeight(null),
- BufferedImage.TYPE_INT_ARGB);
-
- img.getGraphics().drawImage(trans, 0, 0, null);
-
- tilesetImage = img;
-
+ Color color = new Color(Integer.parseInt(transStr, 16));
set.setTransparentColor(color);
}
- set.importTileBitmap(tilesetImage, new BasicTileCutter(
- tileWidth, tileHeight, tileSpacing, 0),
- true);
-
- set.setTilesetImageFilename(sourcePath);
+ set.importTileBitmap(sourcePath, new BasicTileCutter(
+ tileWidth, tileHeight, tileSpacing, 0));
} else {
set.addImage(unmarshalImage(child, tilesetBaseDir),
Integer.parseInt(getAttributeValue(child, "id")));
@@ -398,7 +383,7 @@
if (c.getNodeName().equalsIgnoreCase("tile")) {
Tile tile = unmarshalTile(set, c, tilesetBaseDir);
- if((!hasTilesetImage) || tile.getId() >= set.getMaxTileId()) {
+ if (!hasTilesetImage || tile.getId() >= set.getMaxTileId()) {
set.addTile(tile);
} else {
Tile myTile = set.getTile(tile.getId());
Modified: trunk/src/tiled/mapeditor/dialogs/NewTilesetDialog.java
===================================================================
--- trunk/src/tiled/mapeditor/dialogs/NewTilesetDialog.java 2006-06-07 21:55:27 UTC (rev 663)
+++ trunk/src/tiled/mapeditor/dialogs/NewTilesetDialog.java 2006-06-10 17:46:53 UTC (rev 664)
@@ -14,8 +14,6 @@
import java.awt.*;
import java.awt.event.*;
-import java.awt.image.BufferedImage;
-import java.awt.image.FilteredImageSource;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
@@ -25,7 +23,6 @@
import javax.swing.event.*;
import tiled.core.*;
-import tiled.mapeditor.util.TransparentImageFilter;
import tiled.mapeditor.util.cutter.BasicTileCutter;
import tiled.mapeditor.util.cutter.BorderTileCutter;
import tiled.mapeditor.util.cutter.TileCutter;
@@ -214,9 +211,9 @@
buttons.setLayout(new BoxLayout(buttons, BoxLayout.X_AXIS));
buttons.add(Box.createGlue());
buttons.add(okButton);
+ //buttons.add(Box.createRigidArea(new Dimension(5, 0)));
+ //buttons.add(previewButton);
buttons.add(Box.createRigidArea(new Dimension(5, 0)));
- buttons.add(previewButton);
- buttons.add(Box.createRigidArea(new Dimension(5, 0)));
buttons.add(cancelButton);
// Top part of form
@@ -332,61 +329,27 @@
newTileset.setName(tilesetName.getText());
newTileset.setDefaultProperties(defaultSetProperties);
- // In the off chance that something goes wrong,
- // keep working.
- while(true) {
+ if (tilebmpCheck.isSelected()) {
+ String file = tilebmpFile.getText();
+ int spacing = tileSpacing.intValue();
+ int width = tileWidth.intValue();
+ int height = tileHeight.intValue();
- if (tilebmpCheck.isSelected()) {
- String file = tilebmpFile.getText();
- int spacing = tileSpacing.intValue();
- int width = tileWidth.intValue();
- int height = tileHeight.intValue();
- try {
- if (!transCheck.isSelected()) {
- newTileset.importTileBitmap(file,
- getCutter(width, height, spacing),
- true);
- } else {
- try {
- Toolkit tk = Toolkit.getDefaultToolkit();
- Image orig = ImageIO.read(new File(file));
- Image trans = tk.createImage(
- new FilteredImageSource(orig.getSource(),
- new TransparentImageFilter(
- colorButton.getColor().getRGB())));
- BufferedImage img = new BufferedImage(
- trans.getWidth(null),
- trans.getHeight(null),
- BufferedImage.TYPE_INT_ARGB);
+ try {
+ if (transCheck.isSelected()) {
+ Color color = colorButton.getColor();
+ newTileset.setTransparentColor(color);
+ }
- img.getGraphics().drawImage(trans, 0, 0, null);
+ newTileset.importTileBitmap(file,
+ getCutter(width, height, spacing));
+ }
+ catch (IOException e) {
+ JOptionPane.showMessageDialog(this, e.getLocalizedMessage(),
+ IMPORT_ERROR_MSG, JOptionPane.WARNING_MESSAGE);
+ }
+ }
- newTileset.importTileBitmap(img,
- getCutter(width, height, spacing),
- true);
-
- newTileset.setTransparentColor(
- colorButton.getColor());
-
- newTileset.setTilesetImageFilename(file);
- } catch (IOException e) {
- JOptionPane.showMessageDialog(this, e.getLocalizedMessage(),
- IMPORT_ERROR_MSG, JOptionPane.WARNING_MESSAGE);
- continue;
- }
- }
-
- } catch (Exception e) {
- JOptionPane.showMessageDialog(this, e.getLocalizedMessage(),
- IMPORT_ERROR_MSG, JOptionPane.ERROR_MESSAGE);
- newTileset = null;
- return;
- }
- }
-
- break;
- }
-
dispose();
}
Modified: trunk/src/tiled/mapeditor/util/cutter/BasicTileCutter.java
===================================================================
--- trunk/src/tiled/mapeditor/util/cutter/BasicTileCutter.java 2006-06-07 21:55:27 UTC (rev 663)
+++ trunk/src/tiled/mapeditor/util/cutter/BasicTileCutter.java 2006-06-10 17:46:53 UTC (rev 664)
@@ -13,7 +13,6 @@
package tiled.mapeditor.util.cutter;
import java.awt.Dimension;
-import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
@@ -24,53 +23,41 @@
{
private int nextX, nextY;
private BufferedImage image;
- private int tileWidth, tileHeight, frame, offset;
+ private int tileWidth;
+ private int tileHeight;
+ private int tileSpacing;
+ private int offset;
- public BasicTileCutter(int tileWidth, int tileHeight, int frame,
+ public BasicTileCutter(int tileWidth, int tileHeight, int tileSpacing,
int offset)
{
this.tileWidth = tileWidth;
this.tileHeight = tileHeight;
- this.frame = frame;
+ this.tileSpacing = tileSpacing;
this.offset = offset;
// Do initial setup
- nextX = offset + frame;
- nextY = offset + frame;
+ nextX = offset + tileSpacing;
+ nextY = offset + tileSpacing;
}
public String getName() {
return "Basic";
}
- public void setImage(Image image) {
- int iw = image.getWidth(null);
- int ih = image.getHeight(null);
- this.image = new BufferedImage(iw, ih, BufferedImage.TYPE_INT_ARGB);
- //FIXME: although faster, the following doesn't seem to handle alpha on some platforms...
- //GraphicsConfiguration config =
- //GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
-
-
- //Image tilesetImage = config.createCompatibleImage(tileWidth, tileHeight);
- //Graphics tg = tilesetImage.getGraphics();
- Graphics2D tg = this.image.createGraphics();
-
- tg.drawImage(image,
- 0, 0, iw, ih,
- 0, 0, iw, ih,
- null);
+ public void setImage(BufferedImage image) {
+ this.image = image;
}
- public Image getNextTile() throws Exception {
+ public Image getNextTile() {
if (nextY + tileHeight <= image.getHeight()) {
BufferedImage tile =
image.getSubimage(nextX, nextY, tileWidth, tileHeight);
- nextX += tileWidth + frame;
+ nextX += tileWidth + tileSpacing;
if (nextX + tileWidth > image.getWidth()) {
- nextX = offset + frame;
- nextY += tileHeight + frame;
+ nextX = offset + tileSpacing;
+ nextY += tileHeight + tileSpacing;
}
return tile;
@@ -79,7 +66,15 @@
return null;
}
- public Dimension getDimensions() {
+ public Dimension getTileDimensions() {
return new Dimension(tileWidth, tileHeight);
}
+
+ /**
+ * Returns the spacing between tile images.
+ * @return the spacing between tile images.
+ */
+ public int getTileSpacing() {
+ return tileSpacing;
+ }
}
Modified: trunk/src/tiled/mapeditor/util/cutter/BorderTileCutter.java
===================================================================
--- trunk/src/tiled/mapeditor/util/cutter/BorderTileCutter.java 2006-06-07 21:55:27 UTC (rev 663)
+++ trunk/src/tiled/mapeditor/util/cutter/BorderTileCutter.java 2006-06-10 17:46:53 UTC (rev 664)
@@ -14,26 +14,27 @@
import java.awt.Dimension;
import java.awt.Image;
+import java.awt.image.BufferedImage;
/**
* @version $Id$
*/
public class BorderTileCutter implements TileCutter
{
- public String getName() {
- return "Border";
- }
+ public String getName() {
+ return "Border";
+ }
- public void setImage(Image image) {
+ public void setImage(BufferedImage image) {
// TODO Auto-generated method stub
}
- public Image getNextTile() throws Exception {
+ public Image getNextTile() {
// TODO Auto-generated method stub
return null;
}
- public Dimension getDimensions() {
+ public Dimension getTileDimensions() {
// TODO Auto-generated method stub
return null;
}
Modified: trunk/src/tiled/mapeditor/util/cutter/TileCutter.java
===================================================================
--- trunk/src/tiled/mapeditor/util/cutter/TileCutter.java 2006-06-07 21:55:27 UTC (rev 663)
+++ trunk/src/tiled/mapeditor/util/cutter/TileCutter.java 2006-06-10 17:46:53 UTC (rev 664)
@@ -14,14 +14,33 @@
import java.awt.Dimension;
import java.awt.Image;
+import java.awt.image.BufferedImage;
/**
+ * A generic interface to a class that implements tile cutting behavior.
+ *
* @version $Id$
*/
public interface TileCutter
{
- public void setImage(Image image);
- public Image getNextTile() throws Exception;
- public Dimension getDimensions();
+ /**
+ * Sets the image that this cutter should cut in tile images.
+ * @param image
+ */
+ public void setImage(BufferedImage image);
+
+ /**
+ * Retrieves the next tile image.
+ * @return the next tile image, or <code>null</code> when no more tile
+ * images are available
+ */
+ public Image getNextTile();
+
+ /**
+ * Returns the default tile dimensions of tiles cut by this cutter.
+ * @return the default tile dimensions of tiles cut by this cutter.
+ */
+ public Dimension getTileDimensions();
+
public String getName();
}
More information about the tiled-commit
mailing list