winex11.drv: Implement synthesizing the CF_ENHMETAFILE clipboard format from CF_METAFILEPICT. (try 2)

Alexander Scott-Johns alexander.scott.johns at googlemail.com
Fri Jan 28 09:45:51 CST 2011


Try 2: Just return instead of using bret variable; also check result
of HeapAlloc. I've not changed the trace log from hex to decimal,
since the rest of the file (and in fact the whole Wine codebase) uses
hex for showing clipboard formats. Perhaps the constants in winuser.h
should be changed to hex instead?
-------------- next part --------------
From 4cccdc71172888b67ace9ee2939e780edd50cfc6 Mon Sep 17 00:00:00 2001
From: Alexander Scott-Johns <alexander.scott.johns at googlemail.com>
Date: Tue, 25 Jan 2011 17:54:21 +0000
Subject: winex11.drv: Implement synthesizing the CF_ENHMETAFILE clipboard format from CF_METAFILEPICT.

---
 dlls/winex11.drv/clipboard.c |   55 ++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 53 insertions(+), 2 deletions(-)

diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c
index fcec86b..c3f1b55 100644
--- a/dlls/winex11.drv/clipboard.c
+++ b/dlls/winex11.drv/clipboard.c
@@ -179,6 +179,7 @@ static BOOL X11DRV_CLIPBOARD_SynthesizeData(UINT wFormatID);
 static BOOL X11DRV_CLIPBOARD_RenderSynthesizedFormat(Display *display, LPWINE_CLIPDATA lpData);
 static BOOL X11DRV_CLIPBOARD_RenderSynthesizedDIB(Display *display);
 static BOOL X11DRV_CLIPBOARD_RenderSynthesizedBitmap(Display *display);
+static BOOL X11DRV_CLIPBOARD_RenderSynthesizedEnhMetaFile(Display *display);
 static void X11DRV_HandleSelectionRequest( HWND hWnd, XSelectionRequestEvent *event, BOOL bIsMultiple );
 
 /* Clipboard formats
@@ -887,12 +888,15 @@ static BOOL X11DRV_CLIPBOARD_RenderSynthesizedFormat(Display *display, LPWINE_CL
                     break;
 
                 case CF_ENHMETAFILE:
+                    bret = X11DRV_CLIPBOARD_RenderSynthesizedEnhMetaFile( display );
+                    break;
+
                 case CF_METAFILEPICT:
-		    FIXME("Synthesizing wFormatID(0x%08x) not implemented\n", wFormatID);
+                    FIXME("Synthesizing CF_METAFILEPICT not implemented\n");
                     break;
 
                 default:
-		    FIXME("Called to synthesize unknown format\n");
+                    FIXME("Called to synthesize unknown format 0x%08x\n", wFormatID);
                     break;
             }
         }
@@ -1088,6 +1092,53 @@ static BOOL X11DRV_CLIPBOARD_RenderSynthesizedBitmap(Display *display)
 
 
 /**************************************************************************
+ *                      X11DRV_CLIPBOARD_RenderSynthesizedEnhMetaFile
+ */
+static BOOL X11DRV_CLIPBOARD_RenderSynthesizedEnhMetaFile(Display *display)
+{
+    LPWINE_CLIPDATA lpSource = NULL;
+
+    TRACE("\n");
+
+    if ((lpSource = X11DRV_CLIPBOARD_LookupData(CF_ENHMETAFILE)) && lpSource->hData)
+        return TRUE;
+    /* If we have a MF pict and it's not synthesized or it has been rendered */
+    else if ((lpSource = X11DRV_CLIPBOARD_LookupData(CF_METAFILEPICT)) &&
+        (!(lpSource->wFlags & CF_FLAG_SYNTHESIZED) || lpSource->hData))
+    {
+        /* Render source if required */
+        if (lpSource->hData || X11DRV_CLIPBOARD_RenderFormat(display, lpSource))
+        {
+            METAFILEPICT *pmfp;
+            HENHMETAFILE hData = NULL;
+
+            pmfp = GlobalLock(lpSource->hData);
+            if (pmfp)
+            {
+                UINT size_mf_bits = GetMetaFileBitsEx(pmfp->hMF, 0, NULL);
+                void *mf_bits = HeapAlloc(GetProcessHeap(), 0, size_mf_bits);
+                if (mf_bits)
+                {
+                    GetMetaFileBitsEx(pmfp->hMF, size_mf_bits, mf_bits);
+                    hData = SetWinMetaFileBits(size_mf_bits, mf_bits, NULL, pmfp);
+                    HeapFree(GetProcessHeap(), 0, mf_bits);
+                }
+                GlobalUnlock(lpSource->hData);
+            }
+
+            if (hData)
+            {
+                X11DRV_CLIPBOARD_InsertClipboardData(CF_ENHMETAFILE, hData, 0, NULL, TRUE);
+                return TRUE;
+            }
+        }
+    }
+
+    return FALSE;
+}
+
+
+/**************************************************************************
  *		X11DRV_CLIPBOARD_ImportXAString
  *
  *  Import XA_STRING, converting the string to CF_TEXT.
-- 
1.7.0.4


More information about the wine-patches mailing list