Module: wine Branch: master Commit: 42fc3b64302699ed5a4a27d7fee5b55c0eb54e74 URL: http://source.winehq.org/git/wine.git/?a=commit;h=42fc3b64302699ed5a4a27d7fe...
Author: Alexander Scott-Johns alexander.scott.johns@googlemail.com Date: Tue Jan 25 17:54:21 2011 +0000
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.