From 6c0c9203a40be693ef8318fcd8718f3abd7d7942 Mon Sep 17 00:00:00 2001 From: Jason Long Date: Wed, 7 Jan 2015 13:06:18 -0500 Subject: [PATCH] TileImages: share image-loading code between overlay map and main view main view- tiles image is now loaded as a single buffered image, and selected into "sub-images" where needed overlay- the rgb drawing code is moved into TileImages class --- src/micropolisj/gui/OverlayMapView.java | 25 +------- src/micropolisj/gui/TileImages.java | 81 ++++++++++++------------- 2 files changed, 41 insertions(+), 65 deletions(-) diff --git a/src/micropolisj/gui/OverlayMapView.java b/src/micropolisj/gui/OverlayMapView.java index 47778a8..727effc 100644 --- a/src/micropolisj/gui/OverlayMapView.java +++ b/src/micropolisj/gui/OverlayMapView.java @@ -98,20 +98,6 @@ public class OverlayMapView extends JComponent static final int TILE_HEIGHT = 3; static final int TILE_OFFSET_Y = 3; static TileImages tileArray = TileImages.getInstance("sm", TILE_HEIGHT); - static BufferedImage tileArrayImage = loadImage(tileArray.getResourceName()); - - static BufferedImage loadImage(String resourceName) - { - URL iconUrl = MicropolisDrawingArea.class.getResource(resourceName); - Image refImage = new ImageIcon(iconUrl).getImage(); - - BufferedImage bi = new BufferedImage(refImage.getWidth(null), refImage.getHeight(null), - BufferedImage.TYPE_INT_RGB); - Graphics2D gr = bi.createGraphics(); - gr.drawImage(refImage, 0, 0, null); - - return bi; - } static final Color VAL_LOW = new Color(0xbfbfbf); static final Color VAL_MEDIUM = new Color(0xffff00); @@ -412,15 +398,8 @@ public class OverlayMapView extends JComponent { assert tile >= 0; - int imageNumber = tileArray.getTileImageNumber(tile); - for (int yy = 0; yy < TILE_HEIGHT; yy++) - { - for (int xx = 0; xx < TILE_WIDTH; xx++) - { - img.setRGB(x*TILE_WIDTH+xx,y*TILE_HEIGHT+yy, - tileArrayImage.getRGB(xx,imageNumber*TILE_OFFSET_Y+yy)); - } - } + TileImages.ImageInfo tileImg = tileArray.getTileImageInfo(tile); + tileImg.drawToBytes(img, x*TILE_WIDTH, y*TILE_HEIGHT); } Rectangle getViewRect(ConnectedView cv) diff --git a/src/micropolisj/gui/TileImages.java b/src/micropolisj/gui/TileImages.java index 971a9cb..43a4b7b 100644 --- a/src/micropolisj/gui/TileImages.java +++ b/src/micropolisj/gui/TileImages.java @@ -25,7 +25,7 @@ public class TileImages final String name; final int TILE_WIDTH; final int TILE_HEIGHT; - Image [] images; + BufferedImage tileImages; TileImage [] tileImageMap; Map > spriteImages; @@ -54,6 +54,7 @@ public class TileImages this.TILE_WIDTH = size; this.TILE_HEIGHT = size; + this.tileImages = loadImage(getResourceName()); initTileImageMap(); } @@ -62,16 +63,6 @@ public class TileImages return "/" + name + "/tiles.png"; } - void initTileImages() - { - if (this.images != null) { - // already loaded - return; - } - - this.images = loadTileImages(getResourceName(), TILE_HEIGHT); - } - SimpleTileImage readSimpleImage(XMLStreamReader in) throws XMLStreamException { @@ -171,7 +162,6 @@ public class TileImages public static TileImages getInstance(int size) { TileImages self = getInstance(String.format("%dx%d", size, size), size); - self.initTileImages(); self.loadSpriteImages(); return self; } @@ -184,11 +174,6 @@ public class TileImages return savedInstances.get(size); } - public int getTileImageNumber(int tileNumber) - { - return getTileImageInfo(tileNumber, 0).imageNumber; - } - public class ImageInfo { int imageNumber; @@ -199,8 +184,32 @@ public class TileImages this.animated = animated; } - Image getImage() { return images[imageNumber]; } boolean isAnimated() { return animated; } + + public void drawToBytes(BufferedImage img, int x, int y) + { + for (int yy = 0; yy < TILE_HEIGHT; yy++) + { + for (int xx = 0; xx < TILE_WIDTH; xx++) + { + img.setRGB(x+xx,y+yy, + tileImages.getRGB(xx,imageNumber*TILE_HEIGHT+yy)); + } + } + } + + public Image getImage() + { + return tileImages.getSubimage( + 0, imageNumber*TILE_HEIGHT, + TILE_WIDTH, TILE_HEIGHT + ); + } + } + + public ImageInfo getTileImageInfo(int tileNumber) + { + return getTileImageInfo(tileNumber, 0); } public ImageInfo getTileImageInfo(int tileNumber, int acycle) @@ -232,30 +241,6 @@ public class TileImages return getTileImageInfo(tile, 0).getImage(); } - private Image [] loadTileImages(String resourceName, int srcSize) - { - URL iconUrl = TileImages.class.getResource(resourceName); - Image refImage = new ImageIcon(iconUrl).getImage(); - - GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); - GraphicsDevice dev = env.getDefaultScreenDevice(); - GraphicsConfiguration conf = dev.getDefaultConfiguration(); - - Image [] images = new Image[refImage.getHeight(null) / srcSize]; - for (int i = 0; i < images.length; i++) - { - BufferedImage bi = conf.createCompatibleImage(TILE_WIDTH, TILE_HEIGHT, Transparency.OPAQUE); - Graphics2D gr = bi.createGraphics(); - gr.drawImage(refImage, 0, 0, TILE_WIDTH, TILE_HEIGHT, - 0, i * srcSize, - 0 + srcSize, i * srcSize + srcSize, - null); - - images[i] = bi; - } - return images; - } - public Image getSpriteImage(SpriteKind kind, int frameNumber) { assert spriteImages != null; @@ -321,4 +306,16 @@ public class TileImages return bi; } + static BufferedImage loadImage(String resourceName) + { + URL iconUrl = TileImages.class.getResource(resourceName); + Image refImage = new ImageIcon(iconUrl).getImage(); + + BufferedImage bi = new BufferedImage(refImage.getWidth(null), refImage.getHeight(null), + BufferedImage.TYPE_INT_RGB); + Graphics2D gr = bi.createGraphics(); + gr.drawImage(refImage, 0, 0, null); + + return bi; + } }