[PATCH 4/5] wineps.drv: Add support for GETFACENAME and DOWNLOADFACE escapes.

Dmitry Timoshkov dmitry at baikal.ru
Fri Dec 7 06:16:25 CST 2018


Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 dlls/wineps.drv/download.c | 26 ++++++++++++++++++++++++++
 dlls/wineps.drv/escape.c   | 21 ++++++++++++++++++---
 dlls/wineps.drv/psdrv.h    |  1 +
 3 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/dlls/wineps.drv/download.c b/dlls/wineps.drv/download.c
index dc77cf1170..86188d2b55 100644
--- a/dlls/wineps.drv/download.c
+++ b/dlls/wineps.drv/download.c
@@ -259,6 +259,32 @@ static BOOL is_fake_italic( HDC hdc )
     return !(mac_style & 2);
 }
 
+char *PSDRV_get_download_name(PHYSDEV dev, BOOL vertical)
+{
+    PSDRV_PDEVICE *physDev = get_psdrv_dev( dev );
+    char *ps_name;
+    LPOUTLINETEXTMETRICA potm;
+    DWORD len = GetOutlineTextMetricsA(dev->hdc, 0, NULL);
+    LOGFONTW lf;
+
+    assert(physDev->font.fontloc == Download);
+
+    if (!GetObjectW(GetCurrentObject(dev->hdc, OBJ_FONT), sizeof(lf), &lf))
+        return NULL;
+
+    potm = HeapAlloc(GetProcessHeap(), 0, len);
+    if (!potm)
+        return NULL;
+
+    GetOutlineTextMetricsA(dev->hdc, len, potm);
+
+    ps_name = NULL;
+    get_download_name(dev, potm, &ps_name, vertical);
+    HeapFree(GetProcessHeap(), 0, potm);
+
+    return ps_name;
+}
+
 /****************************************************************************
  *  PSDRV_WriteSetDownloadFont
  *
diff --git a/dlls/wineps.drv/escape.c b/dlls/wineps.drv/escape.c
index 44d790b298..db73c057ef 100644
--- a/dlls/wineps.drv/escape.c
+++ b/dlls/wineps.drv/escape.c
@@ -138,12 +138,27 @@ INT PSDRV_ExtEscape( PHYSDEV dev, INT nEscape, INT cbInput, LPCVOID in_data,
         return 1;
 
     case GETFACENAME:
-        FIXME("GETFACENAME: stub\n");
-        lstrcpynA(out_data, "Courier", cbOutput);
+        if (physDev->font.fontloc == Download)
+        {
+            char *name = PSDRV_get_download_name(dev, physDev->font.set);
+            if (name)
+            {
+                TRACE("font name: %s\n", debugstr_a(name));
+                lstrcpynA(out_data, name, cbOutput);
+                HeapFree(GetProcessHeap(), 0, name);
+            }
+            else
+                lstrcpynA(out_data, "Courier", cbOutput);
+        }
+        else
+        {
+            TRACE("font name: %s\n", debugstr_a(physDev->font.fontinfo.Builtin.afm->FontName));
+            lstrcpynA(out_data, physDev->font.fontinfo.Builtin.afm->FontName, cbOutput);
+        }
         return 1;
 
     case DOWNLOADFACE:
-        FIXME("DOWNLOADFACE: stub\n");
+        PSDRV_SetFont(dev, physDev->font.set);
         return 1;
 
     case MFCOMMENT:
diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h
index 9cbee65ed8..55f345b87f 100644
--- a/dlls/wineps.drv/psdrv.h
+++ b/dlls/wineps.drv/psdrv.h
@@ -553,6 +553,7 @@ extern BOOL PSDRV_SelectBuiltinFont(PHYSDEV dev, HFONT hfont,
 extern BOOL PSDRV_WriteSetBuiltinFont(PHYSDEV dev) DECLSPEC_HIDDEN;
 extern BOOL PSDRV_WriteBuiltinGlyphShow(PHYSDEV dev, LPCWSTR str, INT count) DECLSPEC_HIDDEN;
 
+extern char *PSDRV_get_download_name(PHYSDEV dev, BOOL vertical) DECLSPEC_HIDDEN;
 extern BOOL PSDRV_SelectDownloadFont(PHYSDEV dev) DECLSPEC_HIDDEN;
 extern BOOL PSDRV_WriteSetDownloadFont(PHYSDEV dev, BOOL vertical) DECLSPEC_HIDDEN;
 extern BOOL PSDRV_WriteDownloadGlyphShow(PHYSDEV dev, const WORD *glyphs, UINT count) DECLSPEC_HIDDEN;
-- 
2.19.2




More information about the wine-devel mailing list