Index: reactos/win32ss/gdi/ntgdi/freetype.c =================================================================== --- reactos/win32ss/gdi/ntgdi/freetype.c (revision 74981) +++ reactos/win32ss/gdi/ntgdi/freetype.c (working copy) @@ -2452,22 +2452,47 @@ return FindFaceNameInInfo(FaceName, Info, InfoEntries) < 0; } +static BOOL FASTCALL +FontFamilyFound(PFONTFAMILYINFO InfoEntry, + PFONTFAMILYINFO Info, DWORD InfoCount) +{ + UNICODE_STRING Str1, Str2; + LPLOGFONTW plf1 = &InfoEntry->EnumLogFontEx.elfLogFont; + DWORD i; + + for (i = 0; i < InfoCount; ++i) + { + LPLOGFONTW plf2 = &Info[i].EnumLogFontEx.elfLogFont; + if (plf1->lfCharSet != plf2->lfCharSet) + continue; + + RtlInitUnicodeString(&Str1, InfoEntry->EnumLogFontEx.elfFullName); + RtlInitUnicodeString(&Str2, Info[i].EnumLogFontEx.elfFullName); + if (!RtlEqualUnicodeString(&Str1, &Str2, TRUE)) + 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; + UNICODE_STRING LogFontFaceNameW, EntryFaceNameW, EntryFullNameW; + FONTFAMILYINFO InfoEntry; - Entry = Head->Flink; - while (Entry != Head) +if (LogFont->lfFaceName) +DPRINT1("Begin GetFontFamilyInfoForList for %S & CharSet %d\n", + LogFont->lfFaceName, LogFont->lfCharSet); + + for (Entry = Head->Flink; Entry != Head; Entry = Entry->Flink) { CurrentEntry = (PFONT_ENTRY) CONTAINING_RECORD(Entry, FONT_ENTRY, ListEntry); @@ -2474,30 +2499,45 @@ FontGDI = CurrentEntry->Font; ASSERT(FontGDI); - RtlInitAnsiString(&EntryFaceNameA, FontGDI->SharedFace->Face->family_name); - status = RtlAnsiStringToUnicodeString(&EntryFaceNameW, &EntryFaceNameA, TRUE); - if (!NT_SUCCESS(status)) +DPRINT1("GetFontFamilyInfoForList for %S & CharSet %d\n", + FontGDI->Filename, FontGDI->CharSet); + + 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); + + RtlInitUnicodeString(&LogFontFaceNameW, LogFont->lfFaceName); + RtlInitUnicodeString(&EntryFaceNameW, InfoEntry.EnumLogFontEx.elfLogFont.lfFaceName); + RtlInitUnicodeString(&EntryFullNameW, InfoEntry.EnumLogFontEx.elfFullName); + + if (!RtlEqualUnicodeString(&LogFontFaceNameW, &EntryFaceNameW, TRUE) && + !RtlEqualUnicodeString(&LogFontFaceNameW, &EntryFullNameW, TRUE)) { - 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;