/* * WaypointRenderer.java * * Created on March 30, 2006, 5:24 PM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package sample4_fancy; import java.awt.Color; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.geom.Point2D; import java.awt.image.BufferedImage; import java.net.URL; import java.util.HashMap; import java.util.Map; import javax.imageio.ImageIO; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jxmapviewer.JXMapViewer; import org.jxmapviewer.viewer.WaypointRenderer; /** * A fancy waypoint painter * @author Martin Steiger */ public class FancyWaypointRenderer implements WaypointRenderer<MyWaypoint> { private static final Log log = LogFactory.getLog(FancyWaypointRenderer.class); private final Map<Color, BufferedImage> map = new HashMap<Color, BufferedImage>(); // private final Font font = new Font("Lucida Sans", Font.BOLD, 10); private BufferedImage origImage; /** * Uses a default waypoint image */ public FancyWaypointRenderer() { URL resource = getClass().getResource("waypoint_white.png"); try { origImage = ImageIO.read(resource); } catch (Exception ex) { log.warn("couldn't read waypoint_white.png", ex); } } private BufferedImage convert(BufferedImage loadImg, Color newColor) { int w = loadImg.getWidth(); int h = loadImg.getHeight(); BufferedImage imgOut = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); BufferedImage imgColor = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics2D g = imgColor.createGraphics(); g.setColor(newColor); g.fillRect(0, 0, w+1, h+1); g.dispose(); Graphics2D graphics = imgOut.createGraphics(); graphics.drawImage(loadImg, 0, 0, null); graphics.setComposite(MultiplyComposite.Default); graphics.drawImage(imgColor, 0, 0, null); graphics.dispose(); return imgOut; } @Override public void paintWaypoint(Graphics2D g, JXMapViewer viewer, MyWaypoint w) { g = (Graphics2D)g.create(); if (origImage == null) return; BufferedImage myImg = map.get(w.getColor()); if (myImg == null) { myImg = convert(origImage, w.getColor()); map.put(w.getColor(), myImg); } Point2D point = viewer.getTileFactory().geoToPixel(w.getPosition(), viewer.getZoom()); int x = (int)point.getX(); int y = (int)point.getY(); g.drawImage(myImg, x -myImg.getWidth() / 2, y -myImg.getHeight(), null); String label = w.getLabel(); // g.setFont(font); FontMetrics metrics = g.getFontMetrics(); int tw = metrics.stringWidth(label); int th = 1 + metrics.getAscent(); // g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.drawString(label, x - tw / 2, y + th - myImg.getHeight()); g.dispose(); } }