提交 f8b7e9bf 编写于 作者: A alexsch

8157838: Personalized Windows Font Size is not taken into account in Java8u102

Reviewed-by: prr, serb
上级 cdf1bda9
......@@ -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, "<init>", "(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();
......
......@@ -35,14 +35,6 @@
#include <shellapi.h>
#include <shlobj.h>
#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;
......
......@@ -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() {
......
/*
* 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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册