Changeset 12594 in josm


Ignore:
Timestamp:
2017-08-12T11:24:39+02:00 (10 days ago)
Author:
bastiK
Message:

fixed #15139 - raster-image filter settings are Not Stored when saving session (color Saturation, Brightness, Sharpness)

Location:
trunk/src/org/openstreetmap/josm
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java

    r12593 r12594  
    1818import java.util.LinkedList;
    1919import java.util.Optional;
    20 import java.util.Set;
    2120
    2221import javax.swing.JOptionPane;
  • trunk/src/org/openstreetmap/josm/gui/layer/imagery/ColorfulImageProcessor.java

    r11914 r12594  
    33
    44import java.awt.image.BufferedImage;
     5import java.util.Collections;
     6import java.util.Map;
    57
    68import org.openstreetmap.josm.gui.layer.ImageProcessor;
     9import org.openstreetmap.josm.io.session.SessionAwareReadApply;
     10import org.openstreetmap.josm.tools.Utils;
    711
    812/**
     
    1216 * @since 10547
    1317 */
    14 public class ColorfulImageProcessor implements ImageProcessor {
     18public class ColorfulImageProcessor implements ImageProcessor, SessionAwareReadApply {
    1519    private ColorfulFilter op;
    16     private double colorfulness = 1;
     20    private double colorfulness = 1.0;
    1721
    1822    /**
     
    5256
    5357    @Override
     58    public void applyFromPropertiesMap(Map<String, String> properties) {
     59        String cStr = properties.get("colorfulness");
     60        if (cStr != null) {
     61            try {
     62                setColorfulness(Double.parseDouble(cStr));
     63            } catch (NumberFormatException e) {
     64                // nothing
     65            }
     66        }
     67    }
     68
     69    @Override
     70    public Map<String, String> toPropertiesMap() {
     71        if (Utils.equalsEpsilon(colorfulness, 1.0))
     72            return Collections.emptyMap();
     73        else
     74            return Collections.singletonMap("colorfulness", Double.toString(colorfulness));
     75    }
     76
     77    @Override
    5478    public String toString() {
    5579        return "ColorfulImageProcessor [colorfulness=" + colorfulness + ']';
  • trunk/src/org/openstreetmap/josm/gui/layer/imagery/GammaImageProcessor.java

    r10547 r12594  
    66import java.awt.image.LookupOp;
    77import java.awt.image.ShortLookupTable;
     8import java.util.Collections;
     9import java.util.Map;
    810
    911import org.openstreetmap.josm.Main;
    1012import org.openstreetmap.josm.gui.layer.ImageProcessor;
     13import org.openstreetmap.josm.io.session.SessionAwareReadApply;
     14import org.openstreetmap.josm.tools.Utils;
    1115
    1216/**
     
    1418 * @since 10547
    1519 */
    16 public class GammaImageProcessor implements ImageProcessor {
    17     private double gamma = 1;
     20public class GammaImageProcessor implements ImageProcessor, SessionAwareReadApply {
     21    private double gamma = 1.0;
    1822    final short[] gammaChange = new short[256];
    1923    private final LookupOp op3 = new LookupOp(
     
    4347    @Override
    4448    public BufferedImage process(BufferedImage image) {
    45         if (gamma == 1) {
     49        if (gamma == 1.0) {
    4650            return image;
    4751        }
     
    6367
    6468    @Override
     69    public void applyFromPropertiesMap(Map<String, String> properties) {
     70        String cStr = properties.get("gamma");
     71        if (cStr != null) {
     72            try {
     73                setGamma(Double.parseDouble(cStr));
     74            } catch (NumberFormatException e) {
     75                // nothing
     76            }
     77        }
     78    }
     79
     80    @Override
     81    public Map<String, String> toPropertiesMap() {
     82        if (Utils.equalsEpsilon(gamma, 1.0))
     83            return Collections.emptyMap();
     84        else
     85            return Collections.singletonMap("gamma", Double.toString(gamma));
     86    }
     87
     88    @Override
    6589    public String toString() {
    6690        return "GammaImageProcessor [gamma=" + gamma + ']';
  • trunk/src/org/openstreetmap/josm/gui/layer/imagery/SharpenImageProcessor.java

    r12537 r12594  
    55import java.awt.image.ConvolveOp;
    66import java.awt.image.Kernel;
     7import java.util.Collections;
     8import java.util.Map;
    79
    810import org.openstreetmap.josm.gui.layer.ImageProcessor;
     11import org.openstreetmap.josm.io.session.SessionAwareReadApply;
     12import org.openstreetmap.josm.tools.Utils;
    913
    1014/**
     
    1822 * @since 10547
    1923 */
    20 public class SharpenImageProcessor implements ImageProcessor {
    21     private float sharpenLevel = 1;
     24public class SharpenImageProcessor implements ImageProcessor, SessionAwareReadApply {
     25    private float sharpenLevel = 1.0f;
    2226    private ConvolveOp op;
    2327
     
    8993
    9094    @Override
     95    public void applyFromPropertiesMap(Map<String, String> properties) {
     96        String vStr = properties.get("sharpenlevel");
     97        if (vStr != null) {
     98            try {
     99                setSharpenLevel(Float.parseFloat(vStr));
     100            } catch (NumberFormatException e) {
     101                // nothing
     102            }
     103        }
     104    }
     105
     106    @Override
     107    public Map<String, String> toPropertiesMap() {
     108        if (Utils.equalsEpsilon(sharpenLevel, 1.0))
     109            return Collections.emptyMap();
     110        else
     111            return Collections.singletonMap("sharpenlevel", Float.toString(sharpenLevel));
     112    }
     113
     114    @Override
    91115    public String toString() {
    92116        return "SharpenImageProcessor [sharpenLevel=" + sharpenLevel + ']';
  • trunk/src/org/openstreetmap/josm/io/session/ImagerySessionExporter.java

    r12267 r12594  
    55import java.awt.GridBagLayout;
    66import java.io.IOException;
     7import java.util.HashMap;
    78import java.util.LinkedHashMap;
    89import java.util.Map;
     
    2021import org.openstreetmap.josm.gui.layer.WMSLayer;
    2122import org.openstreetmap.josm.gui.layer.WMTSLayer;
     23import org.openstreetmap.josm.gui.layer.imagery.ImageryFilterSettings;
    2224import org.openstreetmap.josm.io.session.SessionWriter.ExportSupport;
    2325import org.openstreetmap.josm.tools.GBC;
     26import org.openstreetmap.josm.tools.Utils;
    2427import org.w3c.dom.Element;
    2528
     
    9598            }
    9699        }
     100        ImageryFilterSettings filters = layer.getFilterSettings();
     101        if (filters != null) {
     102            Map<String, String> filterProps = new HashMap<>();
     103            filters.getProcessors().stream()
     104                    .flatMap(Utils.castToStream(SessionAwareReadApply.class))
     105                    .forEach(proc -> filterProps.putAll(proc.toPropertiesMap()));
     106            if (!filterProps.isEmpty()) {
     107                Element filterEl = support.createElement("filters");
     108                layerElem.appendChild(filterEl);
     109                addAttributes(filterEl, filterProps, support);
     110            }
     111        }
    97112        return layerElem;
    98113    }
  • trunk/src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java

    r12267 r12594  
    1818import org.openstreetmap.josm.gui.layer.WMSLayer;
    1919import org.openstreetmap.josm.gui.layer.WMTSLayer;
     20import org.openstreetmap.josm.gui.layer.imagery.ImageryFilterSettings;
    2021import org.openstreetmap.josm.gui.progress.ProgressMonitor;
    2122import org.openstreetmap.josm.io.IllegalDataException;
    2223import org.openstreetmap.josm.io.session.SessionReader.ImportSupport;
     24import org.openstreetmap.josm.tools.Utils;
    2325import org.w3c.dom.Element;
    2426import org.w3c.dom.Node;
     
    4547            AbstractTileSourceLayer<?> tsLayer = (AbstractTileSourceLayer<?>) layer;
    4648            tsLayer.getDisplaySettings().loadFrom(attributes);
    47             NodeList nodes = elem.getChildNodes();
    48             for (int i = 0; i < nodes.getLength(); ++i) {
    49                 Node node = nodes.item(i);
    50                 if (node.getNodeType() == Node.ELEMENT_NODE && "offset".equals(node.getLocalName())) {
    51                     Map<String, String> offsetAttributes = readProperties((Element) node);
    52                     OffsetBookmark offset = OffsetBookmark.fromPropertiesMap(offsetAttributes);
    53                     tsLayer.getDisplaySettings().setOffsetBookmark(offset);
    54                     break;
    55                 }
     49            Element offsetEl = getFirstElementByTagName(elem, "offset");
     50            if (offsetEl != null) {
     51                Map<String, String> offsetAttributes = readProperties(offsetEl);
     52                OffsetBookmark offset = OffsetBookmark.fromPropertiesMap(offsetAttributes);
     53                tsLayer.getDisplaySettings().setOffsetBookmark(offset);
     54            }
     55        }
     56        Element filtersEl = getFirstElementByTagName(elem, "filters");
     57        if (filtersEl != null) {
     58            ImageryFilterSettings filterSettings = layer.getFilterSettings();
     59            if (filterSettings != null) {
     60                Map<String, String> filtersProps = readProperties(filtersEl);
     61                filterSettings.getProcessors().stream()
     62                        .flatMap(Utils.castToStream(SessionAwareReadApply.class))
     63                        .forEach(proc -> proc.applyFromPropertiesMap(filtersProps));
    5664            }
    5765        }
    5866        return layer;
     67    }
     68
     69    private static Element getFirstElementByTagName(Element el, String name) {
     70        NodeList nl = el.getElementsByTagName(name);
     71        if (nl.getLength() == 0)
     72            return null;
     73        return (Element) nl.item(0);
    5974    }
    6075
  • trunk/src/org/openstreetmap/josm/tools/Utils.java

    r12238 r12594  
    5555import java.util.regex.Matcher;
    5656import java.util.regex.Pattern;
     57import java.util.stream.Stream;
    5758import java.util.zip.GZIPInputStream;
    5859import java.util.zip.ZipEntry;
     
    16901691        return null;
    16911692    }
     1693
     1694    /**
     1695     * Get a function that converts an object to a singleton stream of a certain
     1696     * class (or null if the object cannot be cast to that class).
     1697     *
     1698     * Can be useful in relation with streams, but be aware of the performance
     1699     * implications of creating a stream for each element.
     1700     * @param <T> type of the objects to convert
     1701     * @param <U> type of the elements in the resulting stream
     1702     * @param klass the class U
     1703     * @return function converting an object to a singleton stream or null
     1704     */
     1705    public static <T, U> Function<T, Stream<U>> castToStream(Class<U> klass) {
     1706        return x -> klass.isInstance(x) ? Stream.of(klass.cast(x)) : null;
     1707    }
    16921708}
Note: See TracChangeset for help on using the changeset viewer.