@@ -90,6 +90,7 @@ typedef HRESULT(__stdcall *PFNCLOSETHEMEDATA)(HTHEME hTheme);
90
90
typedef HRESULT (__stdcall *PFNDRAWTHEMEBACKGROUND)(HTHEME hTheme, HDC hdc,
91
91
int iPartId, int iStateId, const RECT *pRect, const RECT *pClipRect);
92
92
93
+ typedef HTHEME (__stdcall *PFNOPENTHEMEDATA)(HWND hwnd, LPCWSTR pszClassList);
93
94
typedef HTHEME (__stdcall *PFNOPENTHEMEDATAFORDPI)(HWND hwnd, LPCWSTR pszClassList, UINT dpi);
94
95
95
96
typedef HRESULT (__stdcall *PFNDRAWTHEMETEXT)(HTHEME hTheme, HDC hdc,
@@ -134,6 +135,7 @@ typedef HRESULT (__stdcall *PFNGETTHEMETRANSITIONDURATION)
134
135
(HTHEME hTheme, int iPartId, int iStateIdFrom, int iStateIdTo,
135
136
int iPropId, DWORD *pdwDuration);
136
137
138
+ static PFNOPENTHEMEDATA OpenThemeDataFunc = NULL ;
137
139
static PFNOPENTHEMEDATAFORDPI OpenThemeDataForDpiFunc = NULL ;
138
140
static PFNDRAWTHEMEBACKGROUND DrawThemeBackground = NULL ;
139
141
static PFNCLOSETHEMEDATA CloseThemeData = NULL ;
@@ -154,13 +156,17 @@ static PFNISTHEMEBACKGROUNDPARTIALLYTRANSPARENT
154
156
// this function might not exist on Windows XP
155
157
static PFNGETTHEMETRANSITIONDURATION GetThemeTransitionDuration = NULL ;
156
158
159
+ constexpr unsigned int defaultDPI = 96 ;
157
160
158
- BOOL InitThemes () {
161
+
162
+ static BOOL InitThemes () {
159
163
static HMODULE hModThemes = NULL ;
160
164
hModThemes = JDK_LoadSystemLibrary (" UXTHEME.DLL" );
161
165
DTRACE_PRINTLN1 (" InitThemes hModThemes = %x\n " , hModThemes);
162
166
if (hModThemes) {
163
167
DTRACE_PRINTLN (" Loaded UxTheme.dll\n " );
168
+ OpenThemeDataFunc = (PFNOPENTHEMEDATA)GetProcAddress (hModThemes,
169
+ " OpenThemeData" );
164
170
OpenThemeDataForDpiFunc = (PFNOPENTHEMEDATAFORDPI)GetProcAddress (
165
171
hModThemes, " OpenThemeDataForDpi" );
166
172
DrawThemeBackground = (PFNDRAWTHEMEBACKGROUND)GetProcAddress (
@@ -198,7 +204,7 @@ BOOL InitThemes() {
198
204
(PFNGETTHEMETRANSITIONDURATION)GetProcAddress (hModThemes,
199
205
" GetThemeTransitionDuration" );
200
206
201
- if (OpenThemeDataForDpiFunc
207
+ if (( OpenThemeDataForDpiFunc || OpenThemeDataFunc)
202
208
&& DrawThemeBackground
203
209
&& CloseThemeData
204
210
&& DrawThemeText
@@ -218,10 +224,12 @@ BOOL InitThemes() {
218
224
DTRACE_PRINTLN (" Loaded function pointers.\n " );
219
225
// We need to make sure we can load the Theme.
220
226
// Use the default DPI value of 96 on windows.
221
- constexpr unsigned int defaultDPI = 96 ;
222
- HTHEME hTheme = OpenThemeDataForDpiFunc (
223
- AwtToolkit::GetInstance ().GetHWnd (),
224
- L" Button" , defaultDPI);
227
+ HTHEME hTheme = OpenThemeDataForDpiFunc
228
+ ? OpenThemeDataForDpiFunc (AwtToolkit::GetInstance ().GetHWnd (),
229
+ L" Button" , defaultDPI)
230
+ : OpenThemeDataFunc (AwtToolkit::GetInstance ().GetHWnd (),
231
+ L" Button" );
232
+
225
233
if (hTheme) {
226
234
DTRACE_PRINTLN (" Loaded Theme data.\n " );
227
235
CloseThemeData (hTheme);
@@ -285,11 +293,13 @@ JNIEXPORT jlong JNICALL Java_sun_awt_windows_ThemeReader_openTheme
285
293
JNU_ThrowOutOfMemoryError (env, 0 );
286
294
return 0 ;
287
295
}
296
+
288
297
// We need to open the Theme on a Window that will stick around.
289
298
// The best one for that purpose is the Toolkit window.
290
- HTHEME htheme = OpenThemeDataForDpiFunc (
291
- AwtToolkit::GetInstance ().GetHWnd (),
292
- str, dpi);
299
+ HTHEME htheme = OpenThemeDataForDpiFunc
300
+ ? OpenThemeDataForDpiFunc (AwtToolkit::GetInstance ().GetHWnd (), str, dpi)
301
+ : OpenThemeDataFunc (AwtToolkit::GetInstance ().GetHWnd (), str);
302
+
293
303
JNU_ReleaseStringPlatformChars (env, widget, str);
294
304
return (jlong) htheme;
295
305
}
@@ -469,9 +479,14 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_ThemeReader_paintBackground
469
479
470
480
rect.left = 0 ;
471
481
rect.top = 0 ;
472
- rect.bottom = rectBottom;
473
- rect.right = rectRight;
474
482
483
+ if (OpenThemeDataForDpiFunc) {
484
+ rect.bottom = rectBottom;
485
+ rect.right = rectRight;
486
+ } else {
487
+ rect.bottom = h;
488
+ rect.right = w;
489
+ }
475
490
ZeroMemory (pSrcBits,(BITS_PER_PIXEL>>3 )*w*h);
476
491
477
492
HRESULT hres = DrawThemeBackground (hTheme, memDC, part, state, &rect, NULL );
@@ -494,6 +509,28 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_ThemeReader_paintBackground
494
509
ReleaseDC (NULL ,defaultDC);
495
510
}
496
511
512
+ static void rescale (SIZE *size) {
513
+ static int dpiX = -1 ;
514
+ static int dpiY = -1 ;
515
+
516
+ if (dpiX == -1 || dpiY == -1 ) {
517
+ HWND hWnd = ::GetDesktopWindow ();
518
+ HDC hDC = ::GetDC (hWnd);
519
+ dpiX = ::GetDeviceCaps (hDC, LOGPIXELSX);
520
+ dpiY = ::GetDeviceCaps (hDC, LOGPIXELSY);
521
+ ::ReleaseDC (hWnd, hDC);
522
+ }
523
+
524
+ if (dpiX !=0 && dpiX != defaultDPI) {
525
+ float invScaleX = (float ) defaultDPI / dpiX;
526
+ size->cx = (int ) round (size->cx * invScaleX);
527
+ }
528
+ if (dpiY != 0 && dpiY != defaultDPI) {
529
+ float invScaleY = (float ) defaultDPI / dpiY;
530
+ size->cy = (int ) round (size->cy * invScaleY);
531
+ }
532
+ }
533
+
497
534
jobject newInsets (JNIEnv *env, jint top, jint left, jint bottom, jint right) {
498
535
if (env->EnsureLocalCapacity (2 ) < 0 ) {
499
536
return NULL ;
@@ -785,6 +822,10 @@ JNIEXPORT jobject JNICALL Java_sun_awt_windows_ThemeReader_getPartSize
785
822
CHECK_NULL_RETURN (dimMID, NULL );
786
823
}
787
824
825
+ if (!OpenThemeDataForDpiFunc) {
826
+ rescale (&size);
827
+ }
828
+
788
829
jobject dimObj = env->NewObject (dimClassID, dimMID, size.cx , size.cy );
789
830
if (safe_ExceptionOccurred (env)) {
790
831
env->ExceptionDescribe ();
0 commit comments