From: Piotr Caban Subject: [PATCH 1/2] enhmfdrv: Always set ExtTextOut bounding rect if we're not inside path bracket Message-Id: <571F5CCF.80408@codeweavers.com> Date: Tue, 26 Apr 2016 14:19:27 +0200 Signed-off-by: Piotr Caban --- 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 ae05378..26f13c9 100644 --- a/dlls/gdi32/enhmfdrv/graphics.c +++ b/dlls/gdi32/enhmfdrv/graphics.c @@ -722,6 +722,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; @@ -803,13 +804,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());