Huw Davies : gdi32: Write the map mode and window size records after the mfcomment.

Alexandre Julliard julliard at winehq.org
Thu Jul 2 08:25:09 CDT 2009


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Jul  2 11:37:29 2009 +0100

gdi32: Write the map mode and window size records after the mfcomment.

---

 dlls/gdi32/metafile.c |   71 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/dlls/gdi32/metafile.c b/dlls/gdi32/metafile.c
index d0c55ce..2e34f37 100644
--- a/dlls/gdi32/metafile.c
+++ b/dlls/gdi32/metafile.c
@@ -1223,11 +1223,71 @@ end:
 }
 
 /******************************************************************
+ *         set_window
+ *
+ * Helper for GetWinMetaFileBits
+ *
+ * Add the SetWindowOrg and SetWindowExt records
+ */
+static BOOL set_window(HDC hdc, HENHMETAFILE emf, HDC ref_dc, INT map_mode)
+{
+    ENHMETAHEADER header;
+    INT horz_res, vert_res, horz_size, vert_size;
+    POINT pt;
+
+    if(!GetEnhMetaFileHeader(emf, sizeof(header), &header)) return FALSE;
+
+    horz_res = GetDeviceCaps(ref_dc, HORZRES);
+    vert_res = GetDeviceCaps(ref_dc, VERTRES);
+    horz_size = GetDeviceCaps(ref_dc, HORZSIZE);
+    vert_size = GetDeviceCaps(ref_dc, VERTSIZE);
+
+    switch(map_mode)
+    {
+    case MM_TEXT:
+    case MM_ISOTROPIC:
+    case MM_ANISOTROPIC:
+        pt.y = MulDiv(header.rclFrame.top, vert_res, vert_size * 100);
+        pt.x = MulDiv(header.rclFrame.left, horz_res, horz_size * 100);
+        break;
+    case MM_LOMETRIC:
+        pt.y = MulDiv(-header.rclFrame.top, 1, 10) + 1;
+        pt.x = MulDiv( header.rclFrame.left, 1, 10);
+        break;
+    case MM_HIMETRIC:
+        pt.y = -header.rclFrame.top + 1;
+        pt.x = header.rclFrame.left;
+        break;
+    case MM_LOENGLISH:
+        pt.y = MulDiv(-header.rclFrame.top, 10, 254) + 1;
+        pt.x = MulDiv( header.rclFrame.left, 10, 254);
+        break;
+    case MM_HIENGLISH:
+        pt.y = MulDiv(-header.rclFrame.top, 100, 254) + 1;
+        pt.x = MulDiv( header.rclFrame.left, 100, 254);
+        break;
+    case MM_TWIPS:
+        pt.y = MulDiv(-header.rclFrame.top, 72 * 20, 2540) + 1;
+        pt.x = MulDiv( header.rclFrame.left, 72 * 20, 2540);
+        break;
+    default:
+        WARN("Unknown map mode %d\n", map_mode);
+        return FALSE;
+    }
+    SetWindowOrgEx(hdc, pt.x, pt.y, NULL);
+
+    pt.x = MulDiv(header.rclFrame.right - header.rclFrame.left, horz_res, horz_size * 100);
+    pt.y = MulDiv(header.rclFrame.bottom - header.rclFrame.top, vert_res, vert_size * 100);
+    SetWindowExtEx(hdc, pt.x, pt.y, NULL);
+    return TRUE;
+}
+
+/******************************************************************
  *         GetWinMetaFileBits [GDI32.@]
  */
 UINT WINAPI GetWinMetaFileBits(HENHMETAFILE hemf,
                                 UINT cbBuffer, LPBYTE lpbBuffer,
-                                INT fnMapMode, HDC hdcRef)
+                                INT map_mode, HDC hdcRef)
 {
     HDC hdcmf;
     HMETAFILE hmf;
@@ -1237,11 +1297,14 @@ UINT WINAPI GetWinMetaFileBits(HENHMETAFILE hemf,
     GetClipBox(hdcRef, &rc);
 
     TRACE("(%p,%d,%p,%d,%p) rc=%s\n", hemf, cbBuffer, lpbBuffer,
-        fnMapMode, hdcRef, wine_dbgstr_rect(&rc));
+          map_mode, hdcRef, wine_dbgstr_rect(&rc));
 
     hdcmf = CreateMetaFileW(NULL);
 
     add_mf_comment(hdcmf, hemf);
+    SetMapMode(hdcmf, map_mode);
+    if(!set_window(hdcmf, hemf, hdcRef, map_mode))
+        goto error;
 
     PlayEnhMetaFile(hdcmf, hemf, &rc);
     hmf = CloseMetaFile(hdcmf);
@@ -1260,6 +1323,10 @@ UINT WINAPI GetWinMetaFileBits(HENHMETAFILE hemf,
         comment_rec->rdParm[8] = ~checksum + 1;
     }
     return ret;
+
+error:
+    DeleteMetaFile(CloseMetaFile(hdcmf));
+    return 0;
 }
 
 /******************************************************************




More information about the wine-cvs mailing list