Alexandre Julliard : ole2: Reimplement OleMetafilePictFromIconAndLabel16 on top of the 32-bit version .

Alexandre Julliard julliard at winehq.org
Mon Dec 28 09:16:11 CST 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Dec 23 17:11:24 2009 +0100

ole2: Reimplement OleMetafilePictFromIconAndLabel16 on top of the 32-bit version.

---

 dlls/ole2.dll16/ole2.c          |   67 ++++++++++++++++++++------------------
 dlls/ole2.dll16/ole2.dll16.spec |    2 +-
 2 files changed, 36 insertions(+), 33 deletions(-)

diff --git a/dlls/ole2.dll16/ole2.c b/dlls/ole2.dll16/ole2.c
index ab04390..d3880c6 100644
--- a/dlls/ole2.dll16/ole2.c
+++ b/dlls/ole2.dll16/ole2.c
@@ -50,7 +50,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole);
 
 #define HICON_16(h32)		(LOWORD(h32))
 #define HICON_32(h16)		((HICON)(ULONG_PTR)(h16))
-#define HINSTANCE_32(h16)	((HINSTANCE)(ULONG_PTR)(h16))
 
 /******************************************************************************
  *		OleBuildVersion	(OLE2.1)
@@ -124,49 +123,53 @@ HRESULT WINAPI RevokeDragDrop16(
  * If no hIcon is given, we load the icon via lpszSourceFile and iIconIndex.
  * This code might be wrong at some places.
  */
-HGLOBAL16 WINAPI OleMetaFilePictFromIconAndLabel16(
+HGLOBAL16 WINAPI OleMetafilePictFromIconAndLabel16(
 	HICON16 hIcon,
 	LPCOLESTR16 lpszLabel,
 	LPCOLESTR16 lpszSourceFile,
 	UINT16 iIconIndex
 ) {
-    METAFILEPICT16 *mf16;
+    METAFILEPICT *pict;
+    HGLOBAL hmf;
     HGLOBAL16 hmf16;
-    HMETAFILE hmf;
-    INT mfSize;
-    HDC hdc;
-
-    if (!hIcon) {
-        if (lpszSourceFile) {
-	    HINSTANCE16 hInstance = LoadLibrary16(lpszSourceFile);
-
-	    /* load the icon at index from lpszSourceFile */
-	    hIcon = HICON_16(LoadIconA(HINSTANCE_32(hInstance), (LPCSTR)(DWORD)iIconIndex));
-	    FreeLibrary16(hInstance);
-	} else
-	    return 0;
-    }
+    LPWSTR label = NULL, source = NULL;
+    DWORD len;
 
-    FIXME("(%04x, '%s', '%s', %d): incorrect metrics, please try to correct them !\n",
-          hIcon, lpszLabel, lpszSourceFile, iIconIndex);
+    if (lpszLabel)
+    {
+        len = MultiByteToWideChar( CP_ACP, 0, lpszLabel, -1, NULL, 0 );
+        label = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+        MultiByteToWideChar( CP_ACP, 0, lpszLabel, -1, label, len );
+    }
+    if (lpszSourceFile)
+    {
+        len = MultiByteToWideChar( CP_ACP, 0, lpszSourceFile, -1, NULL, 0 );
+        source = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+        MultiByteToWideChar( CP_ACP, 0, lpszSourceFile, -1, source, len );
+    }
+    hmf = OleMetafilePictFromIconAndLabel( HICON_32(hIcon), label, source, iIconIndex );
+    HeapFree( GetProcessHeap(), 0, label );
+    HeapFree( GetProcessHeap(), 0, source );
 
-    hdc = CreateMetaFileW(NULL);
-    DrawIcon(hdc, 0, 0, HICON_32(hIcon)); /* FIXME */
-    TextOutA(hdc, 0, 0, lpszLabel, 1); /* FIXME */
-    hmf = CloseMetaFile(hdc);
+    if (!hmf) return 0;
+    pict = GlobalLock( hmf );
 
     hmf16 = GlobalAlloc16(0, sizeof(METAFILEPICT16));
-    mf16 = GlobalLock16(hmf16);
-    mf16->mm = MM_ANISOTROPIC;
-    mf16->xExt = 20; /* FIXME: bogus */
-    mf16->yExt = 20; /* ditto */
-    mfSize = GetMetaFileBitsEx(hmf, 0, 0);
-    mf16->hMF = GlobalAlloc16(GMEM_MOVEABLE, mfSize);
-    if(mf16->hMF)
+    if (hmf16)
     {
-        GetMetaFileBitsEx(hmf, mfSize, GlobalLock16(mf16->hMF));
-        GlobalUnlock16(mf16->hMF);
+        METAFILEPICT16 *pict16 = GlobalLock16( hmf16 );
+        pict16->mm   = pict->mm;
+        pict16->xExt = pict->xExt;
+        pict16->yExt = pict->yExt;
+        len = GetMetaFileBitsEx( pict->hMF, 0, 0 );
+        pict16->hMF = GlobalAlloc16( GMEM_MOVEABLE, len );
+        GetMetaFileBitsEx( pict->hMF, len, GlobalLock16( pict16->hMF) );
+        GlobalUnlock16( pict16->hMF );
+        GlobalUnlock16( hmf16 );
     }
+    DeleteMetaFile( pict->hMF );
+    GlobalUnlock( hmf );
+    GlobalFree( hmf );
     return hmf16;
 }
 
diff --git a/dlls/ole2.dll16/ole2.dll16.spec b/dlls/ole2.dll16/ole2.dll16.spec
index 6f08851..308f77a 100644
--- a/dlls/ole2.dll16/ole2.dll16.spec
+++ b/dlls/ole2.dll16/ole2.dll16.spec
@@ -53,7 +53,7 @@
 53 stub OLEGETICONOFCLASS
 54 pascal CreateILockBytesOnHGlobal(word word ptr) CreateILockBytesOnHGlobal16
 55 stub GETHGLOBALFROMILOCKBYTES
-56 pascal -ret16 OleMetaFilePictFromIconAndLabel(word str str word) OleMetaFilePictFromIconAndLabel16
+56 pascal -ret16 OleMetafilePictFromIconAndLabel(word str str word) OleMetafilePictFromIconAndLabel16
 57 stub GETCLASSFILE
 58 stub OLEDRAW
 59 stub OLECREATEDEFAULTHANDLER




More information about the wine-cvs mailing list