// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.util;
import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import org.openstreetmap.josm.Main;
/**
* Support class to handle size information of Gui elements
* This is needed, because display resolution may vary a lot and a common set
* of sizes wont work for all users alike.
* @since 10358
*/
public final class GuiSizesHelper {
private GuiSizesHelper() {
// Hide default constructor for utils classes
}
/** cache value for screen resolution */
private static float screenDPI = -1;
/**
* Request the screen resolution (cached)
* @return screen resolution in DPI
*/
private static float getScreenDPI() {
if (screenDPI == -1) {
synchronized (GuiHelper.class) {
if (screenDPI == -1) {
float scalePref = (float) Main.pref.getDouble("gui.scale", 1.0);
if (scalePref != 0) {
screenDPI = 96f * scalePref;
} else {
if (!GraphicsEnvironment.isHeadless()) {
screenDPI = Toolkit.getDefaultToolkit().getScreenResolution();
} else {
screenDPI = 96;
}
}
}
}
}
return screenDPI;
}
/**
* Returns coefficient of monitor pixel density. All hardcoded sizes must be multiplied by this value.
*
* @return float value. 1 - means standard monitor, 2 and high - "retina" display.
*/
public static float getPixelDensity() {
return getScreenDPI() / 96f;
}
/**
* Check if a high DPI resolution is used
* @return <code>true</code> for HIDPI screens
*/
public static boolean isHiDPI() {
return getPixelDensity() >= 2f;
}
/**
* Returns a resolution adapted size
* @param size Size value to adapt (base size is a low DPI screen)
* @return adapted size (may be unmodified)
*/
public static int getSizeDpiAdjusted(int size) {
if (size <= 0) return size;
return Math.round(size * getScreenDPI() / 96);
}
/**
* Returns a resolution adapted size
* @param size Size value to adapt (base size is a low DPI screen)
* @return adapted size (may be unmodified)
*/
public static float getSizeDpiAdjusted(float size) {
if (size <= 0f) return size;
return size * getScreenDPI() / 96;
}
/**
* Returns a resolution adapted size
* @param size Size value to adapt (base size is a low DPI screen)
* @return adapted size (may be unmodified)
*/
public static double getSizeDpiAdjusted(double size) {
if (size <= 0d) return size;
return size * getScreenDPI() / 96;
}
/**
* Returns a resolution adapted Dimension
* @param dim Dimension value to adapt (base size is a low DPI screen)
* @return adapted dimension (may be unmodified)
*/
public static Dimension getDimensionDpiAdjusted(Dimension dim) {
float pixelPerInch = getScreenDPI();
int width = dim.width;
int height = dim.height;
if (dim.width > 0) {
width = Math.round(dim.width * pixelPerInch / 96);
}
if (dim.height > 0) {
height = Math.round(dim.height * pixelPerInch / 96);
}
return new Dimension(width, height);
}
}