Ignore:
Timestamp:
2014-05-15T03:15:28+02:00 (10 years ago)
Author:
Don-vip
Message:

fix #9984 - Add support for WMS tiles defining a transparent color in RGB space (tRNS PNG chunk for example), instead of a proper alpha channel. Surprisingly, Java does not support that out of the box, ImageIO.read always returns opaque images. Allows to switch between this mode and standard mode using WMS layer contextual entry "Use Alpha Channel", for consistency with images defining an alpha channel. Does not impact other images than WMS tiles.

Location:
trunk/src/org/openstreetmap/josm/io
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/io/CacheFiles.java

    r7082 r7132  
    1515
    1616import org.openstreetmap.josm.Main;
     17import org.openstreetmap.josm.tools.ImageProvider;
    1718
    1819/**
     
    168169                img.setLastModified(System.currentTimeMillis());
    169170            }
    170             return ImageIO.read(img);
     171            return ImageProvider.read(img, false, false);
    171172        } catch (Exception e) {
    172173            Main.warn(e);
  • trunk/src/org/openstreetmap/josm/io/imagery/Grabber.java

    r6883 r7132  
    4444                if (!layer.cache.hasExactMatch(Main.getProjection(), request.getPixelPerDegree(), b.minEast, b.minNorth)) {
    4545                    attempt(request);
     46                } else if (Main.isDebugEnabled()) {
     47                    Main.debug("Ignoring "+request+" (precache only + exact match)");
    4648                }
    47             } else {
    48                 if(!loadFromCache(request)){
    49                     attempt(request);
    50                 }
     49            } else if (!loadFromCache(request)){
     50                attempt(request);
     51            } else if (Main.isDebugEnabled()) {
     52                Main.debug("Ignoring "+request+" (loaded from cache)");
    5153            }
    5254            layer.finishRequest(request);
     
    7072                    Main.debug("InterruptedException in "+getClass().getSimpleName()+" during WMS request");
    7173                }
    72                 if(i == maxTries) {
     74                if (i == maxTries) {
    7375                    Main.error(e);
    7476                    request.finish(State.FAILED, null);
  • trunk/src/org/openstreetmap/josm/io/imagery/HTMLGrabber.java

    r7005 r7132  
    1212import java.util.StringTokenizer;
    1313
    14 import javax.imageio.ImageIO;
    15 
    1614import org.openstreetmap.josm.Main;
    1715import org.openstreetmap.josm.data.preferences.StringProperty;
    1816import org.openstreetmap.josm.gui.MapView;
    1917import org.openstreetmap.josm.gui.layer.WMSLayer;
     18import org.openstreetmap.josm.tools.ImageProvider;
    2019import org.openstreetmap.josm.tools.Utils;
    2120
     
    5150        Utils.copyStream(browser.getInputStream(), baos);
    5251        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
    53         BufferedImage img = layer.normalizeImage(ImageIO.read(bais));
     52        BufferedImage img = layer.normalizeImage(ImageProvider.read(bais, true, WMSLayer.PROP_ALPHA_CHANNEL.get()));
    5453        bais.reset();
    5554        layer.cache.saveToCache(layer.isOverlapEnabled()?img:null, bais, Main.getProjection(), request.getPixelPerDegree(), b.minEast, b.minNorth);
  • trunk/src/org/openstreetmap/josm/io/imagery/WMSGrabber.java

    r7082 r7132  
    2424import java.util.regex.Pattern;
    2525
    26 import javax.imageio.ImageIO;
    27 
    2826import org.openstreetmap.josm.Main;
    2927import org.openstreetmap.josm.data.coor.EastNorth;
     
    3533import org.openstreetmap.josm.io.OsmTransferException;
    3634import org.openstreetmap.josm.io.ProgressInputStream;
     35import org.openstreetmap.josm.tools.ImageProvider;
    3736import org.openstreetmap.josm.tools.Utils;
    38 
    3937
    4038public class WMSGrabber extends Grabber {
     
    137135    @Override
    138136    public boolean loadFromCache(WMSRequest request) {
    139         BufferedImage cached = layer.cache.getExactMatch(Main.getProjection(), request.getPixelPerDegree(), b.minEast, b.minNorth);
     137        BufferedImage cached = layer.cache.getExactMatch(
     138                Main.getProjection(), request.getPixelPerDegree(), b.minEast, b.minNorth);
    140139
    141140        if (cached != null) {
     
    143142            return true;
    144143        } else if (request.isAllowPartialCacheMatch()) {
    145             BufferedImage partialMatch = layer.cache.getPartialMatch(Main.getProjection(), request.getPixelPerDegree(), b.minEast, b.minNorth);
     144            BufferedImage partialMatch = layer.cache.getPartialMatch(
     145                    Main.getProjection(), request.getPixelPerDegree(), b.minEast, b.minNorth);
    146146            if (partialMatch != null) {
    147147                request.finish(State.PARTLY_IN_CACHE, partialMatch);
     
    179179
    180180        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
    181         BufferedImage img = layer.normalizeImage(ImageIO.read(bais));
     181        BufferedImage img = layer.normalizeImage(ImageProvider.read(bais, true, WMSLayer.PROP_ALPHA_CHANNEL.get()));
    182182        bais.reset();
    183183        layer.cache.saveToCache(layer.isOverlapEnabled()?img:null, bais, Main.getProjection(), request.getPixelPerDegree(), b.minEast, b.minNorth);
Note: See TracChangeset for help on using the changeset viewer.