diff --git a/platform/util/ui/src/com/intellij/ui/icons/ImageDescriptor.java b/platform/util/ui/src/com/intellij/ui/icons/ImageDescriptor.java index 3b224ef70a44..bcf021233684 100644 --- a/platform/util/ui/src/com/intellij/ui/icons/ImageDescriptor.java +++ b/platform/util/ui/src/com/intellij/ui/icons/ImageDescriptor.java @@ -26,6 +26,8 @@ import java.util.concurrent.ConcurrentMap; @ApiStatus.Internal public final class ImageDescriptor { private static final ConcurrentMap> ourCache = ContainerUtil.createConcurrentSoftValueMap(); + private static final ConcurrentMap ourLargeImageCache = ContainerUtil.createConcurrentWeakValueMap(); + private static final ConcurrentMap ourLargeImageDimensionMap = ContainerUtil.createConcurrentWeakMap(); final @NotNull String path; public final double scale; // initial scale factor @@ -62,6 +64,8 @@ public final class ImageDescriptor { public static void clearCache() { ourCache.clear(); + ourLargeImageCache.clear(); + ourLargeImageDimensionMap.clear(); ImageLoader.clearCache(); } @@ -94,6 +98,14 @@ public final class ImageDescriptor { origUsrSize.setSize(pair.second); return pair.first; } + Image image = ourLargeImageCache.get(cacheKey); + if (image != null) { + ImageLoader.Dimension2DDouble dimension = ourLargeImageDimensionMap.get(image); + if (dimension != null) { + origUsrSize.setSize(dimension); + return image; + } + } } long start = StartUpMeasurer.isEnabled() || loadTimeConsumer != null ? StartUpMeasurer.getCurrentTime() : -1; @@ -128,8 +140,14 @@ public final class ImageDescriptor { finally { stream.close(); } - if (image != null && cacheKey != null && 4L * image.getWidth(null) * image.getHeight(null) <= ImageLoader.CACHED_IMAGE_MAX_SIZE) { - ourCache.put(cacheKey, Pair.create(image, origUsrSize)); + if (image != null && cacheKey != null) { + if (4L * image.getWidth(null) * image.getHeight(null) <= ImageLoader.CACHED_IMAGE_MAX_SIZE) { + ourCache.put(cacheKey, Pair.create(image, origUsrSize)); + } + else { + ourLargeImageCache.put(cacheKey, image); + ourLargeImageDimensionMap.put(image, origUsrSize); + } } return image; }