From aff263f489a4407647e9492602206fad43d6532c Mon Sep 17 00:00:00 2001 From: Anton Tarasov Date: Thu, 29 Sep 2016 14:12:43 +0300 Subject: [PATCH] [macosx] Improve system menu icons quality Swing can't paint correctly our HiDPI icons at the system menu. It scales them down (from 2x to 1x) downgrading the quality. An ideal fix would be to add appropriate functionality to Swing. So far the fix is to pass Swing 1x icons. --- .../openapi/actionSystem/impl/ActionMenuItem.java | 11 +++++++++++ .../src/com/intellij/openapi/util/IconLoader.java | 13 +++++++++++++ 2 files changed, 24 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenuItem.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenuItem.java index 134fdc21ee07..d3fb034d8f16 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenuItem.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenuItem.java @@ -247,6 +247,17 @@ public class ActionMenuItem extends JBCheckBoxMenuItem { } } + @Override + public void setIcon(Icon icon) { + if (SystemInfo.isMacSystemMenu && ActionPlaces.MAIN_MENU.equals(myPlace)) { + if (icon instanceof IconLoader.LazyIcon) { + // [tav] JDK can't paint correctly our HiDPI icons at the system menu bar + icon = ((IconLoader.LazyIcon)icon).inNormalScale(false); + } + } + super.setIcon(icon); + } + public boolean isToggleable() { return myToggleable; } diff --git a/platform/util/src/com/intellij/openapi/util/IconLoader.java b/platform/util/src/com/intellij/openapi/util/IconLoader.java index 9b057c4b6e7f..7f12fd1424c9 100644 --- a/platform/util/src/com/intellij/openapi/util/IconLoader.java +++ b/platform/util/src/com/intellij/openapi/util/IconLoader.java @@ -573,6 +573,19 @@ public final class IconLoader { } protected abstract Icon compute(); + + public Icon inNormalScale(boolean isRetina) { + Icon icon = getOrComputeIcon(); + if (icon != null) { + if (icon instanceof CachedImageIcon) { + Image img = ((CachedImageIcon)icon).myScaledIconsCache.getOrigImage(isRetina); + if (img != null) { + icon = new ImageIcon(img); + } + } + } + return icon; + } } private static class LabelHolder {