Mercurial > mxd2map
diff src/java/de/intevation/mxd/reader/PictureFillSymbolReader.java @ 251:6b80e46b8f38
Added picture symbol support to the converter.
author | raimund renkert <raimund.renkert@intevation.de> |
---|---|
date | Fri, 12 Aug 2011 16:08:57 +0200 |
parents | |
children | 2cb2f26d0d54 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/java/de/intevation/mxd/reader/PictureFillSymbolReader.java Fri Aug 12 16:08:57 2011 +0200 @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2011 by Intevation GmbH, Germany <info@intevation.de> + * + * This file is part of MXD2map. + * + * This program is free software under the LGPL (>=v2.1) + * Read the file LICENCE.txt coming with the software for details + * or visit http://www.gnu.org/licenses/ if it does not exist. + * + * MXD2map has been developed on behalf of the + * Bundesamt fuer Seeschifffahrt und Hydrographie (BSH) in Hamburg + * by Intevation GmbH. + * + * Authors: + * Raimund Renkert <raimund.renkert@intevation.de> + * Bjoern Schilberg <bjoern.schilberg@intevation.de> + * Stephan Holl <stephan.holl@intevation.de> + */ + +package de.intevation.mxd.reader; + +import java.awt.Color; +import java.awt.Image; + +import org.apache.log4j.Logger; + +import com.esri.arcgis.display.ISymbol; +import com.esri.arcgis.display.ILineSymbol; +import com.esri.arcgis.display.IFillSymbol; +import com.esri.arcgis.display.PictureFillSymbol; +import com.esri.arcgis.support.ms.stdole.Picture; +import com.esri.arcgis.display.IRgbColor; +import com.esri.arcgis.display.RgbColor; + +import org.w3c.dom.Element; +import java.io.IOException; +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferByte; +import javax.imageio.ImageIO; +import java.io.ByteArrayOutputStream; + +import org.apache.commons.codec.binary.Base64; +/** + * Reads picture fill symbol information. + * + * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a> + */ +public class PictureFillSymbolReader +extends AbstractSymbolReader { + + /** + * The logger. + */ + private static final Logger logger = + Logger.getLogger(PictureFillSymbolReader.class); + + /** + * Private member. + */ + private PictureFillSymbol symbol; + + public PictureFillSymbolReader(ISymbol symbol) + throws Exception { + logger.debug("contructor()"); + if(symbol instanceof PictureFillSymbol) { + this.symbol = (PictureFillSymbol)symbol; + } + else { + throw new Exception("Not a PictureFillSymbol!"); + } + } + + public PictureFillSymbolReader(IFillSymbol symbol) + throws Exception { + logger.debug("contructor()"); + if(symbol instanceof PictureFillSymbol) { + this.symbol = (PictureFillSymbol)symbol; + } + else { + throw new Exception("Not a PictureFillSymbol!"); + } + } + + /** + * Reads the symbol attributes. + * + * @return The XML node. + */ + public Element read() { + logger.debug("read()"); + Element symbolElement = util.addSymbol(parent); + + try { + symbolElement.setAttribute("name", symbol.getNameString()); + } + catch(IOException ioe) { + logger.warn("Could not read name. Setting name to \"default\""); + symbolElement.setAttribute("name", "default"); + } + + try { + symbolElement.setAttribute( + "x_scale", + String.valueOf(symbol.getXScale())); + } + catch(IOException ioe) { + logger.warn("Could not read x-scale."); + } + + try { + symbolElement.setAttribute( + "y_scale", + String.valueOf(symbol.getYScale())); + } + catch(IOException ioe) { + logger.warn("Could not read y-scale."); + } + + try { + symbolElement.setAttribute( + "xseparation", + String.valueOf(symbol.getXSeparation())); + } + catch(IOException ioe) { + logger.warn("Could not read x-separation."); + } + + try { + symbolElement.setAttribute( + "yseparation", + String.valueOf(symbol.getYSeparation())); + } + catch(IOException ioe) { + logger.warn( + "Could not read y-separation."); + } + + try { + ILineSymbol ls = symbol.getOutline(); + LineSymbolReader lsr = new LineSymbolReader(); + if(lsr.canRead(ls)) { + lsr.setSymbol(ls); + lsr.setUtil(util); + lsr.setParent(symbolElement); + lsr.read(); + } + else { + logger.debug("The type of " + ls.getClass().toString() + + " is not implemented!"); + } + } + catch(Exception e) { + logger.warn("Could not read outline."); + } + + //Read the picture and convert to base64. + try { + Picture p = symbol.getPicture(); + Image i = p.toImage(); + if(i instanceof BufferedImage) { + BufferedImage bi = (BufferedImage)i; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + //Get byte array from image. + ImageIO.write(bi, "BMP", baos); + Base64 encoder = new Base64(); + //encode in a base64 string + String pict = encoder.encodeBase64String(baos.toByteArray()); + symbolElement.setAttribute("picture", pict); + + //Get transparent color. + RgbColor c = new RgbColor(); + c.setRGB(symbol.getBitmapTransparencyColor().getRGB()); + Color transp = new Color ( + c.getRed(), + c.getGreen(), + c.getBlue()); + symbolElement.setAttribute( + "transparent_color", + String.valueOf(transp.getRGB())); + } + else { + logger.warn("Could not read image symbol."); + return null; + } + } + catch(IOException ioe) { + logger.warn("Could not read picture."); + } + symbolElement.setAttribute("type", "fill"); + symbolElement.setAttribute("style", "picture"); + + return symbolElement; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :