/*FreeMind - A Program for creating and viewing Mindmaps *Copyright (C) 2000-2011 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitri Polivaev and others. * *See COPYING for Details * *This program is free software; you can redistribute it and/or *modify it under the terms of the GNU General Public License *as published by the Free Software Foundation; either version 2 *of the License, or (at your option) any later version. * *This program is distributed in the hope that it will be useful, *but WITHOUT ANY WARRANTY; without even the implied warranty of *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *GNU General Public License for more details. * *You should have received a copy of the GNU General Public License *along with this program; if not, write to the Free Software *Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package plugins.map; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; import java.awt.image.RenderedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.logging.Logger; import javax.imageio.ImageIO; import org.openstreetmap.gui.jmapviewer.Tile; import org.openstreetmap.gui.jmapviewer.TileController; import freemind.main.Tools; public class TileImage implements ImageObserver { private Tile[][] mTiles = null; private boolean mTilesPresent = false; private boolean mImageCreated = false; private BufferedImage mImage; private int mWaitingForCallbacks = 0; private int mDx; private int mDy; public TileImage() { } public boolean isLoaded() { if (!mTilesPresent) return false; for (int i = 0; i < mTiles.length; i++) { Tile[] tiles = mTiles[i]; for (int j = 0; j < tiles.length; j++) { Tile tile = tiles[j]; if (!tile.isLoaded() && !tile.hasError()) { System.out.println("Tile " + tile + " is not loaded:" + tile.getStatus()); return false; } } } if (!mImageCreated) { createImage(); mImageCreated = true; } return isDrawingDone(); } /** * Is called when all tiles are loaded and creates the common picture. */ private void createImage() { BufferedImage tileImage00 = mTiles[0][0].getImage(); int height = tileImage00.getHeight(); int width = tileImage00.getWidth(); mImage = new BufferedImage(height * mTiles[0].length, width * mTiles.length, BufferedImage.TYPE_INT_RGB); Graphics2D graphics = (Graphics2D) mImage.getGraphics(); for (int i = 0; i < mTiles.length; i++) { Tile[] tiles = mTiles[i]; for (int j = 0; j < tiles.length; j++) { Tile tile = tiles[j]; boolean done = graphics.drawImage(tile.getImage(), i * height, j * width, this); if (!done) { mWaitingForCallbacks++; } } } if (isDrawingDone()) { drawCross(); } } public boolean isDrawingDone() { return mWaitingForCallbacks <= 0; } public void drawCross() { Graphics2D graphics = (Graphics2D) mImage.getGraphics(); graphics.setColor(Color.RED); graphics.setStroke(new BasicStroke(4)); int size = 15; graphics.drawLine(mDx - size, mDy, mDx + size, mDy); graphics.drawLine(mDx, mDy - size, mDx, mDy + size); } public void load(String pCodedImage) { try { mImage = ImageIO.read(new ByteArrayInputStream(Tools .fromBase64(pCodedImage))); mTilesPresent = false; mImageCreated = true; } catch (IOException e) { freemind.main.Resources.getInstance().logException(e); } } public void load(File pFileName) { try { mImage = ImageIO.read(new FileInputStream(pFileName)); mTilesPresent = false; mImageCreated = true; } catch (IOException e) { freemind.main.Resources.getInstance().logException(e); } } public String save() { try { ByteArrayOutputStream stream = new ByteArrayOutputStream(); ImageIO.write(mImage, "png", stream); stream.close(); return Tools.toBase64(stream.toByteArray()); } catch (Exception e) { freemind.main.Resources.getInstance().logException(e); } return null; } /** * @return */ public RenderedImage getImage() { return mImage; } /** * @param pDimension * @param pX * @param pY * @param pZoom * @param mTileController * @param pLogger * @param pDy * @param pDx */ public void setTiles(int pDimension, int pX, int pY, int pZoom, TileController mTileController, Logger pLogger, int pDx, int pDy) { mDx = pDx; mDy = pDy; mTiles = new Tile[pDimension][pDimension]; for (int i = 0; i < pDimension; ++i) { for (int j = 0; j < pDimension; ++j) { pLogger.fine("Trying to load tile to x=" + (pX + i) + ", y=" + (pY + j) + ", zoom=" + pZoom); mTiles[i][j] = mTileController.getTile(pX + i, pY + j, pZoom); } } mTilesPresent = true; } /* * (non-Javadoc) * * @see java.awt.image.ImageObserver#imageUpdate(java.awt.Image, int, * int, int, int, int) */ public boolean imageUpdate(Image pImg, int pInfoflags, int pX, int pY, int pWidth, int pHeight) { mWaitingForCallbacks--; if (isDrawingDone()) { drawCross(); } return isDrawingDone(); } /** * @return */ public boolean hasErrors() { if (!mTilesPresent) return false; for (int i = 0; i < mTiles.length; i++) { Tile[] tiles = mTiles[i]; for (int j = 0; j < tiles.length; j++) { Tile tile = tiles[j]; if (tile.hasError()) { return true; } } } return false; } public boolean isImageCreated() { return mImageCreated; } }