/*
* Created on 03.01.2006 for PIROL
*
* SVN header information:
* $Author: LBST-PF-3\orahn $
* $Rev: 2509 $
* $Date: 2006-10-06 12:01:50 +0200 (Fr, 06 Okt 2006) $
* $Id: RasterImageRenderer.java 2509 2006-10-06 10:01:50Z LBST-PF-3\orahn $
*/
package org.openjump.core.rasterimage;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jump.workbench.ui.LayerViewPanel;
import com.vividsolutions.jump.workbench.ui.renderer.ImageCachingRenderer;
import com.vividsolutions.jump.workbench.ui.renderer.LayerRenderer;
import com.vividsolutions.jump.workbench.ui.renderer.ThreadSafeImage;
import com.vividsolutions.jump.workbench.ui.renderer.ThreadSafeImage.Drawer;
/**
* TODO: comment class
*
* @author Ole Rahn
* <br>
* <br>FH Osnabrück - University of Applied Sciences Osnabrück,
* <br>Project: PIROL (2006),
* <br>Subproject: Daten- und Wissensmanagement
*
* @version $Rev: 2509 $
* modified: [sstein]: 16.Feb.2009 changed logger-entries to comments
*/
public class RasterImageRenderer extends ImageCachingRenderer {
//protected static PersonalLogger logger = new PersonalLogger(DebugUserIds.OLE);
protected boolean doneRendering = true;
/**
*@param contentID
*@param panel
*/
public RasterImageRenderer(Object contentID, LayerViewPanel panel) {
super(contentID, panel);
}
protected RasterImageLayer getRasterImageLayer(){
return (RasterImageLayer) this.getContentID();
}
// ############
public ThreadSafeImage getImage() {
if (!getLayer().isVisible()) {
return null;
}
return super.getImage();
}
public Runnable createRunnable() {
if (!LayerRenderer.render(getLayer(), panel)) {
return null;
}
return super.createRunnable();
}
public void copyTo(Graphics2D graphics) {
if (!LayerRenderer.render(getLayer(), panel)) {
return;
}
super.copyTo(graphics);
}
private RasterImageLayer getLayer() {
return (RasterImageLayer) getContentID();
}
// ############
/**
*@param image
*@throws Exception
*/
protected void renderHook(ThreadSafeImage image) throws Exception {
if (!getRasterImageLayer().isVisible()) {
return;
}
while(!this.doneRendering)
Thread.sleep(50);
doneRendering = false;
//Create the image outside the synchronized call to #draw, because it
// takes
//a few seconds, and we don't want to block repaints. [Jon Aquino]
RasterImageLayer rLayer = getRasterImageLayer();
final Envelope realWorldCoordinates = new Envelope(rLayer.getEnvelope());
final Point2D upperLeftCorner = this.panel.getViewport().toViewPoint(new Coordinate(realWorldCoordinates.getMinX(), realWorldCoordinates.getMaxY()));
// Draw a grey rect where the image is about to show up...
if (false && rLayer.getOrigImageWidth() * rLayer.getOrigImageHeight() > RasterImageLayer.getMaxPixelsForFastDisplayMode()){
final Rectangle drawingRect = rLayer.getDrawingRectangle(10, 10, rLayer.getEnvelope(), this.panel.getViewport());
if (drawingRect!=null){
//logger.printDebug(drawingRect.toString());
Drawer defaultDrawer = new ThreadSafeImage.Drawer() {
public void draw(Graphics2D g) throws Exception {
g.translate( upperLeftCorner.getX() , upperLeftCorner.getY() );
g.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, .5f));
g.setColor(Color.lightGray);
g.fillRect(drawingRect.x, drawingRect.y, drawingRect.width, -drawingRect.height);
}
};
image.draw(defaultDrawer);
}
}
final BufferedImage sourceImage = rLayer.createImage(panel);
final int xOffset = rLayer.getXOffset();
final int yOffset = rLayer.getYOffset();
if (sourceImage==null){
doneRendering = true;
return;
}
//Drawing can take a long time. If the renderer is cancelled during
// this
//time, don't draw when the request returns. [Jon Aquino]
if (cancelled) {
doneRendering = true;
return;
}
Drawer drawer = new ThreadSafeImage.Drawer() {
public void draw(Graphics2D g) throws Exception {
g.translate( upperLeftCorner.getX() , upperLeftCorner.getY() );
Object oldRenderingKey = g.getRenderingHint(RenderingHints.KEY_RENDERING);
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
Object oldColorRenderingKey = g.getRenderingHint(RenderingHints.KEY_COLOR_RENDERING);
g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED);
Object oldDitheringKey = g.getRenderingHint(RenderingHints.KEY_DITHERING);
g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
Object oldAplhaInterpolationKey = g.getRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION);
g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED);
Object oldAAKey = g.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
g.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, .0f));
g.setColor(Color.RED);
g.fillRect(xOffset, yOffset, sourceImage.getWidth(), sourceImage.getHeight());
g.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, 1.0f - (float) getRasterImageLayer().getTransparencyLevel()));
g.drawImage(sourceImage, xOffset, yOffset, null);
if (oldRenderingKey!=null)
g.setRenderingHint(RenderingHints.KEY_RENDERING, oldRenderingKey);
else
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_DEFAULT);
if (oldColorRenderingKey!=null)
g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, oldColorRenderingKey);
else
g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_DEFAULT);
if (oldDitheringKey!=null)
g.setRenderingHint(RenderingHints.KEY_DITHERING, oldDitheringKey);
else
g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DEFAULT);
if (oldAplhaInterpolationKey!=null)
g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, oldAplhaInterpolationKey);
else
g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT);
if (oldAAKey!=null)
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, oldAAKey);
else
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_DEFAULT);
}
};
image.draw(drawer);
doneRendering = true;
}
}