Only add the tooltip when building the online help
[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      * {@inheritDoc}
61      */
62     public boolean mustRegenerate() {
63         return true;
64     }
65
66     /**
67      * Since it is a singleton class...
68      * @return this
69      */
70     public static ExternalImageConverter getInstance(HTMLDocbookTagConverter.GenerationType type) {
71         if (instance == null) {
72             instance = new MathMLImageConverter(type);
73         }
74         return instance;
75     }
76
77     /**
78      * {@inheritDoc}
79      */
80     public String convertToImage(String currentFile, String mathml, Map<String, String> attributes, File imageFile, String imageName) {
81         Document doc = null;
82         try {
83             doc = MathMLParserSupport.parseString(mathml);
84         } catch (final SAXException e) {
85             return null;
86         } catch (final ParserConfigurationException e) {
87             return null;
88         } catch (final IOException e) {
89             return null;
90         }
91
92         String fontsize = attributes.get("fontsize");
93         int fs = 16;
94         if (fontsize != null) {
95             fs = Integer.parseInt(fontsize);
96         }
97
98         Image img = convertMathML(doc, fs);
99         if (img != null && ImageConverter.convertIconToPNG(img.icon, imageFile)) {
100             return ImageConverter.generateCode(img, imageName, attributes);
101         }
102
103         return null;
104     }
105
106     /**
107      * {@inheritDoc}
108      */
109     public String convertToImage(File mathml, Map<String, String> attributes, File imageFile, String imageName) {
110         Document doc = null;
111         try {
112             doc = MathMLParserSupport.parseFile(mathml);
113         } catch (final SAXException e) {
114             return null;
115         } catch (final IOException e) {
116             return null;
117         }
118
119         String fontsize = attributes.get("fontsize");
120         int fs = 16;
121         if (fontsize != null) {
122             fs = Integer.parseInt(fontsize);
123         }
124
125         Image img = convertMathML(doc, fs);
126         if (img != null && ImageConverter.convertIconToPNG(img.icon, imageFile)) {
127             return ImageConverter.generateCode(img, imageName, attributes);
128         }
129
130         return null;
131     }
132
133     /**
134      * @param mathml the document to convert
135      * @param fontSize the font size
136      * @return an image informations
137      */
138     private static Image convertMathML(Document mathml, int fontSize) {
139         LayoutContextImpl parameters = new LayoutContextImpl(LayoutContextImpl.getDefaultLayoutContext());
140         parameters.setParameter(Parameter.MATHSIZE, fontSize);
141         JEuclidView jev = new JEuclidView((Node) mathml, parameters, TEMPGRAPHIC);
142
143         int width = (int) Math.ceil(jev.getWidth());
144         int ascent = (int) Math.ceil(jev.getAscentHeight());
145         int height = (int) Math.ceil(jev.getDescentHeight()) + ascent;
146
147         if (width <= 0 || height <= 0) {
148             return null;
149         }
150
151         BufferedImage bimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
152         Graphics2D g2d = bimg.createGraphics();
153         g2d.setColor(new Color(255, 255, 255, 0));
154         g2d.fillRect(0, 0, width, height);
155
156         jev.draw(g2d, 0, ascent);
157         g2d.dispose();
158
159         return new Image(new ImageIcon(bimg), width, height, ascent, height - ascent);
160     }
161 }