From bb22b64f58148e7c042c2b66b7d65ed4821ed992 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Tue, 3 Dec 2019 10:03:16 +0100 Subject: [PATCH] IDEA-226566: Use caching for large images merged from https://github.com/JetBrains/intellij-community/pull/1242 GitOrigin-RevId: 1da9624577c717f6358d96b89c8c34f8ed3c37bd --- .../intellij/ui/icons/ImageDescriptor.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) 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; }