001: /* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
002: * This code is licensed under the GPL 2.0 license, availible at the root
003: * application directory.
004: */
005: package org.vfny.geoserver.wms.responses.legend.png;
006:
007: import org.geotools.image.ImageWorker;
008: import org.geotools.resources.image.ImageUtilities;
009: import org.vfny.geoserver.ServiceException;
010: import org.vfny.geoserver.wms.responses.DefaultRasterLegendProducer;
011: import java.awt.image.BufferedImage;
012: import java.awt.image.DirectColorModel;
013: import java.io.IOException;
014: import java.io.OutputStream;
015: import java.util.Iterator;
016: import javax.imageio.IIOImage;
017: import javax.imageio.ImageIO;
018: import javax.imageio.ImageWriteParam;
019: import javax.imageio.ImageWriter;
020: import javax.imageio.stream.MemoryCacheImageOutputStream;
021: import javax.media.jai.PlanarImage;
022:
023: /**
024: * Producer of legend graphics in all the formats available through JAI.
025: *
026: * @author Gabriel Roldan, Axios Engineering
027: * @version $Id: PNGLegendGraphicProducer.java 4776 2006-07-24 14:43:05Z
028: * afabiani $
029: */
030: class PNGLegendGraphicProducer extends DefaultRasterLegendProducer {
031: /**
032: * Creates a new JAI based legend producer for creating
033: * <code>outputFormat</code> type images.
034: *
035: * @param outputFormat
036: * DOCUMENT ME!
037: */
038: PNGLegendGraphicProducer() {
039: super ();
040: }
041:
042: /**
043: * Encodes the image created by the superclss to the format specified at the
044: * constructor and sends it to <code>out</code>.
045: *
046: * @see org.vfny.geoserver.wms.responses.GetLegendGraphicProducer#writeTo(java.io.OutputStream)
047: */
048: public void writeTo(OutputStream out) throws IOException,
049: ServiceException {
050: final BufferedImage image = super .getLegendGraphic();
051:
052: // /////////////////////////////////////////////////////////////////
053: //
054: // Reformatting this image for png
055: //
056: // /////////////////////////////////////////////////////////////////
057: final MemoryCacheImageOutputStream memOutStream = new MemoryCacheImageOutputStream(
058: out);
059: final ImageWorker worker = new ImageWorker(image);
060: final PlanarImage finalImage = (image.getColorModel() instanceof DirectColorModel) ? worker
061: .forceComponentColorModel().getPlanarImage()
062: : worker.getPlanarImage();
063:
064: // /////////////////////////////////////////////////////////////////
065: //
066: // Getting a writer
067: //
068: // /////////////////////////////////////////////////////////////////
069: final Iterator it = ImageIO
070: .getImageWritersByMIMEType("image/png");
071: ImageWriter writer = null;
072:
073: if (!it.hasNext()) {
074: throw new IllegalStateException("No PNG ImageWriter found");
075: } else {
076: writer = (ImageWriter) it.next();
077: }
078:
079: // /////////////////////////////////////////////////////////////////
080: //
081: // Compression is available only on native lib
082: //
083: // /////////////////////////////////////////////////////////////////
084: final ImageWriteParam iwp = writer.getDefaultWriteParam();
085:
086: if (writer
087: .getClass()
088: .getName()
089: .equals(
090: "com.sun.media.imageioimpl.plugins.png.CLibPNGImageWriter")) {
091: iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
092:
093: iwp.setCompressionQuality(0.75f); // we can control quality here
094: }
095:
096: writer.setOutput(memOutStream);
097: writer.write(null, new IIOImage(finalImage, null, null), iwp);
098: memOutStream.flush();
099: memOutStream.close();
100: writer.dispose();
101: }
102:
103: /**
104: * Returns the MIME type in which the legend graphic will be encoded.
105: *
106: * @see org.vfny.geoserver.wms.responses.GetLegendGraphicProducer#getContentType()
107: */
108: public String getContentType() throws IllegalStateException {
109: return "image/png";
110: }
111: }
|