From f8b7e9bfc2c0393d6fdb974370bb1e3218a79d77 Mon Sep 17 00:00:00 2001 From: alexsch Date: Thu, 2 Jun 2016 09:36:41 +0300 Subject: [PATCH] 8157838: Personalized Windows Font Size is not taken into account in Java8u102 Reviewed-by: prr, serb --- .../native/sun/windows/ThemeReader.cpp | 26 ----- .../sun/windows/awt_DesktopProperties.cpp | 100 ++++++------------ .../sun/windows/awt_DesktopProperties.h | 4 +- .../awt/font/FontScaling/FontScalingTest.java | 58 ---------- 4 files changed, 35 insertions(+), 153 deletions(-) delete mode 100644 test/java/awt/font/FontScaling/FontScalingTest.java diff --git a/src/windows/native/sun/windows/ThemeReader.cpp b/src/windows/native/sun/windows/ThemeReader.cpp index b3d3e09ed..ef677750b 100644 --- a/src/windows/native/sun/windows/ThemeReader.cpp +++ b/src/windows/native/sun/windows/ThemeReader.cpp @@ -31,8 +31,6 @@ #include "awt_Object.h" #include "awt_Component.h" -#include "math.h" - // Important note about VC6 and VC7 (or XP Platform SDK) ! // // These type definitions have been imported from UxTheme.h @@ -70,11 +68,6 @@ typedef struct _MARGINS #define TMT_TRANSPARENT 2201 #endif // _UXTHEME_H_ -#if defined(_MSC_VER) && _MSC_VER >= 1800 -# define ROUND_TO_INT(num) ((int) round(num)) -#else -# define ROUND_TO_INT(num) ((int) floor((num) + 0.5)) -#endif #define ALPHA_MASK 0xff000000 #define RED_MASK 0xff0000 @@ -752,23 +745,6 @@ JNIEXPORT jobject JNICALL Java_sun_awt_windows_ThemeReader_getPosition return NULL; } -void rescale(SIZE *size) { - HWND hWnd = ::GetDesktopWindow(); - HDC hDC = ::GetDC(hWnd); - int dpiX = ::GetDeviceCaps(hDC, LOGPIXELSX); - int dpiY = ::GetDeviceCaps(hDC, LOGPIXELSY); - - if (dpiX !=0 && dpiX != 96) { - float invScaleX = 96.0f / dpiX; - size->cx = ROUND_TO_INT(size->cx * invScaleX); - } - if (dpiY != 0 && dpiY != 96) { - float invScaleY = 96.0f / dpiY; - size->cy = ROUND_TO_INT(size->cy * invScaleY); - } - ::ReleaseDC(hWnd, hDC); -} - /* * Class: sun_awt_windows_ThemeReader * Method: getPartSize @@ -794,8 +770,6 @@ JNIEXPORT jobject JNICALL Java_sun_awt_windows_ThemeReader_getPartSize dimMID = env->GetMethodID(dimClassID, "", "(II)V"); CHECK_NULL_RETURN(dimMID, NULL); } - - rescale(&size); jobject dimObj = env->NewObject(dimClassID, dimMID, size.cx, size.cy); if (safe_ExceptionOccurred(env)) { env->ExceptionDescribe(); diff --git a/src/windows/native/sun/windows/awt_DesktopProperties.cpp b/src/windows/native/sun/windows/awt_DesktopProperties.cpp index 497d35dc3..454a2fe74 100644 --- a/src/windows/native/sun/windows/awt_DesktopProperties.cpp +++ b/src/windows/native/sun/windows/awt_DesktopProperties.cpp @@ -35,14 +35,6 @@ #include #include -#include "math.h" - -#if defined(_MSC_VER) && _MSC_VER >= 1800 -# define ROUND_TO_INT(num) ((int) round(num)) -#else -# define ROUND_TO_INT(num) ((int) floor((num) + 0.5)) -#endif - // WDesktopProperties fields jfieldID AwtDesktopProperties::pDataID = 0; jmethodID AwtDesktopProperties::setBooleanPropertyID = 0; @@ -87,35 +79,18 @@ void AwtDesktopProperties::GetWindowsParameters() { } } -void getInvScale(float &invScaleX, float &invScaleY) { - HWND hWnd = ::GetDesktopWindow(); - HDC hDC = ::GetDC(hWnd); - int dpiX = ::GetDeviceCaps(hDC, LOGPIXELSX); - int dpiY = ::GetDeviceCaps(hDC, LOGPIXELSY); - ::ReleaseDC(hWnd, hDC); - invScaleX = (dpiX == 0.0f) ? 1.0f : 96.0f / dpiX; - invScaleY = (dpiY == 0.0f) ? 1.0f : 96.0f / dpiY; -} - -int rescale(int value, float invScale){ - return invScale == 1.0f ? value : ROUND_TO_INT(value * invScale); -} - void AwtDesktopProperties::GetSystemProperties() { HDC dc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); if (dc != NULL) { try { - float invScaleX; - float invScaleY; - getInvScale(invScaleX, invScaleY); - SetFontProperty(dc, ANSI_FIXED_FONT, TEXT("win.ansiFixed.font"), 1.0f); - SetFontProperty(dc, ANSI_VAR_FONT, TEXT("win.ansiVar.font"), 1.0f); - SetFontProperty(dc, DEVICE_DEFAULT_FONT, TEXT("win.deviceDefault.font"), 1.0f); - SetFontProperty(dc, DEFAULT_GUI_FONT, TEXT("win.defaultGUI.font"), invScaleY); - SetFontProperty(dc, OEM_FIXED_FONT, TEXT("win.oemFixed.font"), 1.0f); - SetFontProperty(dc, SYSTEM_FONT, TEXT("win.system.font"), 1.0f); - SetFontProperty(dc, SYSTEM_FIXED_FONT, TEXT("win.systemFixed.font"), 1.0f); + SetFontProperty(dc, ANSI_FIXED_FONT, TEXT("win.ansiFixed.font")); + SetFontProperty(dc, ANSI_VAR_FONT, TEXT("win.ansiVar.font")); + SetFontProperty(dc, DEVICE_DEFAULT_FONT, TEXT("win.deviceDefault.font")); + SetFontProperty(dc, DEFAULT_GUI_FONT, TEXT("win.defaultGUI.font")); + SetFontProperty(dc, OEM_FIXED_FONT, TEXT("win.oemFixed.font")); + SetFontProperty(dc, SYSTEM_FONT, TEXT("win.system.font")); + SetFontProperty(dc, SYSTEM_FIXED_FONT, TEXT("win.systemFixed.font")); } catch (std::bad_alloc&) { DeleteDC(dc); @@ -291,35 +266,31 @@ void AwtDesktopProperties::GetNonClientParameters() { } VERIFY( SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncmetrics.cbSize, &ncmetrics, FALSE) ); - float invScaleX; - float invScaleY; - getInvScale(invScaleX, invScaleY); - - SetFontProperty(TEXT("win.frame.captionFont"), ncmetrics.lfCaptionFont, invScaleY); - SetIntegerProperty(TEXT("win.frame.captionHeight"), rescale(ncmetrics.iCaptionHeight, invScaleY)); - SetIntegerProperty(TEXT("win.frame.captionButtonWidth"), rescale(ncmetrics.iCaptionWidth, invScaleX)); - SetIntegerProperty(TEXT("win.frame.captionButtonHeight"), rescale(ncmetrics.iCaptionHeight, invScaleY)); - SetFontProperty(TEXT("win.frame.smallCaptionFont"), ncmetrics.lfSmCaptionFont, invScaleY); - SetIntegerProperty(TEXT("win.frame.smallCaptionHeight"), rescale(ncmetrics.iSmCaptionHeight, invScaleY)); - SetIntegerProperty(TEXT("win.frame.smallCaptionButtonWidth"), rescale(ncmetrics.iSmCaptionWidth, invScaleX)); - SetIntegerProperty(TEXT("win.frame.smallCaptionButtonHeight"), rescale(ncmetrics.iSmCaptionHeight, invScaleY)); - SetIntegerProperty(TEXT("win.frame.sizingBorderWidth"), rescale(ncmetrics.iBorderWidth, invScaleX)); + SetFontProperty( TEXT("win.frame.captionFont"), ncmetrics.lfCaptionFont ); + SetIntegerProperty( TEXT("win.frame.captionHeight"), ncmetrics.iCaptionHeight ); + SetIntegerProperty( TEXT("win.frame.captionButtonWidth"), ncmetrics.iCaptionWidth ); + SetIntegerProperty( TEXT("win.frame.captionButtonHeight"), ncmetrics.iCaptionHeight ); + SetFontProperty( TEXT("win.frame.smallCaptionFont"), ncmetrics.lfSmCaptionFont ); + SetIntegerProperty( TEXT("win.frame.smallCaptionHeight"), ncmetrics.iSmCaptionHeight ); + SetIntegerProperty( TEXT("win.frame.smallCaptionButtonWidth"), ncmetrics.iSmCaptionWidth ); + SetIntegerProperty( TEXT("win.frame.smallCaptionButtonHeight"), ncmetrics.iSmCaptionHeight ); + SetIntegerProperty( TEXT("win.frame.sizingBorderWidth"), ncmetrics.iBorderWidth ); // menu properties - SetFontProperty(TEXT("win.menu.font"), ncmetrics.lfMenuFont, invScaleY); - SetIntegerProperty(TEXT("win.menu.height"), rescale(ncmetrics.iMenuHeight, invScaleY)); - SetIntegerProperty(TEXT("win.menu.buttonWidth"), rescale(ncmetrics.iMenuWidth, invScaleX)); + SetFontProperty( TEXT("win.menu.font"), ncmetrics.lfMenuFont ); + SetIntegerProperty( TEXT("win.menu.height"), ncmetrics.iMenuHeight ); + SetIntegerProperty( TEXT("win.menu.buttonWidth"), ncmetrics.iMenuWidth ); // scrollbar properties - SetIntegerProperty(TEXT("win.scrollbar.width"), rescale(ncmetrics.iScrollWidth, invScaleX)); - SetIntegerProperty(TEXT("win.scrollbar.height"), rescale(ncmetrics.iScrollHeight, invScaleY)); + SetIntegerProperty( TEXT("win.scrollbar.width"), ncmetrics.iScrollWidth ); + SetIntegerProperty( TEXT("win.scrollbar.height"), ncmetrics.iScrollHeight ); // status bar and tooltip properties - SetFontProperty(TEXT("win.status.font"), ncmetrics.lfStatusFont, invScaleY); - SetFontProperty(TEXT("win.tooltip.font"), ncmetrics.lfStatusFont, invScaleY); + SetFontProperty( TEXT("win.status.font"), ncmetrics.lfStatusFont ); + SetFontProperty( TEXT("win.tooltip.font"), ncmetrics.lfStatusFont ); // message box properties - SetFontProperty(TEXT("win.messagebox.font"), ncmetrics.lfMessageFont, invScaleY); + SetFontProperty( TEXT("win.messagebox.font"), ncmetrics.lfMessageFont ); } void AwtDesktopProperties::GetIconParameters() { @@ -331,13 +302,10 @@ void AwtDesktopProperties::GetIconParameters() { iconmetrics.cbSize = sizeof(iconmetrics); VERIFY( SystemParametersInfo(SPI_GETICONMETRICS, iconmetrics.cbSize, &iconmetrics, FALSE) ); - float invScaleX; - float invScaleY; - getInvScale(invScaleX, invScaleY); - SetIntegerProperty(TEXT("win.icon.hspacing"), rescale(iconmetrics.iHorzSpacing, invScaleX)); - SetIntegerProperty(TEXT("win.icon.vspacing"), rescale(iconmetrics.iVertSpacing, invScaleY)); + SetIntegerProperty(TEXT("win.icon.hspacing"), iconmetrics.iHorzSpacing); + SetIntegerProperty(TEXT("win.icon.vspacing"), iconmetrics.iVertSpacing); SetBooleanProperty(TEXT("win.icon.titleWrappingOn"), iconmetrics.iTitleWrap != 0); - SetFontProperty(TEXT("win.icon.font"), iconmetrics.lfFont, invScaleY); + SetFontProperty(TEXT("win.icon.font"), iconmetrics.lfFont); } /* Windows settings for these are also in the registry @@ -750,7 +718,6 @@ void AwtDesktopProperties::SetStringProperty(LPCTSTR propName, LPTSTR value) { } void AwtDesktopProperties::SetIntegerProperty(LPCTSTR propName, int value) { - jstring key = JNU_NewStringPlatform(GetEnv(), propName); if (key == NULL) { throw std::bad_alloc(); @@ -785,8 +752,8 @@ void AwtDesktopProperties::SetColorProperty(LPCTSTR propName, DWORD value) { } void AwtDesktopProperties::SetFontProperty(HDC dc, int fontID, - LPCTSTR propName, float invScale) { - HGDIOBJ font = GetStockObject(fontID); + LPCTSTR propName) { + HGDIOBJ font = GetStockObject(fontID); if (font != NULL && SelectObject(dc, font) != NULL) { int length = GetTextFace(dc, 0, NULL); @@ -822,8 +789,8 @@ void AwtDesktopProperties::SetFontProperty(HDC dc, int fontID, throw std::bad_alloc(); } - jint pointSize = rescale(metrics.tmHeight - - metrics.tmInternalLeading, invScale); + jint pointSize = metrics.tmHeight - + metrics.tmInternalLeading; jint style = java_awt_Font_PLAIN; if (metrics.tmWeight >= FW_BOLD) { @@ -851,8 +818,7 @@ void AwtDesktopProperties::SetFontProperty(HDC dc, int fontID, } } -void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & font, - float invScale) { +void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & font) { jstring fontName; jint pointSize; jint style; @@ -870,7 +836,7 @@ void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & fon ReleaseDC(NULL, hdc); #endif // Java uses point sizes, but assumes 1 pixel = 1 point - pointSize = rescale(-font.lfHeight, invScale); + pointSize = -font.lfHeight; // convert Windows font style to Java style style = java_awt_Font_PLAIN; diff --git a/src/windows/native/sun/windows/awt_DesktopProperties.h b/src/windows/native/sun/windows/awt_DesktopProperties.h index 70f0bf895..e93530ef2 100644 --- a/src/windows/native/sun/windows/awt_DesktopProperties.h +++ b/src/windows/native/sun/windows/awt_DesktopProperties.h @@ -73,8 +73,8 @@ class AwtDesktopProperties { void SetIntegerProperty(LPCTSTR, int); void SetStringProperty(LPCTSTR, LPTSTR); void SetColorProperty(LPCTSTR, DWORD); - void SetFontProperty(HDC, int, LPCTSTR, float invScale); - void SetFontProperty(LPCTSTR, const LOGFONT &, float invScale); + void SetFontProperty(HDC, int, LPCTSTR); + void SetFontProperty(LPCTSTR, const LOGFONT &); void SetSoundProperty(LPCTSTR, LPCTSTR); JNIEnv * GetEnv() { diff --git a/test/java/awt/font/FontScaling/FontScalingTest.java b/test/java/awt/font/FontScaling/FontScalingTest.java deleted file mode 100644 index 4c100ac8c..000000000 --- a/test/java/awt/font/FontScaling/FontScalingTest.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -import javax.swing.JButton; -import javax.swing.SwingUtilities; -import javax.swing.UIManager; -import javax.swing.plaf.metal.MetalLookAndFeel; - -/* - * @test - * @bug 8076545 - * @summary Text size is twice bigger under Windows L&F on Win 8.1 with - * HiDPI display - */ -public class FontScalingTest { - - public static void main(String[] args) throws Exception { - int metalFontSize = getFontSize(MetalLookAndFeel.class.getName()); - int systemFontSize = getFontSize(UIManager.getSystemLookAndFeelClassName()); - - if (Math.abs(systemFontSize - metalFontSize) > 8) { - throw new RuntimeException("System L&F is too big!"); - } - } - - private static int getFontSize(String laf) throws Exception { - - UIManager.setLookAndFeel(laf); - final int[] sizes = new int[1]; - - SwingUtilities.invokeAndWait(() -> { - JButton button = new JButton("Test"); - sizes[0] = button.getFont().getSize(); - }); - - return sizes[0]; - } -} \ No newline at end of file -- GitLab