001 /* 002 * Copyright 2007 - 2007 JEuclid, http://jeuclid.sf.net 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 /* $Id: FreeHepConverter.java,v 1d64d806165c 2009/04/09 07:17:07 maxberger $ */ 018 019 package net.sourceforge.jeuclid.converter; 020 021 import java.awt.Dimension; 022 import java.io.ByteArrayOutputStream; 023 import java.io.IOException; 024 import java.io.OutputStream; 025 import java.lang.reflect.Constructor; 026 import java.lang.reflect.InvocationTargetException; 027 028 import net.sourceforge.jeuclid.LayoutContext; 029 import net.sourceforge.jeuclid.layout.JEuclidView; 030 031 import org.freehep.graphics2d.VectorGraphics; 032 import org.w3c.dom.Node; 033 034 /** 035 * Converter for output formats supported by FreeHEP. 036 * 037 * @version $Revision: 1d64d806165c $ 038 */ 039 public class FreeHepConverter implements ConverterPlugin { 040 041 private final Constructor<VectorGraphics> streamConst; 042 043 @SuppressWarnings("unchecked") 044 FreeHepConverter(final Class<?> converterClass) 045 throws NoSuchMethodException { 046 047 this.streamConst = ((Class<VectorGraphics>) converterClass) 048 .getConstructor(OutputStream.class, Dimension.class); 049 } 050 051 /** {@inheritDoc} */ 052 public Dimension convert(final Node doc, final LayoutContext context, 053 final OutputStream outStream) throws IOException { 054 final VectorGraphics tempg = this.createGraphics( 055 new ByteArrayOutputStream(), new Dimension(1, 1)); 056 final JEuclidView view = new JEuclidView(doc, context, tempg); 057 final int ascent = (int) Math.ceil(view.getAscentHeight()); 058 final Dimension size = new Dimension( 059 (int) Math.ceil(view.getWidth()), (int) Math.ceil(view 060 .getDescentHeight()) 061 + ascent); 062 063 final VectorGraphics g = this.createGraphics(outStream, size); 064 g.setCreator("JEuclid (from MathML)"); 065 g.startExport(); 066 view.draw(g, 0, ascent); 067 g.endExport(); 068 069 return size; 070 } 071 072 /** {@inheritDoc} */ 073 public DocumentWithDimension convert(final Node doc, 074 final LayoutContext context) { 075 return null; 076 } 077 078 private VectorGraphics createGraphics(final OutputStream os, 079 final Dimension d) throws IOException { 080 try { 081 return this.streamConst.newInstance(os, d); 082 } catch (final InvocationTargetException e) { 083 throw new IOException(e.toString()); 084 } catch (final IllegalArgumentException e) { 085 throw new IOException(e.toString()); 086 } catch (final InstantiationException e) { 087 throw new IOException(e.toString()); 088 } catch (final IllegalAccessException e) { 089 throw new IOException(e.toString()); 090 } 091 } 092 }