1 package prefuse.render; 2 3 import java.awt.Component ; 4 import java.awt.Image ; 5 import java.awt.MediaTracker ; 6 import java.awt.Toolkit ; 7 import java.net.URL ; 8 import java.util.HashMap ; 9 import java.util.Iterator ; 10 import java.util.LinkedHashMap ; 11 import java.util.Map ; 12 13 import prefuse.data.Tuple; 14 import prefuse.util.io.IOLib; 15 16 17 30 public class ImageFactory { 31 32 protected int m_imageCacheSize = 3000; 33 protected int m_maxImageWidth = 100; 34 protected int m_maxImageHeight = 100; 35 protected boolean m_asynch = true; 36 37 protected Map imageCache = 39 new LinkedHashMap ((int) (m_imageCacheSize + 1 / .75F), .75F, true) { 40 public boolean removeEldestEntry(Map.Entry eldest) { 41 return size() > m_imageCacheSize; 42 } 43 }; 44 protected Map loadMap = new HashMap (50); 45 46 protected final Component component = new Component () {}; 47 protected final MediaTracker tracker = new MediaTracker (component); 48 protected int nextTrackerID = 0; 49 50 53 public ImageFactory() { 54 this(-1,-1); 55 } 56 57 65 public ImageFactory(int maxImageWidth, int maxImageHeight) { 66 setMaxImageDimensions(maxImageWidth, maxImageHeight); 67 } 68 69 75 public void setMaxImageDimensions(int width, int height) { 76 m_maxImageWidth = width; 77 m_maxImageHeight = height; 78 } 79 80 84 public void setImageCacheSize(int size) { 85 m_imageCacheSize = size; 86 } 87 88 95 public boolean isInCache(String imageLocation) { 96 return imageCache.containsKey(imageLocation); 97 } 98 99 112 public Image getImage(String imageLocation) { 113 Image image = (Image ) imageCache.get(imageLocation); 114 if (image == null && !loadMap.containsKey(imageLocation)) { 115 URL imageURL = IOLib.urlFromString(imageLocation); 116 if ( imageURL == null ) { 117 System.err.println("Null image: " + imageLocation); 118 return null; 119 } 120 image = Toolkit.getDefaultToolkit().createImage(imageURL); 121 122 if ( !m_asynch ) { 124 waitForImage(image); 125 addImage(imageLocation, image); 126 } else { 127 int id = ++nextTrackerID; 128 tracker.addImage(image, id); 129 loadMap.put(imageLocation, new LoadMapEntry(id,image)); 130 } 131 } else if ( image == null && loadMap.containsKey(imageLocation) ) { 132 LoadMapEntry entry = (LoadMapEntry)loadMap.get(imageLocation); 133 if ( tracker.checkID(entry.id, true) ) { 134 addImage(imageLocation, entry.image); 135 loadMap.remove(imageLocation); 136 tracker.removeImage(entry.image, entry.id); 137 } 138 } else { 139 return image; 140 } 141 return (Image ) imageCache.get(imageLocation); 142 } 143 144 153 public Image addImage(String location, Image image) { 154 if ( m_maxImageWidth > -1 || m_maxImageHeight > -1 ) { 155 image = getScaledImage(image); 156 image.getWidth(null); } 158 imageCache.put(location, image); 159 return image; 160 } 161 162 166 protected void waitForImage(Image image) { 167 int id = ++nextTrackerID; 168 tracker.addImage(image, id); 169 try { 170 tracker.waitForID(id, 0); 171 } catch (InterruptedException e) { 172 e.printStackTrace(); 173 } 174 tracker.removeImage(image, id); 175 } 176 177 182 protected Image getScaledImage(Image img) { 183 int w = img.getWidth(null) - m_maxImageWidth; 186 int h = img.getHeight(null) - m_maxImageHeight; 187 188 if ( w > h && w > 0 && m_maxImageWidth > -1 ) { 189 Image scaled = img.getScaledInstance(m_maxImageWidth, -1, Image.SCALE_SMOOTH); 190 img.flush(); return scaled; 192 } else if ( h > 0 && m_maxImageHeight > -1 ) { 193 Image scaled = img.getScaledInstance(-1, m_maxImageHeight, Image.SCALE_SMOOTH); 194 img.flush(); return scaled; 196 } else { 197 return img; 198 } 199 } 200 201 214 public void preloadImages(Iterator iter, String field) { 215 boolean synch = m_asynch; 216 m_asynch = false; 217 218 String loc = null; 219 while ( iter.hasNext() && imageCache.size() <= m_imageCacheSize ) { 220 Tuple t = (Tuple)iter.next(); 222 loc = t.getString(field); 223 if ( loc != null ) { 224 getImage(loc); 225 } 226 } 227 m_asynch = synch; 228 } 229 230 233 private class LoadMapEntry { 234 public int id; 235 public Image image; 236 public LoadMapEntry(int id, Image image) { 237 this.id = id; 238 this.image = image; 239 } 240 } 241 242 } | Popular Tags |