Index: reactos/win32ss/gdi/ntgdi/freetype.c =================================================================== --- reactos/win32ss/gdi/ntgdi/freetype.c (revision 75016) +++ reactos/win32ss/gdi/ntgdi/freetype.c (working copy) @@ -2452,22 +2452,44 @@ return FindFaceNameInInfo(FaceName, Info, InfoEntries) < 0; } +static BOOL FASTCALL +FontFamilyFound(PFONTFAMILYINFO InfoEntry, + PFONTFAMILYINFO Info, DWORD InfoCount) +{ + LPLOGFONTW plf1 = &InfoEntry->EnumLogFontEx.elfLogFont; + LPWSTR pFullName1 = InfoEntry->EnumLogFontEx.elfFullName; + LPWSTR pFullName2; + DWORD i; + + for (i = 0; i < InfoCount; ++i) + { + LPLOGFONTW plf2 = &Info[i].EnumLogFontEx.elfLogFont; + if (plf1->lfCharSet != plf2->lfCharSet) + continue; + + pFullName2 = Info[i].EnumLogFontEx.elfFullName; + if (_wcsicmp(pFullName1, pFullName2) != 0) + continue; + + return TRUE; + } + return FALSE; +} + static BOOLEAN FASTCALL GetFontFamilyInfoForList(LPLOGFONTW LogFont, PFONTFAMILYINFO Info, DWORD *Count, - DWORD Size, + DWORD MaxCount, PLIST_ENTRY Head) { PLIST_ENTRY Entry; PFONT_ENTRY CurrentEntry; - ANSI_STRING EntryFaceNameA; - UNICODE_STRING EntryFaceNameW; FONTGDI *FontGDI; - NTSTATUS status; + FONTFAMILYINFO InfoEntry; + ENUMLOGFONTEXW *pLog; - Entry = Head->Flink; - while (Entry != Head) + for (Entry = Head->Flink; Entry != Head; Entry = Entry->Flink) { CurrentEntry = (PFONT_ENTRY) CONTAINING_RECORD(Entry, FONT_ENTRY, ListEntry); @@ -2474,30 +2496,39 @@ FontGDI = CurrentEntry->Font; ASSERT(FontGDI); - RtlInitAnsiString(&EntryFaceNameA, FontGDI->SharedFace->Face->family_name); - status = RtlAnsiStringToUnicodeString(&EntryFaceNameW, &EntryFaceNameA, TRUE); - if (!NT_SUCCESS(status)) + if (LogFont->lfCharSet != DEFAULT_CHARSET && + LogFont->lfCharSet != FontGDI->CharSet) { - return FALSE; + continue; } - if ((LF_FACESIZE - 1) * sizeof(WCHAR) < EntryFaceNameW.Length) + if (LogFont->lfFaceName[0] == UNICODE_NULL) { - EntryFaceNameW.Length = (LF_FACESIZE - 1) * sizeof(WCHAR); - EntryFaceNameW.Buffer[LF_FACESIZE - 1] = L'\0'; + if (*Count < MaxCount) + { + FontFamilyFillInfo(&Info[*Count], NULL, NULL, FontGDI); + } + (*Count)++; + continue; } - if (FontFamilyInclude(LogFont, &EntryFaceNameW, Info, min(*Count, Size))) + FontFamilyFillInfo(&InfoEntry, NULL, NULL, FontGDI); + + pLog = &InfoEntry.EnumLogFontEx; + if (_wcsicmp(LogFont->lfFaceName, pLog->elfLogFont.lfFaceName) != 0 && + _wcsicmp(LogFont->lfFaceName, pLog->elfFullName) != 0) { - if (*Count < Size) + continue; + } + + if (!FontFamilyFound(&InfoEntry, Info, min(*Count, MaxCount))) + { + if (*Count < MaxCount) { - FontFamilyFillInfo(Info + *Count, EntryFaceNameW.Buffer, - NULL, FontGDI); + RtlCopyMemory(&Info[*Count], &InfoEntry, sizeof(InfoEntry)); } (*Count)++; } - RtlFreeUnicodeString(&EntryFaceNameW); - Entry = Entry->Flink; } return TRUE;