rrenkert@243: /* rrenkert@243: * Copyright (c) 2011 by Intevation GmbH, Germany rrenkert@243: * rrenkert@243: * This file is part of MXD2map. rrenkert@243: * rrenkert@243: * This program is free software under the LGPL (>=v2.1) rrenkert@243: * Read the file LICENCE.txt coming with the software for details rrenkert@243: * or visit http://www.gnu.org/licenses/ if it does not exist. rrenkert@243: * rrenkert@243: * MXD2map has been developed on behalf of the rrenkert@243: * Bundesamt fuer Seeschifffahrt und Hydrographie (BSH) in Hamburg rrenkert@243: * by Intevation GmbH. rrenkert@243: * rrenkert@243: * Authors: rrenkert@243: * Raimund Renkert rrenkert@243: * Bjoern Schilberg rrenkert@243: * Stephan Holl rrenkert@243: */ rrenkert@243: rrenkert@64: package de.intevation.mxd.reader; rrenkert@64: rrenkert@64: import java.awt.Color; rrenkert@64: import java.awt.Image; rrenkert@64: rrenkert@64: import org.apache.log4j.Logger; rrenkert@64: rrenkert@64: import com.esri.arcgis.display.ISymbol; rrenkert@67: import com.esri.arcgis.display.ILineSymbol; rrenkert@64: import com.esri.arcgis.display.PictureLineSymbol; rrenkert@64: import com.esri.arcgis.support.ms.stdole.Picture; rrenkert@64: import com.esri.arcgis.display.RgbColor; rrenkert@64: rrenkert@64: import org.w3c.dom.Element; rrenkert@115: import java.io.IOException; raimund@251: import java.awt.image.BufferedImage; raimund@251: import javax.imageio.ImageIO; raimund@251: import java.io.ByteArrayOutputStream; rrenkert@64: raimund@251: import org.apache.commons.codec.binary.Base64; rrenkert@64: /** rrenkert@64: * Reads picture line symbol information. rrenkert@64: * rrenkert@64: * @author Raimund Renkert rrenkert@64: */ rrenkert@80: public class PictureLineSymbolReader rrenkert@80: extends AbstractSymbolReader { rrenkert@64: rrenkert@64: /** rrenkert@64: * The logger. rrenkert@64: */ rrenkert@64: private static final Logger logger = rrenkert@64: Logger.getLogger(SimpleLineSymbolReader.class); rrenkert@64: rrenkert@64: /** rrenkert@64: * Private member. rrenkert@64: */ rrenkert@64: private PictureLineSymbol symbol; rrenkert@64: rrenkert@64: public PictureLineSymbolReader(ISymbol symbol) rrenkert@64: throws Exception { aheinecke@336: logger.debug("constructor()"); rrenkert@64: if(symbol instanceof PictureLineSymbol) { rrenkert@64: this.symbol = (PictureLineSymbol)symbol; rrenkert@64: } rrenkert@64: else { rrenkert@64: throw new Exception("Not a PictureLineSymbol!"); rrenkert@64: } rrenkert@64: } rrenkert@64: rrenkert@67: public PictureLineSymbolReader(ILineSymbol symbol) rrenkert@67: throws Exception { aheinecke@336: logger.debug("constructor()"); rrenkert@67: if(symbol instanceof PictureLineSymbol) { rrenkert@67: this.symbol = (PictureLineSymbol)symbol; rrenkert@67: } rrenkert@67: else { rrenkert@67: throw new Exception("Not a PictureLineSymbol!"); rrenkert@67: } rrenkert@67: } rrenkert@67: rrenkert@64: /** rrenkert@64: * Reads the symbol attributes. rrenkert@64: * rrenkert@64: * @return The XML node. rrenkert@64: */ rrenkert@115: public Element read() { rrenkert@84: //TODO Read the picture from mxd and write it as base64 string to the rrenkert@84: // XML Element. rrenkert@64: logger.debug("read()"); rrenkert@80: Element symbolElement = util.addSymbol(parent); rrenkert@64: rrenkert@115: try { rrenkert@115: symbolElement.setAttribute("name", symbol.getNameString()); rrenkert@115: } rrenkert@115: catch(IOException ioe) { rrenkert@135: logger.warn("Could not read name. Setting name to \"default\""); rrenkert@115: symbolElement.setAttribute("name", "default"); rrenkert@115: } rrenkert@115: rrenkert@115: try { rrenkert@115: symbolElement.setAttribute( rrenkert@115: "offset", rrenkert@115: String.valueOf(symbol.getOffset())); rrenkert@115: } rrenkert@115: catch(IOException ioe) { rrenkert@135: logger.warn("Could not read offset."); rrenkert@115: } rrenkert@115: rrenkert@115: try { rrenkert@115: symbolElement.setAttribute( rrenkert@115: "x_scale", rrenkert@115: String.valueOf(symbol.getXScale())); rrenkert@115: } rrenkert@115: catch(IOException ioe) { rrenkert@135: logger.warn("Could not read x-scale."); rrenkert@115: } rrenkert@115: rrenkert@115: try { rrenkert@115: symbolElement.setAttribute( rrenkert@115: "y_scale", rrenkert@115: String.valueOf(symbol.getYScale())); rrenkert@115: } rrenkert@115: catch(IOException ioe) { rrenkert@135: logger.warn("Could not read y-scale."); rrenkert@115: } rrenkert@115: rrenkert@115: try { rrenkert@115: symbolElement.setAttribute( rrenkert@115: "width", rrenkert@115: String.valueOf(symbol.getWidth())); rrenkert@115: } rrenkert@115: catch(IOException ioe) { rrenkert@135: logger.warn("Could not read width."); rrenkert@115: } raimund@251: raimund@251: //Read the picture and convert to base64. raimund@251: try { raimund@251: Picture p = symbol.getPicture(); raimund@251: Image i = p.toImage(); raimund@251: if(i instanceof BufferedImage) { raimund@251: BufferedImage bi = (BufferedImage)i; raimund@251: ByteArrayOutputStream baos = new ByteArrayOutputStream(); raimund@251: //Get byte array from image. raimund@251: ImageIO.write(bi, "BMP", baos); raimund@251: Base64 encoder = new Base64(); raimund@251: //encode in a base64 string raimund@251: String pict = encoder.encodeBase64String(baos.toByteArray()); raimund@251: symbolElement.setAttribute("picture", pict); rrenkert@115: raimund@251: //Get transparent color. raimund@251: RgbColor c = new RgbColor(); raimund@251: c.setRGB(symbol.getBitmapTransparencyColor().getRGB()); raimund@251: Color transp = new Color ( raimund@251: c.getRed(), raimund@251: c.getGreen(), raimund@251: c.getBlue()); raimund@251: symbolElement.setAttribute( raimund@251: "transparent_color", raimund@251: String.valueOf(transp.getRGB())); raimund@251: } raimund@251: else { raimund@251: logger.warn("Could not read image symbol."); raimund@251: return null; raimund@251: } raimund@251: } raimund@251: catch(IOException ioe) { raimund@251: logger.warn("Could not read picture."); raimund@251: } rrenkert@97: symbolElement.setAttribute("type", "line"); rrenkert@64: symbolElement.setAttribute("style", "picture"); rrenkert@64: rrenkert@64: return symbolElement; rrenkert@64: } rrenkert@64: } rrenkert@64: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :