Mercurial > hg > release > icedtea7-forest-2.4 > jdk
changeset 7297:c26df3aa662c
7131153: GetDC called way too many times - causes bad performance.
Reviewed-by: prr
author | bae |
---|---|
date | Fri, 24 Jan 2014 22:40:21 +0400 |
parents | 3b44abd19845 |
children | 795654fce29c |
files | src/windows/native/sun/font/fontpath.c |
diffstat | 1 files changed, 21 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/windows/native/sun/font/fontpath.c Mon Jan 27 13:42:59 2014 +0000 +++ b/src/windows/native/sun/font/fontpath.c Fri Jan 24 22:40:21 2014 +0400 @@ -185,6 +185,12 @@ return 0; } +/* This HDC is initialised and released in the populate family map + * JNI entry point, and used within the call which would otherwise + * create many DCs. + */ +static HDC screenDC = NULL; + static int DifferentFamily(wchar_t *family, wchar_t* fullName) { LOGFONTW lfw; CheckFamilyInfo info; @@ -202,7 +208,7 @@ memset(&lfw, 0, sizeof(lfw)); wcscpy(lfw.lfFaceName, fullName); lfw.lfCharSet = DEFAULT_CHARSET; - EnumFontFamiliesExW(GetDC(NULL), &lfw, + EnumFontFamiliesExW(screenDC, &lfw, (FONTENUMPROCW)CheckFontFamilyProcW, (LPARAM)(&info), 0L); @@ -299,7 +305,7 @@ memset(&lfa, 0, sizeof(lfa)); strcpy(lfa.lfFaceName, lpelfe->elfLogFont.lfFaceName); lfa.lfCharSet = lpelfe->elfLogFont.lfCharSet; - EnumFontFamiliesExA(GetDC(NULL), &lfa, + EnumFontFamiliesExA(screenDC, &lfa, (FONTENUMPROCA)EnumFontFacesInFamilyProcA, lParam, 0L); return 1; @@ -353,7 +359,7 @@ memset(&lfw, 0, sizeof(lfw)); wcscpy(lfw.lfFaceName, lpelfe->elfLogFont.lfFaceName); lfw.lfCharSet = lpelfe->elfLogFont.lfCharSet; - EnumFontFamiliesExW(GetDC(NULL), &lfw, + EnumFontFamiliesExW(screenDC, &lfw, (FONTENUMPROCW)EnumFontFacesInFamilyProcW, lParam, 0L); return 1; @@ -613,13 +619,17 @@ return; } + screenDC = GetDC(NULL); + if (screenDC == NULL) { + return; + } /* Enumerate fonts via GDI to build maps of fonts and families */ if (IS_NT) { LOGFONTW lfw; memset(&lfw, 0, sizeof(lfw)); lfw.lfCharSet = DEFAULT_CHARSET; /* all charsets */ wcscpy(lfw.lfFaceName, L""); /* one face per family (CHECK) */ - EnumFontFamiliesExW(GetDC(NULL), &lfw, + EnumFontFamiliesExW(screenDC, &lfw, (FONTENUMPROCW)EnumFamilyNamesW, (LPARAM)(&fmi), 0L); } else { @@ -627,7 +637,7 @@ memset(&lfa, 0, sizeof(lfa)); lfa.lfCharSet = DEFAULT_CHARSET; /* all charsets */ strcpy(lfa.lfFaceName, ""); /* one face per family */ - ret = EnumFontFamiliesExA(GetDC(NULL), &lfa, + ret = EnumFontFamiliesExA(screenDC, &lfa, (FONTENUMPROCA)EnumFamilyNamesA, (LPARAM)(&fmi), 0L); } @@ -637,6 +647,8 @@ ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, fontKeyName, 0L, KEY_READ, &hkeyFonts); if (ret != ERROR_SUCCESS) { + ReleaseDC(NULL, screenDC); + screenDC = NULL; return; } @@ -653,6 +665,8 @@ dwMaxValueNameLen >= MAX_BUFFER || dwMaxValueDataLen >= MAX_BUFFER) { RegCloseKey(hkeyFonts); + ReleaseDC(NULL, screenDC); + screenDC = NULL; return; } for (nval = 0; nval < dwNumValues; nval++ ) { @@ -692,4 +706,6 @@ } } RegCloseKey(hkeyFonts); + ReleaseDC(NULL, screenDC); + screenDC = NULL; }