@@ -46,6 +46,7 @@ typedef HRESULT(__stdcall *PFNCLOSETHEMEDATA)(HTHEME hTheme);
46
46
typedef HRESULT (__stdcall *PFNDRAWTHEMEBACKGROUND)(HTHEME hTheme, HDC hdc,
47
47
int iPartId, int iStateId, const RECT *pRect, const RECT *pClipRect);
48
48
49
+ typedef HTHEME (__stdcall *PFNOPENTHEMEDATA)(HWND hwnd, LPCWSTR pszClassList);
49
50
typedef HTHEME (__stdcall *PFNOPENTHEMEDATAFORDPI)(HWND hwnd, LPCWSTR pszClassList, UINT dpi);
50
51
51
52
typedef HRESULT (__stdcall *PFNDRAWTHEMETEXT)(HTHEME hTheme, HDC hdc,
@@ -90,6 +91,7 @@ typedef HRESULT (__stdcall *PFNGETTHEMETRANSITIONDURATION)
90
91
(HTHEME hTheme, int iPartId, int iStateIdFrom, int iStateIdTo,
91
92
int iPropId, DWORD *pdwDuration);
92
93
94
+ static PFNOPENTHEMEDATA OpenThemeDataFunc = NULL ;
93
95
static PFNOPENTHEMEDATAFORDPI OpenThemeDataForDpiFunc = NULL ;
94
96
static PFNDRAWTHEMEBACKGROUND DrawThemeBackgroundFunc = NULL ;
95
97
static PFNCLOSETHEMEDATA CloseThemeDataFunc = NULL ;
@@ -109,13 +111,17 @@ static PFNISTHEMEBACKGROUNDPARTIALLYTRANSPARENT
109
111
IsThemeBackgroundPartiallyTransparentFunc = NULL ;
110
112
static PFNGETTHEMETRANSITIONDURATION GetThemeTransitionDurationFunc = NULL ;
111
113
114
+ constexpr unsigned int defaultDPI = 96 ;
112
115
113
- BOOL InitThemes () {
116
+
117
+ static BOOL InitThemes () {
114
118
static HMODULE hModThemes = NULL ;
115
119
hModThemes = JDK_LoadSystemLibrary (" UXTHEME.DLL" );
116
120
DTRACE_PRINTLN1 (" InitThemes hModThemes = %x\n " , hModThemes);
117
121
if (hModThemes) {
118
122
DTRACE_PRINTLN (" Loaded UxTheme.dll\n " );
123
+ OpenThemeDataFunc = (PFNOPENTHEMEDATA)GetProcAddress (hModThemes,
124
+ " OpenThemeData" );
119
125
OpenThemeDataForDpiFunc = (PFNOPENTHEMEDATAFORDPI)GetProcAddress (
120
126
hModThemes, " OpenThemeDataForDpi" );
121
127
DrawThemeBackgroundFunc = (PFNDRAWTHEMEBACKGROUND)GetProcAddress (
@@ -152,7 +158,7 @@ BOOL InitThemes() {
152
158
(PFNGETTHEMETRANSITIONDURATION)GetProcAddress (hModThemes,
153
159
" GetThemeTransitionDuration" );
154
160
155
- if (OpenThemeDataForDpiFunc
161
+ if (( OpenThemeDataForDpiFunc || OpenThemeDataFunc)
156
162
&& DrawThemeBackgroundFunc
157
163
&& CloseThemeDataFunc
158
164
&& DrawThemeTextFunc
@@ -173,10 +179,12 @@ BOOL InitThemes() {
173
179
DTRACE_PRINTLN (" Loaded function pointers.\n " );
174
180
// We need to make sure we can load the Theme.
175
181
// Use the default DPI value of 96 on windows.
176
- constexpr unsigned int defaultDPI = 96 ;
177
- HTHEME hTheme = OpenThemeDataForDpiFunc (
178
- AwtToolkit::GetInstance ().GetHWnd (),
179
- L" Button" , defaultDPI);
182
+ HTHEME hTheme = OpenThemeDataForDpiFunc
183
+ ? OpenThemeDataForDpiFunc (AwtToolkit::GetInstance ().GetHWnd (),
184
+ L" Button" , defaultDPI)
185
+ : OpenThemeDataFunc (AwtToolkit::GetInstance ().GetHWnd (),
186
+ L" Button" );
187
+
180
188
if (hTheme) {
181
189
DTRACE_PRINTLN (" Loaded Theme data.\n " );
182
190
CloseThemeDataFunc (hTheme);
@@ -246,11 +254,13 @@ JNIEXPORT jlong JNICALL Java_sun_awt_windows_ThemeReader_openTheme
246
254
JNU_ThrowOutOfMemoryError (env, 0 );
247
255
return 0 ;
248
256
}
257
+
249
258
// We need to open the Theme on a Window that will stick around.
250
259
// The best one for that purpose is the Toolkit window.
251
- HTHEME htheme = OpenThemeDataForDpiFunc (
252
- AwtToolkit::GetInstance ().GetHWnd (),
253
- str, dpi);
260
+ HTHEME htheme = OpenThemeDataForDpiFunc
261
+ ? OpenThemeDataForDpiFunc (AwtToolkit::GetInstance ().GetHWnd (), str, dpi)
262
+ : OpenThemeDataFunc (AwtToolkit::GetInstance ().GetHWnd (), str);
263
+
254
264
JNU_ReleaseStringPlatformChars (env, widget, str);
255
265
return (jlong) htheme;
256
266
}
@@ -430,9 +440,14 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_ThemeReader_paintBackground
430
440
431
441
rect.left = 0 ;
432
442
rect.top = 0 ;
433
- rect.bottom = rectBottom;
434
- rect.right = rectRight;
435
443
444
+ if (OpenThemeDataForDpiFunc) {
445
+ rect.bottom = rectBottom;
446
+ rect.right = rectRight;
447
+ } else {
448
+ rect.bottom = h;
449
+ rect.right = w;
450
+ }
436
451
ZeroMemory (pSrcBits,(BITS_PER_PIXEL>>3 )*w*h);
437
452
438
453
HRESULT hres = DrawThemeBackgroundFunc (hTheme, memDC, part, state, &rect, NULL );
@@ -455,6 +470,28 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_ThemeReader_paintBackground
455
470
ReleaseDC (NULL ,defaultDC);
456
471
}
457
472
473
+ static void rescale (SIZE *size) {
474
+ static int dpiX = -1 ;
475
+ static int dpiY = -1 ;
476
+
477
+ if (dpiX == -1 || dpiY == -1 ) {
478
+ HWND hWnd = ::GetDesktopWindow ();
479
+ HDC hDC = ::GetDC (hWnd);
480
+ dpiX = ::GetDeviceCaps (hDC, LOGPIXELSX);
481
+ dpiY = ::GetDeviceCaps (hDC, LOGPIXELSY);
482
+ ::ReleaseDC (hWnd, hDC);
483
+ }
484
+
485
+ if (dpiX !=0 && dpiX != defaultDPI) {
486
+ float invScaleX = (float ) defaultDPI / dpiX;
487
+ size->cx = (int ) round (size->cx * invScaleX);
488
+ }
489
+ if (dpiY != 0 && dpiY != defaultDPI) {
490
+ float invScaleY = (float ) defaultDPI / dpiY;
491
+ size->cy = (int ) round (size->cy * invScaleY);
492
+ }
493
+ }
494
+
458
495
jobject newInsets (JNIEnv *env, jint top, jint left, jint bottom, jint right) {
459
496
if (env->EnsureLocalCapacity (2 ) < 0 ) {
460
497
return NULL ;
@@ -746,6 +783,10 @@ JNIEXPORT jobject JNICALL Java_sun_awt_windows_ThemeReader_getPartSize
746
783
CHECK_NULL_RETURN (dimMID, NULL );
747
784
}
748
785
786
+ if (!OpenThemeDataForDpiFunc) {
787
+ rescale (&size);
788
+ }
789
+
749
790
jobject dimObj = env->NewObject (dimClassID, dimMID, size.cx , size.cy );
750
791
if (safe_ExceptionOccurred (env)) {
751
792
env->ExceptionDescribe ();
0 commit comments