From bced3cbb4dddfac8fc599f5498d7eb2aa53d0aec Mon Sep 17 00:00:00 2001 From: Anton Tarasov Date: Mon, 19 Dec 2016 20:13:47 +0300 Subject: [PATCH] IDEA-164566 [add JBUI.isHiDPI(Graphics, ScaleType)] --- .../openapi/util/DimensionService.java | 2 +- .../laf/darcula/ui/DarculaRadioButtonUI.java | 2 +- .../src/com/intellij/ide/util/TipUIUtil.java | 2 +- .../util/src/com/intellij/util/ui/JBUI.java | 35 ++++++++++++++++++- 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/util/DimensionService.java b/platform/platform-api/src/com/intellij/openapi/util/DimensionService.java index d1b5028d1e5a..a324ad5d984e 100644 --- a/platform/platform-api/src/com/intellij/openapi/util/DimensionService.java +++ b/platform/platform-api/src/com/intellij/openapi/util/DimensionService.java @@ -288,7 +288,7 @@ public class DimensionService implements PersistentStateComponent { screen = gc.getBounds(); } String realKey = key + '.' + screen.x + '.' + screen.y + '.' + screen.width + '.' + screen.height; - if (JBUI.isHiDPI()) { + if (JBUI.isHiDPI(JBUI.ScaleType.PIX)) { // [tav] todo: Consider implementing inter-transforming of window coordinates b/w the HiDPI modes // like it was done for the IdeFrame (see ScreenUtil.boundsFromDeviceSpace/boundsToDeviceSpace). // The problem with DimensionService is that it can store location and size separately in diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaRadioButtonUI.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaRadioButtonUI.java index 2523b746581c..8721199c044c 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaRadioButtonUI.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaRadioButtonUI.java @@ -117,7 +117,7 @@ public class DarculaRadioButtonUI extends MetalRadioButtonUI { } if (focus) { - if (UIUtil.isRetina() || JBUI.isHiDPI()) { + if (UIUtil.isJDKManagedHiDPIScreen(g) || JBUI.isHiDPI(g, JBUI.ScaleType.USR)) { DarculaUIUtil.paintFocusOval(g, JBUI.scale(1), JBUI.scale(1) + 1, w - JBUI.scale(2), h - JBUI.scale(2)); } else { DarculaUIUtil.paintFocusOval(g, 0, JBUI.scale(1), w, h); diff --git a/platform/platform-impl/src/com/intellij/ide/util/TipUIUtil.java b/platform/platform-impl/src/com/intellij/ide/util/TipUIUtil.java index 400ea2f52f13..031a7f364816 100644 --- a/platform/platform-impl/src/com/intellij/ide/util/TipUIUtil.java +++ b/platform/platform-impl/src/com/intellij/ide/util/TipUIUtil.java @@ -147,7 +147,7 @@ public class TipUIUtil { // } String suffix = ""; - if (JBUI.isHiDPI()) suffix += "@2x"; + if (JBUI.isHiDPI(JBUI.ScaleType.PIX)) suffix += "@2x"; if (dark) suffix += "_dark"; int index = text.indexOf(" 1.0f; + return isHiDPI(ScaleType.USR); + } + + /** + * Returns whether the scale factor associated with the graphics device assumes HiDPI-awareness. + * + * @param g the graphics of the device + * @param type the type of the scale factor + * @return whether HiDPI-awareness is assumed for the scale factor + */ + public static boolean isHiDPI(@Nullable Graphics2D g, ScaleType type) { + switch (type) { + case USR: + return scale(1f) > 1f; + case SYS: + return sysScale(g) > 1f; + case PIX: + return pixScale(g) > 1f; + default: + return false; + } + } + + /** + * Equivalent of {@link #isHiDPI(Graphics2D, ScaleType)} called for the graphics of the default screen device. + * + * @see #isHiDPI(Graphics2D, ScaleType) + */ + public static boolean isHiDPI(ScaleType type) { + return isHiDPI(null, type); } public static class Fonts {