Index: reactos/win32ss/gdi/ntgdi/freetype.c =================================================================== --- reactos/win32ss/gdi/ntgdi/freetype.c (revision 74405) +++ reactos/win32ss/gdi/ntgdi/freetype.c (working copy) @@ -1738,6 +1738,10 @@ FillTMEx(TM, FontGDI, pOS2, pHori, pFNT, FALSE); } +static NTSTATUS +IntGetFontLocalizedName(PUNICODE_STRING pNameW, FT_Face Face, + FT_UShort NameID, FT_UShort LangID); + /************************************************************* * IntGetOutlineTextMetrics * @@ -1752,57 +1756,40 @@ TT_HoriHeader *pHori; TT_Postscript *pPost; FT_Fixed XScale, YScale; - ANSI_STRING FamilyNameA, StyleNameA; - UNICODE_STRING FamilyNameW, StyleNameW, Regular; FT_WinFNT_HeaderRec Win; FT_Error Error; char *Cp; - NTSTATUS status; FT_Face Face = FontGDI->SharedFace->Face; + UNICODE_STRING FamilyNameW, FaceNameW, StyleNameW, FullNameW; - Needed = sizeof(OUTLINETEXTMETRICW); + /* family name */ + RtlInitUnicodeString(&FamilyNameW, NULL); + IntGetFontLocalizedName(&FamilyNameW, Face, TT_NAME_ID_FONT_FAMILY, gusLanguageID); - RtlInitAnsiString(&FamilyNameA, Face->family_name); - status = RtlAnsiStringToUnicodeString(&FamilyNameW, &FamilyNameA, TRUE); - if (!NT_SUCCESS(status)) - { - return 0; - } + /* face name */ + RtlInitUnicodeString(&FaceNameW, NULL); + IntGetFontLocalizedName(&FaceNameW, Face, TT_NAME_ID_FULL_NAME, gusLanguageID); - RtlInitAnsiString(&StyleNameA, Face->style_name); - status = RtlAnsiStringToUnicodeString(&StyleNameW, &StyleNameA, TRUE); - if (!NT_SUCCESS(status)) - { - RtlFreeUnicodeString(&FamilyNameW); - return 0; - } + /* style name */ + RtlInitUnicodeString(&StyleNameW, NULL); + IntGetFontLocalizedName(&StyleNameW, Face, TT_NAME_ID_FONT_SUBFAMILY, gusLanguageID); - /* These names should be read from the TT name table */ + /* unique name (full name) */ + RtlInitUnicodeString(&FullNameW, NULL); + IntGetFontLocalizedName(&FullNameW, Face, TT_NAME_ID_UNIQUE_ID, gusLanguageID); - /* Length of otmpFamilyName */ + Needed = sizeof(OUTLINETEXTMETRICW); Needed += FamilyNameW.Length + sizeof(WCHAR); - - RtlInitUnicodeString(&Regular, L"Regular"); - /* Length of otmpFaceName */ - if (RtlEqualUnicodeString(&StyleNameW, &Regular, TRUE)) - { - Needed += FamilyNameW.Length + sizeof(WCHAR); /* Just the family name */ - } - else - { - Needed += FamilyNameW.Length + StyleNameW.Length + (sizeof(WCHAR) << 1); /* family + " " + style */ - } - - /* Length of otmpStyleName */ + Needed += FaceNameW.Length + sizeof(WCHAR); Needed += StyleNameW.Length + sizeof(WCHAR); + Needed += FullNameW.Length + sizeof(WCHAR); - /* Length of otmpFullName */ - Needed += FamilyNameW.Length + StyleNameW.Length + (sizeof(WCHAR) << 1); - if (Size < Needed) { RtlFreeUnicodeString(&FamilyNameW); + RtlFreeUnicodeString(&FaceNameW); RtlFreeUnicodeString(&StyleNameW); + RtlFreeUnicodeString(&FullNameW); return Needed; } @@ -1815,8 +1802,10 @@ { IntUnLockFreeType; DPRINT1("Can't find OS/2 table - not TT font?\n"); + RtlFreeUnicodeString(&FamilyNameW); + RtlFreeUnicodeString(&FaceNameW); RtlFreeUnicodeString(&StyleNameW); - RtlFreeUnicodeString(&FamilyNameW); + RtlFreeUnicodeString(&FullNameW); return 0; } @@ -1825,8 +1814,10 @@ { IntUnLockFreeType; DPRINT1("Can't find HHEA table - not TT font?\n"); + RtlFreeUnicodeString(&FamilyNameW); + RtlFreeUnicodeString(&FaceNameW); RtlFreeUnicodeString(&StyleNameW); - RtlFreeUnicodeString(&FamilyNameW); + RtlFreeUnicodeString(&FullNameW); return 0; } @@ -1882,33 +1873,34 @@ IntUnLockFreeType; - /* otmp* members should clearly have type ptrdiff_t, but M$ knows best */ Cp = (char*) Otm + sizeof(OUTLINETEXTMETRICW); + + /* family name */ Otm->otmpFamilyName = (LPSTR)(Cp - (char*) Otm); wcscpy((WCHAR*) Cp, FamilyNameW.Buffer); Cp += FamilyNameW.Length + sizeof(WCHAR); + + /* face name */ + Otm->otmpFaceName = (LPSTR)(Cp - (char*) Otm); + wcscpy((WCHAR*) Cp, FaceNameW.Buffer); + Cp += FaceNameW.Length + sizeof(WCHAR); + + /* style name */ Otm->otmpStyleName = (LPSTR)(Cp - (char*) Otm); wcscpy((WCHAR*) Cp, StyleNameW.Buffer); Cp += StyleNameW.Length + sizeof(WCHAR); - Otm->otmpFaceName = (LPSTR)(Cp - (char*) Otm); - wcscpy((WCHAR*) Cp, FamilyNameW.Buffer); - if (!RtlEqualUnicodeString(&StyleNameW, &Regular, TRUE)) - { - wcscat((WCHAR*) Cp, L" "); - wcscat((WCHAR*) Cp, StyleNameW.Buffer); - Cp += FamilyNameW.Length + StyleNameW.Length + (sizeof(WCHAR) << 1); - } - else - { - Cp += FamilyNameW.Length + sizeof(WCHAR); - } + + /* unique name (full name) */ Otm->otmpFullName = (LPSTR)(Cp - (char*) Otm); - wcscpy((WCHAR*) Cp, FamilyNameW.Buffer); - wcscat((WCHAR*) Cp, L" "); - wcscat((WCHAR*) Cp, StyleNameW.Buffer); + wcscpy((WCHAR*) Cp, FullNameW.Buffer); + Cp += FullNameW.Length + sizeof(WCHAR); + ASSERT(Cp - (char*)Otm == Needed); + + RtlFreeUnicodeString(&FamilyNameW); + RtlFreeUnicodeString(&FaceNameW); RtlFreeUnicodeString(&StyleNameW); - RtlFreeUnicodeString(&FamilyNameW); + RtlFreeUnicodeString(&FullNameW); return Needed; } @@ -2101,12 +2093,17 @@ { Status = IntGetFontLocalizedName(pNameW, Face, NameID, gusEnglishUS); } + else if (NameID == TT_NAME_ID_FONT_SUBFAMILY) + { + RtlInitAnsiString(&AnsiName, Face->style_name); + Status = RtlAnsiStringToUnicodeString(pNameW, &AnsiName, TRUE); + } + else + { + RtlInitAnsiString(&AnsiName, Face->family_name); + Status = RtlAnsiStringToUnicodeString(pNameW, &AnsiName, TRUE); + } } - if (Status == STATUS_NOT_FOUND) - { - RtlInitAnsiString(&AnsiName, Face->family_name); - Status = RtlAnsiStringToUnicodeString(pNameW, &AnsiName, TRUE); - } return Status; }