/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wms.worldwind; import gov.nasa.worldwind.formats.dds.DDSConverter; import gov.nasa.worldwind.util.Logging; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.RenderedImage; import java.awt.image.WritableRaster; import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; import java.util.Collections; import java.util.Hashtable; import java.util.Set; import org.geoserver.platform.ServiceException; import org.geoserver.wms.MapProducerCapabilities; import org.geoserver.wms.WMS; import org.geoserver.wms.WMSMapContent; import org.geoserver.wms.map.RenderedImageMapResponse; public class DDSMapResponse extends RenderedImageMapResponse { /** the only MIME type this map producer supports */ static final String MIME_TYPE = "image/dds"; /** * convenient singleton Set to expose the output format this producer * supports */ private static final Set SUPPORTED_FORMATS = Collections .singleton(MIME_TYPE); public DDSMapResponse(WMS wms) { super(MIME_TYPE, wms); } public void formatImageOutputStream(RenderedImage img, OutputStream os, WMSMapContent mapContent) throws ServiceException, IOException { BufferedImage bimg = convertRenderedImage(img); ByteBuffer bb = DDSConverter.convertToDxt3(bimg); saveBuffer(bb,os); } public static boolean saveBuffer(ByteBuffer buffer, OutputStream os) throws IOException { if (buffer == null) { String message = "nullValue.BufferNull"; Logging.logger().severe(message); throw new IllegalArgumentException(message); } if (os == null) { String message = "nullValue.FileIsNull"; Logging.logger().severe(message); throw new IllegalArgumentException(message); } int numBytesRead = 0; //WWIO.saveBuffer(buffer, new File("C:\\testdds\\image.dds")); os.write(buffer.array()); return true; } /** * Covert RenderedImage to BufferedImage * with correct colour model * (lifted from http://www.jguru.com/faq/view.jsp?EID=114602) * @param img * */ protected BufferedImage convertRenderedImage(RenderedImage img) { if (img instanceof BufferedImage) { return (BufferedImage)img; } ColorModel cm = img.getColorModel(); int width = img.getWidth(); int height = img.getHeight(); WritableRaster raster = cm.createCompatibleWritableRaster(width, height); boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); Hashtable properties = new Hashtable(); String[] keys = img.getPropertyNames(); if (keys!=null) { for (int i = 0; i < keys.length; i++) { properties.put(keys[i], img.getProperty(keys[i])); } } BufferedImage bimg = new BufferedImage(cm, raster, isAlphaPremultiplied, properties); img.copyData(raster); return bimg; } /** * DXT3 does support transparency, unless alpha is pre-multiplied */ @Override public MapProducerCapabilities getCapabilities(String outputFormat) { // FIXME Become more capable return new MapProducerCapabilities(false, false, false, true, null); } }