From ef7f14413e399fa3503d68d06abee928e7534492 Mon Sep 17 00:00:00 2001 From: Jason Long Date: Mon, 19 Jan 2015 09:21:39 -0800 Subject: [PATCH] TileImages: cache generated sub-images, fixes OS-X performance issue --- src/micropolisj/gui/TileImages.java | 40 ++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 4 deletions(-) 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);