< prev index next >

src/java.desktop/windows/native/libfontmanager/fontpath.c

Print this page

        

*** 509,526 **** /* Delete the created reference after its usage */ DeleteLocalReference(env, fileStr); } ! /* Obtain all the fontname -> filename mappings. ! * This is called once and the results returned to Java code which can ! * use it for lookups to reduce or avoid the need to search font files. ! */ ! JNIEXPORT void JNICALL ! Java_sun_awt_Win32FontManager_populateFontFileNameMap0 ! (JNIEnv *env, jclass obj, jobject fontToFileMap, ! jobject fontToFamilyMap, jobject familyToFontListMap, jobject locale) { #define MAX_BUFFER (FILENAME_MAX+1) const wchar_t wname[MAX_BUFFER]; const char data[MAX_BUFFER]; --- 509,519 ---- /* Delete the created reference after its usage */ DeleteLocalReference(env, fileStr); } ! static void populateFontFileNameFromRegistryKey(HKEY regKey, GdiFontMapInfo *fmi, jobject fontToFileMap) { #define MAX_BUFFER (FILENAME_MAX+1) const wchar_t wname[MAX_BUFFER]; const char data[MAX_BUFFER];
*** 529,539 **** HKEY hkeyFonts; DWORD dwNameSize; DWORD dwDataValueSize; DWORD nval; DWORD dwNumValues, dwMaxValueNameLen, dwMaxValueDataLen; ! DWORD numValues = 0; jclass classIDHashMap; jclass classIDString; jmethodID putMID; GdiFontMapInfo fmi; LOGFONTW lfw; --- 522,588 ---- HKEY hkeyFonts; DWORD dwNameSize; DWORD dwDataValueSize; DWORD nval; DWORD dwNumValues, dwMaxValueNameLen, dwMaxValueDataLen; ! ! /* Use the windows registry to map font names to files */ ! ret = RegOpenKeyEx(regKey, ! FONTKEY_NT, 0L, KEY_READ, &hkeyFonts); ! if (ret != ERROR_SUCCESS) { ! return; ! } ! ! ret = RegQueryInfoKeyW(hkeyFonts, NULL, NULL, NULL, NULL, NULL, NULL, ! &dwNumValues, &dwMaxValueNameLen, ! &dwMaxValueDataLen, NULL, NULL); ! ! if (ret != ERROR_SUCCESS || ! dwMaxValueNameLen >= MAX_BUFFER || ! dwMaxValueDataLen >= MAX_BUFFER) { ! RegCloseKey(hkeyFonts); ! return; ! } ! for (nval = 0; nval < dwNumValues; nval++ ) { ! dwNameSize = MAX_BUFFER; ! dwDataValueSize = MAX_BUFFER; ! ret = RegEnumValueW(hkeyFonts, nval, (LPWSTR)wname, &dwNameSize, ! NULL, &type, (LPBYTE)data, &dwDataValueSize); ! ! if (ret != ERROR_SUCCESS) { ! break; ! } ! if (type != REG_SZ) { /* REG_SZ means a null-terminated string */ ! continue; ! } ! ! if (!RegistryToBaseTTNameW((LPWSTR)wname) ) { ! /* If the filename ends with ".ttf" or ".otf" also accept it. ! * Not expecting to need to do this for .ttc files. ! * Also note this code is not mirrored in the "A" (win9x) path. ! */ ! LPWSTR dot = wcsrchr((LPWSTR)data, L'.'); ! if (dot == NULL || ((wcsicmp(dot, L".ttf") != 0) ! && (wcsicmp(dot, L".otf") != 0))) { ! continue; /* not a TT font... */ ! } ! } ! registerFontW(fmi, fontToFileMap, (LPWSTR)wname, (LPWSTR)data); ! } ! ! RegCloseKey(hkeyFonts); ! } ! ! /* Obtain all the fontname -> filename mappings. ! * This is called once and the results returned to Java code which can ! * use it for lookups to reduce or avoid the need to search font files. ! */ ! JNIEXPORT void JNICALL ! Java_sun_awt_Win32FontManager_populateFontFileNameMap0 ! (JNIEnv *env, jclass obj, jobject fontToFileMap, ! jobject fontToFamilyMap, jobject familyToFontListMap, jobject locale) ! { jclass classIDHashMap; jclass classIDString; jmethodID putMID; GdiFontMapInfo fmi; LOGFONTW lfw;
*** 605,661 **** wcscpy(lfw.lfFaceName, L""); /* one face per family (CHECK) */ EnumFontFamiliesExW(screenDC, &lfw, (FONTENUMPROCW)EnumFamilyNamesW, (LPARAM)(&fmi), 0L); ! /* Use the windows registry to map font names to files */ ! ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ! FONTKEY_NT, 0L, KEY_READ, &hkeyFonts); ! if (ret != ERROR_SUCCESS) { ! ReleaseDC(NULL, screenDC); ! screenDC = NULL; ! return; ! } ! ! ret = RegQueryInfoKeyW(hkeyFonts, NULL, NULL, NULL, NULL, NULL, NULL, ! &dwNumValues, &dwMaxValueNameLen, ! &dwMaxValueDataLen, NULL, NULL); ! ! if (ret != ERROR_SUCCESS || ! dwMaxValueNameLen >= MAX_BUFFER || ! dwMaxValueDataLen >= MAX_BUFFER) { ! RegCloseKey(hkeyFonts); ! ReleaseDC(NULL, screenDC); ! screenDC = NULL; ! return; ! } ! for (nval = 0; nval < dwNumValues; nval++ ) { ! dwNameSize = MAX_BUFFER; ! dwDataValueSize = MAX_BUFFER; ! ret = RegEnumValueW(hkeyFonts, nval, (LPWSTR)wname, &dwNameSize, ! NULL, &type, (LPBYTE)data, &dwDataValueSize); ! ! if (ret != ERROR_SUCCESS) { ! break; ! } ! if (type != REG_SZ) { /* REG_SZ means a null-terminated string */ ! continue; ! } ! ! if (!RegistryToBaseTTNameW((LPWSTR)wname) ) { ! /* If the filename ends with ".ttf" or ".otf" also accept it. ! * Not expecting to need to do this for .ttc files. ! * Also note this code is not mirrored in the "A" (win9x) path. */ ! LPWSTR dot = wcsrchr((LPWSTR)data, L'.'); ! if (dot == NULL || ((wcsicmp(dot, L".ttf") != 0) ! && (wcsicmp(dot, L".otf") != 0))) { ! continue; /* not a TT font... */ ! } ! } ! registerFontW(&fmi, fontToFileMap, (LPWSTR)wname, (LPWSTR)data); ! } - RegCloseKey(hkeyFonts); ReleaseDC(NULL, screenDC); screenDC = NULL; } --- 654,668 ---- wcscpy(lfw.lfFaceName, L""); /* one face per family (CHECK) */ EnumFontFamiliesExW(screenDC, &lfw, (FONTENUMPROCW)EnumFamilyNamesW, (LPARAM)(&fmi), 0L); ! /* Starting from Windows 10 Preview Build 17704, when a user installs non-system fonts, ! * then by default they are installed in a new per-user location as specified in a ! * per user registry entry. */ ! populateFontFileNameFromRegistryKey(HKEY_CURRENT_USER, &fmi, fontToFileMap); ! populateFontFileNameFromRegistryKey(HKEY_LOCAL_MACHINE, &fmi, fontToFileMap); ReleaseDC(NULL, screenDC); screenDC = NULL; }
< prev index next >