Package follows the classical Scilab declaration
[scilab.git] / scilab / modules / helptools / src / java / org / scilab / modules / helptools / image / ImageConverter.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.FileInputStream;
20 import java.io.FileOutputStream;
21 import java.io.IOException;
22 import java.io.OutputStream;
23 import java.io.StringReader;
24 import java.nio.channels.FileChannel;
25 import java.util.HashMap;
26 import java.util.Map;
27
28 import javax.activation.MimetypesFileTypeMap;
29 import javax.imageio.ImageIO;
30 import javax.swing.Icon;
31 import javax.swing.ImageIcon;
32 import javax.swing.JLabel;
33
34 /**
35  * Class to handle the image conversion
36  * @author Calixte DENIZET
37  */
38 public final class ImageConverter {
39
40     private static Map<String, ExternalImageConverter> externalConverters = new HashMap();
41     private static MimetypesFileTypeMap mimeMap = new MimetypesFileTypeMap();
42
43     static {
44         mimeMap.addMimeTypes("type=image/latex exts=tex,latex");
45         mimeMap.addMimeTypes("type=image/mathml exts=mml,mathml");
46         mimeMap.addMimeTypes("type=image/svg exts=svg");
47     }
48
49     /**
50      * Register a new ExternalImageConverter
51      * @param c the converter to register
52      */
53     public static void registerExternalImageConverter(ExternalImageConverter c) {
54         if (c != null) {
55             externalConverters.put(c.getMimeType(), c);
56         }
57     }
58
59     /**
60      * @param attrs the attribute of the image
61      * @param path the current XML file which is parsed
62      * @param image the filename
63      * @param destDir the destination directory
64      * @return the HTML code to insert the image
65      */
66     public static String getImageByFile(Map<String, String> attrs, String path, String image, String outputDir, String destDir) {
67         File f = new File(image);
68         if (!f.isAbsolute()) {
69             f = new File(path + File.separator + image);
70         }
71
72         String destFile = outputDir + File.separator + destDir + File.separator + f.getName();
73
74         ExternalImageConverter conv = externalConverters.get(mimeMap.getContentType(f));
75         if (conv != null) {
76             destFile += ".png";
77         }
78         File imageFile = new File(destFile);
79         String imageName = destDir + "/" + imageFile.getName();
80
81         if (f.lastModified() > imageFile.lastModified()) {
82             if (conv != null) {
83                 return conv.convertToImage(f, attrs, imageFile, imageName);
84             }
85             copyImageFile(f, destDir);
86         }
87
88         return "<img src=\'" + imageName + "\'/>";
89     }
90
91
92     /**
93      * @param code the code to translate
94      * @param attrs the attribute of the image
95      * @param mime type
96      * @param imageFile the filename
97      * @return the HTML code to insert the image
98      */
99     public static String getImageByCode(String code, Map<String, String> attrs, String mime, File imageFile, String imageName) {
100         ExternalImageConverter conv = externalConverters.get(mime);
101         if (conv != null) {
102             return conv.convertToImage(code, attrs, imageFile, imageName);
103         }
104         System.err.println("Code not handled:\n" + code);
105
106         return null;
107     }
108
109     /**
110      * @param code the code to translate
111      * @param img image informations
112      * @param fileName the filename
113      * @param attrs the attribute of the image
114      * @return the HTML code to insert the image
115      */
116     public static String generateCode(Image img, String fileName, Map<String, String> attrs) {
117         String style = (String) attrs.get("style");
118         String top = "";
119         boolean display = style != null && style.equals("display");
120
121         if (!display) {
122             top = "top:" + img.descent + "px;";
123         }
124
125         String alignAttr = (String) attrs.get("align");
126         String align = "";
127         String div = "div";
128         if (alignAttr != null) {
129             align = " style=\'text-align:" + alignAttr + "\'";
130         } else if (display) {
131             align = " style=\'text-align:center\'";
132         } else {
133             div = "span";
134         }
135
136         return "<" + div + align + "><img src=\'" + fileName + "\' style=\'position:relative;" + top  + "width:" + img.width + "px;height:" + img.height + "px\'/></" + div + ">";
137     }
138
139     /**
140      * @param f the file to copy
141      * @param destDir the destination directory
142      */
143     public static void copyImageFile(File f, String destDir) {
144         FileChannel src = null;
145         FileChannel dest = null;
146         try {
147             File destFile = new File(destDir + File.separator + f.getName());
148             if (!destFile.exists()) {
149                 destFile.createNewFile();
150             } else if (f.lastModified() <= destFile.lastModified()) {
151                 return;
152             }
153
154             src = new FileInputStream(f).getChannel();
155             dest = new FileOutputStream(destFile).getChannel();
156             dest.transferFrom(src, 0, src.size());
157         } catch (IOException e) {
158             System.err.println(e);
159         }
160         finally {
161             try {
162                 if (src != null) {
163                     src.close();
164                 }
165                 if (dest != null) {
166                     dest.close();
167                 }
168             } catch (IOException e) {
169                 System.err.println(e);
170             }
171         }
172     }
173
174     /**
175      * @param icon the icon to convert into PNG
176      * @param imageFile the destination file
177      * @return true if all is ok
178      */
179     public static boolean convertIconToPNG(Icon icon, File imageFile) {
180         BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
181         Graphics2D g2d = image.createGraphics();
182         icon.paintIcon(null, g2d, 0, 0);
183
184         try {
185             ImageIO.write(image, "png", imageFile.getAbsoluteFile());
186         } catch (IOException ex) {
187             return false;
188         }
189
190         g2d.dispose();
191
192         return true;
193     }
194 }