diff --git a/src/micropolisj/gui/TileImages.java b/src/micropolisj/gui/TileImages.java index 8c6f156..89672e3 100644 --- a/src/micropolisj/gui/TileImages.java +++ b/src/micropolisj/gui/TileImages.java @@ -180,13 +180,45 @@ public class TileImages public Image getImage() { - return image.srcImage.image.getSubimage( - 0, image.offsetY, - TILE_WIDTH, TILE_HEIGHT - ); + return cacheSubImage(image.srcImage.image, + new Rectangle(0, image.offsetY, + TILE_WIDTH, TILE_HEIGHT)); } } + static class ImageCache extends HashMap + { + } + IdentityHashMap subImageCache = new IdentityHashMap(); + + Image cacheSubImage(BufferedImage bi, Rectangle rect) + { + ImageCache ic = subImageCache.get(bi); + if (ic == null) { + ic = new ImageCache(); + subImageCache.put(bi, ic); + } + Image i = ic.get(rect); + if (i == null) { + + Image imageRef = bi.getSubimage( + rect.x, rect.y, + rect.width, rect.height); + + GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice dev = env.getDefaultScreenDevice(); + GraphicsConfiguration conf = dev.getDefaultConfiguration(); + + BufferedImage bi2 = conf.createCompatibleImage(rect.width, rect.height, Transparency.OPAQUE); + Graphics2D gr = bi2.createGraphics(); + gr.drawImage(imageRef, 0, 0, null); + + i = bi2; + ic.put(rect, i); + } + return i; + } + public ImageInfo getTileImageInfo(int tileNumber) { return getTileImageInfo(tileNumber, 0);