[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