From cdad61369c94eb2d90fb330176fc6fd2c31885c9 Mon Sep 17 00:00:00 2001 From: Ken Thomases Date: Fri, 22 Nov 2013 04:31:28 -0600 Subject: [PATCH] winemac: Add support for the CF_METAFILEPICT clipboard format. --- dlls/winemac.drv/clipboard.c | 58 ++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/dlls/winemac.drv/clipboard.c b/dlls/winemac.drv/clipboard.c index a648fcc6afd..9f4a81fe28e 100644 --- a/dlls/winemac.drv/clipboard.c +++ b/dlls/winemac.drv/clipboard.c @@ -72,6 +72,7 @@ typedef struct static HANDLE import_clipboard_data(CFDataRef data); static HANDLE import_bmp_to_bitmap(CFDataRef data); static HANDLE import_bmp_to_dib(CFDataRef data); +static HANDLE import_metafilepict(CFDataRef data); static HANDLE import_nsfilenames_to_hdrop(CFDataRef data); static HANDLE import_oemtext_to_text(CFDataRef data); static HANDLE import_oemtext_to_unicodetext(CFDataRef data); @@ -90,6 +91,7 @@ static CFDataRef export_clipboard_data(HANDLE data); static CFDataRef export_bitmap_to_bmp(HANDLE data); static CFDataRef export_dib_to_bmp(HANDLE data); static CFDataRef export_hdrop_to_filenames(HANDLE data); +static CFDataRef export_metafilepict(HANDLE data); static CFDataRef export_oemtext_to_utf8(HANDLE data); static CFDataRef export_oemtext_to_utf16(HANDLE data); static CFDataRef export_text_to_utf8(HANDLE data); @@ -194,6 +196,8 @@ static const struct { CF_HDROP, CFSTR("org.winehq.builtin.hdrop"), import_clipboard_data, export_clipboard_data, FALSE }, { CF_HDROP, CFSTR("NSFilenamesPboardType"), import_nsfilenames_to_hdrop, export_hdrop_to_filenames, TRUE }, + + { CF_METAFILEPICT, CFSTR("org.winehq.builtin.metafilepict"), import_metafilepict, export_metafilepict, FALSE }, }; static const WCHAR wszRichTextFormat[] = {'R','i','c','h',' ','T','e','x','t',' ','F','o','r','m','a','t',0}; @@ -670,6 +674,33 @@ static HANDLE import_bmp_to_dib(CFDataRef data) } +/************************************************************************** + * import_metafilepict + * + * Import metafile picture data, converting it to CF_METAFILEPICT. + */ +static HANDLE import_metafilepict(CFDataRef data) +{ + HANDLE ret = 0; + CFIndex len = CFDataGetLength(data); + METAFILEPICT *mfp; + + TRACE("data %s\n", debugstr_cf(data)); + + if (len >= sizeof(*mfp) && (ret = GlobalAlloc(0, sizeof(*mfp)))) + { + const BYTE *bytes = (const BYTE*)CFDataGetBytePtr(data); + + mfp = GlobalLock(ret); + memcpy(mfp, bytes, sizeof(*mfp)); + mfp->hMF = SetMetaFileBitsEx(len - sizeof(*mfp), bytes + sizeof(*mfp)); + GlobalUnlock(ret); + } + + return ret; +} + + /************************************************************************** * import_nsfilenames_to_hdrop * @@ -1230,6 +1261,33 @@ done: } +/************************************************************************** + * export_metafilepict + * + * Export a metafile to data. + */ +static CFDataRef export_metafilepict(HANDLE data) +{ + CFMutableDataRef ret = NULL; + METAFILEPICT *mfp = GlobalLock(data); + unsigned int size = GetMetaFileBitsEx(mfp->hMF, 0, NULL); + + TRACE("data %p\n", data); + + ret = CFDataCreateMutable(NULL, sizeof(*mfp) + size); + if (ret) + { + CFDataAppendBytes(ret, (UInt8*)mfp, sizeof(*mfp)); + CFDataIncreaseLength(ret, size); + GetMetaFileBitsEx(mfp->hMF, size, (BYTE*)CFDataGetMutableBytePtr(ret) + sizeof(*mfp)); + } + + GlobalUnlock(data); + TRACE(" -> %s\n", debugstr_cf(ret)); + return ret; +} + + /************************************************************************** * export_oemtext_to_utf8 *