Don't store transform reference in CachedIcon and LazyIcon, store transform modification count instead (IDEA-CR-53109)

GitOrigin-RevId: b671242d3feada4474362411d3ae68214c9143f8
This commit is contained in:
Dmitry Jemerov
2019-10-07 13:03:29 +00:00
committed by intellij-monorepo-bot
parent f74dad81fb
commit cdd700404c
@@ -30,6 +30,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import java.util.function.Supplier;
@@ -66,6 +67,7 @@ public final class IconLoader {
};
private static final AtomicReference<IconTransform> ourTransform = new AtomicReference<>(IconTransform.getDefault());
private static final AtomicInteger ourTransformModCount = new AtomicInteger(0);
static {
installPathPatcher(new DeprecatedDuplicatesIconPathPatcher());
@@ -104,12 +106,9 @@ public final class IconLoader {
next = updater.apply(prev);
}
while (!ourTransform.compareAndSet(prev, next));
ourTransformModCount.incrementAndGet();
if (prev != next) {
for (CachedImageIcon value : ourIconsCache.values()) {
value.myTransform = next;
}
ourIcon2DisabledIcon.clear();
//clears svg cache
ImageDescriptor.clearCache();
@@ -564,7 +563,7 @@ public final class IconLoader {
@Nullable private final String myOriginalPath;
@NotNull private volatile IconUrlResolver myResolver;
@Nullable("when not overridden") private final Boolean myDarkOverridden;
@NotNull private volatile IconTransform myTransform;
private int myTransformModCount;
private final boolean myUseCacheOnLoad;
@Nullable private final Supplier<? extends RGBImageFilter> myLocalFilterSupplier;
@@ -578,22 +577,20 @@ public final class IconLoader {
this(new MyUrlResolver(url, null), null, useCacheOnLoad);
}
private CachedImageIcon(@NotNull MyUrlResolver urlResolver, @Nullable String originalPath, boolean useCacheOnLoad)
{
this(originalPath, urlResolver, null, useCacheOnLoad, ourTransform.get(), null);
private CachedImageIcon(@NotNull MyUrlResolver urlResolver, @Nullable String originalPath, boolean useCacheOnLoad) {
this(originalPath, urlResolver, null, useCacheOnLoad, null);
}
private CachedImageIcon(@Nullable String originalPath,
@NotNull IconUrlResolver resolver,
@Nullable Boolean darkOverridden,
boolean useCacheOnLoad,
@NotNull IconTransform transform,
@Nullable Supplier<? extends RGBImageFilter> localFilterSupplier) {
myOriginalPath = originalPath;
myResolver = resolver;
myDarkOverridden = darkOverridden;
myUseCacheOnLoad = useCacheOnLoad;
myTransform = transform;
myTransformModCount = ourTransformModCount.get();
myLocalFilterSupplier = localFilterSupplier;
}
@@ -622,12 +619,11 @@ public final class IconLoader {
if (isLoaderDisabled()) return EMPTY_ICON;
synchronized (myLock) {
if (!isValid()) {
myTransform = ourTransform.get();
myResolver.resolve();
myRealIcon = null;
myScaledIconsCache.clear();
if (myOriginalPath != null) {
myResolver = myResolver.patch(myOriginalPath, myTransform);
myResolver = myResolver.patch(myOriginalPath, ourTransform.get());
}
}
}
@@ -650,7 +646,7 @@ public final class IconLoader {
}
private boolean isValid() {
return myTransform == ourTransform.get() && myResolver.isResolved();
return ourTransformModCount.get() == myTransformModCount && myResolver.isResolved();
}
@Override
@@ -679,7 +675,7 @@ public final class IconLoader {
@NotNull
@Override
public Icon getDarkIcon(boolean isDark) {
return new CachedImageIcon(myOriginalPath, myResolver, isDark, myUseCacheOnLoad, myTransform, myLocalFilterSupplier);
return new CachedImageIcon(myOriginalPath, myResolver, isDark, myUseCacheOnLoad, myLocalFilterSupplier);
}
@NotNull
@@ -701,21 +697,21 @@ public final class IconLoader {
@NotNull
@Override
public CachedImageIcon copy() {
return new CachedImageIcon(myOriginalPath, myResolver, myDarkOverridden, myUseCacheOnLoad, myTransform, myLocalFilterSupplier);
return new CachedImageIcon(myOriginalPath, myResolver, myDarkOverridden, myUseCacheOnLoad, myLocalFilterSupplier);
}
@NotNull
private Icon createWithFilter(@NotNull Supplier<? extends RGBImageFilter> filterSupplier) {
return new CachedImageIcon(myOriginalPath, myResolver, myDarkOverridden, myUseCacheOnLoad, myTransform, filterSupplier);
return new CachedImageIcon(myOriginalPath, myResolver, myDarkOverridden, myUseCacheOnLoad, filterSupplier);
}
private boolean isDark() {
return myDarkOverridden == null ? myTransform.isDark() : myDarkOverridden;
return myDarkOverridden == null ? ourTransform.get().isDark() : myDarkOverridden;
}
@Nullable
private ImageFilter[] getFilters() {
ImageFilter global = myTransform.getFilter();
ImageFilter global = ourTransform.get().getFilter();
ImageFilter local = myLocalFilterSupplier != null ? myLocalFilterSupplier.get() : null;
if (global != null && local != null) {
return new ImageFilter[] {global, local};
@@ -1044,7 +1040,7 @@ public final class IconLoader {
public abstract static class LazyIcon extends ScaleContextSupport implements CopyableIcon, RetrievableIcon {
private boolean myWasComputed;
private volatile Icon myIcon;
private IconTransform myTransform = ourTransform.get();
private int myTransformModCount = ourTransformModCount.get();
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
@@ -1069,10 +1065,10 @@ public final class IconLoader {
@NotNull
final synchronized Icon getOrComputeIcon() {
IconTransform currentTransform = ourTransform.get();
Icon icon = myIcon;
if (!myWasComputed || myTransform != currentTransform || icon == null) {
myTransform = currentTransform;
int newTransformModCount = ourTransformModCount.get();
if (!myWasComputed || myTransformModCount != newTransformModCount || icon == null) {
myTransformModCount = newTransformModCount;
myWasComputed = true;
myIcon = icon = compute();
}