package com.vividsolutions.jump.workbench.ui; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.util.Assert; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.model.Layerable; import com.vividsolutions.jump.workbench.ui.renderer.LayerRenderer; /** * Renders layers as an Image, which can then be saved to a file or printed. */ public class LayerPrinter { /** * @param layers earlier layers will be rendered above later layers */ public BufferedImage print(Collection layers, Envelope envelope, int extentInPixels) throws Exception { Assert.isTrue(!layers.isEmpty()); final Throwable[] throwable = new Throwable[] { null }; LayerViewPanel panel = new LayerViewPanel(((Layer) layers.iterator() .next()).getLayerManager(), new LayerViewPanelContext() { public void setStatusMessage(String message) { } public void warnUser(String warning) { } public void handleThrowable(Throwable t) { throwable[0] = t; } }); panel.setSize(extentInPixels, extentInPixels); panel.getViewport().zoom(envelope); BufferedImage bufferedImage = new BufferedImage(panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D graphics = bufferedImage.createGraphics(); paintBackground(graphics, extentInPixels); ArrayList layersReversed = new ArrayList(layers); Collections.reverse(layersReversed); for (Iterator i = layersReversed.iterator(); i.hasNext();) { Layer layer = (Layer) i.next(); LayerRenderer renderer = new LayerRenderer(layer, panel); //Wait for rendering to complete rather than running it in a separate thread. [Jon Aquino] Runnable runnable = renderer.createRunnable(); if (runnable != null) { runnable.run(); } //I hope no ImageObserver is needed. Set to null. [Jon Aquino] renderer.copyTo(graphics); } if (throwable[0] != null) { throw throwable[0] instanceof Exception ? (Exception) throwable[0] : new Exception(throwable[0].getMessage()); } return bufferedImage; } private void paintBackground(Graphics2D graphics, int extent) { graphics.setColor(Color.white); graphics.fillRect(0, 0, extent, extent); } }