Piotr Caban : gdi32/enhmfdrv: Always set ExtTextOut bounding rect if we' re not inside path bracket.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Apr 29 11:05:57 CDT 2016


Module: wine
Branch: master
Commit: 269b2519a7ac17a6f7a832cc39c2b3a8c965c773
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=269b2519a7ac17a6f7a832cc39c2b3a8c965c773

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu Apr 28 18:47:14 2016 +0200

gdi32/enhmfdrv: Always set ExtTextOut bounding rect if we're not inside path bracket.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/enhmfdrv/dc.c             |  6 ++++++
 dlls/gdi32/enhmfdrv/enhmetafiledrv.h |  1 +
 dlls/gdi32/enhmfdrv/graphics.c       |  4 +++-
 dlls/gdi32/enhmfdrv/init.c           |  1 +
 dlls/gdi32/tests/metafile.c          | 11 +++++++++++
 5 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c
index cbf3f5c..8525067 100644
--- a/dlls/gdi32/enhmfdrv/dc.c
+++ b/dlls/gdi32/enhmfdrv/dc.c
@@ -420,8 +420,11 @@ BOOL EMFDRV_AbortPath( PHYSDEV dev )
 
 BOOL EMFDRV_BeginPath( PHYSDEV dev )
 {
+    EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*) dev;
     EMRBEGINPATH emr;
 
+    physDev->path = TRUE;
+
     emr.emr.iType = EMR_BEGINPATH;
     emr.emr.nSize = sizeof(emr);
 
@@ -440,8 +443,11 @@ BOOL EMFDRV_CloseFigure( PHYSDEV dev )
 
 BOOL EMFDRV_EndPath( PHYSDEV dev )
 {
+    EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*) dev;
     EMRENDPATH emr;
 
+    physDev->path = FALSE;
+
     emr.emr.iType = EMR_ENDPATH;
     emr.emr.nSize = sizeof(emr);
 
diff --git a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
index 721c82f..8aa1b2d 100644
--- a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
+++ b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
@@ -42,6 +42,7 @@ typedef struct
     HDC        ref_dc;             /* Reference device */
     HDC        screen_dc;          /* Screen DC if no reference device specified */
     INT        restoring;          /* RestoreDC counter */
+    BOOL       path;
 } EMFDRV_PDEVICE;
 
 
diff --git a/dlls/gdi32/enhmfdrv/graphics.c b/dlls/gdi32/enhmfdrv/graphics.c
index e5553e0..38a71b6 100644
--- a/dlls/gdi32/enhmfdrv/graphics.c
+++ b/dlls/gdi32/enhmfdrv/graphics.c
@@ -746,6 +746,7 @@ BOOL EMFDRV_InvertRgn( PHYSDEV dev, HRGN hrgn )
 BOOL EMFDRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, const RECT *lprect,
                         LPCWSTR str, UINT count, const INT *lpDx )
 {
+    EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*) dev;
     EMREXTTEXTOUTW *pemr;
     DWORD nSize;
     BOOL ret;
@@ -827,13 +828,14 @@ BOOL EMFDRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, const RECT *lprec
         }
     }
 
-    if (!lprect)
+    if (physDev->path)
     {
         pemr->rclBounds.left = pemr->rclBounds.top = 0;
         pemr->rclBounds.right = pemr->rclBounds.bottom = -1;
         goto no_bounds;
     }
 
+    /* FIXME: handle font escapement */
     switch (textAlign & (TA_LEFT | TA_RIGHT | TA_CENTER)) {
     case TA_CENTER: {
         pemr->rclBounds.left  = x - (textWidth / 2) - 1;
diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c
index e0cbcae..f618e85 100644
--- a/dlls/gdi32/enhmfdrv/init.c
+++ b/dlls/gdi32/enhmfdrv/init.c
@@ -352,6 +352,7 @@ HDC WINAPI CreateEnhMetaFileW(
     physDev->dc_pen = 0;
     physDev->screen_dc = 0;
     physDev->restoring = 0;
+    physDev->path = FALSE;
     if (hdc)  /* if no ref, use current display */
         physDev->ref_dc = hdc;
     else
diff --git a/dlls/gdi32/tests/metafile.c b/dlls/gdi32/tests/metafile.c
index c77112d..ebe7e02 100644
--- a/dlls/gdi32/tests/metafile.c
+++ b/dlls/gdi32/tests/metafile.c
@@ -148,6 +148,13 @@ static int CALLBACK eto_emf_enum_proc(HDC hdc, HANDLETABLE *handle_table,
         ok(!memcmp(&orig_lf, &device_lf, FIELD_OFFSET(LOGFONTA, lfOutPrecision)), "fonts don't match\n");
         ok(!lstrcmpA(orig_lf.lfFaceName, device_lf.lfFaceName), "font names don't match\n");
 
+        ok(!emr_ExtTextOutW->rclBounds.left, "emr_ExtTextOutW->rclBounds.left = %d\n",
+                emr_ExtTextOutW->rclBounds.left);
+        ok(emr_ExtTextOutW->rclBounds.right != -1, "emr_ExtTextOutW->rclBounds.right = %d\n",
+                emr_ExtTextOutW->rclBounds.right);
+        ok(emr_ExtTextOutW->rclBounds.bottom != -1, "emr_ExtTextOutW->rclBounds.bottom = %d\n",
+                emr_ExtTextOutW->rclBounds.bottom);
+
         for(i = 0; i < emr_ExtTextOutW->emrtext.nChars; i++)
         {
             ok(orig_dx[i] == dx[i], "pass %d: dx[%d] (%d) didn't match %d\n",
@@ -229,6 +236,10 @@ static void test_ExtTextOut(void)
     ret = ExtTextOutA(hdcMetafile, 0, 20, 0, &rc, text, lstrlenA(text), dx);
     ok( ret, "ExtTextOutA error %d\n", GetLastError());
 
+    /* 3. pass NULL lprc */
+    ret = ExtTextOutA(hdcMetafile, 0, 40, 0, NULL, text, lstrlenA(text), NULL);
+    ok( ret, "ExtTextOutA error %d\n", GetLastError());
+
     hFont = SelectObject(hdcMetafile, hFont);
     ret = DeleteObject(hFont);
     ok( ret, "DeleteObject error %d\n", GetLastError());




More information about the wine-cvs mailing list