Ignore:
Timestamp:
2009-12-12T15:09:44+01:00 (15 years ago)
Author:
bastiK
Message:

geoimage: improved thumbnails (closes #4101)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoader.java

    r2606 r2617  
    55import static org.openstreetmap.josm.tools.I18n.tr;
    66
    7 import java.awt.MediaTracker;
    87import java.awt.Graphics2D;
    98import java.awt.Image;
     9import java.awt.MediaTracker;
     10import java.awt.Rectangle;
    1011import java.awt.Toolkit;
    1112import java.awt.image.BufferedImage;
     
    1920
    2021public class ThumbsLoader implements Runnable {
     22        public static final int maxSize = 120;
     23        public static final int minSize = 22;
    2124        volatile boolean stop = false;
    2225        List<ImageEntry> data;
     26        GeoImageLayer layer;
    2327        MediaTracker tracker;
    2428        CacheFiles cache;
    2529        boolean cacheOff = Main.pref.getBoolean("geoimage.noThumbnailCache", false);
    26        
    27         public ThumbsLoader(List<ImageEntry> data) {
    28             this.data = new ArrayList<ImageEntry>(data);
     30
     31        public ThumbsLoader(GeoImageLayer layer) {
     32            this.layer = layer;
     33            this.data = new ArrayList<ImageEntry>(layer.data);
    2934            if (!cacheOff) {
    3035                cache = new CacheFiles("geoimage-thumbnails", false);
     
    3944            for (int i = 0; i < data.size(); i++) {
    4045                if (stop) return;
     46
    4147                System.err.print("fetching image "+i);
     48
    4249                data.get(i).thumbnail = loadThumb(data.get(i));
     50
    4351                if (Main.map != null && Main.map.mapView != null) {
     52                    try {
     53                        layer.updateOffscreenBuffer = true;
     54                    } catch (Exception e) {}
    4455                    Main.map.mapView.repaint();
    4556                }
    4657            }
    47             (new Thread() {
     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
    4863                public void run() {
    4964                    try {
     
    5671
    5772        }
    58        
     73
    5974        private BufferedImage loadThumb(ImageEntry entry) {
    60             final int size = 16;
    61             final String cacheIdent = entry.file.toString()+":"+size;
    62            
     75            final String cacheIdent = entry.file.toString()+":"+maxSize;
     76
    6377            if (!cacheOff) {
    6478                BufferedImage cached = cache.getImg(cacheIdent);
    6579                if(cached != null) {
    66                     System.err.println(" from cache"); 
     80                    System.err.println(" from cache");
    6781                    return cached;
    6882                }
    6983            }
    70            
     84
    7185            Image img = Toolkit.getDefaultToolkit().createImage(entry.file.getPath());
    7286            tracker.addImage(img, 0);
     
    7791                return null;
    7892            }
    79             BufferedImage scaledBI = new BufferedImage(16, 16, BufferedImage.TYPE_INT_RGB);
     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);
    80101            Graphics2D g = scaledBI.createGraphics();
    81             while (!g.drawImage(img, 0, 0, 16, 16, null))
     102            while (!g.drawImage(img, 0, 0, targetSize.width, targetSize.height, null))
    82103            {
    83104                try {
    84105                    Thread.sleep(10);
    85                 } catch(InterruptedException ie) {} //FIXME: timeout?
     106                } catch(InterruptedException ie) {}
    86107            }
    87108            g.dispose();
    88109            tracker.removeImage(img);
    89            
    90             if (!cacheOff && scaledBI != null && scaledBI.getWidth() > 0) {
     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) {
    91117                cache.saveImg(cacheIdent, scaledBI);
    92118            }
    93            
     119
    94120            System.err.println("");
    95121            return scaledBI;
Note: See TracChangeset for help on using the changeset viewer.