package com.revolsys.swing.map.layer.raster;
import java.awt.AlphaComposite;
import java.awt.Composite;
import java.awt.Graphics2D;
import com.revolsys.awt.WebColors;
import com.revolsys.collection.map.MapEx;
import com.revolsys.geometry.model.BoundingBox;
import com.revolsys.geometry.model.Polygon;
import com.revolsys.io.BaseCloseable;
import com.revolsys.raster.GeoreferencedImage;
import com.revolsys.swing.map.Viewport2D;
import com.revolsys.swing.map.layer.AbstractLayerRenderer;
import com.revolsys.swing.map.layer.record.style.GeometryStyle;
import com.revolsys.util.Cancellable;
public class GeoreferencedImageLayerRenderer
extends AbstractLayerRenderer<GeoreferencedImageLayer> {
private static final GeometryStyle STYLE_DIFFERENT_COORDINATE_SYSTEM = GeometryStyle
.line(WebColors.Red, 4);
public static void render(final Viewport2D viewport, final Graphics2D graphics,
final GeoreferencedImage image, final boolean useTransform) {
if (image != null) {
final BoundingBox viewBoundingBox = viewport.getBoundingBox();
final int viewWidth = viewport.getViewWidthPixels();
final int viewHeight = viewport.getViewHeightPixels();
image.drawImage(graphics, viewBoundingBox, viewWidth, viewHeight, useTransform);
}
}
public static void renderAlpha(final Viewport2D viewport, final Graphics2D graphics,
final GeoreferencedImage image, final boolean useTransform, final double alpha) {
final Composite composite = graphics.getComposite();
try (
BaseCloseable transformCloseable = viewport.setUseModelCoordinates(graphics, false)) {
AlphaComposite alphaComposite = AlphaComposite.SrcOver;
if (alpha < 1) {
alphaComposite = alphaComposite.derive((float)alpha);
}
graphics.setComposite(alphaComposite);
render(viewport, graphics, image, useTransform);
} finally {
graphics.setComposite(composite);
}
}
public static void renderDifferentCoordinateSystem(final Viewport2D viewport,
final Graphics2D graphics, final BoundingBox boundingBox) {
if (!boundingBox.isSameCoordinateSystem(viewport)) {
try (
BaseCloseable transformCloseable = viewport.setUseModelCoordinates(true)) {
final Polygon polygon = boundingBox.toPolygon(0);
viewport.drawGeometryOutline(polygon, STYLE_DIFFERENT_COORDINATE_SYSTEM);
}
}
}
public GeoreferencedImageLayerRenderer(final GeoreferencedImageLayer layer) {
super("raster", layer);
}
@Override
public void render(final Viewport2D viewport, final Cancellable cancellable,
final GeoreferencedImageLayer layer) {
final double scaleForVisible = viewport.getScaleForVisible();
if (layer.isVisible(scaleForVisible)) {
if (!layer.isEditable()) {
final GeoreferencedImage image = layer.getImage();
if (image != null) {
BoundingBox boundingBox = layer.getBoundingBox();
if (boundingBox == null || boundingBox.isEmpty()) {
boundingBox = layer.fitToViewport();
}
final Graphics2D graphics = viewport.getGraphics();
if (graphics != null) {
if (!cancellable.isCancelled()) {
renderAlpha(viewport, graphics, image, true, layer.getOpacity() / 255.0);
}
if (!cancellable.isCancelled()) {
renderDifferentCoordinateSystem(viewport, graphics, boundingBox);
}
}
}
}
}
}
@Override
public MapEx toMap() {
return MapEx.EMPTY;
}
}