// License: GPL. See LICENSE file for details. package org.openstreetmap.josm.gui.layer.geoimage; import java.awt.Graphics2D; import java.awt.Image; import java.awt.MediaTracker; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.io.CacheFiles; public class ThumbsLoader implements Runnable { public static final int maxSize = 120; public static final int minSize = 22; volatile boolean stop = false; List<ImageEntry> data; GeoImageLayer layer; MediaTracker tracker; CacheFiles cache; boolean cacheOff = Main.pref.getBoolean("geoimage.noThumbnailCache", false); public ThumbsLoader(GeoImageLayer layer) { this.layer = layer; this.data = new ArrayList<ImageEntry>(layer.data); if (!cacheOff) { cache = new CacheFiles("geoimage-thumbnails", false); cache.setExpire(CacheFiles.EXPIRE_NEVER, false); cache.setMaxSize(120, false); } } public void run() { System.err.println("Load Thumbnails"); tracker = new MediaTracker(Main.map.mapView); for (int i = 0; i < data.size(); i++) { if (stop) return; System.err.print("fetching image "+i); data.get(i).thumbnail = loadThumb(data.get(i)); if (Main.map != null && Main.map.mapView != null) { layer.updateOffscreenBuffer = true; Main.map.mapView.repaint(); } } try { layer.updateOffscreenBuffer = true; } catch (Exception e) {} Main.map.mapView.repaint(); (new Thread() { // clean up the garbage - shouldn't hurt @Override public void run() { try { Thread.sleep(200); } catch (InterruptedException ie) {} System.gc(); } }).start(); } private BufferedImage loadThumb(ImageEntry entry) { final String cacheIdent = entry.getFile().toString()+":"+maxSize; if (!cacheOff) { BufferedImage cached = cache.getImg(cacheIdent); if(cached != null) { System.err.println(" from cache"); return cached; } } Image img = Toolkit.getDefaultToolkit().createImage(entry.getFile().getPath()); tracker.addImage(img, 0); try { tracker.waitForID(0); } catch (InterruptedException e) { System.err.println(" InterruptedException"); return null; } if (tracker.isErrorID(1) || img.getWidth(null) <= 0 || img.getHeight(null) <= 0) { System.err.println(" Invalid image"); return null; } Rectangle targetSize = ImageDisplay.calculateDrawImageRectangle( new Rectangle(0, 0, img.getWidth(null), img.getHeight(null)), new Rectangle(0, 0, maxSize, maxSize)); BufferedImage scaledBI = new BufferedImage(targetSize.width, targetSize.height, BufferedImage.TYPE_INT_RGB); Graphics2D g = scaledBI.createGraphics(); while (!g.drawImage(img, 0, 0, targetSize.width, targetSize.height, null)) { try { Thread.sleep(10); } catch(InterruptedException ie) {} } g.dispose(); tracker.removeImage(img); if (scaledBI.getWidth() <= 0 || scaledBI.getHeight() <= 0) { System.err.println(" Invalid image"); return null; } if (!cacheOff) { cache.saveImg(cacheIdent, scaledBI); } System.err.println(""); return scaledBI; } }