package com.cedricziel.idea.typo3.util; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ui.UIUtil; import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.image.ImageTranscoder; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class IconUtil { public static Icon createIconFromFile(VirtualFile virtualFile) throws IOException { Image image; if (virtualFile.getExtension().equalsIgnoreCase("svg")) { try { image = IconUtil.svg2png(new File(virtualFile.getPath())); } catch (TranscoderException e) { // invalid svg return null; } catch (RuntimeException e) { // unsupported svg version return null; } } else { image = ImageIO.read(virtualFile.getInputStream()); } if (image == null) { return null; } Icon icon = IconLoader.getIcon(image); if (UIUtil.isRetina()) { icon = scaleImage((ImageIcon) icon, 32, 32); } else { icon = scaleImage((ImageIcon) icon, 16, 16); } return icon; } public static ImageIcon scaleImage(ImageIcon icon, int w, int h) { int nw = icon.getIconWidth(); int nh = icon.getIconHeight(); if (icon.getIconWidth() > w) { nw = w; nh = (nw * icon.getIconHeight()) / icon.getIconWidth(); } if (nh > h) { nh = h; nw = (icon.getIconWidth() * nh) / icon.getIconHeight(); } return new ImageIcon(icon.getImage().getScaledInstance(nw, nh, Image.SCALE_DEFAULT)); } public static BufferedImage svg2png(File svgFile) throws IOException, TranscoderException { MyTranscoder transcoder = new MyTranscoder(); transcoder.transcode(new TranscoderInput(svgFile.toURL().toString()), null); return transcoder.getImage(); } private static class MyTranscoder extends ImageTranscoder { private BufferedImage image = null; public BufferedImage createImage(int w, int h) { image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); return image; } public void writeImage(BufferedImage img, TranscoderOutput out) { } public BufferedImage getImage() { return image; } } }