package org.freehep.util.images; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Point; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Hashtable; import javax.swing.Icon; import javax.swing.ImageIcon; public class TempImageHandler { private static Image brokenImage; private static Cursor brokenCursor; private static String[] imageExtensions = { ".gif", ".png" }; private static Hashtable imageCache = new Hashtable(); private static Hashtable cursorCache = new Hashtable(); private static Hashtable iconCache = new Hashtable(); // only static methods protected TempImageHandler() { } static { Toolkit toolkit = Toolkit.getDefaultToolkit(); byte[] brokenImageBytes = getImageBytes("BrokenImage.gif", TempImageHandler.class); if (brokenImageBytes != null) { brokenImage = toolkit.createImage(brokenImageBytes); } if (brokenImage == null) { throw new RuntimeException("Could not load BrokenIcon"); } byte[] brokenCursorBytes = getImageBytes("BrokenCursor.gif", TempImageHandler.class); if (brokenCursorBytes != null) { Image brokenCursorImage = toolkit.createImage(brokenCursorBytes); if (brokenCursorImage != null) { brokenCursor = toolkit.createCustomCursor(brokenCursorImage, new Point(0,0), "BrokenCursor"); } } if (brokenCursor == null) { throw new RuntimeException("Could not load BrokenCursor"); } } public static Image getImage(String name, Class clazz) { Image image = (Image)imageCache.get(name); if (image == null) { Toolkit toolkit = Toolkit.getDefaultToolkit(); int i = 0; while ((image == null) && (i < imageExtensions.length)) { byte[] imageBytes = getImageBytes(name+imageExtensions[i], clazz); if (imageBytes != null) { image = toolkit.createImage(imageBytes); } i++; } if (image != null) { imageCache.put(name, image); } else { image = brokenImage; } } return image; } public static Cursor getCursor(String name, Class clazz) { return getCursor(name, clazz, 0, 0); } public static Cursor getCursor(String name, Class clazz, int x, int y) { Cursor cursor = (Cursor)cursorCache.get(name); if (cursor == null) { Toolkit toolkit = Toolkit.getDefaultToolkit(); Image image = getImage(name, clazz); // Make this into an icon image, so that we don't have to deal // with image observers. ImageIcon icon = new ImageIcon(image); int iconWidth = icon.getIconWidth(); int iconHeight = icon.getIconHeight(); // Get the best size for the cursor. Dimension bestSize = toolkit.getBestCursorSize(icon.getIconWidth(), icon.getIconHeight()); int cursorWidth = bestSize.width; int cursorHeight = bestSize.height; if (cursorWidth<iconWidth || cursorHeight<iconHeight) { // One of the dimensions is smaller, so just scale the image. image = image.getScaledInstance(cursorWidth,cursorHeight, Image.SCALE_DEFAULT); } else if (iconWidth!=cursorWidth || iconHeight!=cursorHeight) { // Both dimensions are larger. Make a larger image and draw // the image into the upper, left-hand corner. BufferedImage bimage = new BufferedImage(cursorWidth,cursorHeight, BufferedImage.TYPE_INT_ARGB); // Draw into the image to create the new cursor. Graphics2D g2d = (Graphics2D) bimage.getGraphics(); Color trans = new Color(0,0,0,0); g2d.setColor(trans); g2d.fillRect(0,0,cursorWidth,cursorHeight); g2d.drawImage(icon.getImage(),0,0,null); // Set the image to the newly created one. image = bimage; } if (image == brokenImage) { cursor = brokenCursor; } else if (image != null) { cursor = toolkit.createCustomCursor(image, new Point(x, y), ""+name); if (cursor != null) cursorCache.put(name, cursor); } } return cursor; } public static Icon getIcon(String name, Class clazz) { Icon icon = (Icon)iconCache.get(name); if (icon == null) { Image image = getImage(name, clazz); if (image != null) { icon = new ImageIcon(image, name); } if ((icon != null) && (image != brokenImage)) iconCache.put(name, icon); } return icon; } /** * Read a string of byes from a file. */ private static byte[] getImageBytes(String name, Class clazz) { try { // Try first to get the data as a stream. InputStream stream = clazz.getResourceAsStream(name); if (stream == null) return null; ByteArrayOutputStream ostream = new ByteArrayOutputStream(); // Create a temporary buffer. int maxBytes = 10000; byte[] buffer = new byte[maxBytes]; // Read the full file into the ByteArrayOutputStream. int bytesRead = stream.read(buffer); while (bytesRead>0) { ostream.write(buffer,0,bytesRead); bytesRead = stream.read(buffer); } stream.close(); // Convert to a byte array and return it. return ostream.toByteArray(); } catch (IOException x) { return null; } } }