Index: reactos/win32ss/gdi/ntgdi/freetype.c =================================================================== --- reactos/win32ss/gdi/ntgdi/freetype.c (revision 74543) +++ reactos/win32ss/gdi/ntgdi/freetype.c (working copy) @@ -2038,32 +2038,37 @@ FT_UShort NameID, FT_UShort LangID) { FT_SfntName Name; - INT i, Count; + INT i, Count, BestIndex, Score, BestScore; WCHAR Buf[LF_FULLFACESIZE]; FT_Error Error; - NTSTATUS Status = STATUS_NOT_FOUND; ANSI_STRING AnsiName; RtlFreeUnicodeString(pNameW); + BestIndex = -1; + BestScore = 0; + Count = FT_Get_Sfnt_Name_Count(Face); for (i = 0; i < Count; ++i) { Error = FT_Get_Sfnt_Name(Face, i, &Name); if (Error) - continue; - - if (Name.platform_id != TT_PLATFORM_MICROSOFT || - Name.encoding_id != TT_MS_ID_UNICODE_CS) { - continue; /* not Microsoft Unicode name */ + continue; /* failure */ } - if (Name.name_id != NameID || Name.language_id != LangID) + if (Name.name_id != NameID) { continue; /* mismatched */ } + if (Name.platform_id != TT_PLATFORM_MICROSOFT || + (Name.encoding_id != TT_MS_ID_UNICODE_CS && + Name.encoding_id != TT_MS_ID_SYMBOL_CS)) + { + continue; /* not Microsoft Unicode name */ + } + if (Name.string == NULL || Name.string_len == 0 || (Name.string[0] == 0 && Name.string[1] == 0)) { @@ -2075,38 +2080,56 @@ continue; /* name too long */ } - /* NOTE: Name.string is not null-terminated */ - RtlCopyMemory(Buf, Name.string, Name.string_len); - Buf[Name.string_len / sizeof(WCHAR)] = UNICODE_NULL; - - /* Convert UTF-16 big endian to little endian */ - SwapEndian(Buf, Name.string_len); - - RtlCreateUnicodeString(pNameW, Buf); - Status = STATUS_SUCCESS; - break; - } - - if (Status == STATUS_NOT_FOUND) - { - if (LangID != gusEnglishUS) + Score = 0; + if (Name.language_id == LangID) { - /* Retry with English US */ - Status = IntGetFontLocalizedName(pNameW, Face, NameID, gusEnglishUS); + BestScore = Score; + BestIndex = i; + break; } - else if (NameID == TT_NAME_ID_FONT_SUBFAMILY) + else if (PRIMARYLANGID(Name.language_id) == PRIMARYLANGID(LangID)) { - RtlInitAnsiString(&AnsiName, Face->style_name); - Status = RtlAnsiStringToUnicodeString(pNameW, &AnsiName, TRUE); + Score += 20; } - else + else if (PRIMARYLANGID(Name.language_id) == LANG_ENGLISH) { - RtlInitAnsiString(&AnsiName, Face->family_name); - Status = RtlAnsiStringToUnicodeString(pNameW, &AnsiName, TRUE); + Score += 10; } + + if (Score > BestScore) + { + BestScore = Score; + BestIndex = i; + } } - return Status; + if (BestIndex >= 0) + { + Error = FT_Get_Sfnt_Name(Face, i, &Name); + if (!Error) + { + /* NOTE: Name.string is not null-terminated */ + RtlCopyMemory(Buf, Name.string, Name.string_len); + Buf[Name.string_len / sizeof(WCHAR)] = UNICODE_NULL; + + /* Convert UTF-16 big endian to little endian */ + SwapEndian(Buf, Name.string_len); + + RtlCreateUnicodeString(pNameW, Buf); + return STATUS_SUCCESS; + } + } + + if (NameID == TT_NAME_ID_FONT_SUBFAMILY) + { + RtlInitAnsiString(&AnsiName, Face->style_name); + return RtlAnsiStringToUnicodeString(pNameW, &AnsiName, TRUE); + } + else + { + RtlInitAnsiString(&AnsiName, Face->family_name); + return RtlAnsiStringToUnicodeString(pNameW, &AnsiName, TRUE); + } } static void FASTCALL