[PATCH v3 1/2] gdi32: Implement GetCharWidthInfo().

Huw Davies huw at codeweavers.com
Tue Apr 9 04:32:59 CDT 2019


From: Akihiro Sagawa <sagawa.aki at gmail.com>

Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/gdi32/dibdrv/dc.c      |  2 ++
 dlls/gdi32/driver.c         |  6 ++++++
 dlls/gdi32/enhmfdrv/dc.c    |  1 +
 dlls/gdi32/enhmfdrv/init.c  |  1 +
 dlls/gdi32/font.c           | 24 ++++++++++++++++++++++++
 dlls/gdi32/freetype.c       | 35 +++++++++++++++++++++++++++++++++++
 dlls/gdi32/gdi32.spec       |  2 +-
 dlls/gdi32/gdi_private.h    |  8 ++++++++
 dlls/gdi32/mfdrv/init.c     |  1 +
 dlls/gdi32/path.c           |  1 +
 dlls/wineandroid.drv/init.c |  1 +
 dlls/winemac.drv/gdi.c      |  1 +
 dlls/wineps.drv/init.c      |  1 +
 dlls/winex11.drv/init.c     |  1 +
 dlls/winex11.drv/xrender.c  |  1 +
 include/wine/gdi_driver.h   |  3 ++-
 16 files changed, 87 insertions(+), 2 deletions(-)

diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index 3456002171..a3f84bd688 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -430,6 +430,7 @@ const struct gdi_dc_funcs dib_driver =
     NULL,                               /* pGetCharABCWidths */
     NULL,                               /* pGetCharABCWidthsI */
     NULL,                               /* pGetCharWidth */
+    NULL,                               /* pGetCharWidthInfo */
     NULL,                               /* pGetDeviceCaps */
     NULL,                               /* pGetDeviceGammaRamp */
     NULL,                               /* pGetFontData */
@@ -1052,6 +1053,7 @@ static const struct gdi_dc_funcs window_driver =
     NULL,                               /* pGetCharABCWidths */
     NULL,                               /* pGetCharABCWidthsI */
     NULL,                               /* pGetCharWidth */
+    NULL,                               /* pGetCharWidthInfo */
     NULL,                               /* pGetDeviceCaps */
     NULL,                               /* pGetDeviceGammaRamp */
     NULL,                               /* pGetFontData */
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index 054d7cf418..88f49a03b6 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -310,6 +310,11 @@ static BOOL nulldrv_GetCharWidth( PHYSDEV dev, UINT first, UINT last, INT *buffe
     return FALSE;
 }
 
+static BOOL nulldrv_GetCharWidthInfo( PHYSDEV dev, void *info )
+{
+    return FALSE;
+}
+
 static INT nulldrv_GetDeviceCaps( PHYSDEV dev, INT cap )
 {
     int bpp;
@@ -756,6 +761,7 @@ const struct gdi_dc_funcs null_driver =
     nulldrv_GetCharABCWidths,           /* pGetCharABCWidths */
     nulldrv_GetCharABCWidthsI,          /* pGetCharABCWidthsI */
     nulldrv_GetCharWidth,               /* pGetCharWidth */
+    nulldrv_GetCharWidthInfo,           /* pGetCharWidthInfo */
     nulldrv_GetDeviceCaps,              /* pGetDeviceCaps */
     nulldrv_GetDeviceGammaRamp,         /* pGetDeviceGammaRamp */
     nulldrv_GetFontData,                /* pGetFontData */
diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c
index 305f052c0a..960d1b295c 100644
--- a/dlls/gdi32/enhmfdrv/dc.c
+++ b/dlls/gdi32/enhmfdrv/dc.c
@@ -860,6 +860,7 @@ static const struct gdi_dc_funcs emfpath_driver =
     NULL,                               /* pGetCharABCWidths */
     NULL,                               /* pGetCharABCWidthsI */
     NULL,                               /* pGetCharWidth */
+    NULL,                               /* pGetCharWidthInfo */
     NULL,                               /* pGetDeviceCaps */
     NULL,                               /* pGetDeviceGammaRamp */
     NULL,                               /* pGetFontData */
diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c
index 51133705a5..1cd838ab8e 100644
--- a/dlls/gdi32/enhmfdrv/init.c
+++ b/dlls/gdi32/enhmfdrv/init.c
@@ -73,6 +73,7 @@ static const struct gdi_dc_funcs emfdrv_driver =
     NULL,                            /* pGetCharABCWidths */
     NULL,                            /* pGetCharABCWidthsI */
     NULL,                            /* pGetCharWidth */
+    NULL,                            /* pGetCharWidthInfo */
     EMFDRV_GetDeviceCaps,            /* pGetDeviceCaps */
     NULL,                            /* pGetDeviceGammaRamp */
     NULL,                            /* pGetFontData */
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index b3d67ff624..633fb10116 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -3968,3 +3968,27 @@ BOOL WINAPI GdiRealizationInfo(HDC hdc, struct realization_info *info)
 
     return ret;
 }
+
+/*************************************************************
+ *           GetCharWidthInfo    (GDI32.@)
+ *
+ */
+BOOL WINAPI GetCharWidthInfo(HDC hdc, struct char_width_info *info)
+{
+    PHYSDEV dev;
+    BOOL ret;
+    DC *dc;
+
+    dc = get_dc_ptr(hdc);
+    if (!dc) return FALSE;
+    dev = GET_DC_PHYSDEV( dc, pGetCharWidthInfo );
+    ret = dev->funcs->pGetCharWidthInfo( dev, info );
+
+    if (ret)
+    {
+        info->lsb = width_to_LP( dc, info->lsb );
+        info->rsb = width_to_LP( dc, info->rsb );
+    }
+    release_dc_ptr(dc);
+    return ret;
+}
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 352a86653a..703dc3a997 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -8417,6 +8417,40 @@ static BOOL freetype_GetCharWidth( PHYSDEV dev, UINT firstChar, UINT lastChar, L
     return TRUE;
 }
 
+/*************************************************************
+ * freetype_GetCharWidthInfo
+ */
+static BOOL freetype_GetCharWidthInfo( PHYSDEV dev, void* ptr )
+{
+    struct freetype_physdev *physdev = get_freetype_dev( dev );
+    struct char_width_info *info = ptr;
+    TT_HoriHeader *pHori;
+
+    if (!physdev->font)
+    {
+        dev = GET_NEXT_PHYSDEV( dev, pGetCharWidthInfo );
+        return dev->funcs->pGetCharWidthInfo( dev, ptr );
+    }
+
+    TRACE("%p, %p\n", physdev->font, info);
+
+    if (FT_IS_SCALABLE(physdev->font->ft_face) &&
+        (pHori = pFT_Get_Sfnt_Table(physdev->font->ft_face, ft_sfnt_hhea)))
+    {
+        FT_Fixed em_scale;
+        em_scale = MulDiv(physdev->font->ppem, 1 << 16,
+                          physdev->font->ft_face->units_per_EM);
+        info->lsb = (SHORT)pFT_MulFix(pHori->min_Left_Side_Bearing,  em_scale);
+        info->rsb = (SHORT)pFT_MulFix(pHori->min_Right_Side_Bearing, em_scale);
+    }
+    else
+        info->lsb = info->rsb = 0;
+
+    info->unk = 0;
+
+    return TRUE;
+}
+
 /*************************************************************
  * freetype_GetCharABCWidths
  */
@@ -9112,6 +9146,7 @@ static const struct gdi_dc_funcs freetype_funcs =
     freetype_GetCharABCWidths,          /* pGetCharABCWidths */
     freetype_GetCharABCWidthsI,         /* pGetCharABCWidthsI */
     freetype_GetCharWidth,              /* pGetCharWidth */
+    freetype_GetCharWidthInfo,          /* pGetCharWidthInfo */
     NULL,                               /* pGetDeviceCaps */
     NULL,                               /* pGetDeviceGammaRamp */
     freetype_GetFontData,               /* pGetFontData */
diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec
index 6e8f0285f4..2d158e0f1b 100644
--- a/dlls/gdi32/gdi32.spec
+++ b/dlls/gdi32/gdi32.spec
@@ -251,7 +251,7 @@
 @ stdcall GetCharWidthFloatA(long long long ptr)
 @ stdcall GetCharWidthFloatW(long long long ptr)
 @ stdcall GetCharWidthI(ptr long long ptr ptr)
-# @ stub GetCharWidthInfo
+@ stdcall GetCharWidthInfo(ptr ptr)
 @ stdcall GetCharWidthW(long long long long) GetCharWidth32W
 @ stub GetCharWidthWOW
 @ stdcall GetCharacterPlacementA(long str long long ptr long)
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 01473dd7e2..fc3961bd70 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -294,6 +294,14 @@ struct font_realization_info
     WORD  simulations; /* 0 bit - bold simulation, 1 bit - oblique simulation */
 };
 
+/* Undocumented structure filled in by GetCharWidthInfo */
+struct char_width_info
+{
+    INT lsb;   /* minimum left side bearing */
+    INT rsb;   /* minimum right side bearing */
+    INT unk;   /* unknown */
+};
+
 extern INT WineEngAddFontResourceEx(LPCWSTR, DWORD, PVOID) DECLSPEC_HIDDEN;
 extern HANDLE WineEngAddFontMemResourceEx(PVOID, DWORD, PVOID, LPDWORD) DECLSPEC_HIDDEN;
 extern BOOL WineEngCreateScalableFontResource(DWORD, LPCWSTR, LPCWSTR, LPCWSTR) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index d766d025e5..4ef509a89f 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -136,6 +136,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs =
     NULL,                            /* pGetCharABCWidths */
     NULL,                            /* pGetCharABCWidthsI */
     NULL,                            /* pGetCharWidth */
+    NULL,                            /* pGetCharWidthInfo */
     MFDRV_GetDeviceCaps,             /* pGetDeviceCaps */
     NULL,                            /* pGetDeviceGammaRamp */
     NULL,                            /* pGetFontData */
diff --git a/dlls/gdi32/path.c b/dlls/gdi32/path.c
index 402b082f4c..8cf86ccb2e 100644
--- a/dlls/gdi32/path.c
+++ b/dlls/gdi32/path.c
@@ -2158,6 +2158,7 @@ const struct gdi_dc_funcs path_driver =
     NULL,                               /* pGetCharABCWidths */
     NULL,                               /* pGetCharABCWidthsI */
     NULL,                               /* pGetCharWidth */
+    NULL,                               /* pGetCharWidthInfo */
     NULL,                               /* pGetDeviceCaps */
     NULL,                               /* pGetDeviceGammaRamp */
     NULL,                               /* pGetFontData */
diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c
index b5c85eea83..7a2945c80f 100644
--- a/dlls/wineandroid.drv/init.c
+++ b/dlls/wineandroid.drv/init.c
@@ -321,6 +321,7 @@ static const struct gdi_dc_funcs android_drv_funcs =
     NULL,                               /* pGetCharABCWidths */
     NULL,                               /* pGetCharABCWidthsI */
     NULL,                               /* pGetCharWidth */
+    NULL,                               /* pGetCharWidthInfo */
     NULL,                               /* pGetDeviceCaps */
     NULL,                               /* pGetDeviceGammaRamp */
     NULL,                               /* pGetFontData */
diff --git a/dlls/winemac.drv/gdi.c b/dlls/winemac.drv/gdi.c
index 40478fdb86..7156a3c3a8 100644
--- a/dlls/winemac.drv/gdi.c
+++ b/dlls/winemac.drv/gdi.c
@@ -300,6 +300,7 @@ static const struct gdi_dc_funcs macdrv_funcs =
     NULL,                                   /* pGetCharABCWidths */
     NULL,                                   /* pGetCharABCWidthsI */
     NULL,                                   /* pGetCharWidth */
+    NULL,                                   /* pGetCharWidthInfo */
     macdrv_GetDeviceCaps,                   /* pGetDeviceCaps */
     macdrv_GetDeviceGammaRamp,              /* pGetDeviceGammaRamp */
     NULL,                                   /* pGetFontData */
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c
index 8a1353cedf..0dff6cc868 100644
--- a/dlls/wineps.drv/init.c
+++ b/dlls/wineps.drv/init.c
@@ -818,6 +818,7 @@ static const struct gdi_dc_funcs psdrv_funcs =
     NULL,                               /* pGetCharABCWidths */
     NULL,                               /* pGetCharABCWidthsI */
     PSDRV_GetCharWidth,                 /* pGetCharWidth */
+    NULL,                               /* pGetCharWidthInfo */
     PSDRV_GetDeviceCaps,                /* pGetDeviceCaps */
     NULL,                               /* pGetDeviceGammaRamp */
     NULL,                               /* pGetFontData */
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c
index 326873314c..20710cc0c9 100644
--- a/dlls/winex11.drv/init.c
+++ b/dlls/winex11.drv/init.c
@@ -381,6 +381,7 @@ static const struct gdi_dc_funcs x11drv_funcs =
     NULL,                               /* pGetCharABCWidths */
     NULL,                               /* pGetCharABCWidthsI */
     NULL,                               /* pGetCharWidth */
+    NULL,                               /* pGetCharWidthInfo */
     X11DRV_GetDeviceCaps,               /* pGetDeviceCaps */
     X11DRV_GetDeviceGammaRamp,          /* pGetDeviceGammaRamp */
     NULL,                               /* pGetFontData */
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index 8350bad548..61729ecf29 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -2194,6 +2194,7 @@ static const struct gdi_dc_funcs xrender_funcs =
     NULL,                               /* pGetCharABCWidths */
     NULL,                               /* pGetCharABCWidthsI */
     NULL,                               /* pGetCharWidth */
+    NULL,                               /* pGetCharWidthInfo */
     NULL,                               /* pGetDeviceCaps */
     NULL,                               /* pGetDeviceGammaRamp */
     NULL,                               /* pGetFontData */
diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h
index 4693235cae..d3e5bcefb4 100644
--- a/include/wine/gdi_driver.h
+++ b/include/wine/gdi_driver.h
@@ -102,6 +102,7 @@ struct gdi_dc_funcs
     BOOL     (*pGetCharABCWidths)(PHYSDEV,UINT,UINT,LPABC);
     BOOL     (*pGetCharABCWidthsI)(PHYSDEV,UINT,UINT,WORD*,LPABC);
     BOOL     (*pGetCharWidth)(PHYSDEV,UINT,UINT,LPINT);
+    BOOL     (*pGetCharWidthInfo)(PHYSDEV,void*);
     INT      (*pGetDeviceCaps)(PHYSDEV,INT);
     BOOL     (*pGetDeviceGammaRamp)(PHYSDEV,LPVOID);
     DWORD    (*pGetFontData)(PHYSDEV,DWORD,DWORD,LPVOID,DWORD);
@@ -199,7 +200,7 @@ struct gdi_dc_funcs
 };
 
 /* increment this when you change the DC function table */
-#define WINE_GDI_DRIVER_VERSION 48
+#define WINE_GDI_DRIVER_VERSION 49
 
 #define GDI_PRIORITY_NULL_DRV        0  /* null driver */
 #define GDI_PRIORITY_FONT_DRV      100  /* any font driver */
-- 
2.18.0




More information about the wine-devel mailing list