Changeset 17364 in josm for trunk/src/org/openstreetmap/josm/tools/ImageResource.java
- Timestamp:
- 2020-11-26T22:24:27+01:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/tools/ImageResource.java
r17144 r17364 5 5 import java.awt.Image; 6 6 import java.awt.image.BufferedImage; 7 import java.io.IOException; 8 import java.io.UncheckedIOException; 7 9 import java.util.List; 8 import java.util.Map; 9 import java.util.concurrent.ConcurrentHashMap; 10 import java.util.Locale; 11 import java.util.Objects; 12 import java.util.function.Supplier; 10 13 11 14 import javax.swing.AbstractAction; … … 15 18 import javax.swing.JPanel; 16 19 import javax.swing.UIManager; 20 21 import org.apache.commons.jcs3.access.behavior.ICacheAccess; 22 import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry; 23 import org.openstreetmap.josm.data.cache.JCSCacheManager; 17 24 18 25 import com.kitfox.svg.SVGDiagram; … … 29 36 30 37 /** 31 * Caches the image data for resized versions of the same image. The key is obtained using {@link ImageResizeMode#cacheKey(Dimension)}. 32 */ 33 private final Map<Integer, BufferedImage> imgCache = new ConcurrentHashMap<>(4); 38 * Caches the image data for resized versions of the same image. 39 * Depending on {@link JCSCacheManager#USE_IMAGE_RESOURCE_CACHE}, a combined memory/disk, or an in-memory-cache is used. 40 */ 41 private static final ICacheAccess<String, BufferedImageCacheEntry> imgCache = JCSCacheManager.getImageResourceCache(); 42 43 private final String cacheKey; 34 44 /** 35 45 * SVG diagram information in case of SVG vector image. … … 37 47 private SVGDiagram svg; 38 48 /** 49 * Supplier for SVG diagram information in case of possibly cached SVG vector image. 50 */ 51 private Supplier<SVGDiagram> svgSupplier; 52 /** 39 53 * Use this dimension to request original file dimension. 40 54 */ … … 55 69 /** 56 70 * Constructs a new {@code ImageResource} from an image. 71 * @param cacheKey the caching identifier of the image 57 72 * @param img the image 58 73 */ 59 public ImageResource( Image img) {60 CheckParameterUtil.ensureParameterNotNull(img);61 baseImage = img;74 public ImageResource(String cacheKey, Image img) { 75 this.cacheKey = Objects.requireNonNull(cacheKey); 76 this.baseImage = Objects.requireNonNull(img); 62 77 } 63 78 64 79 /** 65 80 * Constructs a new {@code ImageResource} from SVG data. 81 * @param cacheKey the caching identifier of the image 66 82 * @param svg SVG data 67 83 */ 68 public ImageResource(SVGDiagram svg) { 69 CheckParameterUtil.ensureParameterNotNull(svg); 70 this.svg = svg; 84 public ImageResource(String cacheKey, SVGDiagram svg) { 85 this.cacheKey = Objects.requireNonNull(cacheKey); 86 this.svg = Objects.requireNonNull(svg); 87 } 88 89 public ImageResource(String cacheKey, Supplier<SVGDiagram> svgSupplier) { 90 this.cacheKey = Objects.requireNonNull(cacheKey); 91 this.svgSupplier = Objects.requireNonNull(svgSupplier); 71 92 } 72 93 … … 78 99 */ 79 100 public ImageResource(ImageResource res, List<ImageOverlay> overlayInfo) { 101 this.cacheKey = res.cacheKey; 80 102 this.svg = res.svg; 103 this.svgSupplier = res.svgSupplier; 81 104 this.baseImage = res.baseImage; 82 105 this.overlayInfo = overlayInfo; … … 157 180 ImageIcon getImageIcon(Dimension dim, boolean multiResolution, ImageResizeMode resizeMode) { 158 181 return getImageIconAlreadyScaled(GuiSizesHelper.getDimensionDpiAdjusted(dim), multiResolution, false, resizeMode); 182 } 183 184 private BufferedImage getImageFromCache(String cacheKey) { 185 try { 186 BufferedImageCacheEntry image = imgCache.get(cacheKey); 187 if (image == null || image.getImage() == null) { 188 return null; 189 } 190 Logging.trace("{0} is in cache :-)", cacheKey); 191 return image.getImage(); 192 } catch (IOException e) { 193 throw new UncheckedIOException(e); 194 } 159 195 } 160 196 … … 181 217 resizeMode = ImageResizeMode.BOUNDED; 182 218 } 183 final int cacheKey = resizeMode.cacheKey(dim); 184 BufferedImage img = imgCache.get(cacheKey); 219 final String cacheKey = String.format(Locale.ROOT, "%s--%s--%d--%d", 220 this.cacheKey, resizeMode.name(), dim.width, dim.height); 221 BufferedImage img = getImageFromCache(cacheKey); 185 222 if (img == null) { 223 if (svgSupplier != null) { 224 svg = svgSupplier.get(); 225 Logging.trace("{0} is not in cache :-(", cacheKey); 226 svgSupplier = null; 227 } 186 228 if (svg != null) { 187 229 img = ImageProvider.createImageFromSvg(svg, dim, resizeMode); … … 211 253 disabledIcon.paintIcon(new JPanel(), img.getGraphics(), 0, 0); 212 254 } 213 imgCache.put(cacheKey, img); 255 if (img == null) { 256 return null; 257 } 258 BufferedImageCacheEntry cacheEntry = BufferedImageCacheEntry.pngEncoded(img); 259 Logging.trace("Storing {0} ({1} bytes) in cache...", cacheKey, cacheEntry.getContent().length); 260 imgCache.put(cacheKey, cacheEntry); 214 261 } 215 262 … … 251 298 } 252 299 300 static String statistics() { 301 return String.format("ImageResource cache: [%s]", imgCache.getStatistics()); 302 } 303 253 304 @Override 254 305 public String toString() {
Note:
See TracChangeset
for help on using the changeset viewer.