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