source: josm/trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoader.java@ 2606

Last change on this file since 2606 was 2606, checked in by bastiK, 14 years ago

geoimage: add thumbnail caching (fixes #4116, see #4101)

  • Property svn:eol-style set to native
File size: 3.3 KB
Line 
1// License: GPL. See LICENSE file for details.
2
3package org.openstreetmap.josm.gui.layer.geoimage;
4
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.MediaTracker;
8import java.awt.Graphics2D;
9import java.awt.Image;
10import java.awt.Toolkit;
11import java.awt.image.BufferedImage;
12import java.io.File;
13import java.util.ArrayList;
14import java.util.List;
15
16import org.openstreetmap.josm.io.CacheFiles;
17import org.openstreetmap.josm.Main;
18import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer.ImageEntry;
19
20public class ThumbsLoader implements Runnable {
21 volatile boolean stop = false;
22 List<ImageEntry> data;
23 MediaTracker tracker;
24 CacheFiles cache;
25 boolean cacheOff = Main.pref.getBoolean("geoimage.noThumbnailCache", false);
26
27 public ThumbsLoader(List<ImageEntry> data) {
28 this.data = new ArrayList<ImageEntry>(data);
29 if (!cacheOff) {
30 cache = new CacheFiles("geoimage-thumbnails", false);
31 cache.setExpire(CacheFiles.EXPIRE_NEVER, false);
32 cache.setMaxSize(120, false);
33 }
34 }
35
36 public void run() {
37 System.err.println("Load Thumbnails");
38 tracker = new MediaTracker(Main.map.mapView);
39 for (int i = 0; i < data.size(); i++) {
40 if (stop) return;
41 System.err.print("fetching image "+i);
42 data.get(i).thumbnail = loadThumb(data.get(i));
43 if (Main.map != null && Main.map.mapView != null) {
44 Main.map.mapView.repaint();
45 }
46 }
47 (new Thread() {
48 public void run() {
49 try {
50 Thread.sleep(200);
51 }
52 catch (InterruptedException ie) {}
53 System.gc();
54 }
55 }).start();
56
57 }
58
59 private BufferedImage loadThumb(ImageEntry entry) {
60 final int size = 16;
61 final String cacheIdent = entry.file.toString()+":"+size;
62
63 if (!cacheOff) {
64 BufferedImage cached = cache.getImg(cacheIdent);
65 if(cached != null) {
66 System.err.println(" from cache");
67 return cached;
68 }
69 }
70
71 Image img = Toolkit.getDefaultToolkit().createImage(entry.file.getPath());
72 tracker.addImage(img, 0);
73 try {
74 tracker.waitForID(0);
75 } catch (InterruptedException e) {
76 System.err.println(" InterruptedException");
77 return null;
78 }
79 BufferedImage scaledBI = new BufferedImage(16, 16, BufferedImage.TYPE_INT_RGB);
80 Graphics2D g = scaledBI.createGraphics();
81 while (!g.drawImage(img, 0, 0, 16, 16, null))
82 {
83 try {
84 Thread.sleep(10);
85 } catch(InterruptedException ie) {} //FIXME: timeout?
86 }
87 g.dispose();
88 tracker.removeImage(img);
89
90 if (!cacheOff && scaledBI != null && scaledBI.getWidth() > 0) {
91 cache.saveImg(cacheIdent, scaledBI);
92 }
93
94 System.err.println("");
95 return scaledBI;
96 }
97
98 }
Note: See TracBrowser for help on using the repository browser.