From eb653d303e87394d0ba439bbd5707f746b3fd39f Mon Sep 17 00:00:00 2001 From: Anton Tarasov Date: Mon, 26 Sep 2016 15:08:50 +0300 Subject: [PATCH] IDEA-161665 LayeredIcon offsets are not scaled on hidpi --- .../src/com/intellij/ui/LayeredIcon.java | 24 ++++++++++++------- .../core-api/src/com/intellij/ui/RowIcon.java | 2 ++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/platform/core-api/src/com/intellij/ui/LayeredIcon.java b/platform/core-api/src/com/intellij/ui/LayeredIcon.java index dab769e65e2f..9676903aa947 100644 --- a/platform/core-api/src/com/intellij/ui/LayeredIcon.java +++ b/platform/core-api/src/com/intellij/ui/LayeredIcon.java @@ -17,6 +17,7 @@ package com.intellij.ui; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.ScalableIcon; +import com.intellij.util.ui.JBUI; import org.intellij.lang.annotations.MagicConstant; import org.jetbrains.annotations.NotNull; @@ -28,6 +29,8 @@ public class LayeredIcon extends AbstractSizeAdjustingIcon { private static final Logger LOG = Logger.getInstance("#com.intellij.ui.LayeredIcon"); private final Icon[] myIcons; private Icon[] myScaledIcons; + // Extra scale factor, not counting the global UI scale, + // thus the effective icon scale is myScale * JBUI.scale(1f) private float myScale = 1f; private final boolean[] myDisabledLayers; private final int[] myHShifts; @@ -167,8 +170,9 @@ public class LayeredIcon extends AbstractSizeAdjustingIcon { for (int i = 0; i < myIcons.length; i++) { Icon icon = getOrScale(i); if (icon == null || myDisabledLayers[i]) continue; - int xOffset = x + scale(myXShift + myHShifts[i]); - int yOffset = y + scale(myYShift + myVShifts[i]); + float uiScale = JBUI.scale(1f); // [tav] todo: take global scale from Graphics in HiDPI-aware JDK + int xOffset = x + scaledVal(myXShift + myHShifts[i], uiScale); + int yOffset = y + scaledVal(myYShift + myVShifts[i], uiScale); icon.paintIcon(c, g, xOffset, yOffset); } } @@ -207,22 +211,26 @@ public class LayeredIcon extends AbstractSizeAdjustingIcon { public int getIconWidth() { if (myWidth <= 1) { //icon is not loaded yet adjustSize(); - return scale(myWidth); + return scaledVal(myWidth); } - return scale(super.getIconWidth()); + return scaledVal(super.getIconWidth()); } @Override public int getIconHeight() { if (myHeight <= 1) { //icon is not loaded yet adjustSize(); - return scale(myHeight); + return scaledVal(myHeight); } - return scale(super.getIconHeight()); + return scaledVal(super.getIconHeight()); } - private int scale(int n) { - return myScale == 1f ? n : (int)(n * myScale); + private int scaledVal(int size) { + return scaledVal(size, 1f); + } + + private int scaledVal(int size, float uiScale) { + return (int)(myScale * uiScale * size); } @Override diff --git a/platform/core-api/src/com/intellij/ui/RowIcon.java b/platform/core-api/src/com/intellij/ui/RowIcon.java index 18fa5a5c3b0c..9a7d1776192b 100644 --- a/platform/core-api/src/com/intellij/ui/RowIcon.java +++ b/platform/core-api/src/com/intellij/ui/RowIcon.java @@ -28,6 +28,8 @@ import java.util.List; public class RowIcon extends AbstractSizeAdjustingIcon { private final Alignment myAlignment; + // Extra scale factor, not counting the global UI scale, + // thus the effective icon scale is myScale * JBUI.scale(1f) private float myScale = 1f; public enum Alignment {TOP, CENTER, BOTTOM}