[WIN32K] Fix NtGdiGetTextFaceW to report face name correctly (#173)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Sat, 9 Dec 2017 10:06:51 +0000 (19:06 +0900)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Sat, 9 Dec 2017 10:06:51 +0000 (12:06 +0200)
Initialize TEXTOBJ.FaceName member in TextIntRealizeFont and use it in NtGdiGetTextFaceW
CORE-14071

win32ss/gdi/ntgdi/freetype.c
win32ss/gdi/ntgdi/text.c

index 5fb58cf..b8b3f74 100644 (file)
@@ -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);
index b4130b6..4d8d877 100644 (file)
@@ -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
     {