// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.tools;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import org.openstreetmap.josm.gui.layer.ImageProcessor;
/** class to describe how image overlay
* @since 8095
*/
public class ImageOverlay implements ImageProcessor {
/** the image resource to use as overlay */
public ImageProvider image;
/** offset of the image from left border, values between 0 and 1 */
private final double offsetLeft;
/** offset of the image from top border, values between 0 and 1 */
private final double offsetRight;
/** offset of the image from right border, values between 0 and 1*/
private final double offsetTop;
/** offset of the image from bottom border, values between 0 and 1 */
private final double offsetBottom;
/**
* Create an overlay info. All values are relative sizes between 0 and 1. Size of the image
* is the result of the difference between left/right and top/bottom.
*
* @param image image provider for the overlay icon
* @param offsetLeft offset of the image from left border, values between 0 and 1, -1 for auto-calculation
* @param offsetTop offset of the image from top border, values between 0 and 1, -1 for auto-calculation
* @param offsetRight offset of the image from right border, values between 0 and 1, -1 for auto-calculation
* @param offsetBottom offset of the image from bottom border, values between 0 and 1, -1 for auto-calculation
* @since 8095
*/
public ImageOverlay(ImageProvider image, double offsetLeft, double offsetTop, double offsetRight, double offsetBottom) {
this.image = image;
this.offsetLeft = offsetLeft;
this.offsetTop = offsetTop;
this.offsetRight = offsetRight;
this.offsetBottom = offsetBottom;
}
/**
* Create an overlay in southeast corner. All values are relative sizes between 0 and 1.
* Size of the image is the result of the difference between left/right and top/bottom.
* Right and bottom values are set to 1.
*
* @param image image provider for the overlay icon
* @see #ImageOverlay(ImageProvider, double, double, double, double)
* @since 8095
*/
public ImageOverlay(ImageProvider image) {
this.image = image;
this.offsetLeft = -1.0;
this.offsetTop = -1.0;
this.offsetRight = 1.0;
this.offsetBottom = 1.0;
}
/**
* Handle overlay. The image passed as argument is modified!
*
* @param ground the base image for the overlay (gets modified!)
* @return the modified image (same as argument)
* @since 8095
*/
@Override
public BufferedImage process(BufferedImage ground) {
/* get base dimensions for calculation */
int w = ground.getWidth();
int h = ground.getHeight();
int width = -1;
int height = -1;
if (offsetRight > 0 && offsetLeft > 0) {
width = (int) (w*(offsetRight-offsetLeft));
}
if (offsetTop > 0 && offsetBottom > 0) {
height = (int) (h*(offsetBottom-offsetTop));
}
ImageIcon overlay;
if (width != -1 || height != -1) {
image = new ImageProvider(image).resetMaxSize(new Dimension(width, height));
}
overlay = image.get();
int x, y;
if (width == -1 && offsetLeft < 0) {
x = (int) (w*offsetRight) - overlay.getIconWidth();
} else {
x = (int) (w*offsetLeft);
}
if (height == -1 && offsetTop < 0) {
y = (int) (h*offsetBottom) - overlay.getIconHeight();
} else {
y = (int) (h*offsetTop);
}
overlay.paintIcon(null, ground.getGraphics(), x, y);
return ground;
}
}