Index: win32ss/gdi/ntgdi/freetype.c =================================================================== --- win32ss/gdi/ntgdi/freetype.c (revision 72980) +++ win32ss/gdi/ntgdi/freetype.c (working copy) @@ -18,6 +18,8 @@ #include FT_BITMAP_H #include FT_OUTLINE_H #include FT_WINFONTS_H +#include FT_SFNT_NAMES_H +#include FT_TRUETYPE_IDS_H #include @@ -1047,7 +1049,14 @@ NEWTEXTMETRICW *Ntm; DWORD fs0; NTSTATUS status; + SHORT UserLangID; + unsigned NameCount; + unsigned CopyCount; + int FullNameEntryIndex; + FT_SfntName NameEntry; + UserLangID = UserGetLanguageID(); + RtlZeroMemory(Info, sizeof(FONTFAMILYINFO)); Size = IntGetOutlineTextMetrics(FontGDI, 0, NULL); Otm = ExAllocatePoolWithTag(PagedPool, Size, GDITAG_TEXT); @@ -1112,9 +1121,50 @@ RtlStringCbCopyW(Info->EnumLogFontEx.elfLogFont.lfFaceName, sizeof(Info->EnumLogFontEx.elfLogFont.lfFaceName), FaceName); - RtlStringCbCopyW(Info->EnumLogFontEx.elfFullName, - sizeof(Info->EnumLogFontEx.elfFullName), - FaceName); + + IntLockFreeType; + FullNameEntryIndex = -1; + NameCount = FT_Get_Sfnt_Name_Count(FontGDI->face); + for (i = 0; i < NameCount; i++) + { + FT_Get_Sfnt_Name(FontGDI->face, i, &NameEntry); + if (NameEntry.platform_id == TT_PLATFORM_MICROSOFT && + NameEntry.encoding_id == TT_MS_ID_UNICODE_CS && + NameEntry.name_id == TT_NAME_ID_FULL_NAME) + { + if (NameEntry.language_id == UserLangID) + { + FullNameEntryIndex = i; + break; + } + else if (NameEntry.language_id == MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT)) + FullNameEntryIndex = i; + } + } + if (FullNameEntryIndex != -1) + FT_Get_Sfnt_Name(FontGDI->face, FullNameEntryIndex, &NameEntry); + IntUnLockFreeType; + + if (FullNameEntryIndex != -1) + { + CopyCount = sizeof(Info->EnumLogFontEx.elfFullName); + if (NameEntry.string_len < CopyCount) + CopyCount = NameEntry.string_len; + CopyCount /= 2; + for (i = 0; i < CopyCount; i++) + { + Info->EnumLogFontEx.elfFullName[i] = + NameEntry.string[i * 2] << 8 | + NameEntry.string[i * 2 + 1]; + } + } + else + { + RtlStringCbCopyW(Info->EnumLogFontEx.elfFullName, + sizeof(Info->EnumLogFontEx.elfFullName), + FaceName); + } + RtlInitAnsiString(&StyleA, FontGDI->face->style_name); StyleW.Buffer = Info->EnumLogFontEx.elfStyle; StyleW.MaximumLength = sizeof(Info->EnumLogFontEx.elfStyle);