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

Last change on this file since 6084 was 6084, checked in by bastiK, 11 years ago

see #8902 - add missing @Override annotations (patch by shinigami)

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