Ignore:
Timestamp:
2020-08-03T22:06:40+02:00 (4 years ago)
Author:
simon04
Message:

see #19622 - Extract OsmPrimitiveImageProvider

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/tools/ImageProvider.java

    r16794 r16838  
    3535import java.util.Base64;
    3636import java.util.Collection;
    37 import java.util.Collections;
    38 import java.util.Comparator;
    3937import java.util.EnumMap;
    4038import java.util.HashMap;
     
    4543import java.util.Map;
    4644import java.util.Objects;
    47 import java.util.Optional;
    4845import java.util.concurrent.CompletableFuture;
    4946import java.util.concurrent.ConcurrentHashMap;
     
    6764
    6865import org.openstreetmap.josm.data.Preferences;
    69 import org.openstreetmap.josm.data.osm.DataSet;
    7066import org.openstreetmap.josm.data.osm.OsmPrimitive;
    7167import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    72 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
    73 import org.openstreetmap.josm.gui.mappaint.Range;
    74 import org.openstreetmap.josm.gui.mappaint.StyleElementList;
    75 import org.openstreetmap.josm.gui.mappaint.styleelement.MapImage;
    76 import org.openstreetmap.josm.gui.mappaint.styleelement.NodeElement;
    77 import org.openstreetmap.josm.gui.mappaint.styleelement.StyleElement;
    78 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
    79 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
    8068import org.openstreetmap.josm.io.CachedFile;
    8169import org.openstreetmap.josm.spi.preferences.Config;
     
    15391527
    15401528    /**
    1541      * Options used in {@link #getPadded(OsmPrimitive, Dimension, Collection)}.
    1542      * @since 15889
    1543      */
    1544     public enum GetPaddedOptions {
    1545         /**
    1546          * Exclude icon indicating deprecated tag usage.
    1547          */
    1548         NO_DEPRECATED,
    1549         /**
    1550          * Exclude default icon for {@link OsmPrimitiveType} from {@link #get(OsmPrimitiveType)}
    1551          */
    1552         NO_DEFAULT,
    1553         /**
    1554          * Exclude tagging preset icons.
    1555          */
    1556         NO_PRESETS,
    1557         /**
    1558          * Exclude tagging preset icons for {@linkplain OsmPrimitiveType#WAY ways}.
    1559          */
    1560         NO_WAY_PRESETS;
    1561 
    1562         private static final Collection<GetPaddedOptions> DEFAULT = Collections.singleton(GetPaddedOptions.NO_WAY_PRESETS);
    1563     }
    1564 
    1565     /**
    15661529     * Returns an {@link ImageIcon} for the given OSM object, at the specified size.
    15671530     * This is a slow operation.
     
    15721535     */
    15731536    public static ImageIcon getPadded(OsmPrimitive primitive, Dimension iconSize) {
    1574         return getPadded(primitive, iconSize, GetPaddedOptions.DEFAULT);
    1575     }
    1576 
    1577     /**
    1578      * Returns an {@link ImageIcon} for the given OSM object, at the specified size.
    1579      * This is a slow operation.
    1580      * @param primitive Object for which an icon shall be fetched. The icon is chosen based on tags.
    1581      * @param iconSize Target size of icon. Icon is padded if required.
    1582      * @param options zero or more {@linkplain GetPaddedOptions options}.
    1583      * @return Icon for {@code primitive} that fits in cell or {@code null}.
    1584      * @since 15889
    1585      */
    1586     public static ImageIcon getPadded(OsmPrimitive primitive, Dimension iconSize, Collection<GetPaddedOptions> options) {
    15871537        if (iconSize.width <= 0 || iconSize.height <= 0) {
    15881538            return null;
    15891539        }
    1590 
    1591         // Check if the current styles have special icon for tagged objects.
    1592         if (primitive.isTagged()) {
    1593             ImageIcon icon = getTaggedPadded(primitive, iconSize, options);
    1594             if (icon != null) {
    1595                 return icon;
    1596             }
    1597         }
    1598 
    1599         // Check if the presets have icons for nodes/relations.
    1600         if (primitive.isTagged() && (!options.contains(GetPaddedOptions.NO_WAY_PRESETS) || OsmPrimitiveType.WAY != primitive.getType())) {
    1601             final Optional<ImageIcon> icon = TaggingPresets.getMatchingPresets(primitive).stream()
    1602                     .sorted(Comparator.comparing(p -> (p.iconName != null && p.iconName.contains("multipolygon"))
    1603                             || p.types == null || p.types.isEmpty() ? Integer.MAX_VALUE : p.types.size()))
    1604                     .map(TaggingPreset::getImageResource)
    1605                     .filter(Objects::nonNull)
    1606                     .map(resource -> resource.getPaddedIcon(iconSize))
    1607                     .findFirst();
    1608             if (icon.isPresent()) {
    1609                 return icon.get();
    1610             }
    1611         }
    1612 
    1613         // Use generic default icon.
    1614         return options.contains(GetPaddedOptions.NO_DEFAULT)
    1615                 ? null
    1616                 : new ImageProvider("data", primitive.getDisplayType().getAPIName()).getResource().getPaddedIcon(iconSize);
    1617     }
    1618 
    1619     /**
    1620      * Computes a new padded icon for the given tagged primitive, using map paint styles.
    1621      * This is a slow operation.
    1622      * @param primitive tagged OSM primitive
    1623      * @param iconSize icon size in pixels
    1624      * @param options zero or more {@linkplain GetPaddedOptions options}.
    1625      * @return a new padded icon for the given tagged primitive, or null
    1626      */
    1627     private static ImageIcon getTaggedPadded(OsmPrimitive primitive, Dimension iconSize, Collection<GetPaddedOptions> options) {
    1628         Pair<StyleElementList, Range> nodeStyles;
    1629         DataSet ds = primitive.getDataSet();
    1630         if (ds != null) {
    1631             ds.getReadLock().lock();
    1632         }
    1633         try {
    1634             nodeStyles = MapPaintStyles.getStyles().generateStyles(primitive, 100, false);
    1635         } finally {
    1636             if (ds != null) {
    1637                 ds.getReadLock().unlock();
    1638             }
    1639         }
    1640         for (StyleElement style : nodeStyles.a) {
    1641             if (style instanceof NodeElement) {
    1642                 NodeElement nodeStyle = (NodeElement) style;
    1643                 MapImage icon = nodeStyle.mapImage;
    1644                 if (icon != null && icon.getImageResource() != null &&
    1645                         (icon.name == null || !options.contains(GetPaddedOptions.NO_DEPRECATED) || !icon.name.contains("deprecated"))) {
    1646                     return icon.getImageResource().getPaddedIcon(iconSize);
    1647                 }
    1648             }
    1649         }
    1650         return null;
     1540        ImageResource resource = OsmPrimitiveImageProvider.getResource(primitive, OsmPrimitiveImageProvider.Options.DEFAULT);
     1541        return resource != null ? resource.getPaddedIcon(iconSize) : null;
    16511542    }
    16521543
Note: See TracChangeset for help on using the changeset viewer.