From a82cdfc05016dffb9f8f649e9f00c675afd0e681 Mon Sep 17 00:00:00 2001 From: Erich Hoover Date: Mon, 19 Jan 2009 19:50:03 -0700 Subject: [PATCH] oleaut32: Fix OLEPicture rendering vector metafiles without setting up the source rectangle. --- dlls/oleaut32/olepicture.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c index c80f3578754..f05501d5cf4 100644 --- a/dlls/oleaut32/olepicture.c +++ b/dlls/oleaut32/olepicture.c @@ -710,17 +710,27 @@ static HRESULT WINAPI OLEPictureImpl_Render(IPicture *iface, HDC hdc, case PICTYPE_METAFILE: { - POINT prevOrg; - SIZE prevExt; + POINT prevOrg, prevWndOrg; + SIZE prevExt, prevWndExt; int oldmode; + /* Render the WMF to the appropriate location by setting the + appropriate ratio between "device units" and "logical units" */ oldmode = SetMapMode(hdc, MM_ANISOTROPIC); + /* For the "source rectangle" the y-axis must be inverted */ + SetWindowOrgEx(hdc, xSrc, This->himetricHeight-ySrc, &prevWndOrg); + SetWindowExtEx(hdc, cxSrc, -cySrc, &prevWndExt); + /* For the "destination rectangle" no inversion is necessary */ SetViewportOrgEx(hdc, x, y, &prevOrg); SetViewportExtEx(hdc, cx, cy, &prevExt); if (!PlayMetaFile(hdc, This->desc.u.wmf.hmeta)) ERR("PlayMetaFile failed!\n"); + /* We're done, restore the DC to the previous settings for converting + logical units to device units */ + SetWindowExtEx(hdc, prevWndExt.cx, prevWndExt.cy, NULL); + SetWindowOrgEx(hdc, prevWndOrg.x, prevWndOrg.y, NULL); SetViewportExtEx(hdc, prevExt.cx, prevExt.cy, NULL); SetViewportOrgEx(hdc, prevOrg.x, prevOrg.y, NULL); SetMapMode(hdc, oldmode);