//**********************************************************************
//
//<copyright>
//
//BBN Technologies
//10 Moulton Street
//Cambridge, MA 02138
//(617) 873-8000
//
//Copyright (C) BBNT Solutions LLC. All rights reserved.
//
//</copyright>
//**********************************************************************
//
//$Source:
///cvs/darwars/ambush/aar/src/com/bbn/ambush/mission/MissionHandler.java,v
//$
//$RCSfile: MissionHandler.java,v $
//$Revision: 1.10 $
//$Date: 2004/10/21 20:08:31 $
//$Author: dietrick $
//
//**********************************************************************
package com.bbn.openmap.omGraphics;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.net.MalformedURLException;
import java.net.URL;
import com.bbn.openmap.dataAccess.image.WorldFile;
import com.bbn.openmap.image.BufferedImageHelper;
import com.bbn.openmap.omGraphics.util.ImageWarp;
import com.bbn.openmap.proj.Projection;
import com.bbn.openmap.proj.coords.GeoCoordTransformation;
import com.bbn.openmap.proj.coords.LatLonGCT;
import com.bbn.openmap.util.DataBounds;
import com.bbn.openmap.util.PropUtils;
/**
* An OMGraphic that wraps an ImageWarp object to display the resulting
* OMRaster, in any projection. For use as a background object, doesn't react to
* mouse events, distance queries, etc.
*
* <pre>
* try {
* String imageFile = "/data/geoimages/NBenguela.2004357.aqua.250m.jpg";
* WorldFile worldFile = WorldFile.get(PropUtils.getResourceOrFileOrURL(imageFile));
* OMWarpingImage omwi = new OMWarpingImage(imageFile, LatLonGCT.INSTANCE, worldFile);
* omList.add(omwi);
* } catch (MalformedURLException e) {
* e.printStackTrace();
* } catch (InterruptedException e) {
* e.printStackTrace();
* }
*
* try {
* String imageFile = "/data/images/earthmap4k.jpg";
* OMWarpingImage omwi = new OMWarpingImage(imageFile);
* omList.add(omwi);
* } catch (MalformedURLException e) {
* e.printStackTrace();
* } catch (InterruptedException e) {
* e.printStackTrace();
* }
*
* </pre>
*
* @author dietrick
*/
public class OMWarpingImage extends OMGraphicAdapter implements OMGraphic {
private static final long serialVersionUID = 1L;
protected ImageWarp warp;
protected OMRaster raster;
/**
* Create an OMWarpingImage from path to image (resource, file or URL).
*
* @param imagePath
* @throws MalformedURLException
* @throws InterruptedException
*/
public OMWarpingImage(String imagePath) throws MalformedURLException, InterruptedException {
setWarp(imagePath, LatLonGCT.INSTANCE, new DataBounds(-180, -90, 180, 90));
}
/**
* Create an OMWarpingImage from path to image (resource, file or URL).
*
* @param imagePath
* @param transform the transform describing the image's projection.
* @param imageBounds the bounds of the image, in its coordinate system.
* @throws MalformedURLException
* @throws InterruptedException
*/
public OMWarpingImage(String imagePath, GeoCoordTransformation transform, DataBounds imageBounds)
throws MalformedURLException, InterruptedException {
setWarp(imagePath, transform, imageBounds);
}
/**
* Create an OMWarpingImage from path to image (resource, file or URL).
*
* @param imagePath
* @param transform transform the transform describing the image's
* projection.
* @param worldfile The WorldFile describing the image's location.
* @throws MalformedURLException
* @throws InterruptedException
*/
public OMWarpingImage(String imagePath, GeoCoordTransformation transform, WorldFile worldfile)
throws MalformedURLException, InterruptedException {
setWarp(imagePath, transform, worldfile);
}
/**
* Takes an image, assumed to be a world image in the LLXY projection (equal
* arc) covering -180, 180 longitude to -90, 90 latitude.
*
* @param bi
*/
public OMWarpingImage(BufferedImage bi) {
setWarp(bi, LatLonGCT.INSTANCE, new DataBounds(-180, -90, 180, 90));
}
/**
* Create an OMWarpingImage from a BufferedImage.
*
* @param bi a BufferedImage
* @param transform the transform describing the image's projection.
* @param imageBounds the bounds of the image, in its coordinate system.
*/
public OMWarpingImage(BufferedImage bi, GeoCoordTransformation transform, DataBounds imageBounds) {
setWarp(bi, transform, imageBounds);
}
/**
* Create an OMWarpingImage from a BufferedImage.
*
* @param bi BufferedImage
* @param transform transform the transform describing the image's
* projection.
* @param worldfile The WorldFile describing the image's location.
*/
public OMWarpingImage(BufferedImage bi, GeoCoordTransformation transform, WorldFile worldfile) {
setWarp(bi, transform, worldfile);
}
/**
* Takes an array of ARGB integer values representing an image, assumed to
* be a world image in the LLXY projection (equal arc) covering -180, 180
* longitude to -90, 90 latitude.
*
* @param pix int[] ARGB pixel array for image
* @param width pixel width of image
* @param height pixel height of image
*/
public OMWarpingImage(int[] pix, int width, int height) {
setWarp(pix, width, height, LatLonGCT.INSTANCE, new DataBounds(-180, -90, 180, 90));
}
/**
* Create an OMWarpingImage from a BufferedImage.
*
* @param pix int[] ARGB pixel array for image
* @param width pixel width of image
* @param height pixel height of image
* @param transform the transform describing the image's projection.
* @param imageBounds the bounds of the image, in its coordinate system.
*/
public OMWarpingImage(int[] pix, int width, int height, GeoCoordTransformation transform,
DataBounds imageBounds) {
setWarp(pix, width, height, transform, imageBounds);
}
/**
* Create an OMWarpingImage from a BufferedImage.
*
* @param pix int[] ARGB pixel array for image
* @param width pixel width of image
* @param height pixel height of image
* @param transform transform the transform describing the image's
* projection.
* @param worldfile The WorldFile describing the image's location.
*/
public OMWarpingImage(int[] pix, int width, int height, GeoCoordTransformation transform,
WorldFile worldfile) {
setWarp(pix, width, height, transform, worldfile);
}
/**
* Create an OMWarpingImage from an OMScalingRaster - useful for when the
* projection being used on the map doesn't match the projection of the
* raster, and it needs to be transformed.
*
* @param omsr OMScalingRaster
* @param transform a GeoCoordTransform if the OMScalingRaster image isn't a
* WGS84 image.
*/
public OMWarpingImage(OMScalingRaster omsr, GeoCoordTransformation transform) {
if (omsr != null) {
ImageWarp iw = omsr.getImageWarp(transform);
if (iw != null) {
setWarp(iw);
}
}
}
/**
* Set all the information needed.
*
* @param imagePath
* @param transform
* @param imageBounds
* @throws MalformedURLException
* @throws InterruptedException
*/
public void setWarp(String imagePath, GeoCoordTransformation transform, DataBounds imageBounds)
throws MalformedURLException, InterruptedException {
URL imageURL = PropUtils.getResourceOrFileOrURL(imagePath);
BufferedImage bi = BufferedImageHelper.getBufferedImage(imageURL);
setWarp(new ImageWarp(bi, transform, imageBounds));
}
public void setWarp(String imagePath, GeoCoordTransformation transform, WorldFile worldfile)
throws MalformedURLException, InterruptedException {
URL imageURL = PropUtils.getResourceOrFileOrURL(imagePath);
BufferedImage bi = BufferedImageHelper.getBufferedImage(imageURL);
setWarp(new ImageWarp(bi, transform, worldfile));
}
/**
* Set all the information needed.
*
* @param pix int[] ARGB pixel array for image
* @param width pixel width of image
* @param height pixel height of image
* @param transform
* @param imageBounds
*/
public void setWarp(int[] pix, int width, int height, GeoCoordTransformation transform,
DataBounds imageBounds) {
setWarp(new ImageWarp(pix, width, height, transform, imageBounds));
}
/**
* Set all the information needed.
*
* @param pix int[] ARGB pixel array for image
* @param width pixel width of image
* @param height pixel height of image
* @param transform
* @param worldfile describes projection of image
*/
public void setWarp(int[] pix, int width, int height, GeoCoordTransformation transform,
WorldFile worldfile) {
setWarp(new ImageWarp(pix, width, height, transform, worldfile));
}
public void setWarp(BufferedImage bi, GeoCoordTransformation transform, DataBounds imageBounds) {
setWarp(new ImageWarp(bi, transform, imageBounds));
}
public void setWarp(BufferedImage bi, GeoCoordTransformation transform, WorldFile worldfile) {
setWarp(new ImageWarp(bi, transform, worldfile));
}
public void setWarp(ImageWarp wrp) {
warp = wrp;
setNeedToRegenerate(true);
}
public ImageWarp getWarp() {
return warp;
}
@Override
public boolean generate(Projection proj) {
if (warp != null) {
if (updateImageForProjection(proj) || raster == null) {
raster = warp.getOMRaster(proj);
DrawingAttributes.sTransfer(this, raster);
}
}
setNeedToRegenerate(false);
return true;
}
protected Projection lastProjection = null;
/**
* Called from within generate. Some render buffering calls generate to make
* sure the latest projection is called on an OMGraphic before it's put into
* a buffer. We're keeping track of the last projection used to generate the
* warped image, and if it's the same, don't bother regenerating, use the
* raster we have.
*
* @param proj current projection.
* @return false if the rest of generate() should be skipped.
*/
protected boolean updateImageForProjection(Projection proj) {
boolean ret = proj.equals(lastProjection);
lastProjection = proj;
return !ret;
}
@Override
public void render(Graphics g) {
if (raster != null && isRenderable(raster.getShape())) {
raster.setSelected(isSelected());
raster.setMatted(isMatted());
raster.render(g);
}
}
@Override
public float distance(double x, double y) {
if (raster != null) {
return raster.distance(x, y);
}
return super.distance(x, y);
}
@Override
public float distanceToEdge(double x, double y) {
if (raster != null) {
return raster.distanceToEdge(x, y);
}
return super.distanceToEdge(x, y);
}
@Override
public boolean contains(double x, double y) {
if (raster != null) {
return raster.contains(x, y);
}
return super.contains(x, y);
}
}