93f4f3b0068e0d497f966a6256db7ce7f0d646ad
[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 /**
37  * A MathML to PNG converter
38  * @author Calixte DENIZET
39  */
40 public class MathMLImageConverter implements ExternalImageConverter {
41
42     private static final Graphics2D TEMPGRAPHIC = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB).createGraphics();
43     private static MathMLImageConverter instance;
44
45     private MathMLImageConverter() { }
46
47     /**
48      * {@inheritDoc}
49      */
50     public String getMimeType() {
51         return "image/mathml";
52     }
53
54     /**
55      * Since it is a singleton class...
56      * @return this
57      */
58     public static ExternalImageConverter getInstance() {
59         if (instance == null) {
60             instance = new MathMLImageConverter();
61         }
62         return instance;
63     }
64
65     /**
66      * {@inheritDoc}
67      */
68     public String convertToImage(String currentFile, String mathml, Map<String, String> attributes, File imageFile, String imageName) {
69         Document doc = null;
70         try {
71             doc = MathMLParserSupport.parseString(mathml);
72         } catch (final SAXException e) {
73             return null;
74         } catch (final ParserConfigurationException e) {
75             return null;
76         } catch (final IOException e) {
77             return null;
78         }
79
80         String fontsize = attributes.get("fontsize");
81         int fs = 16;
82         if (fontsize != null) {
83             fs = Integer.parseInt(fontsize);
84         }
85
86         Image img = convertMathML(doc, fs);
87         if (img != null && ImageConverter.convertIconToPNG(img.icon, imageFile)) {
88             return ImageConverter.generateCode(img, imageName, attributes);
89         }
90
91         return null;
92     }
93
94     /**
95      * {@inheritDoc}
96      */
97     public String convertToImage(File mathml, Map<String, String> attributes, File imageFile, String imageName) {
98         Document doc = null;
99         try {
100             doc = MathMLParserSupport.parseFile(mathml);
101         } catch (final SAXException e) {
102             return null;
103         } catch (final IOException e) {
104             return null;
105         }
106
107         String fontsize = attributes.get("fontsize");
108         int fs = 16;
109         if (fontsize != null) {
110             fs = Integer.parseInt(fontsize);
111         }
112
113         Image img = convertMathML(doc, fs);
114         if (img != null && ImageConverter.convertIconToPNG(img.icon, imageFile)) {
115             return ImageConverter.generateCode(img, imageName, attributes);
116         }
117
118         return null;
119     }
120
121     /**
122      * @param mathml the document to convert
123      * @param fontSize the font size
124      * @return an image informations
125      */
126     private static Image convertMathML(Document mathml, int fontSize) {
127         LayoutContextImpl parameters = new LayoutContextImpl(LayoutContextImpl.getDefaultLayoutContext());
128         parameters.setParameter(Parameter.MATHSIZE, fontSize);
129         JEuclidView jev = new JEuclidView((Node) mathml, parameters, TEMPGRAPHIC);
130
131         int width = (int) Math.ceil(jev.getWidth());
132         int ascent = (int) Math.ceil(jev.getAscentHeight());
133         int height = (int) Math.ceil(jev.getDescentHeight()) + ascent;
134
135         if (width <= 0 || height <= 0) {
136             return null;
137         }
138
139         BufferedImage bimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
140         Graphics2D g2d = bimg.createGraphics();
141         g2d.setColor(new Color(255, 255, 255, 0));
142         g2d.fillRect(0, 0, width, height);
143
144         jev.draw(g2d, 0, ascent);
145         g2d.dispose();
146
147         return new Image(new ImageIcon(bimg), width, height, ascent, height - ascent);
148     }
149 }