001    /*
002     * Copyright 2007 - 2008 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: ConverterPlugin.java,v 70597ba9d706 2008/02/18 19:42:05 maxberger $ */
018    
019    package net.sourceforge.jeuclid.converter;
020    
021    import java.awt.Dimension;
022    import java.io.IOException;
023    import java.io.OutputStream;
024    
025    import net.sourceforge.jeuclid.LayoutContext;
026    
027    import org.w3c.dom.Document;
028    import org.w3c.dom.Node;
029    
030    /**
031     * Describes an Image converter.
032     * 
033     * @version $Revision: 70597ba9d706 $
034     */
035    public interface ConverterPlugin {
036        /**
037         * Write the given MathBase object with its rendering parameters into the
038         * given output stream.
039         * 
040         * @param doc
041         *            A JEuclid DocumentElement
042         * @param outStream
043         *            Target output stream.
044         * @param context
045         *            LayoutContext to use.
046         * @return Rendering's dimension based on the spefic plugin's Graphics2D
047         *         implementation.
048         * @throws IOException
049         *             if an I/O error occurred during write.
050         */
051        Dimension convert(Node doc, LayoutContext context, OutputStream outStream)
052                throws IOException;
053    
054        /**
055         * Internal class describing an XML document and the dimensions of its
056         * default view.
057         */
058        class DocumentWithDimension {
059            private final Document document;
060    
061            private final Dimension dimension;
062    
063            private final float baseline;
064    
065            public DocumentWithDimension(final Document doc, final Dimension dim,
066                    final float bline) {
067                super();
068                this.document = doc;
069                this.dimension = dim;
070                this.baseline = bline;
071            }
072    
073            /**
074             * @return the document resulting from this conversion, a suptype of
075             *         Document (e.g. SVGDocument) if possible.
076             */
077            public Document getDocument() {
078                return this.document;
079            }
080    
081            /**
082             * @return The dimensions from this conversion
083             */
084            public Dimension getDimension() {
085                return this.dimension;
086            }
087    
088            /**
089             * @return the position of the baseline in pixels from the bottom.
090             */
091            public float getBaseline() {
092                return this.baseline;
093            }
094    
095        }
096    
097        /**
098         * Convert from the given Math Object to an XML DOM Document.
099         * 
100         * @param doc
101         *            A JEuclid DocumentElement
102         * @param context
103         *            LayoutContext to use.
104         * @return an instance of DocumentWithDimension, containing a Document of
105         *         the appropriate subtype for this format (e.g. SVGDocument), if
106         *         available. If conversion is not supported by this plugin, it
107         *         may return null.
108         */
109        DocumentWithDimension convert(final Node doc, final LayoutContext context);
110    
111    }