https://git.reactos.org/?p=reactos.git;a=commitdiff;h=ea4daf8b6873cd6256c45a...
commit ea4daf8b6873cd6256c45ac1c6b7cfea2e58b340 Author: Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com AuthorDate: Sat Dec 9 19:06:51 2017 +0900
[WIN32K] Fix NtGdiGetTextFaceW to report face name correctly (#173)
Initialize TEXTOBJ.FaceName member in TextIntRealizeFont and use it in NtGdiGetTextFaceW CORE-14071 --- win32ss/gdi/ntgdi/freetype.c | 12 ++++++++++++ win32ss/gdi/ntgdi/text.c | 26 ++++++++++++++++++++------ 2 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/win32ss/gdi/ntgdi/freetype.c b/win32ss/gdi/ntgdi/freetype.c index 5fb58cf3e4..b8b3f74a03 100644 --- a/win32ss/gdi/ntgdi/freetype.c +++ b/win32ss/gdi/ntgdi/freetype.c @@ -4504,6 +4504,7 @@ TextIntRealizeFont(HFONT FontHandle, PTEXTOBJ pTextObj) } else { + UNICODE_STRING NameW; PFONTGDI FontGdi = ObjToGDI(TextObj->Font, FONT); // Need hdev, when freetype is loaded need to create DEVOBJ for // Consumer and Producer. @@ -4518,6 +4519,17 @@ TextIntRealizeFont(HFONT FontHandle, PTEXTOBJ pTextObj) else FontGdi->RequestWeight = FW_NORMAL;
+ /* store the localized family name */ + RtlInitUnicodeString(&NameW, NULL); + Status = IntGetFontLocalizedName(&NameW, FontGdi->SharedFace, + TT_NAME_ID_FONT_FAMILY, gusLanguageID); + if (NT_SUCCESS(Status)) + { + RtlCopyMemory(TextObj->FaceName, NameW.Buffer, NameW.Length); + TextObj->FaceName[NameW.Length / sizeof(WCHAR)] = UNICODE_NULL; + RtlFreeUnicodeString(&NameW); + } + Face = FontGdi->SharedFace->Face;
//FontGdi->OriginalWeight = WeightFromStyle(Face->style_name); diff --git a/win32ss/gdi/ntgdi/text.c b/win32ss/gdi/ntgdi/text.c index b4130b6b2f..4d8d8779df 100644 --- a/win32ss/gdi/ntgdi/text.c +++ b/win32ss/gdi/ntgdi/text.c @@ -3,7 +3,11 @@ * LICENSE: GPL - See COPYING in the top level directory * FILE: win32ss/gdi/ntgdi/text.c * PURPOSE: Text/Font - * PROGRAMMER: + * PROGRAMMERS: Amine Khaldi amine.khaldi@reactos.org + * Timo Kreuzer timo.kreuzer@reactos.org + * James Tabor james.tabor@reactos.org + * Hermes Belusca-Maito hermes.belusca@sfr.fr + * Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com */
/** Includes ******************************************************************/ @@ -512,12 +516,14 @@ NtGdiGetTextFaceW(
TextObj = RealizeFontInit(hFont); ASSERT(TextObj != NULL); - fLen = wcslen(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName) + 1; + fLen = wcslen(TextObj->FaceName) + 1; + if (fLen > LF_FACESIZE) + fLen = LF_FACESIZE;
if (FaceName != NULL) { Count = min(Count, fLen); - Status = MmCopyToCaller(FaceName, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName, Count * sizeof(WCHAR)); + Status = MmCopyToCaller(FaceName, TextObj->FaceName, Count * sizeof(WCHAR)); if (!NT_SUCCESS(Status)) { TEXTOBJ_UnlockText(TextObj); @@ -525,11 +531,19 @@ NtGdiGetTextFaceW( return 0; } /* Terminate if we copied only part of the font name */ - if (Count > 0 && Count < fLen) + ret = Count; + if (Count > 0 && Count <= fLen) { - FaceName[Count - 1] = '\0'; + _SEH2_TRY + { + FaceName[Count - 1] = '\0'; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + ret = 0; + } + _SEH2_END; } - ret = Count; } else {