Add documentation on the Wine initialization process.
[wine] / objects / metafile.c
index 4e233a3..9c917ee 100644 (file)
 
 #include "wine/winbase16.h"
 #include "wine/wingdi16.h"
-#include "bitmap.h"
+#include "gdi.h"
 #include "wownt32.h"
 #include "winreg.h"
 #include "winternl.h"
+#include "gdi_private.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(metafile);
@@ -369,7 +370,7 @@ static METAHEADER *MF_LoadDiskBasedMetaFile(METAHEADER *mh)
  * Take a memory based METAHEADER and change it to a disk based METAHEADER
  * assosiated with filename.  Note: Trashes contents of old one.
  */
-METAHEADER *MF_CreateMetaHeaderDisk(METAHEADER *mh, LPCSTR filename)
+METAHEADER *MF_CreateMetaHeaderDisk(METAHEADER *mh, LPCVOID filename, BOOL uni )
 {
     METAHEADERDISK *mhd;
     DWORD size;
@@ -379,7 +380,12 @@ METAHEADER *MF_CreateMetaHeaderDisk(METAHEADER *mh, LPCSTR filename)
     mh->mtType = METAFILE_DISK;
     size = HeapSize( GetProcessHeap(), 0, mh );
     mhd = (METAHEADERDISK *)((char *)mh + sizeof(METAHEADER));
-    strcpy(mhd->filename, filename);
+
+    if( uni )
+        WideCharToMultiByte(CP_ACP, 0, filename, -1, 
+                   mhd->filename, sizeof mhd->filename, NULL, NULL);
+    else
+        lstrcpynA( mhd->filename, filename, sizeof mhd->filename );
     return mh;
 }
 
@@ -412,7 +418,7 @@ HMETAFILE16 WINAPI CopyMetaFile16( HMETAFILE16 hSrcMetaFile, LPCSTR lpFilename)
        }
        WriteFile(hFile, mh2, mh2->mtSize * 2, NULL, NULL);
        CloseHandle(hFile);
-       mh2 = MF_CreateMetaHeaderDisk(mh2, lpFilename);
+       mh2 = MF_CreateMetaHeaderDisk(mh2, lpFilename, FALSE);
     }
 
     return MF_Create_HMETAFILE16( mh2 );
@@ -436,8 +442,8 @@ HMETAFILE16 WINAPI CopyMetaFile16( HMETAFILE16 hSrcMetaFile, LPCSTR lpFilename)
  */
 HMETAFILE WINAPI CopyMetaFileW(
                   HMETAFILE hSrcMetaFile, /* [in] handle of metafile to copy */
-                  LPCWSTR lpFilename      /* [in] filename if copying to a file */
-{
+                  LPCWSTR lpFilename      /* [in] filename if copying to a file */)
+{
     METAHEADER *mh = MF_GetMetaHeader( hSrcMetaFile );
     METAHEADER *mh2 = NULL;
     HANDLE hFile;
@@ -454,8 +460,6 @@ HMETAFILE WINAPI CopyMetaFileW(
     }
 
     if(lpFilename) {         /* disk based metafile */
-        DWORD len;
-        LPSTR lpFilenameA;
         if((hFile = CreateFileW(lpFilename, GENERIC_WRITE, 0, NULL,
                                CREATE_ALWAYS, 0, 0)) == INVALID_HANDLE_VALUE) {
            HeapFree( GetProcessHeap(), 0, mh2 );
@@ -463,11 +467,7 @@ HMETAFILE WINAPI CopyMetaFileW(
        }
        WriteFile(hFile, mh2, mh2->mtSize * 2, NULL, NULL);
        CloseHandle(hFile);
-        len = WideCharToMultiByte(CP_ACP, 0, lpFilename, -1, NULL, 0, NULL, NULL);
-        lpFilenameA = HeapAlloc(GetProcessHeap(), 0, len);
-        WideCharToMultiByte(CP_ACP, 0, lpFilename, -1, lpFilenameA, len, NULL, NULL);
-        mh2 = MF_CreateMetaHeaderDisk(mh2, lpFilenameA);
-        HeapFree(GetProcessHeap(), 0, lpFilenameA);
+        mh2 = MF_CreateMetaHeaderDisk(mh2, lpFilename, TRUE);
     }
 
     return MF_Create_HMETAFILE( mh2 );
@@ -486,10 +486,9 @@ HMETAFILE WINAPI CopyMetaFileA( HMETAFILE hSrcMetaFile,
     if (lpFilename) RtlCreateUnicodeStringFromAsciiz(&lpFilenameW, lpFilename);
     else lpFilenameW.Buffer = NULL;
 
-    if (lpFilenameW.Buffer) {
-        ret = CopyMetaFileW( hSrcMetaFile, lpFilenameW.Buffer );
-    }
-    RtlFreeUnicodeString(&lpFilenameW);
+    ret = CopyMetaFileW( hSrcMetaFile, lpFilenameW.Buffer );
+    if (lpFilenameW.Buffer)
+        RtlFreeUnicodeString(&lpFilenameW);
     return ret;
 }
 
@@ -730,8 +729,8 @@ BOOL WINAPI EnumMetaFile(
                             HDC hdc,
                             HMETAFILE hmf,
                             MFENUMPROC lpEnumFunc,
-                            LPARAM lpData
-{
+                            LPARAM lpData)
+{
     METAHEADER *mhTemp = NULL, *mh = MF_GetMetaHeader(hmf);
     METARECORD *mr;
     HANDLETABLE *ht;
@@ -1363,7 +1362,9 @@ HMETAFILE WINAPI SetMetaFileBitsEx(
 }
 
 /*****************************************************************
- *  GetMetaFileBitsEx     (GDI32.@)  Get raw metafile data
+ *  GetMetaFileBitsEx     (GDI32.@)
+ *
+ * Get raw metafile data.
  *
  *  Copies the data from metafile _hmf_ into the buffer _buf_.
  *  If _buf_ is zero, returns size of buffer required. Otherwise,
@@ -1372,8 +1373,8 @@ HMETAFILE WINAPI SetMetaFileBitsEx(
 UINT WINAPI GetMetaFileBitsEx(
      HMETAFILE hmf, /* [in] metafile */
      UINT nSize,    /* [in] size of buf */
-     LPVOID buf     /* [out] buffer to receive raw metafile data */
-{
+     LPVOID buf     /* [out] buffer to receive raw metafile data */)
+{
     METAHEADER *mh = MF_GetMetaHeader(hmf);
     UINT mfSize;
 
@@ -1401,13 +1402,23 @@ UINT WINAPI GetWinMetaFileBits(HENHMETAFILE hemf,
     HDC hdcmf;
     HMETAFILE hmf;
     UINT ret;
+    RECT rc;
+    INT oldMapMode;
+
+    GetClipBox(hdcRef, &rc);
+    oldMapMode = SetMapMode(hdcRef, fnMapMode);
+
+    TRACE("(%p,%d,%p,%d,%p) rc=%s\n", hemf, cbBuffer, lpbBuffer,
+        fnMapMode, hdcRef, wine_dbgstr_rect(&rc));
 
-    FIXME("(%p,%d,%p,%d,%p): stub\n", hemf, cbBuffer, lpbBuffer, fnMapMode, hdcRef);
     hdcmf = CreateMetaFileA(NULL);
-/*  PlayEnhMetaFile(hdcmf, hemf, lpRect); where does the bounding rect come from? */
+    PlayEnhMetaFile(hdcmf, hemf, &rc);
     hmf = CloseMetaFile(hdcmf);
     ret = GetMetaFileBitsEx(hmf, cbBuffer, lpbBuffer);
     DeleteMetaFile(hmf);
+
+    SetMapMode(hdcRef, oldMapMode);
+
     return ret;
 }