package ie.dcu.apps.ist.export.imagemap; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Polygon; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Stroke; import java.awt.geom.Area; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; /** * The roll-over effect for the image map. * * @author Kevin McGuinness */ public abstract class RolloverEffect { public abstract RenderedImage createEffect(Image image, Polygon object); public static RolloverEffect darkenBackground(float alpha) { return new DarkenBackground(alpha); } public static RolloverEffect darkenBackground() { return new DarkenBackground(); } public static RolloverEffect brightenForeground(float alpha) { return new BrightenForeground(alpha); } public static RolloverEffect brightenForeground() { return new BrightenForeground(); } public static RolloverEffect outlineObject() { return new OutlineObject(); } public static RolloverEffect outlineObject(Color color) { return new OutlineObject(color); } public static RolloverEffect outlineObject(Color color, Stroke stroke) { return new OutlineObject(color, stroke); } public static class DarkenBackground extends RolloverEffect { private float alpha = 0.5f; public DarkenBackground() { } public DarkenBackground(float alpha) { this.alpha = alpha; } public float getAlpha() { return alpha; } public void setAlpha(float alpha) { this.alpha = alpha; } @Override public RenderedImage createEffect(Image image, Polygon object) { int width = image.getWidth(null); int height = image.getHeight(null); BufferedImage im = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Area area = new Area(new Rectangle(0,0,width,height)); area.subtract(new Area(object)); Graphics g = im.getGraphics(); if (g instanceof Graphics2D) { Graphics2D g2 = (Graphics2D) g; g2.drawImage(image, 0, 0, null); g2.setColor(new Color(0,0,0,alpha)); g2.fill(area); } return im; } } public static class BrightenForeground extends RolloverEffect { private float alpha = 0.5f; public BrightenForeground() { } public BrightenForeground(float alpha) { this.alpha = alpha; } public float getAlpha() { return alpha; } public void setAlpha(float alpha) { this.alpha = alpha; } @Override public RenderedImage createEffect(Image image, Polygon object) { int width = image.getWidth(null); int height = image.getHeight(null); BufferedImage im = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics g = im.getGraphics(); if (g instanceof Graphics2D) { Graphics2D g2 = (Graphics2D) g; g2.drawImage(image, 0, 0, null); g2.setColor(new Color(1,1,1,alpha)); g2.fill(object); } return im; } } public static class OutlineObject extends RolloverEffect { private Color color = Color.white; private Stroke stroke = new BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); public OutlineObject() { } public OutlineObject(Color color) { this.color = color; } public OutlineObject(Color color, Stroke stroke) { this.color = color; this.stroke = stroke; } public Color getColor() { return color; } public void setColor(Color color) { this.color = color; } public Stroke getStroke() { return stroke; } public void setStroke(Stroke stroke) { this.stroke = stroke; } @Override public RenderedImage createEffect(Image image, Polygon object) { int width = image.getWidth(null); int height = image.getHeight(null); BufferedImage im = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics g = im.getGraphics(); if (g instanceof Graphics2D) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.drawImage(image, 0, 0, null); g2.setColor(color); g2.setStroke(stroke); g2.draw(object); } return im; } } }