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

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

geoimage: improved thumbnails (closes #4101)

  • Property svn:eol-style set to native
File size: 4.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.Graphics2D;
8import java.awt.Image;
9import java.awt.MediaTracker;
10import java.awt.Rectangle;
11import java.awt.Toolkit;
12import java.awt.image.BufferedImage;
13import java.io.File;
14import java.util.ArrayList;
15import java.util.List;
16
17import org.openstreetmap.josm.io.CacheFiles;
18import org.openstreetmap.josm.Main;
19import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer.ImageEntry;
20
21public class ThumbsLoader implements Runnable {
22 public static final int maxSize = 120;
23 public static final int minSize = 22;
24 volatile boolean stop = false;
25 List<ImageEntry> data;
26 GeoImageLayer layer;
27 MediaTracker tracker;
28 CacheFiles cache;
29 boolean cacheOff = Main.pref.getBoolean("geoimage.noThumbnailCache", false);
30
31 public ThumbsLoader(GeoImageLayer layer) {
32 this.layer = layer;
33 this.data = new ArrayList<ImageEntry>(layer.data);
34 if (!cacheOff) {
35 cache = new CacheFiles("geoimage-thumbnails", false);
36 cache.setExpire(CacheFiles.EXPIRE_NEVER, false);
37 cache.setMaxSize(120, false);
38 }
39 }
40
41 public void run() {
42 System.err.println("Load Thumbnails");
43 tracker = new MediaTracker(Main.map.mapView);
44 for (int i = 0; i < data.size(); i++) {
45 if (stop) return;
46
47 System.err.print("fetching image "+i);
48
49 data.get(i).thumbnail = loadThumb(data.get(i));
50
51 if (Main.map != null && Main.map.mapView != null) {
52 try {
53 layer.updateOffscreenBuffer = true;
54 } catch (Exception e) {}
55 Main.map.mapView.repaint();
56 }
57 }
58 try {
59 layer.updateOffscreenBuffer = true;
60 } catch (Exception e) {}
61 Main.map.mapView.repaint();
62 (new Thread() { // clean up the garbage - shouldn't hurt
63 public void run() {
64 try {
65 Thread.sleep(200);
66 }
67 catch (InterruptedException ie) {}
68 System.gc();
69 }
70 }).start();
71
72 }
73
74 private BufferedImage loadThumb(ImageEntry entry) {
75 final String cacheIdent = entry.file.toString()+":"+maxSize;
76
77 if (!cacheOff) {
78 BufferedImage cached = cache.getImg(cacheIdent);
79 if(cached != null) {
80 System.err.println(" from cache");
81 return cached;
82 }
83 }
84
85 Image img = Toolkit.getDefaultToolkit().createImage(entry.file.getPath());
86 tracker.addImage(img, 0);
87 try {
88 tracker.waitForID(0);
89 } catch (InterruptedException e) {
90 System.err.println(" InterruptedException");
91 return null;
92 }
93 if (tracker.isErrorID(1) || img.getWidth(null) <= 0 || img.getHeight(null) <= 0) {
94 System.err.println(" Invalid image");
95 return null;
96 }
97 Rectangle targetSize = ImageDisplay.calculateDrawImageRectangle(
98 new Rectangle(0, 0, img.getWidth(null), img.getHeight(null)),
99 new Rectangle(0, 0, maxSize, maxSize));
100 BufferedImage scaledBI = new BufferedImage(targetSize.width, targetSize.height, BufferedImage.TYPE_INT_RGB);
101 Graphics2D g = scaledBI.createGraphics();
102 while (!g.drawImage(img, 0, 0, targetSize.width, targetSize.height, null))
103 {
104 try {
105 Thread.sleep(10);
106 } catch(InterruptedException ie) {}
107 }
108 g.dispose();
109 tracker.removeImage(img);
110
111 if (scaledBI == null || scaledBI.getWidth() <= 0 || scaledBI.getHeight() <= 0) {
112 System.err.println(" Invalid image");
113 return null;
114 }
115
116 if (!cacheOff) {
117 cache.saveImg(cacheIdent, scaledBI);
118 }
119
120 System.err.println("");
121 return scaledBI;
122 }
123
124 }
Note: See TracBrowser for help on using the repository browser.