Doc generation: add a method HTMLDocbookTagConverter::getGenerationType() to know...
[scilab.git] / scilab / modules / helptools / src / java / org / scilab / modules / helptools / image / MathMLImageConverter.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 package org.scilab.modules.helptools.image;
14
15 import java.awt.Graphics2D;
16 import java.awt.Color;
17 import java.awt.image.BufferedImage;
18 import java.io.File;
19 import java.io.IOException;
20 import java.util.Map;
21
22 import javax.swing.ImageIcon;
23
24 import javax.xml.parsers.ParserConfigurationException;
25
26 import org.w3c.dom.Node;
27 import org.w3c.dom.Document;
28 import org.xml.sax.SAXException;
29
30 import net.sourceforge.jeuclid.MathMLParserSupport;
31 import net.sourceforge.jeuclid.MutableLayoutContext;
32 import net.sourceforge.jeuclid.layout.JEuclidView;
33 import net.sourceforge.jeuclid.context.LayoutContextImpl;
34 import net.sourceforge.jeuclid.context.Parameter;
35
36 import org.scilab.modules.helptools.HTMLDocbookTagConverter;
37
38 /**
39  * A MathML to PNG converter
40  * @author Calixte DENIZET
41  */
42 public class MathMLImageConverter implements ExternalImageConverter {
43
44     private static final Graphics2D TEMPGRAPHIC = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB).createGraphics();
45     private static MathMLImageConverter instance;
46     private final HTMLDocbookTagConverter.GenerationType type;
47
48     private MathMLImageConverter(HTMLDocbookTagConverter.GenerationType type) {
49         this.type = type;
50     }
51
52     /**
53      * {@inheritDoc}
54      */
55     public String getMimeType() {
56         return "image/mathml";
57     }
58
59     /**
60      * Since it is a singleton class...
61      * @return this
62      */
63     public static ExternalImageConverter getInstance(HTMLDocbookTagConverter.GenerationType type) {
64         if (instance == null) {
65             instance = new MathMLImageConverter(type);
66         }
67         return instance;
68     }
69
70     /**
71      * {@inheritDoc}
72      */
73     public String convertToImage(String currentFile, String mathml, Map<String, String> attributes, File imageFile, String imageName) {
74         Document doc = null;
75         try {
76             doc = MathMLParserSupport.parseString(mathml);
77         } catch (final SAXException e) {
78             return null;
79         } catch (final ParserConfigurationException e) {
80             return null;
81         } catch (final IOException e) {
82             return null;
83         }
84
85         String fontsize = attributes.get("fontsize");
86         int fs = 16;
87         if (fontsize != null) {
88             fs = Integer.parseInt(fontsize);
89         }
90
91         Image img = convertMathML(doc, fs);
92         if (img != null && ImageConverter.convertIconToPNG(img.icon, imageFile)) {
93             return ImageConverter.generateCode(img, imageName, attributes);
94         }
95
96         return null;
97     }
98
99     /**
100      * {@inheritDoc}
101      */
102     public String convertToImage(File mathml, Map<String, String> attributes, File imageFile, String imageName) {
103         Document doc = null;
104         try {
105             doc = MathMLParserSupport.parseFile(mathml);
106         } catch (final SAXException e) {
107             return null;
108         } catch (final IOException e) {
109             return null;
110         }
111
112         String fontsize = attributes.get("fontsize");
113         int fs = 16;
114         if (fontsize != null) {
115             fs = Integer.parseInt(fontsize);
116         }
117
118         Image img = convertMathML(doc, fs);
119         if (img != null && ImageConverter.convertIconToPNG(img.icon, imageFile)) {
120             return ImageConverter.generateCode(img, imageName, attributes);
121         }
122
123         return null;
124     }
125
126     /**
127      * @param mathml the document to convert
128      * @param fontSize the font size
129      * @return an image informations
130      */
131     private static Image convertMathML(Document mathml, int fontSize) {
132         LayoutContextImpl parameters = new LayoutContextImpl(LayoutContextImpl.getDefaultLayoutContext());
133         parameters.setParameter(Parameter.MATHSIZE, fontSize);
134         JEuclidView jev = new JEuclidView((Node) mathml, parameters, TEMPGRAPHIC);
135
136         int width = (int) Math.ceil(jev.getWidth());
137         int ascent = (int) Math.ceil(jev.getAscentHeight());
138         int height = (int) Math.ceil(jev.getDescentHeight()) + ascent;
139
140         if (width <= 0 || height <= 0) {
141             return null;
142         }
143
144         BufferedImage bimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
145         Graphics2D g2d = bimg.createGraphics();
146         g2d.setColor(new Color(255, 255, 255, 0));
147         g2d.fillRect(0, 0, width, height);
148
149         jev.draw(g2d, 0, ascent);
150         g2d.dispose();
151
152         return new Image(new ImageIcon(bimg), width, height, ascent, height - ascent);
153     }
154 }