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

Last change on this file since 6281 was 6281, checked in by Don-vip, 11 years ago

Sonar/Findbugs / Performance - Explicit garbage collection; extremely dubious

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